From 4f9918dd9d50474d1c0872abd65488813c43ee3c Mon Sep 17 00:00:00 2001 From: David Thompson Date: Fri, 19 Aug 2016 21:44:30 -0400 Subject: Handle videos and source code highlighting in Markdown posts. --- css/dthompson.css | 7 ++ haunt.scm | 159 +++++++++++++++++++++++++++++++++++++----- posts/guile-2d-frp.md | 4 +- videos/guile-2d-frp-demo.webm | Bin 0 -> 10133426 bytes 4 files changed, 149 insertions(+), 21 deletions(-) create mode 100644 videos/guile-2d-frp-demo.webm diff --git a/css/dthompson.css b/css/dthompson.css index 3fbc63e..40e63e7 100644 --- a/css/dthompson.css +++ b/css/dthompson.css @@ -171,6 +171,13 @@ footer { border-radius: 4px; } +.post video { + display: block; + margin: 0 auto; + padding: 0px; + max-width: 100%; +} + .caption { text-align: center; margin: 0; diff --git a/haunt.scm b/haunt.scm index 2a089a5..447f36a 100644 --- a/haunt.scm +++ b/haunt.scm @@ -31,12 +31,16 @@ (haunt reader commonmark) (haunt site) (haunt utils) + (commonmark) (syntax-highlight) (syntax-highlight scheme) + (syntax-highlight xml) + (syntax-highlight c) (sxml match) (sxml transform) (texinfo) (texinfo html) + (srfi srfi-1) (srfi srfi-19) (ice-9 rdelim) (ice-9 regex) @@ -163,28 +167,54 @@ free culture works available under the " ,%cc-by-sa-link " license.") (let ((line (read-line port))) (match:substring (regexp-exec rx line) 1))))) -(define (maybe-highlight-code source) - (call-with-input-string source - (lambda (port) - (let ((lang (string->symbol (parse-lang port)))) - (if lang - (highlights->sxml - (highlight (match lang - ('scheme lex-scheme) - ('xml lex-xml)) - port)) - source))))) +(define (maybe-highlight-code lang source) + (let ((lexer (match lang + ('scheme lex-scheme) + ('xml lex-xml) + ('c lex-c) + (_ #f)))) + (if lexer + (highlights->sxml (highlight lexer source)) + source))) (define (sxml-identity . args) args) (define (highlight-code . tree) (sxml-match tree - ((pre (@ . ,attrs) ,source) - `(pre (@ ,@attrs) - ,(maybe-highlight-code source))))) + ((code (@ (class ,class) . ,attrs) ,source) + (let ((lang (string->symbol + (string-drop class (string-length "language-"))))) + `(code (@ ,@attrs) + ,(maybe-highlight-code lang source)))) + (,other other))) (define (highlight-scheme code) - `(pre ,(highlights->sxml (highlight lex-scheme code)))) + `(pre (code ,(highlights->sxml (highlight lex-scheme code))))) + +(define (media-hackery . tree) + (sxml-match tree + ((img (@ (src ,src) . ,attrs) . ,body) + (if (string-suffix? ".webm" src) + `(video (@ (src ,src) (controls "true"),@attrs) ,@body) + tree)))) + +(define %commonmark-rules + `((code . ,highlight-code) + (img . ,media-hackery) + (*text* . ,(lambda (tag str) str)) + (*default* . ,sxml-identity))) + +(define (post-process-commonmark sxml) + (pre-post-order sxml %commonmark-rules)) + +(define commonmark-reader* + (make-reader (make-file-extension-matcher "md") + (lambda (file) + (call-with-input-file file + (lambda (port) + (values (read-metadata-headers port) + (post-process-commonmark + (commonmark->sxml port)))))))) (define (static-page title file-name body) (lambda (site posts) @@ -242,7 +272,7 @@ system. The official repository is hosted at " (h3 "Anonymous clone") (pre "git clone " ,url))) (h2 "Community") - (p "Real-time discussion for Guile-SDL2 can be found on the " + (p "Real-time discussion for " ,name " can be found on the " (code "#guile") " channel on the Freenode IRC network.") (h2 "Contributing") @@ -278,7 +308,7 @@ at " `((h1 "Projects") (p ,(anchor "Guile-SDL2" "projects/guile-sdl2.html") " β€” SDL2 bindings for Guile Scheme") - (p ,(anchor "Haunt" "projects/haunt.html") + (p ,(anchor "Haunt" "https://haunt.dthompson.us") " β€” Functional, hackable static site generator") (p ,(anchor "Shroud" "projects/shroud.html") " β€” GPG-based password manager") @@ -380,12 +410,102 @@ following modules:") ("0.1.1" ,(date 2016 01 01)) ("0.1.0" ,(date 2015 12 22))))) +(define shroud-page + (project-page + #:name "Shroud" + #:file-name "shroud.html" + #:repo "shroud" + #:description + `((p "Shroud is a simple secret manager with a command line interface.") + (p "The password database is stored as a Scheme s-expression +and encrypted with a " + ,(anchor "GnuPG" "https://gnupg.org") + " key. Secrets consist of an arbitrary number of key/value +pairs, making Shroud suitable for more than just password storage. +For copying and pasting secrets into web browsers and other graphical +applications, there is xclip integration.")) + #:requirements '("GNU Guile >= 2.0.9" + "GnuPG >= 1.4" + "GNU Make" + "GNU pkg-config" + ("optional: xclip is needed for the " + (code "-c") + " flag of " + (code "shroud show") + " to work")) + #:usage + `((p "First, create a " (code ".shroud") + " file in your home directory to hold your +configuration settings. All you really need to set here is your GPG +user ID i.e. your email address:") + ,(highlight-scheme + "'((user-id . \"foo@example.com\"))") + (p "The " + (code ".shroud") + " file is Scheme source code, so any expression that evaluates +to an alist of valid configuration settings is usable by Shroud.") + (p "Once Shroud is configured, try out the following commands to +get a feel for how things work:") + (pre + "# Add a new secret: +shroud hide bank-account username=foobar password=hackme + +# Edit an existing secret: +shroud hide --edit bank-account password=hackmepls + +# List all secrets: +shroud list + +# Show all key/value pairs for a saved secret: +shroud show bank-account + +# Show a single value in a secret: +shroud show bank-account password + +# Copy a password directly to X clipboard: +shroud show -c bank-account password + +# Delete a secret: +shroud remove bank-account") + (p "Happy shrouding!")) + #:license "GNU GPLv3+" + #:releases + `(("0.1.1" ,(date 2015 10 01)) + ("0.1.0" ,(date 2015 09 29))))) + +(define srt2vtt-page + (project-page + #:name "srt2vtt" + #:file-name "srt2vtt.html" + #:repo "srt2vtt" + #:description + `((p "Convert SRT formatted subtitles to WebVTT format for use with +the HTML5 " + (code "") " tag.")) + #:requirements '("GNU Guile >= 2.0.5") + #:usage + `((pre + "$ srt2vtt --help +Usage: srt2vtt [OPTIONS] +Convert SubRip formatted subtitles to WebVTT format. + + -h, --help display this help and exit + -v, --version display version and exit + -i, --input=FILE-NAME read input from FILE-NAME + -o, --output=FILE-NAME write output to FILE-NAME") + (p "If " (code "--input") + " or " (code "--output") + " is ommitted, read from stdin or stdout, respectively.")) + #:license "GNU GPLv3+" + #:releases + `(("0.1" ,(date 2015 02 7))))) + (site #:title "dthompson" #:domain "dthompson.us" #:default-metadata '((author . "David Thompson") (email . "davet@gnu.org")) - #:readers (list commonmark-reader) + #:readers (list commonmark-reader*) #:builders (list (blog #:theme dthompson-theme #:collections %collections) (atom-feed) (atom-feeds-by-tag) @@ -393,8 +513,11 @@ following modules:") projects-page sly-page guile-sdl2-page + shroud-page + srt2vtt-page (static-directory "css") (static-directory "fonts") (static-directory "images") + (static-directory "videos") (static-directory "src") (static-directory "manuals"))) diff --git a/posts/guile-2d-frp.md b/posts/guile-2d-frp.md index 7dedbbb..1970e73 100644 --- a/posts/guile-2d-frp.md +++ b/posts/guile-2d-frp.md @@ -55,9 +55,7 @@ focus on more important things. I think it’s helpful to see FRP in action to really appreciate the magic. So, check out this screencast! - +![](/videos/guile-2d-frp-demo.webm) To see all of the juicy implementation details, check out the [git repository](https://gitorious.org/sly/sly/source/sly/signal.scm). diff --git a/videos/guile-2d-frp-demo.webm b/videos/guile-2d-frp-demo.webm new file mode 100644 index 0000000..ee1d939 Binary files /dev/null and b/videos/guile-2d-frp-demo.webm differ -- cgit v1.2.3