From 1b2b7c3eb939724696894f31ff27db97b0cac84c Mon Sep 17 00:00:00 2001 From: Andreas Widen Date: Sat, 25 Nov 2023 17:21:37 +0100 Subject: Initial commit. Signed-off-by: Andreas Widen --- .gitignore | 1 + COPYING | 661 +++ README | 79 + apps/aux/lists.scm | 67 + apps/aux/numbers.scm | 31 + apps/aux/strings.scm | 12 + apps/aux/sxml.scm | 23 + apps/aux/system.scm | 32 + apps/aux/web.scm | 61 + apps/base/builder.scm | 95 + apps/base/templates/about.scm | 57 + apps/base/templates/components.scm | 486 ++ apps/base/templates/contact.scm | 72 + apps/base/templates/hfge-about.scm | 52 + apps/base/templates/hfge-download.scm | 36 + apps/base/templates/hfge-git.scm | 37 + apps/base/templates/home.scm | 121 + apps/base/templates/menu.scm | 20 + apps/base/templates/theme.scm | 143 + apps/base/types.scm | 124 + apps/base/utils.scm | 224 + apps/blog/builder.scm | 154 + apps/blog/templates/components.scm | 78 + apps/blog/templates/feed.scm | 55 + apps/blog/templates/post-list.scm | 56 + apps/blog/templates/post.scm | 69 + apps/blog/templates/tag.scm | 61 + apps/blog/utils.scm | 143 + apps/i18n.scm | 110 + apps/media/builder.scm | 69 + apps/media/data.scm | 59 + apps/media/templates/components.scm | 48 + apps/media/templates/screenshot.scm | 43 + apps/media/templates/screenshots-overview.scm | 28 + apps/media/types.scm | 60 + haunt.scm | 23 + manifest.scm | 56 + po/LINGUAS | 3 + po/POTFILES | 22 + po/ietf-tags.scm | 26 + ...d-x220-with-a-ch341a-usb-programmer-tutorial.md | 432 ++ ...m-es2l-with-a-ch341a-usb-programmer-tutorial.md | 299 ++ ...berry-pi-for-flashing-with-flashrom-tutorial.md | 160 + ...o-thinkpad-x200-with-a-raspberry-pi-tutorial.md | 436 ++ ...o-thinkpad-x230-with-a-raspberry-pi-tutorial.md | 502 ++ sexp-xgettext.scm | 514 ++ static/base/css/breadcrumbs.css | 37 + static/base/css/buttons.css | 63 + static/base/css/common.css | 172 + static/base/css/download.css | 53 + static/base/css/elements.css | 100 + static/base/css/footer.css | 14 + static/base/css/index.css | 170 + static/base/css/item-preview.css | 67 + static/base/css/menu.css | 123 + static/base/css/messages.css | 53 + static/base/css/navbar.css | 274 ++ static/base/css/page.css | 27 + static/base/css/sidebar.css | 108 + static/base/fonts/FiraSans-Bold.ttf | Bin 0 -> 438028 bytes static/base/highlight/DIGESTS.md | 412 ++ static/base/highlight/LICENSE | 29 + static/base/highlight/README.md | 45 + static/base/highlight/es/core.js | 2600 ++++++++++ static/base/highlight/es/core.min.js | 307 ++ static/base/highlight/es/highlight.js | 2600 ++++++++++ static/base/highlight/es/highlight.min.js | 307 ++ static/base/highlight/es/languages/1c.min.js | 24 + static/base/highlight/es/languages/abnf.min.js | 12 + .../base/highlight/es/languages/accesslog.min.js | 13 + .../highlight/es/languages/actionscript.min.js | 17 + static/base/highlight/es/languages/ada.min.js | 26 + .../base/highlight/es/languages/angelscript.min.js | 21 + static/base/highlight/es/languages/apache.min.js | 14 + .../base/highlight/es/languages/applescript.min.js | 18 + static/base/highlight/es/languages/arcade.min.js | 28 + static/base/highlight/es/languages/arduino.min.js | 54 + static/base/highlight/es/languages/armasm.min.js | 17 + static/base/highlight/es/languages/asciidoc.min.js | 35 + static/base/highlight/es/languages/aspectj.min.js | 30 + .../base/highlight/es/languages/autohotkey.min.js | 13 + static/base/highlight/es/languages/autoit.min.js | 21 + static/base/highlight/es/languages/avrasm.min.js | 12 + static/base/highlight/es/languages/awk.min.js | 11 + static/base/highlight/es/languages/axapta.min.js | 11 + static/base/highlight/es/languages/bash.min.js | 20 + static/base/highlight/es/languages/basic.min.js | 9 + static/base/highlight/es/languages/bnf.min.js | 6 + .../base/highlight/es/languages/brainfuck.min.js | 7 + static/base/highlight/es/languages/c.min.js | 41 + static/base/highlight/es/languages/cal.min.js | 14 + .../base/highlight/es/languages/capnproto.min.js | 13 + static/base/highlight/es/languages/ceylon.min.js | 15 + static/base/highlight/es/languages/clean.min.js | 8 + .../highlight/es/languages/clojure-repl.min.js | 4 + static/base/highlight/es/languages/clojure.min.js | 18 + static/base/highlight/es/languages/cmake.min.js | 7 + .../highlight/es/languages/coffeescript.min.js | 29 + static/base/highlight/es/languages/coq.min.js | 7 + static/base/highlight/es/languages/cos.min.js | 15 + static/base/highlight/es/languages/cpp.min.js | 46 + static/base/highlight/es/languages/crmsh.min.js | 19 + static/base/highlight/es/languages/crystal.min.js | 48 + static/base/highlight/es/languages/csharp.min.js | 47 + static/base/highlight/es/languages/csp.min.js | 6 + static/base/highlight/es/languages/css.min.js | 31 + static/base/highlight/es/languages/d.min.js | 20 + static/base/highlight/es/languages/dart.min.js | 22 + static/base/highlight/es/languages/delphi.min.js | 17 + static/base/highlight/es/languages/diff.min.js | 9 + static/base/highlight/es/languages/django.min.js | 13 + static/base/highlight/es/languages/dns.min.js | 11 + .../base/highlight/es/languages/dockerfile.min.js | 8 + static/base/highlight/es/languages/dos.min.js | 13 + static/base/highlight/es/languages/dsconfig.min.js | 9 + static/base/highlight/es/languages/dts.min.js | 22 + static/base/highlight/es/languages/dust.min.js | 8 + static/base/highlight/es/languages/ebnf.min.js | 7 + static/base/highlight/es/languages/elixir.min.js | 33 + static/base/highlight/es/languages/elm.min.js | 18 + static/base/highlight/es/languages/erb.min.js | 5 + .../base/highlight/es/languages/erlang-repl.min.js | 13 + static/base/highlight/es/languages/erlang.min.js | 27 + static/base/highlight/es/languages/excel.min.js | 10 + static/base/highlight/es/languages/fix.min.js | 7 + static/base/highlight/es/languages/flix.min.js | 10 + static/base/highlight/es/languages/fortran.min.js | 16 + static/base/highlight/es/languages/fsharp.min.js | 35 + static/base/highlight/es/languages/gams.min.js | 28 + static/base/highlight/es/languages/gauss.min.js | 36 + static/base/highlight/es/languages/gcode.min.js | 17 + static/base/highlight/es/languages/gherkin.min.js | 9 + static/base/highlight/es/languages/glsl.min.js | 8 + static/base/highlight/es/languages/gml.min.js | 11 + static/base/highlight/es/languages/go.min.js | 14 + static/base/highlight/es/languages/golo.min.js | 6 + static/base/highlight/es/languages/gradle.min.js | 6 + static/base/highlight/es/languages/groovy.min.js | 20 + static/base/highlight/es/languages/haml.min.js | 18 + .../base/highlight/es/languages/handlebars.min.js | 29 + static/base/highlight/es/languages/haskell.min.js | 29 + static/base/highlight/es/languages/haxe.min.js | 27 + static/base/highlight/es/languages/hsp.min.js | 14 + static/base/highlight/es/languages/http.min.js | 14 + static/base/highlight/es/languages/hy.min.js | 15 + static/base/highlight/es/languages/inform7.min.js | 10 + static/base/highlight/es/languages/ini.min.js | 16 + static/base/highlight/es/languages/irpf90.min.js | 15 + static/base/highlight/es/languages/isbl.min.js | 25 + static/base/highlight/es/languages/java.min.js | 37 + .../base/highlight/es/languages/javascript.min.js | 76 + .../base/highlight/es/languages/jboss-cli.min.js | 10 + static/base/highlight/es/languages/json.min.js | 7 + .../base/highlight/es/languages/julia-repl.min.js | 4 + static/base/highlight/es/languages/julia.min.js | 18 + static/base/highlight/es/languages/kotlin.min.js | 45 + static/base/highlight/es/languages/lasso.min.js | 29 + static/base/highlight/es/languages/latex.min.js | 34 + static/base/highlight/es/languages/ldif.min.js | 5 + static/base/highlight/es/languages/leaf.min.js | 8 + static/base/highlight/es/languages/less.min.js | 43 + static/base/highlight/es/languages/lisp.min.js | 16 + .../highlight/es/languages/livecodeserver.min.js | 21 + .../base/highlight/es/languages/livescript.min.js | 35 + static/base/highlight/es/languages/llvm.min.js | 14 + static/base/highlight/es/languages/lsl.min.js | 19 + static/base/highlight/es/languages/lua.min.js | 14 + static/base/highlight/es/languages/makefile.min.js | 14 + static/base/highlight/es/languages/markdown.min.js | 31 + .../base/highlight/es/languages/mathematica.min.js | 21 + static/base/highlight/es/languages/matlab.min.js | 16 + static/base/highlight/es/languages/maxima.min.js | 12 + static/base/highlight/es/languages/mel.min.js | 8 + static/base/highlight/es/languages/mercury.min.js | 16 + static/base/highlight/es/languages/mipsasm.min.js | 15 + static/base/highlight/es/languages/mizar.min.js | 4 + .../base/highlight/es/languages/mojolicious.min.js | 6 + static/base/highlight/es/languages/monkey.min.js | 17 + .../base/highlight/es/languages/moonscript.min.js | 23 + static/base/highlight/es/languages/n1ql.min.js | 13 + .../base/highlight/es/languages/nestedtext.min.js | 9 + static/base/highlight/es/languages/nginx.min.js | 21 + static/base/highlight/es/languages/nim.min.js | 15 + static/base/highlight/es/languages/nix.min.js | 11 + .../base/highlight/es/languages/node-repl.min.js | 5 + static/base/highlight/es/languages/nsis.min.js | 27 + .../base/highlight/es/languages/objectivec.min.js | 22 + static/base/highlight/es/languages/ocaml.min.js | 14 + static/base/highlight/es/languages/openscad.min.js | 15 + static/base/highlight/es/languages/oxygene.min.js | 14 + static/base/highlight/es/languages/parser3.min.js | 10 + static/base/highlight/es/languages/perl.min.js | 36 + static/base/highlight/es/languages/pf.min.js | 9 + static/base/highlight/es/languages/pgsql.min.js | 69 + .../highlight/es/languages/php-template.min.js | 8 + static/base/highlight/es/languages/php.min.js | 36 + .../base/highlight/es/languages/plaintext.min.js | 3 + static/base/highlight/es/languages/pony.min.js | 12 + .../base/highlight/es/languages/powershell.min.js | 40 + .../base/highlight/es/languages/processing.min.js | 18 + static/base/highlight/es/languages/profile.min.js | 9 + static/base/highlight/es/languages/prolog.min.js | 11 + .../base/highlight/es/languages/properties.min.js | 11 + static/base/highlight/es/languages/protobuf.min.js | 12 + static/base/highlight/es/languages/puppet.min.js | 17 + .../base/highlight/es/languages/purebasic.min.js | 11 + .../base/highlight/es/languages/python-repl.min.js | 5 + static/base/highlight/es/languages/python.min.js | 42 + static/base/highlight/es/languages/q.min.js | 8 + static/base/highlight/es/languages/qml.min.js | 29 + static/base/highlight/es/languages/r.min.js | 26 + static/base/highlight/es/languages/reasonml.min.js | 43 + static/base/highlight/es/languages/rib.min.js | 6 + static/base/highlight/es/languages/roboconf.min.js | 13 + static/base/highlight/es/languages/routeros.min.js | 22 + static/base/highlight/es/languages/rsl.min.js | 10 + static/base/highlight/es/languages/ruby.min.js | 48 + .../highlight/es/languages/ruleslanguage.min.js | 9 + static/base/highlight/es/languages/rust.min.js | 29 + static/base/highlight/es/languages/sas.min.js | 17 + static/base/highlight/es/languages/scala.min.js | 25 + static/base/highlight/es/languages/scheme.min.js | 19 + static/base/highlight/es/languages/scilab.min.js | 13 + static/base/highlight/es/languages/scss.min.js | 33 + static/base/highlight/es/languages/shell.min.js | 5 + static/base/highlight/es/languages/smali.min.js | 13 + .../base/highlight/es/languages/smalltalk.min.js | 11 + static/base/highlight/es/languages/sml.min.js | 14 + static/base/highlight/es/languages/sqf.min.js | 17 + static/base/highlight/es/languages/sql.min.js | 17 + static/base/highlight/es/languages/stan.min.js | 17 + static/base/highlight/es/languages/stata.min.js | 11 + static/base/highlight/es/languages/step21.min.js | 10 + static/base/highlight/es/languages/stylus.min.js | 36 + static/base/highlight/es/languages/subunit.min.js | 10 + static/base/highlight/es/languages/swift.min.js | 60 + .../highlight/es/languages/taggerscript.min.js | 7 + static/base/highlight/es/languages/tap.min.js | 7 + static/base/highlight/es/languages/tcl.min.js | 15 + static/base/highlight/es/languages/thrift.min.js | 12 + static/base/highlight/es/languages/tp.min.js | 19 + static/base/highlight/es/languages/twig.min.js | 15 + .../base/highlight/es/languages/typescript.min.js | 91 + static/base/highlight/es/languages/vala.min.js | 9 + static/base/highlight/es/languages/vbnet.min.js | 25 + .../highlight/es/languages/vbscript-html.min.js | 4 + static/base/highlight/es/languages/vbscript.min.js | 10 + static/base/highlight/es/languages/verilog.min.js | 17 + static/base/highlight/es/languages/vhdl.min.js | 14 + static/base/highlight/es/languages/vim.min.js | 12 + static/base/highlight/es/languages/wasm.min.js | 15 + static/base/highlight/es/languages/wren.min.js | 30 + static/base/highlight/es/languages/x86asm.min.js | 18 + static/base/highlight/es/languages/xl.min.js | 15 + static/base/highlight/es/languages/xml.min.js | 28 + static/base/highlight/es/languages/xquery.min.js | 33 + static/base/highlight/es/languages/yaml.min.js | 25 + static/base/highlight/es/languages/zephir.min.js | 18 + static/base/highlight/es/package.json | 1 + static/base/highlight/highlight.js | 2606 ++++++++++ static/base/highlight/highlight.min.js | 870 ++++ static/base/highlight/languages/1c.min.js | 24 + static/base/highlight/languages/abnf.min.js | 11 + static/base/highlight/languages/accesslog.min.js | 13 + .../base/highlight/languages/actionscript.min.js | 17 + static/base/highlight/languages/ada.min.js | 26 + static/base/highlight/languages/angelscript.min.js | 21 + static/base/highlight/languages/apache.min.js | 14 + static/base/highlight/languages/applescript.min.js | 19 + static/base/highlight/languages/arcade.min.js | 27 + static/base/highlight/languages/arduino.min.js | 54 + static/base/highlight/languages/armasm.min.js | 17 + static/base/highlight/languages/asciidoc.min.js | 35 + static/base/highlight/languages/aspectj.min.js | 31 + static/base/highlight/languages/autohotkey.min.js | 14 + static/base/highlight/languages/autoit.min.js | 21 + static/base/highlight/languages/avrasm.min.js | 12 + static/base/highlight/languages/awk.min.js | 11 + static/base/highlight/languages/axapta.min.js | 10 + static/base/highlight/languages/bash.min.js | 20 + static/base/highlight/languages/basic.min.js | 10 + static/base/highlight/languages/bnf.min.js | 6 + static/base/highlight/languages/brainfuck.min.js | 7 + static/base/highlight/languages/c.min.js | 40 + static/base/highlight/languages/cal.min.js | 14 + static/base/highlight/languages/capnproto.min.js | 13 + static/base/highlight/languages/ceylon.min.js | 15 + static/base/highlight/languages/clean.min.js | 8 + .../base/highlight/languages/clojure-repl.min.js | 4 + static/base/highlight/languages/clojure.min.js | 25 + static/base/highlight/languages/cmake.min.js | 7 + .../base/highlight/languages/coffeescript.min.js | 29 + static/base/highlight/languages/coq.min.js | 7 + static/base/highlight/languages/cos.min.js | 15 + static/base/highlight/languages/cpp.min.js | 47 + static/base/highlight/languages/crmsh.min.js | 19 + static/base/highlight/languages/crystal.min.js | 48 + static/base/highlight/languages/csharp.min.js | 47 + static/base/highlight/languages/csp.min.js | 7 + static/base/highlight/languages/css.min.js | 31 + static/base/highlight/languages/d.min.js | 20 + static/base/highlight/languages/dart.min.js | 22 + static/base/highlight/languages/delphi.min.js | 17 + static/base/highlight/languages/diff.min.js | 9 + static/base/highlight/languages/django.min.js | 13 + static/base/highlight/languages/dns.min.js | 11 + static/base/highlight/languages/dockerfile.min.js | 8 + static/base/highlight/languages/dos.min.js | 12 + static/base/highlight/languages/dsconfig.min.js | 9 + static/base/highlight/languages/dts.min.js | 22 + static/base/highlight/languages/dust.min.js | 8 + static/base/highlight/languages/ebnf.min.js | 7 + static/base/highlight/languages/elixir.min.js | 33 + static/base/highlight/languages/elm.min.js | 18 + static/base/highlight/languages/erb.min.js | 5 + static/base/highlight/languages/erlang-repl.min.js | 13 + static/base/highlight/languages/erlang.min.js | 27 + static/base/highlight/languages/excel.min.js | 10 + static/base/highlight/languages/fix.min.js | 7 + static/base/highlight/languages/flix.min.js | 10 + static/base/highlight/languages/fortran.min.js | 16 + static/base/highlight/languages/fsharp.min.js | 35 + static/base/highlight/languages/gams.min.js | 28 + static/base/highlight/languages/gauss.min.js | 36 + static/base/highlight/languages/gcode.min.js | 16 + static/base/highlight/languages/gherkin.min.js | 8 + static/base/highlight/languages/glsl.min.js | 8 + static/base/highlight/languages/gml.min.js | 11 + static/base/highlight/languages/go.min.js | 14 + static/base/highlight/languages/golo.min.js | 6 + static/base/highlight/languages/gradle.min.js | 5 + static/base/highlight/languages/groovy.min.js | 20 + static/base/highlight/languages/haml.min.js | 18 + static/base/highlight/languages/handlebars.min.js | 29 + static/base/highlight/languages/haskell.min.js | 29 + static/base/highlight/languages/haxe.min.js | 26 + static/base/highlight/languages/hsp.min.js | 14 + static/base/highlight/languages/http.min.js | 14 + static/base/highlight/languages/hy.min.js | 16 + static/base/highlight/languages/inform7.min.js | 11 + static/base/highlight/languages/ini.min.js | 15 + static/base/highlight/languages/irpf90.min.js | 15 + static/base/highlight/languages/isbl.min.js | 25 + static/base/highlight/languages/java.min.js | 37 + static/base/highlight/languages/javascript.min.js | 80 + static/base/highlight/languages/jboss-cli.min.js | 10 + static/base/highlight/languages/json.min.js | 7 + static/base/highlight/languages/julia-repl.min.js | 5 + static/base/highlight/languages/julia.min.js | 18 + static/base/highlight/languages/kotlin.min.js | 45 + static/base/highlight/languages/lasso.min.js | 29 + static/base/highlight/languages/latex.min.js | 33 + static/base/highlight/languages/ldif.min.js | 5 + static/base/highlight/languages/leaf.min.js | 8 + static/base/highlight/languages/less.min.js | 43 + static/base/highlight/languages/lisp.min.js | 17 + .../base/highlight/languages/livecodeserver.min.js | 21 + static/base/highlight/languages/livescript.min.js | 35 + static/base/highlight/languages/llvm.min.js | 14 + static/base/highlight/languages/lsl.min.js | 19 + static/base/highlight/languages/lua.min.js | 15 + static/base/highlight/languages/makefile.min.js | 14 + static/base/highlight/languages/markdown.min.js | 31 + static/base/highlight/languages/mathematica.min.js | 21 + static/base/highlight/languages/matlab.min.js | 16 + static/base/highlight/languages/maxima.min.js | 12 + static/base/highlight/languages/mel.min.js | 8 + static/base/highlight/languages/mercury.min.js | 16 + static/base/highlight/languages/mipsasm.min.js | 15 + static/base/highlight/languages/mizar.min.js | 4 + static/base/highlight/languages/mojolicious.min.js | 6 + static/base/highlight/languages/monkey.min.js | 17 + static/base/highlight/languages/moonscript.min.js | 23 + static/base/highlight/languages/n1ql.min.js | 13 + static/base/highlight/languages/nestedtext.min.js | 9 + static/base/highlight/languages/nginx.min.js | 21 + static/base/highlight/languages/nim.min.js | 15 + static/base/highlight/languages/nix.min.js | 12 + static/base/highlight/languages/node-repl.min.js | 5 + static/base/highlight/languages/nsis.min.js | 27 + static/base/highlight/languages/objectivec.min.js | 21 + static/base/highlight/languages/ocaml.min.js | 14 + static/base/highlight/languages/openscad.min.js | 15 + static/base/highlight/languages/oxygene.min.js | 15 + static/base/highlight/languages/parser3.min.js | 10 + static/base/highlight/languages/perl.min.js | 36 + static/base/highlight/languages/pf.min.js | 9 + static/base/highlight/languages/pgsql.min.js | 69 + .../base/highlight/languages/php-template.min.js | 8 + static/base/highlight/languages/php.min.js | 37 + static/base/highlight/languages/plaintext.min.js | 4 + static/base/highlight/languages/pony.min.js | 12 + static/base/highlight/languages/powershell.min.js | 39 + static/base/highlight/languages/processing.min.js | 18 + static/base/highlight/languages/profile.min.js | 9 + static/base/highlight/languages/prolog.min.js | 11 + static/base/highlight/languages/properties.min.js | 11 + static/base/highlight/languages/protobuf.min.js | 11 + static/base/highlight/languages/puppet.min.js | 17 + static/base/highlight/languages/purebasic.min.js | 11 + static/base/highlight/languages/python-repl.min.js | 5 + static/base/highlight/languages/python.min.js | 41 + static/base/highlight/languages/q.min.js | 8 + static/base/highlight/languages/qml.min.js | 29 + static/base/highlight/languages/r.min.js | 26 + static/base/highlight/languages/reasonml.min.js | 43 + static/base/highlight/languages/rib.min.js | 6 + static/base/highlight/languages/roboconf.min.js | 12 + static/base/highlight/languages/routeros.min.js | 22 + static/base/highlight/languages/rsl.min.js | 10 + static/base/highlight/languages/ruby.min.js | 48 + .../base/highlight/languages/ruleslanguage.min.js | 9 + static/base/highlight/languages/rust.min.js | 28 + static/base/highlight/languages/sas.min.js | 18 + static/base/highlight/languages/scala.min.js | 25 + static/base/highlight/languages/scheme.min.js | 20 + static/base/highlight/languages/scilab.min.js | 13 + static/base/highlight/languages/scss.min.js | 33 + static/base/highlight/languages/shell.min.js | 5 + static/base/highlight/languages/smali.min.js | 13 + static/base/highlight/languages/smalltalk.min.js | 11 + static/base/highlight/languages/sml.min.js | 14 + static/base/highlight/languages/sqf.min.js | 17 + static/base/highlight/languages/sql.min.js | 17 + static/base/highlight/languages/stan.min.js | 17 + static/base/highlight/languages/stata.min.js | 11 + static/base/highlight/languages/step21.min.js | 10 + static/base/highlight/languages/stylus.min.js | 36 + static/base/highlight/languages/subunit.min.js | 9 + static/base/highlight/languages/swift.min.js | 60 + .../base/highlight/languages/taggerscript.min.js | 8 + static/base/highlight/languages/tap.min.js | 7 + static/base/highlight/languages/tcl.min.js | 15 + static/base/highlight/languages/thrift.min.js | 12 + static/base/highlight/languages/tp.min.js | 19 + static/base/highlight/languages/twig.min.js | 15 + static/base/highlight/languages/typescript.min.js | 92 + static/base/highlight/languages/vala.min.js | 9 + static/base/highlight/languages/vbnet.min.js | 25 + .../base/highlight/languages/vbscript-html.min.js | 4 + static/base/highlight/languages/vbscript.min.js | 10 + static/base/highlight/languages/verilog.min.js | 17 + static/base/highlight/languages/vhdl.min.js | 14 + static/base/highlight/languages/vim.min.js | 12 + static/base/highlight/languages/wasm.min.js | 14 + static/base/highlight/languages/wren.min.js | 30 + static/base/highlight/languages/x86asm.min.js | 19 + static/base/highlight/languages/xl.min.js | 15 + static/base/highlight/languages/xml.min.js | 29 + static/base/highlight/languages/xquery.min.js | 32 + static/base/highlight/languages/yaml.min.js | 25 + static/base/highlight/languages/zephir.min.js | 18 + static/base/highlight/package.json | 93 + static/base/highlight/styles/a11y-dark.css | 94 + static/base/highlight/styles/a11y-dark.min.css | 7 + static/base/highlight/styles/a11y-light.css | 94 + static/base/highlight/styles/a11y-light.min.css | 7 + static/base/highlight/styles/agate.css | 127 + static/base/highlight/styles/agate.min.css | 20 + static/base/highlight/styles/an-old-hope.css | 75 + static/base/highlight/styles/an-old-hope.min.css | 9 + static/base/highlight/styles/androidstudio.css | 60 + static/base/highlight/styles/androidstudio.min.css | 1 + static/base/highlight/styles/arduino-light.css | 78 + static/base/highlight/styles/arduino-light.min.css | 1 + static/base/highlight/styles/arta.css | 66 + static/base/highlight/styles/arta.min.css | 1 + static/base/highlight/styles/ascetic.css | 45 + static/base/highlight/styles/ascetic.min.css | 1 + .../highlight/styles/atom-one-dark-reasonable.css | 105 + .../styles/atom-one-dark-reasonable.min.css | 1 + static/base/highlight/styles/atom-one-dark.css | 90 + static/base/highlight/styles/atom-one-dark.min.css | 1 + static/base/highlight/styles/atom-one-light.css | 90 + .../base/highlight/styles/atom-one-light.min.css | 1 + static/base/highlight/styles/base16/3024.css | 163 + static/base/highlight/styles/base16/3024.min.css | 7 + static/base/highlight/styles/base16/apathy.css | 163 + static/base/highlight/styles/base16/apathy.min.css | 7 + static/base/highlight/styles/base16/apprentice.css | 163 + .../highlight/styles/base16/apprentice.min.css | 7 + static/base/highlight/styles/base16/ashes.css | 163 + static/base/highlight/styles/base16/ashes.min.css | 7 + .../highlight/styles/base16/atelier-cave-light.css | 163 + .../styles/base16/atelier-cave-light.min.css | 7 + .../base/highlight/styles/base16/atelier-cave.css | 163 + .../highlight/styles/base16/atelier-cave.min.css | 7 + .../highlight/styles/base16/atelier-dune-light.css | 163 + .../styles/base16/atelier-dune-light.min.css | 7 + .../base/highlight/styles/base16/atelier-dune.css | 163 + .../highlight/styles/base16/atelier-dune.min.css | 7 + .../styles/base16/atelier-estuary-light.css | 163 + .../styles/base16/atelier-estuary-light.min.css | 7 + .../highlight/styles/base16/atelier-estuary.css | 163 + .../styles/base16/atelier-estuary.min.css | 7 + .../styles/base16/atelier-forest-light.css | 163 + .../styles/base16/atelier-forest-light.min.css | 7 + .../highlight/styles/base16/atelier-forest.css | 163 + .../highlight/styles/base16/atelier-forest.min.css | 7 + .../styles/base16/atelier-heath-light.css | 163 + .../styles/base16/atelier-heath-light.min.css | 7 + .../base/highlight/styles/base16/atelier-heath.css | 163 + .../highlight/styles/base16/atelier-heath.min.css | 7 + .../styles/base16/atelier-lakeside-light.css | 163 + .../styles/base16/atelier-lakeside-light.min.css | 7 + .../highlight/styles/base16/atelier-lakeside.css | 163 + .../styles/base16/atelier-lakeside.min.css | 7 + .../styles/base16/atelier-plateau-light.css | 163 + .../styles/base16/atelier-plateau-light.min.css | 7 + .../highlight/styles/base16/atelier-plateau.css | 163 + .../styles/base16/atelier-plateau.min.css | 7 + .../styles/base16/atelier-savanna-light.css | 163 + .../styles/base16/atelier-savanna-light.min.css | 7 + .../highlight/styles/base16/atelier-savanna.css | 163 + .../styles/base16/atelier-savanna.min.css | 7 + .../styles/base16/atelier-seaside-light.css | 163 + .../styles/base16/atelier-seaside-light.min.css | 7 + .../highlight/styles/base16/atelier-seaside.css | 163 + .../styles/base16/atelier-seaside.min.css | 7 + .../styles/base16/atelier-sulphurpool-light.css | 163 + .../base16/atelier-sulphurpool-light.min.css | 7 + .../styles/base16/atelier-sulphurpool.css | 163 + .../styles/base16/atelier-sulphurpool.min.css | 7 + static/base/highlight/styles/base16/atlas.css | 163 + static/base/highlight/styles/base16/atlas.min.css | 7 + static/base/highlight/styles/base16/bespin.css | 163 + static/base/highlight/styles/base16/bespin.min.css | 7 + .../styles/base16/black-metal-bathory.css | 163 + .../styles/base16/black-metal-bathory.min.css | 7 + .../highlight/styles/base16/black-metal-burzum.css | 163 + .../styles/base16/black-metal-burzum.min.css | 7 + .../styles/base16/black-metal-dark-funeral.css | 163 + .../styles/base16/black-metal-dark-funeral.min.css | 7 + .../styles/base16/black-metal-gorgoroth.css | 163 + .../styles/base16/black-metal-gorgoroth.min.css | 7 + .../styles/base16/black-metal-immortal.css | 163 + .../styles/base16/black-metal-immortal.min.css | 7 + .../highlight/styles/base16/black-metal-khold.css | 163 + .../styles/base16/black-metal-khold.min.css | 7 + .../highlight/styles/base16/black-metal-marduk.css | 163 + .../styles/base16/black-metal-marduk.min.css | 7 + .../highlight/styles/base16/black-metal-mayhem.css | 163 + .../styles/base16/black-metal-mayhem.min.css | 7 + .../highlight/styles/base16/black-metal-nile.css | 163 + .../styles/base16/black-metal-nile.min.css | 7 + .../highlight/styles/base16/black-metal-venom.css | 163 + .../styles/base16/black-metal-venom.min.css | 7 + .../base/highlight/styles/base16/black-metal.css | 163 + .../highlight/styles/base16/black-metal.min.css | 7 + static/base/highlight/styles/base16/brewer.css | 163 + static/base/highlight/styles/base16/brewer.min.css | 7 + static/base/highlight/styles/base16/bright.css | 163 + static/base/highlight/styles/base16/bright.min.css | 7 + static/base/highlight/styles/base16/brogrammer.css | 163 + .../highlight/styles/base16/brogrammer.min.css | 7 + .../highlight/styles/base16/brush-trees-dark.css | 163 + .../styles/base16/brush-trees-dark.min.css | 7 + .../base/highlight/styles/base16/brush-trees.css | 163 + .../highlight/styles/base16/brush-trees.min.css | 7 + static/base/highlight/styles/base16/chalk.css | 163 + static/base/highlight/styles/base16/chalk.min.css | 7 + static/base/highlight/styles/base16/circus.css | 163 + static/base/highlight/styles/base16/circus.min.css | 7 + .../base/highlight/styles/base16/classic-dark.css | 163 + .../highlight/styles/base16/classic-dark.min.css | 7 + .../base/highlight/styles/base16/classic-light.css | 163 + .../highlight/styles/base16/classic-light.min.css | 7 + static/base/highlight/styles/base16/codeschool.css | 163 + .../highlight/styles/base16/codeschool.min.css | 7 + static/base/highlight/styles/base16/colors.css | 163 + static/base/highlight/styles/base16/colors.min.css | 7 + static/base/highlight/styles/base16/cupcake.css | 163 + .../base/highlight/styles/base16/cupcake.min.css | 7 + static/base/highlight/styles/base16/cupertino.css | 163 + .../base/highlight/styles/base16/cupertino.min.css | 7 + static/base/highlight/styles/base16/danqing.css | 163 + .../base/highlight/styles/base16/danqing.min.css | 7 + static/base/highlight/styles/base16/darcula.css | 163 + .../base/highlight/styles/base16/darcula.min.css | 7 + .../base/highlight/styles/base16/dark-violet.css | 163 + .../highlight/styles/base16/dark-violet.min.css | 7 + static/base/highlight/styles/base16/darkmoss.css | 163 + .../base/highlight/styles/base16/darkmoss.min.css | 7 + static/base/highlight/styles/base16/darktooth.css | 163 + .../base/highlight/styles/base16/darktooth.min.css | 7 + static/base/highlight/styles/base16/decaf.css | 163 + static/base/highlight/styles/base16/decaf.min.css | 7 + .../base/highlight/styles/base16/default-dark.css | 163 + .../highlight/styles/base16/default-dark.min.css | 7 + .../base/highlight/styles/base16/default-light.css | 163 + .../highlight/styles/base16/default-light.min.css | 7 + static/base/highlight/styles/base16/dirtysea.css | 163 + .../base/highlight/styles/base16/dirtysea.min.css | 7 + static/base/highlight/styles/base16/dracula.css | 163 + .../base/highlight/styles/base16/dracula.min.css | 7 + static/base/highlight/styles/base16/edge-dark.css | 163 + .../base/highlight/styles/base16/edge-dark.min.css | 7 + static/base/highlight/styles/base16/edge-light.css | 163 + .../highlight/styles/base16/edge-light.min.css | 7 + static/base/highlight/styles/base16/eighties.css | 163 + .../base/highlight/styles/base16/eighties.min.css | 7 + static/base/highlight/styles/base16/embers.css | 163 + static/base/highlight/styles/base16/embers.min.css | 7 + .../highlight/styles/base16/equilibrium-dark.css | 163 + .../styles/base16/equilibrium-dark.min.css | 7 + .../styles/base16/equilibrium-gray-dark.css | 163 + .../styles/base16/equilibrium-gray-dark.min.css | 7 + .../styles/base16/equilibrium-gray-light.css | 163 + .../styles/base16/equilibrium-gray-light.min.css | 7 + .../highlight/styles/base16/equilibrium-light.css | 163 + .../styles/base16/equilibrium-light.min.css | 7 + static/base/highlight/styles/base16/espresso.css | 163 + .../base/highlight/styles/base16/espresso.min.css | 7 + static/base/highlight/styles/base16/eva-dim.css | 163 + .../base/highlight/styles/base16/eva-dim.min.css | 7 + static/base/highlight/styles/base16/eva.css | 163 + static/base/highlight/styles/base16/eva.min.css | 7 + static/base/highlight/styles/base16/flat.css | 163 + static/base/highlight/styles/base16/flat.min.css | 7 + static/base/highlight/styles/base16/framer.css | 163 + static/base/highlight/styles/base16/framer.min.css | 7 + static/base/highlight/styles/base16/fruit-soda.css | 163 + .../highlight/styles/base16/fruit-soda.min.css | 7 + static/base/highlight/styles/base16/gigavolt.css | 163 + .../base/highlight/styles/base16/gigavolt.min.css | 7 + static/base/highlight/styles/base16/github.css | 163 + static/base/highlight/styles/base16/github.min.css | 7 + .../base/highlight/styles/base16/google-dark.css | 163 + .../highlight/styles/base16/google-dark.min.css | 7 + .../base/highlight/styles/base16/google-light.css | 163 + .../highlight/styles/base16/google-light.min.css | 7 + .../highlight/styles/base16/grayscale-dark.css | 163 + .../highlight/styles/base16/grayscale-dark.min.css | 7 + .../highlight/styles/base16/grayscale-light.css | 163 + .../styles/base16/grayscale-light.min.css | 7 + .../base/highlight/styles/base16/green-screen.css | 163 + .../highlight/styles/base16/green-screen.min.css | 7 + .../highlight/styles/base16/gruvbox-dark-hard.css | 163 + .../styles/base16/gruvbox-dark-hard.min.css | 7 + .../styles/base16/gruvbox-dark-medium.css | 163 + .../styles/base16/gruvbox-dark-medium.min.css | 7 + .../highlight/styles/base16/gruvbox-dark-pale.css | 163 + .../styles/base16/gruvbox-dark-pale.min.css | 7 + .../highlight/styles/base16/gruvbox-dark-soft.css | 163 + .../styles/base16/gruvbox-dark-soft.min.css | 7 + .../highlight/styles/base16/gruvbox-light-hard.css | 163 + .../styles/base16/gruvbox-light-hard.min.css | 7 + .../styles/base16/gruvbox-light-medium.css | 163 + .../styles/base16/gruvbox-light-medium.min.css | 7 + .../highlight/styles/base16/gruvbox-light-soft.css | 163 + .../styles/base16/gruvbox-light-soft.min.css | 7 + static/base/highlight/styles/base16/hardcore.css | 163 + .../base/highlight/styles/base16/hardcore.min.css | 7 + .../highlight/styles/base16/harmonic16-dark.css | 163 + .../styles/base16/harmonic16-dark.min.css | 7 + .../highlight/styles/base16/harmonic16-light.css | 163 + .../styles/base16/harmonic16-light.min.css | 7 + .../base/highlight/styles/base16/heetch-dark.css | 163 + .../highlight/styles/base16/heetch-dark.min.css | 7 + .../base/highlight/styles/base16/heetch-light.css | 163 + .../highlight/styles/base16/heetch-light.min.css | 7 + static/base/highlight/styles/base16/helios.css | 163 + static/base/highlight/styles/base16/helios.min.css | 7 + static/base/highlight/styles/base16/hopscotch.css | 163 + .../base/highlight/styles/base16/hopscotch.min.css | 7 + .../base/highlight/styles/base16/horizon-dark.css | 163 + .../highlight/styles/base16/horizon-dark.min.css | 7 + .../base/highlight/styles/base16/horizon-light.css | 163 + .../highlight/styles/base16/horizon-light.min.css | 7 + .../base/highlight/styles/base16/humanoid-dark.css | 163 + .../highlight/styles/base16/humanoid-dark.min.css | 7 + .../highlight/styles/base16/humanoid-light.css | 163 + .../highlight/styles/base16/humanoid-light.min.css | 7 + static/base/highlight/styles/base16/ia-dark.css | 163 + .../base/highlight/styles/base16/ia-dark.min.css | 7 + static/base/highlight/styles/base16/ia-light.css | 163 + .../base/highlight/styles/base16/ia-light.min.css | 7 + static/base/highlight/styles/base16/icy-dark.css | 163 + .../base/highlight/styles/base16/icy-dark.min.css | 7 + static/base/highlight/styles/base16/ir-black.css | 163 + .../base/highlight/styles/base16/ir-black.min.css | 7 + static/base/highlight/styles/base16/isotope.css | 163 + .../base/highlight/styles/base16/isotope.min.css | 7 + static/base/highlight/styles/base16/kimber.css | 163 + static/base/highlight/styles/base16/kimber.min.css | 7 + .../base/highlight/styles/base16/london-tube.css | 163 + .../highlight/styles/base16/london-tube.min.css | 7 + static/base/highlight/styles/base16/macintosh.css | 163 + .../base/highlight/styles/base16/macintosh.min.css | 7 + static/base/highlight/styles/base16/marrakesh.css | 163 + .../base/highlight/styles/base16/marrakesh.min.css | 7 + static/base/highlight/styles/base16/materia.css | 163 + .../base/highlight/styles/base16/materia.min.css | 7 + .../highlight/styles/base16/material-darker.css | 163 + .../styles/base16/material-darker.min.css | 7 + .../highlight/styles/base16/material-lighter.css | 163 + .../styles/base16/material-lighter.min.css | 7 + .../highlight/styles/base16/material-palenight.css | 163 + .../styles/base16/material-palenight.min.css | 7 + .../highlight/styles/base16/material-vivid.css | 163 + .../highlight/styles/base16/material-vivid.min.css | 7 + static/base/highlight/styles/base16/material.css | 163 + .../base/highlight/styles/base16/material.min.css | 7 + .../base/highlight/styles/base16/mellow-purple.css | 163 + .../highlight/styles/base16/mellow-purple.min.css | 7 + .../base/highlight/styles/base16/mexico-light.css | 163 + .../highlight/styles/base16/mexico-light.min.css | 7 + static/base/highlight/styles/base16/mocha.css | 163 + static/base/highlight/styles/base16/mocha.min.css | 7 + static/base/highlight/styles/base16/monokai.css | 163 + .../base/highlight/styles/base16/monokai.min.css | 7 + static/base/highlight/styles/base16/nebula.css | 163 + static/base/highlight/styles/base16/nebula.min.css | 7 + static/base/highlight/styles/base16/nord.css | 163 + static/base/highlight/styles/base16/nord.min.css | 7 + static/base/highlight/styles/base16/nova.css | 163 + static/base/highlight/styles/base16/nova.min.css | 7 + static/base/highlight/styles/base16/ocean.css | 163 + static/base/highlight/styles/base16/ocean.min.css | 7 + .../base/highlight/styles/base16/oceanicnext.css | 163 + .../highlight/styles/base16/oceanicnext.min.css | 7 + static/base/highlight/styles/base16/one-light.css | 163 + .../base/highlight/styles/base16/one-light.min.css | 7 + static/base/highlight/styles/base16/onedark.css | 163 + .../base/highlight/styles/base16/onedark.min.css | 7 + .../base/highlight/styles/base16/outrun-dark.css | 163 + .../highlight/styles/base16/outrun-dark.min.css | 7 + .../highlight/styles/base16/papercolor-dark.css | 163 + .../styles/base16/papercolor-dark.min.css | 7 + .../highlight/styles/base16/papercolor-light.css | 163 + .../styles/base16/papercolor-light.min.css | 7 + static/base/highlight/styles/base16/paraiso.css | 163 + .../base/highlight/styles/base16/paraiso.min.css | 7 + static/base/highlight/styles/base16/pasque.css | 163 + static/base/highlight/styles/base16/pasque.min.css | 7 + static/base/highlight/styles/base16/phd.css | 163 + static/base/highlight/styles/base16/phd.min.css | 7 + static/base/highlight/styles/base16/pico.css | 163 + static/base/highlight/styles/base16/pico.min.css | 7 + static/base/highlight/styles/base16/pop.css | 163 + static/base/highlight/styles/base16/pop.min.css | 7 + static/base/highlight/styles/base16/porple.css | 163 + static/base/highlight/styles/base16/porple.min.css | 7 + static/base/highlight/styles/base16/qualia.css | 163 + static/base/highlight/styles/base16/qualia.min.css | 7 + static/base/highlight/styles/base16/railscasts.css | 163 + .../highlight/styles/base16/railscasts.min.css | 7 + static/base/highlight/styles/base16/rebecca.css | 163 + .../base/highlight/styles/base16/rebecca.min.css | 7 + .../base/highlight/styles/base16/ros-pine-dawn.css | 163 + .../highlight/styles/base16/ros-pine-dawn.min.css | 7 + .../base/highlight/styles/base16/ros-pine-moon.css | 163 + .../highlight/styles/base16/ros-pine-moon.min.css | 7 + static/base/highlight/styles/base16/ros-pine.css | 163 + .../base/highlight/styles/base16/ros-pine.min.css | 7 + static/base/highlight/styles/base16/sagelight.css | 163 + .../base/highlight/styles/base16/sagelight.min.css | 7 + static/base/highlight/styles/base16/sandcastle.css | 163 + .../highlight/styles/base16/sandcastle.min.css | 7 + static/base/highlight/styles/base16/seti-ui.css | 163 + .../base/highlight/styles/base16/seti-ui.min.css | 7 + .../base/highlight/styles/base16/shapeshifter.css | 163 + .../highlight/styles/base16/shapeshifter.min.css | 7 + static/base/highlight/styles/base16/silk-dark.css | 163 + .../base/highlight/styles/base16/silk-dark.min.css | 7 + static/base/highlight/styles/base16/silk-light.css | 163 + .../highlight/styles/base16/silk-light.min.css | 7 + static/base/highlight/styles/base16/snazzy.css | 163 + static/base/highlight/styles/base16/snazzy.min.css | 7 + .../highlight/styles/base16/solar-flare-light.css | 163 + .../styles/base16/solar-flare-light.min.css | 7 + .../base/highlight/styles/base16/solar-flare.css | 163 + .../highlight/styles/base16/solar-flare.min.css | 7 + .../highlight/styles/base16/solarized-dark.css | 163 + .../highlight/styles/base16/solarized-dark.min.css | 7 + .../highlight/styles/base16/solarized-light.css | 163 + .../styles/base16/solarized-light.min.css | 7 + static/base/highlight/styles/base16/spacemacs.css | 163 + .../base/highlight/styles/base16/spacemacs.min.css | 7 + static/base/highlight/styles/base16/summercamp.css | 163 + .../highlight/styles/base16/summercamp.min.css | 7 + .../highlight/styles/base16/summerfruit-dark.css | 163 + .../styles/base16/summerfruit-dark.min.css | 7 + .../highlight/styles/base16/summerfruit-light.css | 163 + .../styles/base16/summerfruit-light.min.css | 7 + .../styles/base16/synth-midnight-terminal-dark.css | 163 + .../base16/synth-midnight-terminal-dark.min.css | 7 + .../base16/synth-midnight-terminal-light.css | 163 + .../base16/synth-midnight-terminal-light.min.css | 7 + static/base/highlight/styles/base16/tango.css | 163 + static/base/highlight/styles/base16/tango.min.css | 7 + static/base/highlight/styles/base16/tender.css | 163 + static/base/highlight/styles/base16/tender.min.css | 7 + .../highlight/styles/base16/tomorrow-night.css | 163 + .../highlight/styles/base16/tomorrow-night.min.css | 7 + static/base/highlight/styles/base16/tomorrow.css | 163 + .../base/highlight/styles/base16/tomorrow.min.css | 7 + static/base/highlight/styles/base16/twilight.css | 163 + .../base/highlight/styles/base16/twilight.min.css | 7 + .../base/highlight/styles/base16/unikitty-dark.css | 163 + .../highlight/styles/base16/unikitty-dark.min.css | 7 + .../highlight/styles/base16/unikitty-light.css | 163 + .../highlight/styles/base16/unikitty-light.min.css | 7 + static/base/highlight/styles/base16/vulcan.css | 163 + static/base/highlight/styles/base16/vulcan.min.css | 7 + .../highlight/styles/base16/windows-10-light.css | 163 + .../styles/base16/windows-10-light.min.css | 7 + static/base/highlight/styles/base16/windows-10.css | 163 + .../highlight/styles/base16/windows-10.min.css | 7 + .../highlight/styles/base16/windows-95-light.css | 163 + .../styles/base16/windows-95-light.min.css | 7 + static/base/highlight/styles/base16/windows-95.css | 163 + .../highlight/styles/base16/windows-95.min.css | 7 + .../styles/base16/windows-high-contrast-light.css | 163 + .../base16/windows-high-contrast-light.min.css | 7 + .../styles/base16/windows-high-contrast.css | 163 + .../styles/base16/windows-high-contrast.min.css | 7 + .../highlight/styles/base16/windows-nt-light.css | 163 + .../styles/base16/windows-nt-light.min.css | 7 + static/base/highlight/styles/base16/windows-nt.css | 163 + .../highlight/styles/base16/windows-nt.min.css | 7 + static/base/highlight/styles/base16/woodland.css | 163 + .../base/highlight/styles/base16/woodland.min.css | 7 + static/base/highlight/styles/base16/xcode-dusk.css | 163 + .../highlight/styles/base16/xcode-dusk.min.css | 7 + static/base/highlight/styles/base16/zenburn.css | 163 + .../base/highlight/styles/base16/zenburn.min.css | 7 + static/base/highlight/styles/brown-paper.css | 63 + static/base/highlight/styles/brown-paper.min.css | 1 + static/base/highlight/styles/brown-papersq.png | Bin 0 -> 18198 bytes static/base/highlight/styles/codepen-embed.css | 57 + static/base/highlight/styles/codepen-embed.min.css | 1 + static/base/highlight/styles/color-brewer.css | 66 + static/base/highlight/styles/color-brewer.min.css | 1 + static/base/highlight/styles/dark.css | 62 + static/base/highlight/styles/dark.min.css | 1 + static/base/highlight/styles/default.css | 117 + static/base/highlight/styles/default.min.css | 9 + static/base/highlight/styles/devibeans.css | 90 + static/base/highlight/styles/devibeans.min.css | 7 + static/base/highlight/styles/docco.css | 83 + static/base/highlight/styles/docco.min.css | 1 + static/base/highlight/styles/far.css | 67 + static/base/highlight/styles/far.min.css | 1 + static/base/highlight/styles/felipec.css | 94 + static/base/highlight/styles/felipec.min.css | 7 + static/base/highlight/styles/foundation.css | 80 + static/base/highlight/styles/foundation.min.css | 1 + .../base/highlight/styles/github-dark-dimmed.css | 117 + .../highlight/styles/github-dark-dimmed.min.css | 9 + static/base/highlight/styles/github-dark.css | 118 + static/base/highlight/styles/github-dark.min.css | 10 + static/base/highlight/styles/github.css | 118 + static/base/highlight/styles/github.min.css | 10 + static/base/highlight/styles/gml.css | 72 + static/base/highlight/styles/gml.min.css | 1 + static/base/highlight/styles/googlecode.css | 79 + static/base/highlight/styles/googlecode.min.css | 1 + static/base/highlight/styles/gradient-dark.css | 90 + static/base/highlight/styles/gradient-dark.min.css | 1 + static/base/highlight/styles/gradient-light.css | 90 + .../base/highlight/styles/gradient-light.min.css | 1 + static/base/highlight/styles/grayscale.css | 89 + static/base/highlight/styles/grayscale.min.css | 1 + static/base/highlight/styles/hybrid.css | 88 + static/base/highlight/styles/hybrid.min.css | 1 + static/base/highlight/styles/idea.css | 86 + static/base/highlight/styles/idea.min.css | 1 + static/base/highlight/styles/intellij-light.css | 107 + .../base/highlight/styles/intellij-light.min.css | 1 + static/base/highlight/styles/ir-black.css | 66 + static/base/highlight/styles/ir-black.min.css | 1 + static/base/highlight/styles/isbl-editor-dark.css | 94 + .../base/highlight/styles/isbl-editor-dark.min.css | 1 + static/base/highlight/styles/isbl-editor-light.css | 93 + .../highlight/styles/isbl-editor-light.min.css | 1 + static/base/highlight/styles/kimbie-dark.css | 69 + static/base/highlight/styles/kimbie-dark.min.css | 1 + static/base/highlight/styles/kimbie-light.css | 69 + static/base/highlight/styles/kimbie-light.min.css | 1 + static/base/highlight/styles/lightfair.css | 81 + static/base/highlight/styles/lightfair.min.css | 1 + static/base/highlight/styles/lioshi.css | 76 + static/base/highlight/styles/lioshi.min.css | 1 + static/base/highlight/styles/magula.css | 66 + static/base/highlight/styles/magula.min.css | 1 + static/base/highlight/styles/mono-blue.css | 56 + static/base/highlight/styles/mono-blue.min.css | 1 + static/base/highlight/styles/monokai-sublime.css | 76 + .../base/highlight/styles/monokai-sublime.min.css | 1 + static/base/highlight/styles/monokai.css | 68 + static/base/highlight/styles/monokai.min.css | 1 + static/base/highlight/styles/night-owl.css | 174 + static/base/highlight/styles/night-owl.min.css | 1 + static/base/highlight/styles/nnfx-dark.css | 104 + static/base/highlight/styles/nnfx-dark.min.css | 10 + static/base/highlight/styles/nnfx-light.css | 104 + static/base/highlight/styles/nnfx-light.min.css | 10 + static/base/highlight/styles/nord.css | 275 ++ static/base/highlight/styles/nord.min.css | 1 + static/base/highlight/styles/obsidian.css | 79 + static/base/highlight/styles/obsidian.min.css | 1 + static/base/highlight/styles/panda-syntax-dark.css | 92 + .../highlight/styles/panda-syntax-dark.min.css | 1 + .../base/highlight/styles/panda-syntax-light.css | 89 + .../highlight/styles/panda-syntax-light.min.css | 1 + static/base/highlight/styles/paraiso-dark.css | 67 + static/base/highlight/styles/paraiso-dark.min.css | 1 + static/base/highlight/styles/paraiso-light.css | 67 + static/base/highlight/styles/paraiso-light.min.css | 1 + static/base/highlight/styles/pojoaque.css | 76 + static/base/highlight/styles/pojoaque.jpg | Bin 0 -> 1186 bytes static/base/highlight/styles/pojoaque.min.css | 1 + static/base/highlight/styles/purebasic.css | 103 + static/base/highlight/styles/purebasic.min.css | 1 + static/base/highlight/styles/qtcreator-dark.css | 76 + .../base/highlight/styles/qtcreator-dark.min.css | 1 + static/base/highlight/styles/qtcreator-light.css | 74 + .../base/highlight/styles/qtcreator-light.min.css | 1 + static/base/highlight/styles/rainbow.css | 77 + static/base/highlight/styles/rainbow.min.css | 1 + static/base/highlight/styles/routeros.css | 86 + static/base/highlight/styles/routeros.min.css | 1 + static/base/highlight/styles/school-book.css | 62 + static/base/highlight/styles/school-book.min.css | 1 + static/base/highlight/styles/shades-of-purple.css | 84 + .../base/highlight/styles/shades-of-purple.min.css | 1 + static/base/highlight/styles/srcery.css | 89 + static/base/highlight/styles/srcery.min.css | 1 + .../base/highlight/styles/stackoverflow-dark.css | 117 + .../highlight/styles/stackoverflow-dark.min.css | 13 + .../base/highlight/styles/stackoverflow-light.css | 117 + .../highlight/styles/stackoverflow-light.min.css | 13 + static/base/highlight/styles/sunburst.css | 89 + static/base/highlight/styles/sunburst.min.css | 1 + static/base/highlight/styles/tokyo-night-dark.css | 114 + .../base/highlight/styles/tokyo-night-dark.min.css | 8 + static/base/highlight/styles/tokyo-night-light.css | 114 + .../highlight/styles/tokyo-night-light.min.css | 8 + .../base/highlight/styles/tomorrow-night-blue.css | 69 + .../highlight/styles/tomorrow-night-blue.min.css | 1 + .../highlight/styles/tomorrow-night-bright.css | 68 + .../highlight/styles/tomorrow-night-bright.min.css | 1 + static/base/highlight/styles/vs.css | 63 + static/base/highlight/styles/vs.min.css | 1 + static/base/highlight/styles/vs2015.css | 100 + static/base/highlight/styles/vs2015.min.css | 1 + static/base/highlight/styles/xcode.css | 90 + static/base/highlight/styles/xcode.min.css | 1 + static/base/highlight/styles/xt256.css | 79 + static/base/highlight/styles/xt256.min.css | 1 + static/base/img/back-btn-bg.png | Bin 0 -> 1031 bytes static/base/img/breadcrumbs-bg.png | Bin 0 -> 673 bytes static/base/img/checkerboard-bg.png | Bin 0 -> 123 bytes static/base/img/depression-shadow-top.png | Bin 0 -> 126 bytes static/base/img/dropdown-bg.png | Bin 0 -> 264 bytes static/base/img/email-icon.png | Bin 0 -> 4635 bytes static/base/img/featured-box-bg.png | Bin 0 -> 302 bytes static/base/img/feed-bg-white.png | Bin 0 -> 710 bytes static/base/img/feed.png | Bin 0 -> 762 bytes static/base/img/feed.svg | 156 + static/base/img/h-separator-dark.png | Bin 0 -> 750 bytes static/base/img/h-separator.png | Bin 0 -> 590 bytes static/base/img/hf-logo.png | Bin 0 -> 6589 bytes static/base/img/icon.png | Bin 0 -> 8852 bytes static/base/img/icon.svg | 21 + static/base/img/link-arrow.png | Bin 0 -> 546 bytes static/base/img/menu-btn-bg.png | Bin 0 -> 281 bytes static/base/img/menu-item-active-bg.png | Bin 0 -> 133 bytes static/base/img/more-info-bg.png | Bin 0 -> 514 bytes static/base/img/noise-bg.png | Bin 0 -> 7598 bytes static/base/img/white-star.png | Bin 0 -> 260 bytes static/base/js/jquery-3.1.1.min.js | 4 + static/blog/css/post.css | 46 + ..._coreboot-4-15-grub-2-04-with-cpu-microcode.rom | 3663 ++++++++++++++ ...oreboot-4-15-grub-master-with-cpu-microcode.rom | Bin 0 -> 8388608 bytes ...oreboot-4-15-grub-master-with-cpu-microcode.rom | Bin 0 -> 8388608 bytes ...-4-15-grub-master-with-cpu-microcode-bottom.rom | Bin 0 -> 8388608 bytes ...oot-4-15-grub-master-with-cpu-microcode-top.rom | 5139 ++++++++++++++++++++ .../gigabyte-ga-g41m-es2l/01-prerequisites.jpg | Bin 0 -> 124791 bytes .../02-gigabyte-ga-g41m-es2l-internals.jpg | Bin 0 -> 136210 bytes .../03-ch341a-programmer-connected.jpg | Bin 0 -> 137963 bytes .../media/gigabyte-ga-g41m-es2l/dejavusansmono.pf2 | Bin 0 -> 100513 bytes static/blog/media/gigabyte-ga-g41m-es2l/grub.cfg | 115 + .../blog/media/raspberry-pi/01-prerequisites.jpg | Bin 0 -> 44869 bytes .../raspberry-pi-3-model-b-gpio-pinout.jpg | Bin 0 -> 234054 bytes static/blog/media/x200/01-prerequisites.jpg | Bin 0 -> 48686 bytes .../x200/02-lenovo-thinkpad-x200-internals.jpg | Bin 0 -> 99948 bytes .../blog/media/x200/03-raspberry-pi-connected.jpg | Bin 0 -> 98327 bytes static/blog/media/x200/background.jpg | Bin 0 -> 229824 bytes static/blog/media/x200/dejavusansmono.pf2 | Bin 0 -> 100513 bytes static/blog/media/x200/grub.cfg | 129 + static/blog/media/x220/01-prerequisites.jpg | Bin 0 -> 45318 bytes .../x220/02-lenovo-thinkpad-x220-internals.jpg | Bin 0 -> 87849 bytes .../media/x220/03-ch341a-programmer-connected.jpg | Bin 0 -> 110362 bytes static/blog/media/x220/background.jpg | Bin 0 -> 229824 bytes static/blog/media/x220/dejavusansmono.pf2 | Bin 0 -> 100513 bytes static/blog/media/x220/grub.cfg | 129 + static/blog/media/x230/01-prerequisites.jpg | Bin 0 -> 47324 bytes .../x230/02-lenovo-thinkpad-x230-internals.jpg | Bin 0 -> 86633 bytes .../blog/media/x230/03-raspberry-pi-connected.jpg | Bin 0 -> 104873 bytes static/blog/media/x230/background.jpg | Bin 0 -> 229824 bytes static/blog/media/x230/dejavusansmono.pf2 | Bin 0 -> 100513 bytes static/blog/media/x230/grub.cfg | 129 + static/gnupg-pubkeys/andreas-pubkey.asc | 123 + static/media/img/hfge_screenshot_big_1.png | Bin 0 -> 116370 bytes static/media/img/hfge_screenshot_big_2.png | Bin 0 -> 240507 bytes static/media/img/hfge_screenshot_big_3.png | Bin 0 -> 95765 bytes static/media/img/hfge_screenshot_big_4.png | Bin 0 -> 2085568 bytes static/media/img/hfge_screenshot_big_5.png | Bin 0 -> 426653 bytes static/media/img/hfge_screenshot_big_6.png | Bin 0 -> 44874 bytes static/media/img/hfge_screenshot_min_1.png | Bin 0 -> 10341 bytes static/media/img/hfge_screenshot_min_2.png | Bin 0 -> 13353 bytes static/media/img/hfge_screenshot_min_3.png | Bin 0 -> 7260 bytes static/media/img/hfge_screenshot_min_4.png | Bin 0 -> 68467 bytes static/media/img/hfge_screenshot_min_5.png | Bin 0 -> 23624 bytes static/media/img/hfge_screenshot_min_6.png | Bin 0 -> 3365 bytes 1017 files changed, 70519 insertions(+) create mode 100644 .gitignore create mode 100644 COPYING create mode 100644 README create mode 100644 apps/aux/lists.scm create mode 100644 apps/aux/numbers.scm create mode 100644 apps/aux/strings.scm create mode 100644 apps/aux/sxml.scm create mode 100644 apps/aux/system.scm create mode 100644 apps/aux/web.scm create mode 100644 apps/base/builder.scm create mode 100644 apps/base/templates/about.scm create mode 100644 apps/base/templates/components.scm create mode 100644 apps/base/templates/contact.scm create mode 100644 apps/base/templates/hfge-about.scm create mode 100644 apps/base/templates/hfge-download.scm create mode 100644 apps/base/templates/hfge-git.scm create mode 100644 apps/base/templates/home.scm create mode 100644 apps/base/templates/menu.scm create mode 100644 apps/base/templates/theme.scm create mode 100644 apps/base/types.scm create mode 100644 apps/base/utils.scm create mode 100644 apps/blog/builder.scm create mode 100644 apps/blog/templates/components.scm create mode 100644 apps/blog/templates/feed.scm create mode 100644 apps/blog/templates/post-list.scm create mode 100644 apps/blog/templates/post.scm create mode 100644 apps/blog/templates/tag.scm create mode 100644 apps/blog/utils.scm create mode 100644 apps/i18n.scm create mode 100644 apps/media/builder.scm create mode 100644 apps/media/data.scm create mode 100644 apps/media/templates/components.scm create mode 100644 apps/media/templates/screenshot.scm create mode 100644 apps/media/templates/screenshots-overview.scm create mode 100644 apps/media/types.scm create mode 100644 haunt.scm create mode 100644 manifest.scm create mode 100644 po/LINGUAS create mode 100644 po/POTFILES create mode 100644 po/ietf-tags.scm create mode 100644 posts/2019-04-02-17:57-flashing-coreboot-on-a-lenovo-thinkpad-x220-with-a-ch341a-usb-programmer-tutorial.md create mode 100644 posts/2019-04-03-16:59-flashing-coreboot-on-gigabyte-ga-g41m-es2l-with-a-ch341a-usb-programmer-tutorial.md create mode 100644 posts/2022-01-13-16:24-setup-raspberry-pi-for-flashing-with-flashrom-tutorial.md create mode 100644 posts/2022-01-13-21:14-flashing-coreboot-on-a-lenovo-thinkpad-x200-with-a-raspberry-pi-tutorial.md create mode 100644 posts/2022-01-14-18:36-flashing-coreboot-on-a-lenovo-thinkpad-x230-with-a-raspberry-pi-tutorial.md create mode 100644 sexp-xgettext.scm create mode 100644 static/base/css/breadcrumbs.css create mode 100644 static/base/css/buttons.css create mode 100644 static/base/css/common.css create mode 100644 static/base/css/download.css create mode 100644 static/base/css/elements.css create mode 100644 static/base/css/footer.css create mode 100644 static/base/css/index.css create mode 100644 static/base/css/item-preview.css create mode 100644 static/base/css/menu.css create mode 100644 static/base/css/messages.css create mode 100644 static/base/css/navbar.css create mode 100644 static/base/css/page.css create mode 100644 static/base/css/sidebar.css create mode 100755 static/base/fonts/FiraSans-Bold.ttf create mode 100644 static/base/highlight/DIGESTS.md create mode 100644 static/base/highlight/LICENSE create mode 100644 static/base/highlight/README.md create mode 100644 static/base/highlight/es/core.js create mode 100644 static/base/highlight/es/core.min.js create mode 100644 static/base/highlight/es/highlight.js create mode 100644 static/base/highlight/es/highlight.min.js create mode 100644 static/base/highlight/es/languages/1c.min.js create mode 100644 static/base/highlight/es/languages/abnf.min.js create mode 100644 static/base/highlight/es/languages/accesslog.min.js create mode 100644 static/base/highlight/es/languages/actionscript.min.js create mode 100644 static/base/highlight/es/languages/ada.min.js create mode 100644 static/base/highlight/es/languages/angelscript.min.js create mode 100644 static/base/highlight/es/languages/apache.min.js create mode 100644 static/base/highlight/es/languages/applescript.min.js create mode 100644 static/base/highlight/es/languages/arcade.min.js create mode 100644 static/base/highlight/es/languages/arduino.min.js create mode 100644 static/base/highlight/es/languages/armasm.min.js create mode 100644 static/base/highlight/es/languages/asciidoc.min.js create mode 100644 static/base/highlight/es/languages/aspectj.min.js create mode 100644 static/base/highlight/es/languages/autohotkey.min.js create mode 100644 static/base/highlight/es/languages/autoit.min.js create mode 100644 static/base/highlight/es/languages/avrasm.min.js create mode 100644 static/base/highlight/es/languages/awk.min.js create mode 100644 static/base/highlight/es/languages/axapta.min.js create mode 100644 static/base/highlight/es/languages/bash.min.js create mode 100644 static/base/highlight/es/languages/basic.min.js create mode 100644 static/base/highlight/es/languages/bnf.min.js create mode 100644 static/base/highlight/es/languages/brainfuck.min.js create mode 100644 static/base/highlight/es/languages/c.min.js create mode 100644 static/base/highlight/es/languages/cal.min.js create mode 100644 static/base/highlight/es/languages/capnproto.min.js create mode 100644 static/base/highlight/es/languages/ceylon.min.js create mode 100644 static/base/highlight/es/languages/clean.min.js create mode 100644 static/base/highlight/es/languages/clojure-repl.min.js create mode 100644 static/base/highlight/es/languages/clojure.min.js create mode 100644 static/base/highlight/es/languages/cmake.min.js create mode 100644 static/base/highlight/es/languages/coffeescript.min.js create mode 100644 static/base/highlight/es/languages/coq.min.js create mode 100644 static/base/highlight/es/languages/cos.min.js create mode 100644 static/base/highlight/es/languages/cpp.min.js create mode 100644 static/base/highlight/es/languages/crmsh.min.js create mode 100644 static/base/highlight/es/languages/crystal.min.js create mode 100644 static/base/highlight/es/languages/csharp.min.js create mode 100644 static/base/highlight/es/languages/csp.min.js create mode 100644 static/base/highlight/es/languages/css.min.js create mode 100644 static/base/highlight/es/languages/d.min.js create mode 100644 static/base/highlight/es/languages/dart.min.js create mode 100644 static/base/highlight/es/languages/delphi.min.js create mode 100644 static/base/highlight/es/languages/diff.min.js create mode 100644 static/base/highlight/es/languages/django.min.js create mode 100644 static/base/highlight/es/languages/dns.min.js create mode 100644 static/base/highlight/es/languages/dockerfile.min.js create mode 100644 static/base/highlight/es/languages/dos.min.js create mode 100644 static/base/highlight/es/languages/dsconfig.min.js create mode 100644 static/base/highlight/es/languages/dts.min.js create mode 100644 static/base/highlight/es/languages/dust.min.js create mode 100644 static/base/highlight/es/languages/ebnf.min.js create mode 100644 static/base/highlight/es/languages/elixir.min.js create mode 100644 static/base/highlight/es/languages/elm.min.js create mode 100644 static/base/highlight/es/languages/erb.min.js create mode 100644 static/base/highlight/es/languages/erlang-repl.min.js create mode 100644 static/base/highlight/es/languages/erlang.min.js create mode 100644 static/base/highlight/es/languages/excel.min.js create mode 100644 static/base/highlight/es/languages/fix.min.js create mode 100644 static/base/highlight/es/languages/flix.min.js create mode 100644 static/base/highlight/es/languages/fortran.min.js create mode 100644 static/base/highlight/es/languages/fsharp.min.js create mode 100644 static/base/highlight/es/languages/gams.min.js create mode 100644 static/base/highlight/es/languages/gauss.min.js create mode 100644 static/base/highlight/es/languages/gcode.min.js create mode 100644 static/base/highlight/es/languages/gherkin.min.js create mode 100644 static/base/highlight/es/languages/glsl.min.js create mode 100644 static/base/highlight/es/languages/gml.min.js create mode 100644 static/base/highlight/es/languages/go.min.js create mode 100644 static/base/highlight/es/languages/golo.min.js create mode 100644 static/base/highlight/es/languages/gradle.min.js create mode 100644 static/base/highlight/es/languages/groovy.min.js create mode 100644 static/base/highlight/es/languages/haml.min.js create mode 100644 static/base/highlight/es/languages/handlebars.min.js create mode 100644 static/base/highlight/es/languages/haskell.min.js create mode 100644 static/base/highlight/es/languages/haxe.min.js create mode 100644 static/base/highlight/es/languages/hsp.min.js create mode 100644 static/base/highlight/es/languages/http.min.js create mode 100644 static/base/highlight/es/languages/hy.min.js create mode 100644 static/base/highlight/es/languages/inform7.min.js create mode 100644 static/base/highlight/es/languages/ini.min.js create mode 100644 static/base/highlight/es/languages/irpf90.min.js create mode 100644 static/base/highlight/es/languages/isbl.min.js create mode 100644 static/base/highlight/es/languages/java.min.js create mode 100644 static/base/highlight/es/languages/javascript.min.js create mode 100644 static/base/highlight/es/languages/jboss-cli.min.js create mode 100644 static/base/highlight/es/languages/json.min.js create mode 100644 static/base/highlight/es/languages/julia-repl.min.js create mode 100644 static/base/highlight/es/languages/julia.min.js create mode 100644 static/base/highlight/es/languages/kotlin.min.js create mode 100644 static/base/highlight/es/languages/lasso.min.js create mode 100644 static/base/highlight/es/languages/latex.min.js create mode 100644 static/base/highlight/es/languages/ldif.min.js create mode 100644 static/base/highlight/es/languages/leaf.min.js create mode 100644 static/base/highlight/es/languages/less.min.js create mode 100644 static/base/highlight/es/languages/lisp.min.js create mode 100644 static/base/highlight/es/languages/livecodeserver.min.js create mode 100644 static/base/highlight/es/languages/livescript.min.js create mode 100644 static/base/highlight/es/languages/llvm.min.js create mode 100644 static/base/highlight/es/languages/lsl.min.js create mode 100644 static/base/highlight/es/languages/lua.min.js create mode 100644 static/base/highlight/es/languages/makefile.min.js create mode 100644 static/base/highlight/es/languages/markdown.min.js create mode 100644 static/base/highlight/es/languages/mathematica.min.js create mode 100644 static/base/highlight/es/languages/matlab.min.js create mode 100644 static/base/highlight/es/languages/maxima.min.js create mode 100644 static/base/highlight/es/languages/mel.min.js create mode 100644 static/base/highlight/es/languages/mercury.min.js create mode 100644 static/base/highlight/es/languages/mipsasm.min.js create mode 100644 static/base/highlight/es/languages/mizar.min.js create mode 100644 static/base/highlight/es/languages/mojolicious.min.js create mode 100644 static/base/highlight/es/languages/monkey.min.js create mode 100644 static/base/highlight/es/languages/moonscript.min.js create mode 100644 static/base/highlight/es/languages/n1ql.min.js create mode 100644 static/base/highlight/es/languages/nestedtext.min.js create mode 100644 static/base/highlight/es/languages/nginx.min.js create mode 100644 static/base/highlight/es/languages/nim.min.js create mode 100644 static/base/highlight/es/languages/nix.min.js create mode 100644 static/base/highlight/es/languages/node-repl.min.js create mode 100644 static/base/highlight/es/languages/nsis.min.js create mode 100644 static/base/highlight/es/languages/objectivec.min.js create mode 100644 static/base/highlight/es/languages/ocaml.min.js create mode 100644 static/base/highlight/es/languages/openscad.min.js create mode 100644 static/base/highlight/es/languages/oxygene.min.js create mode 100644 static/base/highlight/es/languages/parser3.min.js create mode 100644 static/base/highlight/es/languages/perl.min.js create mode 100644 static/base/highlight/es/languages/pf.min.js create mode 100644 static/base/highlight/es/languages/pgsql.min.js create mode 100644 static/base/highlight/es/languages/php-template.min.js create mode 100644 static/base/highlight/es/languages/php.min.js create mode 100644 static/base/highlight/es/languages/plaintext.min.js create mode 100644 static/base/highlight/es/languages/pony.min.js create mode 100644 static/base/highlight/es/languages/powershell.min.js create mode 100644 static/base/highlight/es/languages/processing.min.js create mode 100644 static/base/highlight/es/languages/profile.min.js create mode 100644 static/base/highlight/es/languages/prolog.min.js create mode 100644 static/base/highlight/es/languages/properties.min.js create mode 100644 static/base/highlight/es/languages/protobuf.min.js create mode 100644 static/base/highlight/es/languages/puppet.min.js create mode 100644 static/base/highlight/es/languages/purebasic.min.js create mode 100644 static/base/highlight/es/languages/python-repl.min.js create mode 100644 static/base/highlight/es/languages/python.min.js create mode 100644 static/base/highlight/es/languages/q.min.js create mode 100644 static/base/highlight/es/languages/qml.min.js create mode 100644 static/base/highlight/es/languages/r.min.js create mode 100644 static/base/highlight/es/languages/reasonml.min.js create mode 100644 static/base/highlight/es/languages/rib.min.js create mode 100644 static/base/highlight/es/languages/roboconf.min.js create mode 100644 static/base/highlight/es/languages/routeros.min.js create mode 100644 static/base/highlight/es/languages/rsl.min.js create mode 100644 static/base/highlight/es/languages/ruby.min.js create mode 100644 static/base/highlight/es/languages/ruleslanguage.min.js create mode 100644 static/base/highlight/es/languages/rust.min.js create mode 100644 static/base/highlight/es/languages/sas.min.js create mode 100644 static/base/highlight/es/languages/scala.min.js create mode 100644 static/base/highlight/es/languages/scheme.min.js create mode 100644 static/base/highlight/es/languages/scilab.min.js create mode 100644 static/base/highlight/es/languages/scss.min.js create mode 100644 static/base/highlight/es/languages/shell.min.js create mode 100644 static/base/highlight/es/languages/smali.min.js create mode 100644 static/base/highlight/es/languages/smalltalk.min.js create mode 100644 static/base/highlight/es/languages/sml.min.js create mode 100644 static/base/highlight/es/languages/sqf.min.js create mode 100644 static/base/highlight/es/languages/sql.min.js create mode 100644 static/base/highlight/es/languages/stan.min.js create mode 100644 static/base/highlight/es/languages/stata.min.js create mode 100644 static/base/highlight/es/languages/step21.min.js create mode 100644 static/base/highlight/es/languages/stylus.min.js create mode 100644 static/base/highlight/es/languages/subunit.min.js create mode 100644 static/base/highlight/es/languages/swift.min.js create mode 100644 static/base/highlight/es/languages/taggerscript.min.js create mode 100644 static/base/highlight/es/languages/tap.min.js create mode 100644 static/base/highlight/es/languages/tcl.min.js create mode 100644 static/base/highlight/es/languages/thrift.min.js create mode 100644 static/base/highlight/es/languages/tp.min.js create mode 100644 static/base/highlight/es/languages/twig.min.js create mode 100644 static/base/highlight/es/languages/typescript.min.js create mode 100644 static/base/highlight/es/languages/vala.min.js create mode 100644 static/base/highlight/es/languages/vbnet.min.js create mode 100644 static/base/highlight/es/languages/vbscript-html.min.js create mode 100644 static/base/highlight/es/languages/vbscript.min.js create mode 100644 static/base/highlight/es/languages/verilog.min.js create mode 100644 static/base/highlight/es/languages/vhdl.min.js create mode 100644 static/base/highlight/es/languages/vim.min.js create mode 100644 static/base/highlight/es/languages/wasm.min.js create mode 100644 static/base/highlight/es/languages/wren.min.js create mode 100644 static/base/highlight/es/languages/x86asm.min.js create mode 100644 static/base/highlight/es/languages/xl.min.js create mode 100644 static/base/highlight/es/languages/xml.min.js create mode 100644 static/base/highlight/es/languages/xquery.min.js create mode 100644 static/base/highlight/es/languages/yaml.min.js create mode 100644 static/base/highlight/es/languages/zephir.min.js create mode 100644 static/base/highlight/es/package.json create mode 100644 static/base/highlight/highlight.js create mode 100644 static/base/highlight/highlight.min.js create mode 100644 static/base/highlight/languages/1c.min.js create mode 100644 static/base/highlight/languages/abnf.min.js create mode 100644 static/base/highlight/languages/accesslog.min.js create mode 100644 static/base/highlight/languages/actionscript.min.js create mode 100644 static/base/highlight/languages/ada.min.js create mode 100644 static/base/highlight/languages/angelscript.min.js create mode 100644 static/base/highlight/languages/apache.min.js create mode 100644 static/base/highlight/languages/applescript.min.js create mode 100644 static/base/highlight/languages/arcade.min.js create mode 100644 static/base/highlight/languages/arduino.min.js create mode 100644 static/base/highlight/languages/armasm.min.js create mode 100644 static/base/highlight/languages/asciidoc.min.js create mode 100644 static/base/highlight/languages/aspectj.min.js create mode 100644 static/base/highlight/languages/autohotkey.min.js create mode 100644 static/base/highlight/languages/autoit.min.js create mode 100644 static/base/highlight/languages/avrasm.min.js create mode 100644 static/base/highlight/languages/awk.min.js create mode 100644 static/base/highlight/languages/axapta.min.js create mode 100644 static/base/highlight/languages/bash.min.js create mode 100644 static/base/highlight/languages/basic.min.js create mode 100644 static/base/highlight/languages/bnf.min.js create mode 100644 static/base/highlight/languages/brainfuck.min.js create mode 100644 static/base/highlight/languages/c.min.js create mode 100644 static/base/highlight/languages/cal.min.js create mode 100644 static/base/highlight/languages/capnproto.min.js create mode 100644 static/base/highlight/languages/ceylon.min.js create mode 100644 static/base/highlight/languages/clean.min.js create mode 100644 static/base/highlight/languages/clojure-repl.min.js create mode 100644 static/base/highlight/languages/clojure.min.js create mode 100644 static/base/highlight/languages/cmake.min.js create mode 100644 static/base/highlight/languages/coffeescript.min.js create mode 100644 static/base/highlight/languages/coq.min.js create mode 100644 static/base/highlight/languages/cos.min.js create mode 100644 static/base/highlight/languages/cpp.min.js create mode 100644 static/base/highlight/languages/crmsh.min.js create mode 100644 static/base/highlight/languages/crystal.min.js create mode 100644 static/base/highlight/languages/csharp.min.js create mode 100644 static/base/highlight/languages/csp.min.js create mode 100644 static/base/highlight/languages/css.min.js create mode 100644 static/base/highlight/languages/d.min.js create mode 100644 static/base/highlight/languages/dart.min.js create mode 100644 static/base/highlight/languages/delphi.min.js create mode 100644 static/base/highlight/languages/diff.min.js create mode 100644 static/base/highlight/languages/django.min.js create mode 100644 static/base/highlight/languages/dns.min.js create mode 100644 static/base/highlight/languages/dockerfile.min.js create mode 100644 static/base/highlight/languages/dos.min.js create mode 100644 static/base/highlight/languages/dsconfig.min.js create mode 100644 static/base/highlight/languages/dts.min.js create mode 100644 static/base/highlight/languages/dust.min.js create mode 100644 static/base/highlight/languages/ebnf.min.js create mode 100644 static/base/highlight/languages/elixir.min.js create mode 100644 static/base/highlight/languages/elm.min.js create mode 100644 static/base/highlight/languages/erb.min.js create mode 100644 static/base/highlight/languages/erlang-repl.min.js create mode 100644 static/base/highlight/languages/erlang.min.js create mode 100644 static/base/highlight/languages/excel.min.js create mode 100644 static/base/highlight/languages/fix.min.js create mode 100644 static/base/highlight/languages/flix.min.js create mode 100644 static/base/highlight/languages/fortran.min.js create mode 100644 static/base/highlight/languages/fsharp.min.js create mode 100644 static/base/highlight/languages/gams.min.js create mode 100644 static/base/highlight/languages/gauss.min.js create mode 100644 static/base/highlight/languages/gcode.min.js create mode 100644 static/base/highlight/languages/gherkin.min.js create mode 100644 static/base/highlight/languages/glsl.min.js create mode 100644 static/base/highlight/languages/gml.min.js create mode 100644 static/base/highlight/languages/go.min.js create mode 100644 static/base/highlight/languages/golo.min.js create mode 100644 static/base/highlight/languages/gradle.min.js create mode 100644 static/base/highlight/languages/groovy.min.js create mode 100644 static/base/highlight/languages/haml.min.js create mode 100644 static/base/highlight/languages/handlebars.min.js create mode 100644 static/base/highlight/languages/haskell.min.js create mode 100644 static/base/highlight/languages/haxe.min.js create mode 100644 static/base/highlight/languages/hsp.min.js create mode 100644 static/base/highlight/languages/http.min.js create mode 100644 static/base/highlight/languages/hy.min.js create mode 100644 static/base/highlight/languages/inform7.min.js create mode 100644 static/base/highlight/languages/ini.min.js create mode 100644 static/base/highlight/languages/irpf90.min.js create mode 100644 static/base/highlight/languages/isbl.min.js create mode 100644 static/base/highlight/languages/java.min.js create mode 100644 static/base/highlight/languages/javascript.min.js create mode 100644 static/base/highlight/languages/jboss-cli.min.js create mode 100644 static/base/highlight/languages/json.min.js create mode 100644 static/base/highlight/languages/julia-repl.min.js create mode 100644 static/base/highlight/languages/julia.min.js create mode 100644 static/base/highlight/languages/kotlin.min.js create mode 100644 static/base/highlight/languages/lasso.min.js create mode 100644 static/base/highlight/languages/latex.min.js create mode 100644 static/base/highlight/languages/ldif.min.js create mode 100644 static/base/highlight/languages/leaf.min.js create mode 100644 static/base/highlight/languages/less.min.js create mode 100644 static/base/highlight/languages/lisp.min.js create mode 100644 static/base/highlight/languages/livecodeserver.min.js create mode 100644 static/base/highlight/languages/livescript.min.js create mode 100644 static/base/highlight/languages/llvm.min.js create mode 100644 static/base/highlight/languages/lsl.min.js create mode 100644 static/base/highlight/languages/lua.min.js create mode 100644 static/base/highlight/languages/makefile.min.js create mode 100644 static/base/highlight/languages/markdown.min.js create mode 100644 static/base/highlight/languages/mathematica.min.js create mode 100644 static/base/highlight/languages/matlab.min.js create mode 100644 static/base/highlight/languages/maxima.min.js create mode 100644 static/base/highlight/languages/mel.min.js create mode 100644 static/base/highlight/languages/mercury.min.js create mode 100644 static/base/highlight/languages/mipsasm.min.js create mode 100644 static/base/highlight/languages/mizar.min.js create mode 100644 static/base/highlight/languages/mojolicious.min.js create mode 100644 static/base/highlight/languages/monkey.min.js create mode 100644 static/base/highlight/languages/moonscript.min.js create mode 100644 static/base/highlight/languages/n1ql.min.js create mode 100644 static/base/highlight/languages/nestedtext.min.js create mode 100644 static/base/highlight/languages/nginx.min.js create mode 100644 static/base/highlight/languages/nim.min.js create mode 100644 static/base/highlight/languages/nix.min.js create mode 100644 static/base/highlight/languages/node-repl.min.js create mode 100644 static/base/highlight/languages/nsis.min.js create mode 100644 static/base/highlight/languages/objectivec.min.js create mode 100644 static/base/highlight/languages/ocaml.min.js create mode 100644 static/base/highlight/languages/openscad.min.js create mode 100644 static/base/highlight/languages/oxygene.min.js create mode 100644 static/base/highlight/languages/parser3.min.js create mode 100644 static/base/highlight/languages/perl.min.js create mode 100644 static/base/highlight/languages/pf.min.js create mode 100644 static/base/highlight/languages/pgsql.min.js create mode 100644 static/base/highlight/languages/php-template.min.js create mode 100644 static/base/highlight/languages/php.min.js create mode 100644 static/base/highlight/languages/plaintext.min.js create mode 100644 static/base/highlight/languages/pony.min.js create mode 100644 static/base/highlight/languages/powershell.min.js create mode 100644 static/base/highlight/languages/processing.min.js create mode 100644 static/base/highlight/languages/profile.min.js create mode 100644 static/base/highlight/languages/prolog.min.js create mode 100644 static/base/highlight/languages/properties.min.js create mode 100644 static/base/highlight/languages/protobuf.min.js create mode 100644 static/base/highlight/languages/puppet.min.js create mode 100644 static/base/highlight/languages/purebasic.min.js create mode 100644 static/base/highlight/languages/python-repl.min.js create mode 100644 static/base/highlight/languages/python.min.js create mode 100644 static/base/highlight/languages/q.min.js create mode 100644 static/base/highlight/languages/qml.min.js create mode 100644 static/base/highlight/languages/r.min.js create mode 100644 static/base/highlight/languages/reasonml.min.js create mode 100644 static/base/highlight/languages/rib.min.js create mode 100644 static/base/highlight/languages/roboconf.min.js create mode 100644 static/base/highlight/languages/routeros.min.js create mode 100644 static/base/highlight/languages/rsl.min.js create mode 100644 static/base/highlight/languages/ruby.min.js create mode 100644 static/base/highlight/languages/ruleslanguage.min.js create mode 100644 static/base/highlight/languages/rust.min.js create mode 100644 static/base/highlight/languages/sas.min.js create mode 100644 static/base/highlight/languages/scala.min.js create mode 100644 static/base/highlight/languages/scheme.min.js create mode 100644 static/base/highlight/languages/scilab.min.js create mode 100644 static/base/highlight/languages/scss.min.js create mode 100644 static/base/highlight/languages/shell.min.js create mode 100644 static/base/highlight/languages/smali.min.js create mode 100644 static/base/highlight/languages/smalltalk.min.js create mode 100644 static/base/highlight/languages/sml.min.js create mode 100644 static/base/highlight/languages/sqf.min.js create mode 100644 static/base/highlight/languages/sql.min.js create mode 100644 static/base/highlight/languages/stan.min.js create mode 100644 static/base/highlight/languages/stata.min.js create mode 100644 static/base/highlight/languages/step21.min.js create mode 100644 static/base/highlight/languages/stylus.min.js create mode 100644 static/base/highlight/languages/subunit.min.js create mode 100644 static/base/highlight/languages/swift.min.js create mode 100644 static/base/highlight/languages/taggerscript.min.js create mode 100644 static/base/highlight/languages/tap.min.js create mode 100644 static/base/highlight/languages/tcl.min.js create mode 100644 static/base/highlight/languages/thrift.min.js create mode 100644 static/base/highlight/languages/tp.min.js create mode 100644 static/base/highlight/languages/twig.min.js create mode 100644 static/base/highlight/languages/typescript.min.js create mode 100644 static/base/highlight/languages/vala.min.js create mode 100644 static/base/highlight/languages/vbnet.min.js create mode 100644 static/base/highlight/languages/vbscript-html.min.js create mode 100644 static/base/highlight/languages/vbscript.min.js create mode 100644 static/base/highlight/languages/verilog.min.js create mode 100644 static/base/highlight/languages/vhdl.min.js create mode 100644 static/base/highlight/languages/vim.min.js create mode 100644 static/base/highlight/languages/wasm.min.js create mode 100644 static/base/highlight/languages/wren.min.js create mode 100644 static/base/highlight/languages/x86asm.min.js create mode 100644 static/base/highlight/languages/xl.min.js create mode 100644 static/base/highlight/languages/xml.min.js create mode 100644 static/base/highlight/languages/xquery.min.js create mode 100644 static/base/highlight/languages/yaml.min.js create mode 100644 static/base/highlight/languages/zephir.min.js create mode 100644 static/base/highlight/package.json create mode 100644 static/base/highlight/styles/a11y-dark.css create mode 100644 static/base/highlight/styles/a11y-dark.min.css create mode 100644 static/base/highlight/styles/a11y-light.css create mode 100644 static/base/highlight/styles/a11y-light.min.css create mode 100644 static/base/highlight/styles/agate.css create mode 100644 static/base/highlight/styles/agate.min.css create mode 100644 static/base/highlight/styles/an-old-hope.css create mode 100644 static/base/highlight/styles/an-old-hope.min.css create mode 100644 static/base/highlight/styles/androidstudio.css create mode 100644 static/base/highlight/styles/androidstudio.min.css create mode 100644 static/base/highlight/styles/arduino-light.css create mode 100644 static/base/highlight/styles/arduino-light.min.css create mode 100644 static/base/highlight/styles/arta.css create mode 100644 static/base/highlight/styles/arta.min.css create mode 100644 static/base/highlight/styles/ascetic.css create mode 100644 static/base/highlight/styles/ascetic.min.css create mode 100644 static/base/highlight/styles/atom-one-dark-reasonable.css create mode 100644 static/base/highlight/styles/atom-one-dark-reasonable.min.css create mode 100644 static/base/highlight/styles/atom-one-dark.css create mode 100644 static/base/highlight/styles/atom-one-dark.min.css create mode 100644 static/base/highlight/styles/atom-one-light.css create mode 100644 static/base/highlight/styles/atom-one-light.min.css create mode 100644 static/base/highlight/styles/base16/3024.css create mode 100644 static/base/highlight/styles/base16/3024.min.css create mode 100644 static/base/highlight/styles/base16/apathy.css create mode 100644 static/base/highlight/styles/base16/apathy.min.css create mode 100644 static/base/highlight/styles/base16/apprentice.css create mode 100644 static/base/highlight/styles/base16/apprentice.min.css create mode 100644 static/base/highlight/styles/base16/ashes.css create mode 100644 static/base/highlight/styles/base16/ashes.min.css create mode 100644 static/base/highlight/styles/base16/atelier-cave-light.css create mode 100644 static/base/highlight/styles/base16/atelier-cave-light.min.css create mode 100644 static/base/highlight/styles/base16/atelier-cave.css create mode 100644 static/base/highlight/styles/base16/atelier-cave.min.css create mode 100644 static/base/highlight/styles/base16/atelier-dune-light.css create mode 100644 static/base/highlight/styles/base16/atelier-dune-light.min.css create mode 100644 static/base/highlight/styles/base16/atelier-dune.css create mode 100644 static/base/highlight/styles/base16/atelier-dune.min.css create mode 100644 static/base/highlight/styles/base16/atelier-estuary-light.css create mode 100644 static/base/highlight/styles/base16/atelier-estuary-light.min.css create mode 100644 static/base/highlight/styles/base16/atelier-estuary.css create mode 100644 static/base/highlight/styles/base16/atelier-estuary.min.css create mode 100644 static/base/highlight/styles/base16/atelier-forest-light.css create mode 100644 static/base/highlight/styles/base16/atelier-forest-light.min.css create mode 100644 static/base/highlight/styles/base16/atelier-forest.css create mode 100644 static/base/highlight/styles/base16/atelier-forest.min.css create mode 100644 static/base/highlight/styles/base16/atelier-heath-light.css create mode 100644 static/base/highlight/styles/base16/atelier-heath-light.min.css create mode 100644 static/base/highlight/styles/base16/atelier-heath.css create mode 100644 static/base/highlight/styles/base16/atelier-heath.min.css create mode 100644 static/base/highlight/styles/base16/atelier-lakeside-light.css create mode 100644 static/base/highlight/styles/base16/atelier-lakeside-light.min.css create mode 100644 static/base/highlight/styles/base16/atelier-lakeside.css create mode 100644 static/base/highlight/styles/base16/atelier-lakeside.min.css create mode 100644 static/base/highlight/styles/base16/atelier-plateau-light.css create mode 100644 static/base/highlight/styles/base16/atelier-plateau-light.min.css create mode 100644 static/base/highlight/styles/base16/atelier-plateau.css create mode 100644 static/base/highlight/styles/base16/atelier-plateau.min.css create mode 100644 static/base/highlight/styles/base16/atelier-savanna-light.css create mode 100644 static/base/highlight/styles/base16/atelier-savanna-light.min.css create mode 100644 static/base/highlight/styles/base16/atelier-savanna.css create mode 100644 static/base/highlight/styles/base16/atelier-savanna.min.css create mode 100644 static/base/highlight/styles/base16/atelier-seaside-light.css create mode 100644 static/base/highlight/styles/base16/atelier-seaside-light.min.css create mode 100644 static/base/highlight/styles/base16/atelier-seaside.css create mode 100644 static/base/highlight/styles/base16/atelier-seaside.min.css create mode 100644 static/base/highlight/styles/base16/atelier-sulphurpool-light.css create mode 100644 static/base/highlight/styles/base16/atelier-sulphurpool-light.min.css create mode 100644 static/base/highlight/styles/base16/atelier-sulphurpool.css create mode 100644 static/base/highlight/styles/base16/atelier-sulphurpool.min.css create mode 100644 static/base/highlight/styles/base16/atlas.css create mode 100644 static/base/highlight/styles/base16/atlas.min.css create mode 100644 static/base/highlight/styles/base16/bespin.css create mode 100644 static/base/highlight/styles/base16/bespin.min.css create mode 100644 static/base/highlight/styles/base16/black-metal-bathory.css create mode 100644 static/base/highlight/styles/base16/black-metal-bathory.min.css create mode 100644 static/base/highlight/styles/base16/black-metal-burzum.css create mode 100644 static/base/highlight/styles/base16/black-metal-burzum.min.css create mode 100644 static/base/highlight/styles/base16/black-metal-dark-funeral.css create mode 100644 static/base/highlight/styles/base16/black-metal-dark-funeral.min.css create mode 100644 static/base/highlight/styles/base16/black-metal-gorgoroth.css create mode 100644 static/base/highlight/styles/base16/black-metal-gorgoroth.min.css create mode 100644 static/base/highlight/styles/base16/black-metal-immortal.css create mode 100644 static/base/highlight/styles/base16/black-metal-immortal.min.css create mode 100644 static/base/highlight/styles/base16/black-metal-khold.css create mode 100644 static/base/highlight/styles/base16/black-metal-khold.min.css create mode 100644 static/base/highlight/styles/base16/black-metal-marduk.css create mode 100644 static/base/highlight/styles/base16/black-metal-marduk.min.css create mode 100644 static/base/highlight/styles/base16/black-metal-mayhem.css create mode 100644 static/base/highlight/styles/base16/black-metal-mayhem.min.css create mode 100644 static/base/highlight/styles/base16/black-metal-nile.css create mode 100644 static/base/highlight/styles/base16/black-metal-nile.min.css create mode 100644 static/base/highlight/styles/base16/black-metal-venom.css create mode 100644 static/base/highlight/styles/base16/black-metal-venom.min.css create mode 100644 static/base/highlight/styles/base16/black-metal.css create mode 100644 static/base/highlight/styles/base16/black-metal.min.css create mode 100644 static/base/highlight/styles/base16/brewer.css create mode 100644 static/base/highlight/styles/base16/brewer.min.css create mode 100644 static/base/highlight/styles/base16/bright.css create mode 100644 static/base/highlight/styles/base16/bright.min.css create mode 100644 static/base/highlight/styles/base16/brogrammer.css create mode 100644 static/base/highlight/styles/base16/brogrammer.min.css create mode 100644 static/base/highlight/styles/base16/brush-trees-dark.css create mode 100644 static/base/highlight/styles/base16/brush-trees-dark.min.css create mode 100644 static/base/highlight/styles/base16/brush-trees.css create mode 100644 static/base/highlight/styles/base16/brush-trees.min.css create mode 100644 static/base/highlight/styles/base16/chalk.css create mode 100644 static/base/highlight/styles/base16/chalk.min.css create mode 100644 static/base/highlight/styles/base16/circus.css create mode 100644 static/base/highlight/styles/base16/circus.min.css create mode 100644 static/base/highlight/styles/base16/classic-dark.css create mode 100644 static/base/highlight/styles/base16/classic-dark.min.css create mode 100644 static/base/highlight/styles/base16/classic-light.css create mode 100644 static/base/highlight/styles/base16/classic-light.min.css create mode 100644 static/base/highlight/styles/base16/codeschool.css create mode 100644 static/base/highlight/styles/base16/codeschool.min.css create mode 100644 static/base/highlight/styles/base16/colors.css create mode 100644 static/base/highlight/styles/base16/colors.min.css create mode 100644 static/base/highlight/styles/base16/cupcake.css create mode 100644 static/base/highlight/styles/base16/cupcake.min.css create mode 100644 static/base/highlight/styles/base16/cupertino.css create mode 100644 static/base/highlight/styles/base16/cupertino.min.css create mode 100644 static/base/highlight/styles/base16/danqing.css create mode 100644 static/base/highlight/styles/base16/danqing.min.css create mode 100644 static/base/highlight/styles/base16/darcula.css create mode 100644 static/base/highlight/styles/base16/darcula.min.css create mode 100644 static/base/highlight/styles/base16/dark-violet.css create mode 100644 static/base/highlight/styles/base16/dark-violet.min.css create mode 100644 static/base/highlight/styles/base16/darkmoss.css create mode 100644 static/base/highlight/styles/base16/darkmoss.min.css create mode 100644 static/base/highlight/styles/base16/darktooth.css create mode 100644 static/base/highlight/styles/base16/darktooth.min.css create mode 100644 static/base/highlight/styles/base16/decaf.css create mode 100644 static/base/highlight/styles/base16/decaf.min.css create mode 100644 static/base/highlight/styles/base16/default-dark.css create mode 100644 static/base/highlight/styles/base16/default-dark.min.css create mode 100644 static/base/highlight/styles/base16/default-light.css create mode 100644 static/base/highlight/styles/base16/default-light.min.css create mode 100644 static/base/highlight/styles/base16/dirtysea.css create mode 100644 static/base/highlight/styles/base16/dirtysea.min.css create mode 100644 static/base/highlight/styles/base16/dracula.css create mode 100644 static/base/highlight/styles/base16/dracula.min.css create mode 100644 static/base/highlight/styles/base16/edge-dark.css create mode 100644 static/base/highlight/styles/base16/edge-dark.min.css create mode 100644 static/base/highlight/styles/base16/edge-light.css create mode 100644 static/base/highlight/styles/base16/edge-light.min.css create mode 100644 static/base/highlight/styles/base16/eighties.css create mode 100644 static/base/highlight/styles/base16/eighties.min.css create mode 100644 static/base/highlight/styles/base16/embers.css create mode 100644 static/base/highlight/styles/base16/embers.min.css create mode 100644 static/base/highlight/styles/base16/equilibrium-dark.css create mode 100644 static/base/highlight/styles/base16/equilibrium-dark.min.css create mode 100644 static/base/highlight/styles/base16/equilibrium-gray-dark.css create mode 100644 static/base/highlight/styles/base16/equilibrium-gray-dark.min.css create mode 100644 static/base/highlight/styles/base16/equilibrium-gray-light.css create mode 100644 static/base/highlight/styles/base16/equilibrium-gray-light.min.css create mode 100644 static/base/highlight/styles/base16/equilibrium-light.css create mode 100644 static/base/highlight/styles/base16/equilibrium-light.min.css create mode 100644 static/base/highlight/styles/base16/espresso.css create mode 100644 static/base/highlight/styles/base16/espresso.min.css create mode 100644 static/base/highlight/styles/base16/eva-dim.css create mode 100644 static/base/highlight/styles/base16/eva-dim.min.css create mode 100644 static/base/highlight/styles/base16/eva.css create mode 100644 static/base/highlight/styles/base16/eva.min.css create mode 100644 static/base/highlight/styles/base16/flat.css create mode 100644 static/base/highlight/styles/base16/flat.min.css create mode 100644 static/base/highlight/styles/base16/framer.css create mode 100644 static/base/highlight/styles/base16/framer.min.css create mode 100644 static/base/highlight/styles/base16/fruit-soda.css create mode 100644 static/base/highlight/styles/base16/fruit-soda.min.css create mode 100644 static/base/highlight/styles/base16/gigavolt.css create mode 100644 static/base/highlight/styles/base16/gigavolt.min.css create mode 100644 static/base/highlight/styles/base16/github.css create mode 100644 static/base/highlight/styles/base16/github.min.css create mode 100644 static/base/highlight/styles/base16/google-dark.css create mode 100644 static/base/highlight/styles/base16/google-dark.min.css create mode 100644 static/base/highlight/styles/base16/google-light.css create mode 100644 static/base/highlight/styles/base16/google-light.min.css create mode 100644 static/base/highlight/styles/base16/grayscale-dark.css create mode 100644 static/base/highlight/styles/base16/grayscale-dark.min.css create mode 100644 static/base/highlight/styles/base16/grayscale-light.css create mode 100644 static/base/highlight/styles/base16/grayscale-light.min.css create mode 100644 static/base/highlight/styles/base16/green-screen.css create mode 100644 static/base/highlight/styles/base16/green-screen.min.css create mode 100644 static/base/highlight/styles/base16/gruvbox-dark-hard.css create mode 100644 static/base/highlight/styles/base16/gruvbox-dark-hard.min.css create mode 100644 static/base/highlight/styles/base16/gruvbox-dark-medium.css create mode 100644 static/base/highlight/styles/base16/gruvbox-dark-medium.min.css create mode 100644 static/base/highlight/styles/base16/gruvbox-dark-pale.css create mode 100644 static/base/highlight/styles/base16/gruvbox-dark-pale.min.css create mode 100644 static/base/highlight/styles/base16/gruvbox-dark-soft.css create mode 100644 static/base/highlight/styles/base16/gruvbox-dark-soft.min.css create mode 100644 static/base/highlight/styles/base16/gruvbox-light-hard.css create mode 100644 static/base/highlight/styles/base16/gruvbox-light-hard.min.css create mode 100644 static/base/highlight/styles/base16/gruvbox-light-medium.css create mode 100644 static/base/highlight/styles/base16/gruvbox-light-medium.min.css create mode 100644 static/base/highlight/styles/base16/gruvbox-light-soft.css create mode 100644 static/base/highlight/styles/base16/gruvbox-light-soft.min.css create mode 100644 static/base/highlight/styles/base16/hardcore.css create mode 100644 static/base/highlight/styles/base16/hardcore.min.css create mode 100644 static/base/highlight/styles/base16/harmonic16-dark.css create mode 100644 static/base/highlight/styles/base16/harmonic16-dark.min.css create mode 100644 static/base/highlight/styles/base16/harmonic16-light.css create mode 100644 static/base/highlight/styles/base16/harmonic16-light.min.css create mode 100644 static/base/highlight/styles/base16/heetch-dark.css create mode 100644 static/base/highlight/styles/base16/heetch-dark.min.css create mode 100644 static/base/highlight/styles/base16/heetch-light.css create mode 100644 static/base/highlight/styles/base16/heetch-light.min.css create mode 100644 static/base/highlight/styles/base16/helios.css create mode 100644 static/base/highlight/styles/base16/helios.min.css create mode 100644 static/base/highlight/styles/base16/hopscotch.css create mode 100644 static/base/highlight/styles/base16/hopscotch.min.css create mode 100644 static/base/highlight/styles/base16/horizon-dark.css create mode 100644 static/base/highlight/styles/base16/horizon-dark.min.css create mode 100644 static/base/highlight/styles/base16/horizon-light.css create mode 100644 static/base/highlight/styles/base16/horizon-light.min.css create mode 100644 static/base/highlight/styles/base16/humanoid-dark.css create mode 100644 static/base/highlight/styles/base16/humanoid-dark.min.css create mode 100644 static/base/highlight/styles/base16/humanoid-light.css create mode 100644 static/base/highlight/styles/base16/humanoid-light.min.css create mode 100644 static/base/highlight/styles/base16/ia-dark.css create mode 100644 static/base/highlight/styles/base16/ia-dark.min.css create mode 100644 static/base/highlight/styles/base16/ia-light.css create mode 100644 static/base/highlight/styles/base16/ia-light.min.css create mode 100644 static/base/highlight/styles/base16/icy-dark.css create mode 100644 static/base/highlight/styles/base16/icy-dark.min.css create mode 100644 static/base/highlight/styles/base16/ir-black.css create mode 100644 static/base/highlight/styles/base16/ir-black.min.css create mode 100644 static/base/highlight/styles/base16/isotope.css create mode 100644 static/base/highlight/styles/base16/isotope.min.css create mode 100644 static/base/highlight/styles/base16/kimber.css create mode 100644 static/base/highlight/styles/base16/kimber.min.css create mode 100644 static/base/highlight/styles/base16/london-tube.css create mode 100644 static/base/highlight/styles/base16/london-tube.min.css create mode 100644 static/base/highlight/styles/base16/macintosh.css create mode 100644 static/base/highlight/styles/base16/macintosh.min.css create mode 100644 static/base/highlight/styles/base16/marrakesh.css create mode 100644 static/base/highlight/styles/base16/marrakesh.min.css create mode 100644 static/base/highlight/styles/base16/materia.css create mode 100644 static/base/highlight/styles/base16/materia.min.css create mode 100644 static/base/highlight/styles/base16/material-darker.css create mode 100644 static/base/highlight/styles/base16/material-darker.min.css create mode 100644 static/base/highlight/styles/base16/material-lighter.css create mode 100644 static/base/highlight/styles/base16/material-lighter.min.css create mode 100644 static/base/highlight/styles/base16/material-palenight.css create mode 100644 static/base/highlight/styles/base16/material-palenight.min.css create mode 100644 static/base/highlight/styles/base16/material-vivid.css create mode 100644 static/base/highlight/styles/base16/material-vivid.min.css create mode 100644 static/base/highlight/styles/base16/material.css create mode 100644 static/base/highlight/styles/base16/material.min.css create mode 100644 static/base/highlight/styles/base16/mellow-purple.css create mode 100644 static/base/highlight/styles/base16/mellow-purple.min.css create mode 100644 static/base/highlight/styles/base16/mexico-light.css create mode 100644 static/base/highlight/styles/base16/mexico-light.min.css create mode 100644 static/base/highlight/styles/base16/mocha.css create mode 100644 static/base/highlight/styles/base16/mocha.min.css create mode 100644 static/base/highlight/styles/base16/monokai.css create mode 100644 static/base/highlight/styles/base16/monokai.min.css create mode 100644 static/base/highlight/styles/base16/nebula.css create mode 100644 static/base/highlight/styles/base16/nebula.min.css create mode 100644 static/base/highlight/styles/base16/nord.css create mode 100644 static/base/highlight/styles/base16/nord.min.css create mode 100644 static/base/highlight/styles/base16/nova.css create mode 100644 static/base/highlight/styles/base16/nova.min.css create mode 100644 static/base/highlight/styles/base16/ocean.css create mode 100644 static/base/highlight/styles/base16/ocean.min.css create mode 100644 static/base/highlight/styles/base16/oceanicnext.css create mode 100644 static/base/highlight/styles/base16/oceanicnext.min.css create mode 100644 static/base/highlight/styles/base16/one-light.css create mode 100644 static/base/highlight/styles/base16/one-light.min.css create mode 100644 static/base/highlight/styles/base16/onedark.css create mode 100644 static/base/highlight/styles/base16/onedark.min.css create mode 100644 static/base/highlight/styles/base16/outrun-dark.css create mode 100644 static/base/highlight/styles/base16/outrun-dark.min.css create mode 100644 static/base/highlight/styles/base16/papercolor-dark.css create mode 100644 static/base/highlight/styles/base16/papercolor-dark.min.css create mode 100644 static/base/highlight/styles/base16/papercolor-light.css create mode 100644 static/base/highlight/styles/base16/papercolor-light.min.css create mode 100644 static/base/highlight/styles/base16/paraiso.css create mode 100644 static/base/highlight/styles/base16/paraiso.min.css create mode 100644 static/base/highlight/styles/base16/pasque.css create mode 100644 static/base/highlight/styles/base16/pasque.min.css create mode 100644 static/base/highlight/styles/base16/phd.css create mode 100644 static/base/highlight/styles/base16/phd.min.css create mode 100644 static/base/highlight/styles/base16/pico.css create mode 100644 static/base/highlight/styles/base16/pico.min.css create mode 100644 static/base/highlight/styles/base16/pop.css create mode 100644 static/base/highlight/styles/base16/pop.min.css create mode 100644 static/base/highlight/styles/base16/porple.css create mode 100644 static/base/highlight/styles/base16/porple.min.css create mode 100644 static/base/highlight/styles/base16/qualia.css create mode 100644 static/base/highlight/styles/base16/qualia.min.css create mode 100644 static/base/highlight/styles/base16/railscasts.css create mode 100644 static/base/highlight/styles/base16/railscasts.min.css create mode 100644 static/base/highlight/styles/base16/rebecca.css create mode 100644 static/base/highlight/styles/base16/rebecca.min.css create mode 100644 static/base/highlight/styles/base16/ros-pine-dawn.css create mode 100644 static/base/highlight/styles/base16/ros-pine-dawn.min.css create mode 100644 static/base/highlight/styles/base16/ros-pine-moon.css create mode 100644 static/base/highlight/styles/base16/ros-pine-moon.min.css create mode 100644 static/base/highlight/styles/base16/ros-pine.css create mode 100644 static/base/highlight/styles/base16/ros-pine.min.css create mode 100644 static/base/highlight/styles/base16/sagelight.css create mode 100644 static/base/highlight/styles/base16/sagelight.min.css create mode 100644 static/base/highlight/styles/base16/sandcastle.css create mode 100644 static/base/highlight/styles/base16/sandcastle.min.css create mode 100644 static/base/highlight/styles/base16/seti-ui.css create mode 100644 static/base/highlight/styles/base16/seti-ui.min.css create mode 100644 static/base/highlight/styles/base16/shapeshifter.css create mode 100644 static/base/highlight/styles/base16/shapeshifter.min.css create mode 100644 static/base/highlight/styles/base16/silk-dark.css create mode 100644 static/base/highlight/styles/base16/silk-dark.min.css create mode 100644 static/base/highlight/styles/base16/silk-light.css create mode 100644 static/base/highlight/styles/base16/silk-light.min.css create mode 100644 static/base/highlight/styles/base16/snazzy.css create mode 100644 static/base/highlight/styles/base16/snazzy.min.css create mode 100644 static/base/highlight/styles/base16/solar-flare-light.css create mode 100644 static/base/highlight/styles/base16/solar-flare-light.min.css create mode 100644 static/base/highlight/styles/base16/solar-flare.css create mode 100644 static/base/highlight/styles/base16/solar-flare.min.css create mode 100644 static/base/highlight/styles/base16/solarized-dark.css create mode 100644 static/base/highlight/styles/base16/solarized-dark.min.css create mode 100644 static/base/highlight/styles/base16/solarized-light.css create mode 100644 static/base/highlight/styles/base16/solarized-light.min.css create mode 100644 static/base/highlight/styles/base16/spacemacs.css create mode 100644 static/base/highlight/styles/base16/spacemacs.min.css create mode 100644 static/base/highlight/styles/base16/summercamp.css create mode 100644 static/base/highlight/styles/base16/summercamp.min.css create mode 100644 static/base/highlight/styles/base16/summerfruit-dark.css create mode 100644 static/base/highlight/styles/base16/summerfruit-dark.min.css create mode 100644 static/base/highlight/styles/base16/summerfruit-light.css create mode 100644 static/base/highlight/styles/base16/summerfruit-light.min.css create mode 100644 static/base/highlight/styles/base16/synth-midnight-terminal-dark.css create mode 100644 static/base/highlight/styles/base16/synth-midnight-terminal-dark.min.css create mode 100644 static/base/highlight/styles/base16/synth-midnight-terminal-light.css create mode 100644 static/base/highlight/styles/base16/synth-midnight-terminal-light.min.css create mode 100644 static/base/highlight/styles/base16/tango.css create mode 100644 static/base/highlight/styles/base16/tango.min.css create mode 100644 static/base/highlight/styles/base16/tender.css create mode 100644 static/base/highlight/styles/base16/tender.min.css create mode 100644 static/base/highlight/styles/base16/tomorrow-night.css create mode 100644 static/base/highlight/styles/base16/tomorrow-night.min.css create mode 100644 static/base/highlight/styles/base16/tomorrow.css create mode 100644 static/base/highlight/styles/base16/tomorrow.min.css create mode 100644 static/base/highlight/styles/base16/twilight.css create mode 100644 static/base/highlight/styles/base16/twilight.min.css create mode 100644 static/base/highlight/styles/base16/unikitty-dark.css create mode 100644 static/base/highlight/styles/base16/unikitty-dark.min.css create mode 100644 static/base/highlight/styles/base16/unikitty-light.css create mode 100644 static/base/highlight/styles/base16/unikitty-light.min.css create mode 100644 static/base/highlight/styles/base16/vulcan.css create mode 100644 static/base/highlight/styles/base16/vulcan.min.css create mode 100644 static/base/highlight/styles/base16/windows-10-light.css create mode 100644 static/base/highlight/styles/base16/windows-10-light.min.css create mode 100644 static/base/highlight/styles/base16/windows-10.css create mode 100644 static/base/highlight/styles/base16/windows-10.min.css create mode 100644 static/base/highlight/styles/base16/windows-95-light.css create mode 100644 static/base/highlight/styles/base16/windows-95-light.min.css create mode 100644 static/base/highlight/styles/base16/windows-95.css create mode 100644 static/base/highlight/styles/base16/windows-95.min.css create mode 100644 static/base/highlight/styles/base16/windows-high-contrast-light.css create mode 100644 static/base/highlight/styles/base16/windows-high-contrast-light.min.css create mode 100644 static/base/highlight/styles/base16/windows-high-contrast.css create mode 100644 static/base/highlight/styles/base16/windows-high-contrast.min.css create mode 100644 static/base/highlight/styles/base16/windows-nt-light.css create mode 100644 static/base/highlight/styles/base16/windows-nt-light.min.css create mode 100644 static/base/highlight/styles/base16/windows-nt.css create mode 100644 static/base/highlight/styles/base16/windows-nt.min.css create mode 100644 static/base/highlight/styles/base16/woodland.css create mode 100644 static/base/highlight/styles/base16/woodland.min.css create mode 100644 static/base/highlight/styles/base16/xcode-dusk.css create mode 100644 static/base/highlight/styles/base16/xcode-dusk.min.css create mode 100644 static/base/highlight/styles/base16/zenburn.css create mode 100644 static/base/highlight/styles/base16/zenburn.min.css create mode 100644 static/base/highlight/styles/brown-paper.css create mode 100644 static/base/highlight/styles/brown-paper.min.css create mode 100644 static/base/highlight/styles/brown-papersq.png create mode 100644 static/base/highlight/styles/codepen-embed.css create mode 100644 static/base/highlight/styles/codepen-embed.min.css create mode 100644 static/base/highlight/styles/color-brewer.css create mode 100644 static/base/highlight/styles/color-brewer.min.css create mode 100644 static/base/highlight/styles/dark.css create mode 100644 static/base/highlight/styles/dark.min.css create mode 100644 static/base/highlight/styles/default.css create mode 100644 static/base/highlight/styles/default.min.css create mode 100644 static/base/highlight/styles/devibeans.css create mode 100644 static/base/highlight/styles/devibeans.min.css create mode 100644 static/base/highlight/styles/docco.css create mode 100644 static/base/highlight/styles/docco.min.css create mode 100644 static/base/highlight/styles/far.css create mode 100644 static/base/highlight/styles/far.min.css create mode 100644 static/base/highlight/styles/felipec.css create mode 100644 static/base/highlight/styles/felipec.min.css create mode 100644 static/base/highlight/styles/foundation.css create mode 100644 static/base/highlight/styles/foundation.min.css create mode 100644 static/base/highlight/styles/github-dark-dimmed.css create mode 100644 static/base/highlight/styles/github-dark-dimmed.min.css create mode 100644 static/base/highlight/styles/github-dark.css create mode 100644 static/base/highlight/styles/github-dark.min.css create mode 100644 static/base/highlight/styles/github.css create mode 100644 static/base/highlight/styles/github.min.css create mode 100644 static/base/highlight/styles/gml.css create mode 100644 static/base/highlight/styles/gml.min.css create mode 100644 static/base/highlight/styles/googlecode.css create mode 100644 static/base/highlight/styles/googlecode.min.css create mode 100644 static/base/highlight/styles/gradient-dark.css create mode 100644 static/base/highlight/styles/gradient-dark.min.css create mode 100644 static/base/highlight/styles/gradient-light.css create mode 100644 static/base/highlight/styles/gradient-light.min.css create mode 100644 static/base/highlight/styles/grayscale.css create mode 100644 static/base/highlight/styles/grayscale.min.css create mode 100644 static/base/highlight/styles/hybrid.css create mode 100644 static/base/highlight/styles/hybrid.min.css create mode 100644 static/base/highlight/styles/idea.css create mode 100644 static/base/highlight/styles/idea.min.css create mode 100644 static/base/highlight/styles/intellij-light.css create mode 100644 static/base/highlight/styles/intellij-light.min.css create mode 100644 static/base/highlight/styles/ir-black.css create mode 100644 static/base/highlight/styles/ir-black.min.css create mode 100644 static/base/highlight/styles/isbl-editor-dark.css create mode 100644 static/base/highlight/styles/isbl-editor-dark.min.css create mode 100644 static/base/highlight/styles/isbl-editor-light.css create mode 100644 static/base/highlight/styles/isbl-editor-light.min.css create mode 100644 static/base/highlight/styles/kimbie-dark.css create mode 100644 static/base/highlight/styles/kimbie-dark.min.css create mode 100644 static/base/highlight/styles/kimbie-light.css create mode 100644 static/base/highlight/styles/kimbie-light.min.css create mode 100644 static/base/highlight/styles/lightfair.css create mode 100644 static/base/highlight/styles/lightfair.min.css create mode 100644 static/base/highlight/styles/lioshi.css create mode 100644 static/base/highlight/styles/lioshi.min.css create mode 100644 static/base/highlight/styles/magula.css create mode 100644 static/base/highlight/styles/magula.min.css create mode 100644 static/base/highlight/styles/mono-blue.css create mode 100644 static/base/highlight/styles/mono-blue.min.css create mode 100644 static/base/highlight/styles/monokai-sublime.css create mode 100644 static/base/highlight/styles/monokai-sublime.min.css create mode 100644 static/base/highlight/styles/monokai.css create mode 100644 static/base/highlight/styles/monokai.min.css create mode 100644 static/base/highlight/styles/night-owl.css create mode 100644 static/base/highlight/styles/night-owl.min.css create mode 100644 static/base/highlight/styles/nnfx-dark.css create mode 100644 static/base/highlight/styles/nnfx-dark.min.css create mode 100644 static/base/highlight/styles/nnfx-light.css create mode 100644 static/base/highlight/styles/nnfx-light.min.css create mode 100644 static/base/highlight/styles/nord.css create mode 100644 static/base/highlight/styles/nord.min.css create mode 100644 static/base/highlight/styles/obsidian.css create mode 100644 static/base/highlight/styles/obsidian.min.css create mode 100644 static/base/highlight/styles/panda-syntax-dark.css create mode 100644 static/base/highlight/styles/panda-syntax-dark.min.css create mode 100644 static/base/highlight/styles/panda-syntax-light.css create mode 100644 static/base/highlight/styles/panda-syntax-light.min.css create mode 100644 static/base/highlight/styles/paraiso-dark.css create mode 100644 static/base/highlight/styles/paraiso-dark.min.css create mode 100644 static/base/highlight/styles/paraiso-light.css create mode 100644 static/base/highlight/styles/paraiso-light.min.css create mode 100644 static/base/highlight/styles/pojoaque.css create mode 100644 static/base/highlight/styles/pojoaque.jpg create mode 100644 static/base/highlight/styles/pojoaque.min.css create mode 100644 static/base/highlight/styles/purebasic.css create mode 100644 static/base/highlight/styles/purebasic.min.css create mode 100644 static/base/highlight/styles/qtcreator-dark.css create mode 100644 static/base/highlight/styles/qtcreator-dark.min.css create mode 100644 static/base/highlight/styles/qtcreator-light.css create mode 100644 static/base/highlight/styles/qtcreator-light.min.css create mode 100644 static/base/highlight/styles/rainbow.css create mode 100644 static/base/highlight/styles/rainbow.min.css create mode 100644 static/base/highlight/styles/routeros.css create mode 100644 static/base/highlight/styles/routeros.min.css create mode 100644 static/base/highlight/styles/school-book.css create mode 100644 static/base/highlight/styles/school-book.min.css create mode 100644 static/base/highlight/styles/shades-of-purple.css create mode 100644 static/base/highlight/styles/shades-of-purple.min.css create mode 100644 static/base/highlight/styles/srcery.css create mode 100644 static/base/highlight/styles/srcery.min.css create mode 100644 static/base/highlight/styles/stackoverflow-dark.css create mode 100644 static/base/highlight/styles/stackoverflow-dark.min.css create mode 100644 static/base/highlight/styles/stackoverflow-light.css create mode 100644 static/base/highlight/styles/stackoverflow-light.min.css create mode 100644 static/base/highlight/styles/sunburst.css create mode 100644 static/base/highlight/styles/sunburst.min.css create mode 100644 static/base/highlight/styles/tokyo-night-dark.css create mode 100644 static/base/highlight/styles/tokyo-night-dark.min.css create mode 100644 static/base/highlight/styles/tokyo-night-light.css create mode 100644 static/base/highlight/styles/tokyo-night-light.min.css create mode 100644 static/base/highlight/styles/tomorrow-night-blue.css create mode 100644 static/base/highlight/styles/tomorrow-night-blue.min.css create mode 100644 static/base/highlight/styles/tomorrow-night-bright.css create mode 100644 static/base/highlight/styles/tomorrow-night-bright.min.css create mode 100644 static/base/highlight/styles/vs.css create mode 100644 static/base/highlight/styles/vs.min.css create mode 100644 static/base/highlight/styles/vs2015.css create mode 100644 static/base/highlight/styles/vs2015.min.css create mode 100644 static/base/highlight/styles/xcode.css create mode 100644 static/base/highlight/styles/xcode.min.css create mode 100644 static/base/highlight/styles/xt256.css create mode 100644 static/base/highlight/styles/xt256.min.css create mode 100644 static/base/img/back-btn-bg.png create mode 100644 static/base/img/breadcrumbs-bg.png create mode 100644 static/base/img/checkerboard-bg.png create mode 100644 static/base/img/depression-shadow-top.png create mode 100644 static/base/img/dropdown-bg.png create mode 100644 static/base/img/email-icon.png create mode 100644 static/base/img/featured-box-bg.png create mode 100644 static/base/img/feed-bg-white.png create mode 100644 static/base/img/feed.png create mode 100644 static/base/img/feed.svg create mode 100644 static/base/img/h-separator-dark.png create mode 100644 static/base/img/h-separator.png create mode 100644 static/base/img/hf-logo.png create mode 100644 static/base/img/icon.png create mode 100644 static/base/img/icon.svg create mode 100644 static/base/img/link-arrow.png create mode 100644 static/base/img/menu-btn-bg.png create mode 100644 static/base/img/menu-item-active-bg.png create mode 100644 static/base/img/more-info-bg.png create mode 100644 static/base/img/noise-bg.png create mode 100644 static/base/img/white-star.png create mode 100644 static/base/js/jquery-3.1.1.min.js create mode 100644 static/blog/css/post.css create mode 100644 static/blog/files/gigabyte-ga-g41m-es2l/gigabyte-ga-g41m-es2l_coreboot-4-15-grub-2-04-with-cpu-microcode.rom create mode 100644 static/blog/files/x200/lenovo-thinkpad-x200_coreboot-4-15-grub-master-with-cpu-microcode.rom create mode 100644 static/blog/files/x220/lenovo-thinkpad-x220_coreboot-4-15-grub-master-with-cpu-microcode.rom create mode 100644 static/blog/files/x230/lenovo-thinkpad-x230_coreboot-4-15-grub-master-with-cpu-microcode-bottom.rom create mode 100644 static/blog/files/x230/lenovo-thinkpad-x230_coreboot-4-15-grub-master-with-cpu-microcode-top.rom create mode 100644 static/blog/media/gigabyte-ga-g41m-es2l/01-prerequisites.jpg create mode 100644 static/blog/media/gigabyte-ga-g41m-es2l/02-gigabyte-ga-g41m-es2l-internals.jpg create mode 100644 static/blog/media/gigabyte-ga-g41m-es2l/03-ch341a-programmer-connected.jpg create mode 100644 static/blog/media/gigabyte-ga-g41m-es2l/dejavusansmono.pf2 create mode 100755 static/blog/media/gigabyte-ga-g41m-es2l/grub.cfg create mode 100644 static/blog/media/raspberry-pi/01-prerequisites.jpg create mode 100644 static/blog/media/raspberry-pi/raspberry-pi-3-model-b-gpio-pinout.jpg create mode 100644 static/blog/media/x200/01-prerequisites.jpg create mode 100644 static/blog/media/x200/02-lenovo-thinkpad-x200-internals.jpg create mode 100644 static/blog/media/x200/03-raspberry-pi-connected.jpg create mode 100644 static/blog/media/x200/background.jpg create mode 100644 static/blog/media/x200/dejavusansmono.pf2 create mode 100644 static/blog/media/x200/grub.cfg create mode 100644 static/blog/media/x220/01-prerequisites.jpg create mode 100644 static/blog/media/x220/02-lenovo-thinkpad-x220-internals.jpg create mode 100644 static/blog/media/x220/03-ch341a-programmer-connected.jpg create mode 100644 static/blog/media/x220/background.jpg create mode 100644 static/blog/media/x220/dejavusansmono.pf2 create mode 100644 static/blog/media/x220/grub.cfg create mode 100644 static/blog/media/x230/01-prerequisites.jpg create mode 100644 static/blog/media/x230/02-lenovo-thinkpad-x230-internals.jpg create mode 100644 static/blog/media/x230/03-raspberry-pi-connected.jpg create mode 100644 static/blog/media/x230/background.jpg create mode 100644 static/blog/media/x230/dejavusansmono.pf2 create mode 100644 static/blog/media/x230/grub.cfg create mode 100644 static/gnupg-pubkeys/andreas-pubkey.asc create mode 100644 static/media/img/hfge_screenshot_big_1.png create mode 100644 static/media/img/hfge_screenshot_big_2.png create mode 100644 static/media/img/hfge_screenshot_big_3.png create mode 100644 static/media/img/hfge_screenshot_big_4.png create mode 100644 static/media/img/hfge_screenshot_big_5.png create mode 100644 static/media/img/hfge_screenshot_big_6.png create mode 100644 static/media/img/hfge_screenshot_min_1.png create mode 100644 static/media/img/hfge_screenshot_min_2.png create mode 100644 static/media/img/hfge_screenshot_min_3.png create mode 100644 static/media/img/hfge_screenshot_min_4.png create mode 100644 static/media/img/hfge_screenshot_min_5.png create mode 100644 static/media/img/hfge_screenshot_min_6.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dcaf716 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +index.html diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..dba13ed --- /dev/null +++ b/COPYING @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/README b/README new file mode 100644 index 0000000..c4a7954 --- /dev/null +++ b/README @@ -0,0 +1,79 @@ +Harmonic Flow website +===================== + +The Harmonic Flow website available at https://www.harmonicflow.org/ is a static +website built with Haunt available from here: + + https://dthompson.us/projects/haunt.html + +This directory contains the source files of the website. This website is a +modified and simplified version of the freely available GNU Guix website source +code available from here: + + https://git.savannah.gnu.org/cgit/guix/guix-artwork.git/tree/website + +This modified website source code is therefore licensed under the same license +(see COPYING). + + +Development environment +======================= + +This website is developed using the GNU Guix package manager. + +Run the following command to install Guix package manager on a Debian GNU/Linux +like system: + + sudo apt install guix + +Run the following command to install all the software needed to build the +website: + + guix package -m manifest.scm + +*Note*: the packages guix and haunt should have the same version of Guile, +otherwise building the website is slow and raises bunch of warnings. The +manifest file takes care. + + +Running the website +=================== + +To try out the website locally while you work on it, run the following commands: + + cd path/to/hf-web + LANG=en_US.UTF-8 HFGE_WEB_SITE_LOCAL=yes guix environment -C -m manifest.scm -E LANG -E HFGE_WEB_SITE_LOCAL --share=/tmp -- haunt build + +Using above command, the raw generated HTML files can be found here: + + /tmp/harmonicflow.org/public_html + + +Serve locally +============= + +Run the following command to serve locally: + + LANG=en_US.UTF-8 guix environment -CN -m manifest.scm -E LANG --share=/tmp -- haunt serve -w + +Then, visit the following url in a web browser: + + http://localhost:8080/en/index.html + +You can stop the server pressing CTRL+c twice. + + +Copying +======= + +See the file 'COPYING' for license information. + + +Graphics +======== + +Public domain 2015 Luis Felipe LУГpez Acevedo and Andreas Widen 2023. + +All the graphics in this directory are dedicated to the public domain, except +for the Harmonic Flow logo (navigation bar logo to the left), which can be used +under the Creative Commons Attribution-ShareAlike 4.0 International License. diff --git a/apps/aux/lists.scm b/apps/aux/lists.scm new file mode 100644 index 0000000..634d1e4 --- /dev/null +++ b/apps/aux/lists.scm @@ -0,0 +1,67 @@ +;;; Harmonic Flow web site + +(define-module (apps aux lists) + #:use-module (apps aux numbers) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-27) + #:export (list-group + list-slice + rest + separate + take-random)) + + +(define (list-group los limit) + (map (lambda (index) + (list-slice los index (+ index limit))) + ;; TODO: Use a skip-count procedure instead of iota. + (iota (ceiling (/ (length los) limit)) 0 limit))) + + +(define* (list-slice los index-a #:optional (index-b #false)) + (let ((start index-a) + (end (if (or (not index-b) (> index-b (length los))) + (- (length los) 1) + (- index-b 1)))) + (map (lambda (index) + (list-ref los index)) + (range index-a end)))) + + +(define (rest los) + (cond ((<= (length los) 1) (list)) + (else (list-tail los 1)))) + + +(define (separate los separator) + "Return a list with the elements of LOS separated by SEPARATOR. + + LOS (list) + A list of s-expressions. + + SEPARATOR (s-expression) + Any s-expression that will be added between the elements of the + given list. + + RETURN VALUE (list) + A list of s-expressions." + (cond ((or (null? los) (= (length los) 1)) los) + (else + (cons (first los) + (cons separator (separate (rest los) separator)))))) + +(define (take-random list n) + "Return a list containing N different elements from LIST, if +possible, chosen randomly and evenly distributed. If LIST has less +than N elements, the result is a permutation of LIST." + (let loop ((list list) + (n n) + (len (length list))) + (if (<= (min n len) 0) + '() + (let ((r (random-integer len))) + (cons (list-ref list r) + (loop (append (take list r) + (drop list (1+ r))) + (- len 1) + (- n 1))))))) diff --git a/apps/aux/numbers.scm b/apps/aux/numbers.scm new file mode 100644 index 0000000..6c83dcb --- /dev/null +++ b/apps/aux/numbers.scm @@ -0,0 +1,31 @@ +;;; Harmonic Flow web site + +(define-module (apps aux numbers) + #:use-module (srfi srfi-1) + #:export (minus-one + plus-one + range)) + + +(define (minus-one n) + "Return N-1." + (- n 1)) + + +(define (plus-one n) + "Return N+1." + (+ n 1)) + + +(define (range a b) + "Return the list of integers in the range [A, B]. + + A (integer) + + B (integer) + + RETURN VALUE (list of integers) + For example, for the range [-2, 3], return + (list -2 -1 0 1 2 3)." + (cond ((zero? (- a b)) (cons a (list))) + (else (cons a (range (plus-one a) b))))) diff --git a/apps/aux/strings.scm b/apps/aux/strings.scm new file mode 100644 index 0000000..7004721 --- /dev/null +++ b/apps/aux/strings.scm @@ -0,0 +1,12 @@ +;;; Harmonic Flow web site + +(define-module (apps aux strings) + #:export (string-summarize)) + + +(define (string-summarize string n) + "Return an extract of N words from the given STRING." + (let ((words (string-split string #\space))) + (if (<= (length words) n) + string + (string-join (list-head words n) " ")))) diff --git a/apps/aux/sxml.scm b/apps/aux/sxml.scm new file mode 100644 index 0000000..531cdee --- /dev/null +++ b/apps/aux/sxml.scm @@ -0,0 +1,23 @@ +;;; Harmonic Flow web site + +(define-module (apps aux sxml) + #:use-module (ice-9 match) + #:use-module (srfi srfi-1) + #:export (sxml->string*)) + + +(define (sxml->string* tree) + "Flatten tree by dismissing tags and attributes, and return the resulting +string." + (define (sxml->strings tree) + (match tree + (((? symbol?) ('@ _ ...) body ...) + (append-map sxml->strings `(" " ,@body " "))) + (((? symbol?) body ...) + (append-map sxml->strings `(" " ,@body " "))) + ((? string?) + (list tree)) + ((lst ...) + (sxml->strings `(div ,@lst))))) + + (string-concatenate (sxml->strings tree))) diff --git a/apps/aux/system.scm b/apps/aux/system.scm new file mode 100644 index 0000000..ee9a5a3 --- /dev/null +++ b/apps/aux/system.scm @@ -0,0 +1,32 @@ +;;; Harmonic Flow web site + +(define-module (apps aux system) + #:export (path-join)) + + +;;; +;;; Procedures. +;;; + +(define (path-join . parts) + "Return a system path composed of the given PARTS. + + PARTS (strings) + A succession of strings representing parts of a file system path. + + To indicate an absolute path, use an empty string as the first + part. For example: + + (path-join '' 'docs' 'manual') + => '/docs/manual' + + To end the path with a slash, use an empty string as the last + part. For example: + + (path-join '' 'docs' 'manual' '') + => '/docs/manual/' + + RETURN VALUE (string) + A string representing a file system path." + (cond ((equal? parts '("")) "/") ; Root directory + (else (string-join parts file-name-separator-string)))) diff --git a/apps/aux/web.scm b/apps/aux/web.scm new file mode 100644 index 0000000..fec6b4c --- /dev/null +++ b/apps/aux/web.scm @@ -0,0 +1,61 @@ +;;; Harmonic Flow web site + +(define-module (apps aux web) + #:use-module (srfi srfi-1) + #:export (slugify + url-path-join)) + + +;;; +;;; Variables. +;;; + +(define char-set:slug + (char-set-union char-set:letter+digit (char-set #\-))) + + + +;;; +;;; Procedures. +;;; + +(define (slugify text) + "Return TEXT as a slug. + + Reserved characters for Internationalized Resource Identifiers + (IRIs) and common reserved characters for file names are removed + using the SLUG_FORBIDDEN constant as reference. + + TEXT (string) + Some text. For example: Biology, Human anatomy. + + RETURN VALUE (string) + A slug-like string. For example: biology, human-anatomy." + (string-join + (map (lambda (s) (string-filter char-set:slug s)) + (string-split (string-downcase text) char-set:whitespace)) + "-")) + + +(define (url-path-join . parts) + "Return a URL path composed of the given PARTS. + + PARTS (strings) + A succession of strings that represent parts of a URL path. + + To indicate an absolute path, use an empty string as the first + part. For example: + + (url-path-join '' 'docs' 'manual') + => '/docs/manual' + + To end the path with a slash, use an empty string as the last + part. For example: + + (url-path-join '' 'docs' 'manual' '') + => '/docs/manual/' + + RETURN VALUE (string) + A string representing a URL path." + (cond ((equal? parts '("")) "/") ; Root directory + (else (string-join parts "/")))) diff --git a/apps/base/builder.scm b/apps/base/builder.scm new file mode 100644 index 0000000..4e1d194 --- /dev/null +++ b/apps/base/builder.scm @@ -0,0 +1,95 @@ +;;; Harmonic Flow web site + +(define-module (apps base builder) + #:use-module (apps base templates about) + #:use-module (apps base templates contact) + #:use-module (apps base templates hfge-about) + #:use-module (apps base templates hfge-download) + #:use-module (apps base templates hfge-git) + #:use-module (apps base templates home) + #:use-module (apps base templates menu) + #:use-module (apps base types) + #:use-module (apps blog utils) + #:use-module (apps media data) + #:use-module (haunt html) + #:use-module (haunt artifact) + #:use-module (haunt post) + #:use-module (haunt utils) + #:use-module (srfi srfi-1) + #:export (builder)) + + +;;; +;;; Application builder. +;;; + +(define (builder site posts) + "Return the list of web resources that compose the app. + + This procedure is a Haunt builder procedure. + + SITE () + A site object that defines all the properties of the website. See + Haunt objects for more information. + + POSTS (list of ) + A list of post objects that represent articles from the blog. See + Haunt objects for more information. + + RETURN (list of ) + A list of page objects that represent the web resources of the + application. See Haunt objects for more information." + (flatten + (list (menu-builder) + (home-builder site posts) + (about-builder) + (contact-builder) + (hfge-about-builder) + (hfge-download-builder) + (hfge-git-builder)))) + + + +;;; +;;; Helper builders. +;;; + + +(define (about-builder) + "Return a Haunt page representing the About page of the website." + (serialized-artifact "about/index.html" (about-t) sxml->html)) + + +(define (contact-builder) + "Return a Haunt page representing the Contact page of the website." + (serialized-artifact "contact/index.html" (contact-t) sxml->html)) + + +(define (hfge-about-builder) + "Return a Haunt page representing the HFGE about page of the website." + (serialized-artifact "hfge-about/index.html" (hfge-about-t) sxml->html)) + + +(define (hfge-download-builder) + "Return a Haunt page representing the HFGE download page of the website." + (serialized-artifact "hfge-download/index.html" (hfge-download-t) sxml->html)) + + +(define (hfge-git-builder) + "Return a Haunt page representing the HFGE git page of the website." + (serialized-artifact "hfge-git/index.html" (hfge-git-t) sxml->html)) + + +(define (home-builder site posts) + "Return a Haunt page representing the Home page of the website." + (let ((context + (list + (cons "screenshots" screenshots) + (cons "posts" (posts/latest posts 3)) + ))) + (serialized-artifact "index.html" (home-t context) sxml->html))) + + +(define (menu-builder) + "Return a Haunt page representing the website menu." + (serialized-artifact "menu/index.html" (menu-t) sxml->html)) diff --git a/apps/base/templates/about.scm b/apps/base/templates/about.scm new file mode 100644 index 0000000..bb7e91d --- /dev/null +++ b/apps/base/templates/about.scm @@ -0,0 +1,57 @@ +;;; Harmonic Flow web site + +(define-module (apps base templates about) + #:use-module (apps base templates components) + #:use-module (apps base templates theme) + #:use-module (apps base types) + #:use-module (apps base utils) + #:use-module (apps i18n) + #:export (about-t)) + + +(define (about-t) + "Return the About page in SHTML." + (theme + #:title (C_ "webpage title" '("About the Site |")) + #:description + (G_ "This website is dedicated to free software primarily in the area of graphics engines but also free software in general.") + #:keywords + (string-split ;TRANSLATORS: |-separated list of webpage keywords + (G_ "About|Harmonic Flow") #\|) + #:active-menu-item (C_ "website menu" "About Site") + #:css (list + (hfweb-url "static/base/css/page.css")) + #:crumbs (list (crumb (C_ "website menu" "About Site") "./")) + #:content + `(main + (section + (@ (class "page centered-block limit-width")) + ,(G_ `(h2 "About the Site")) + + ,(G_ + `(p + "This website is dedicated to free software primarily in the area of + graphics engines but also free software in general." + )) + + ,(G_ + `(p + "The " + ,(G_ `(a (@ (href ,(hfweb-url "blog/"))) " Harmonic Flow Blog")) + " will cover any topics that is of interest (mostly related to free + software in some way)." + )) + + ,(G_ + `(p + "Checkout " + ,(G_ `(a (@ (href ,(hfweb-url "hfge-about/"))) " HFGE 3D graphics engine")) + " for more information about a brand new cross platform 3D graphics + engine currently in development." + )) + + ,(G_ + `(p + "Please use the " + ,(G_ `(a (@ (href ,(hfweb-url "contact/"))) " contact page")) + " for contact information.")))))) diff --git a/apps/base/templates/components.scm b/apps/base/templates/components.scm new file mode 100644 index 0000000..8d7d521 --- /dev/null +++ b/apps/base/templates/components.scm @@ -0,0 +1,486 @@ +;;; Harmonic Flow web site + +(define-module (apps base templates components) + #:use-module (apps aux lists) + #:use-module (apps aux strings) + #:use-module (apps aux sxml) + #:use-module (apps aux web) + #:use-module (apps base types) + #:use-module (apps base utils) + #:use-module (apps i18n) + #:use-module (srfi srfi-1) + #:use-module (ice-9 match) + #:export (breadcrumbs + button-big + button-little + contact-preview + contact->shtml + horizontal-line + horizontal-separator + horizontal-skip + link-more + link-subtle + link-yellow + manual-href + manual-devel-href + manual-link-yellow + navbar + page-indicator + page-selector)) + + +;;; +;;; Components. +;;; + +(define (breadcrumbs crumbs) + "Return an SHTML nav element representing the breadcrumbs. + + CRUMBS (list) + A non-empty list of objects as defined in + (apps base types)." + `(nav + (@ (class "breadcrumbs")) + ,(G_ `(h2 (@ (class "a11y-offset")) "Your location:")) + + ,(G_ `(a (@ (class "crumb") (href ,(hfweb-url))) "Home")) (span " т†’ ") + ,@(separate (crumbs->shtml crumbs) '(span " т†’ ")))) + + +(define (crumbs->shtml crumbs) + "Return the list of CRUMBS as list of SHTML a elements. + + CRUMBS (list) + A non-empty list of objects as defined in + (apps base types)." + (cond ((= (length crumbs) 1) + (cons + `(a + (@ (class "crumb crumb-active") + (href ,(crumb-url (first crumbs)))) + ,(crumb-label (first crumbs))) + '())) + (else + (cons + `(a + (@ (class "crumb") + (href ,(crumb-url (first crumbs)))) + ,(crumb-label (first crumbs))) + (crumbs->shtml (rest crumbs)))))) + + +(define* (button-big #:key (label "Button") (url "#") (light #false)) + "Return an SHTML a element that looks like a big button. + + LABEL (string) + The text for the button. For example: 'Download!'. + + URL (string) + A URL to use for the href attribute of the a element. If not + specified, the value defaults to #. + + LIGHT (boolean) + True if the button is going to be used on a dark background; false + otherwise (this is the default)." + `(a + (@ (class ,(string-append "button-big" (if light " button-light" ""))) + (href ,url)) + ,label)) + + +(define* (button-little #:key (label "Button") (url "#") (active #false)) + "Return an SHTML a element that looks like a little button. + + LABEL (string) + The text for the button. For example: 'Next'. + + URL (string) + A URL to use for the href attribute of the a element. If not + specified, the value defaults to #. + + ACTIVE (boolean) + True if the button should be highlighted as active (on)." + `(a + (@ (class ,(string-append "button-little" + (if active " button-little-active" ""))) + (href ,url)) + ,label)) + + +(define (contact-preview contact) + "Return an SHTML preview of the given contact object. + + CONTACT () + A contact object as defined in (apps base types)." + `(a + (@ (class "item-preview") + (href ,(contact-url contact))) + (h3 ,(contact-name contact)) + (p + ,(string-summarize + (sxml->string* + (match (contact-description contact) + ((and multilingual (((? string?) (? string?)) ...)) + (let ((code %current-lang)) + (match (assoc code multilingual) + ((code blurb) blurb) + (else (assoc "en" multilingual))))) + (blurb + blurb))) + 30) + "т€І"))) + + +(define (language-tag lang) + `(span (@ (class "button-little button-little-active") + (style "text-align: center; width: 20px; vertical-align: middle")) + ,lang)) + +(define (contact->shtml contact) + "Return an SHTML representation of the given contact object. + + CONTACT () + A contact object as defined in (apps base types)." + `(div + (@ (class "contact-medium")) + (a (@ (href ,(contact-url contact))) (b ,(contact-name contact))) + ,(if (string=? (contact-log contact) "") + "" + `(small + " (" ,(G_ `(a (@ (href ,(contact-log contact))) "archive")) ") ")) + + ;; The description can be a list of language/blurb pairs. + ,(match (contact-description contact) + ((((? string? languages) blurbs) ...) + `(div (@ (id "help-hfweb-mailing-list-description")) + ,@(map (lambda (language blurb) + `(div (@ (style "display: flex; align-items: center; margin: 0 10px 10px 0")) + ,(language-tag language) + (div (@ (lang ,language) (style "flex: 1")) ,blurb))) + languages + blurbs))) + (blurb + blurb)))) + + +(define* (horizontal-separator #:key (light #false)) + "Return an SHTML img element that works as a separator. + + LIGHT (boolean) + True if the separator is going to be used on a dark background; + false otherwise (this is the default)." + `(img + (@ (class "h-separator") + ,(if light + `(src ,(hfweb-url "static/base/img/h-separator.png")) + `(src ,(hfweb-url "static/base/img/h-separator-dark.png"))) + (alt "")))) + +(define (horizontal-skip) + "Return SHTML for a small horizontal space." + `(span (@ (class "hskip")))) + +(define (horizontal-line) + "Return SHTML for a visible separator to be used in a dropdown menu +like a menu item." + `(img (@ (class "hline") + (src ,(hfweb-url "static/base/img/h-separator.png")) + (alt "")))) + + +(define* (link-more #:key (label "More") (url "#") (light #false)) + "Return an SHTML a element that looks like a 'more т†’' link. + + LABEL (string) + The text for the link. For example: 'Read the manual'. + + URL (string) + A URL to use for the href attribute of the a element. If not + specified, the value defaults to #. + + LIGHT (boolean) + True if the link is going to be used on a dark background; false + otherwise (this is the default)." + `(a + (@ (class ,(string-append "link-more" (if light " link-more-light" ""))) + (href ,url)) + ,label)) + + +(define* (link-subtle #:key (label "link") (url "#")) + "Return an SHTML a element that does not stand too much on white backgrounds. + + LABEL (string) + The text for the link. For example: 'Additional notes'. + + URL (string) + The URL of the link. If not specified, the value defaults to #." + `(a (@ (class "link-subtle") (href ,url)) ,label)) + + +(define* (link-yellow #:key (label "link") (url "#")) + "Return a yellow SHTML a element to use on dark backgrounds. + + LABEL (string) + The text for the link. For example: 'read the manual'. + + URL (string) + The URL of the link. If not specified, the value defaults to #." + `(a (@ (class "link-yellow") (href ,url)) ,label)) + + + + +(define (manual-href label manual-lang _1 subpath _2) + "Return an HTML a element with its href attribute pointing to the +manual. It can be marked for translation as: + + (G_ (manual-href \"some-text\" (G_ \"en\") (G_ \"Some-section.html\"))) + + LABEL (string) + The content of the a element. + + MANUAL-LANG (string) + The normalized language for the Guix manual as produced by +'doc/build.scm' in the Guix source tree, i.e. \"en\" for the English +manual. + + SUBPATH (string) + The same as in the manual-url procedure." + ;; The _ arguments are placeholders for args added by G_, cf. i18n-howto.txt. + `(a (@ (href ,(manual-url subpath #:language manual-lang))) ,label)) + +(define (manual-devel-href label manual-lang _1 subpath _2) + "Similar to 'manual-href', but link to the development manual." + ;; The _ arguments are placeholders for args added by G_, cf. i18n-howto.txt. + `(a (@ (href ,(manual-devel-url subpath #:language manual-lang))) ,label)) + +(define* (manual-link-yellow label manual-lang _1 #:optional (subpath "") _2) + "Return a link-yellow component pointing to the manual. It can be +used like this: + + (manual-link-yellow \"some-text\" (G_ \"en\") \"Package-Management.html\") + + LABEL (string) + The label of the link-yellow. + + MANUAL-LANG (string) + The normalized language for the Guix manual as produced by +'doc/build.scm' in the Guix source tree, i.e. \"en\" for the English +manual. + + SUBPATH (string) + The same as in the manual-url procedure." + ;; The _ arguments are placeholders for args added by G_, cf. i18n-howto.txt. + (link-yellow + #:label label + #:url (manual-url subpath #:language manual-lang))) + + + + +(define* (menu-dropdown #:key (label "Item") (active-item "") (url "#") (items '())) + "Return an SHTML li element representing a dropdown for the navbar. + + LABEL (string) + The text for the dropdown. For example: 'About'. + + ACTIVE-ITEM (string) + A string representing the label of the current active item in the + navigation bar. If the values of LABEL and ACTIVE-ITEM are the + same, the dropdown is highlighted. + + URL (string) + The URL of the web resource referenced by the dropdown. Any + value used for an HTML a element is valid. If not specified, the + value defaults to #. + + ITEMS (list of menu items) + A list of menu items as returned by the menu-item procedure in this + same module. If not provided, the value defaults to an empty list." + (let ((label-hash (number->string (string-hash label)))) + `(li + (@ (class ,(if (string=? (string-downcase label) + (string-downcase active-item)) + "menu-item menu-item-active dropdown dropdown-btn" + "menu-item dropdown dropdown-btn"))) + ,@(let ((id (string-append "visible-dropdown-" label-hash))) + `(;; show dropdown when button is checked: + (style ,(string-append "#" id ":checked ~ #submenu-" label-hash " +{ + min-width: 150px; + width: max-content; + + /* reset to initial values: */ + height: auto; + overflow: visible; +}")) + ;; show uncheck version of button iff button is checked + (style ,(string-append "#" id ":checked \ +~ label[for=all-dropdowns-hidden] +{ + display: inline; +}")) + (style "label[for=all-dropdowns-hidden] +{ + display: none; +}") + ;; show check version of button iff button is unchecked + (style ,(string-append "#" id ":checked ~ label[for=" id "] +{ + display: none; +}")) + (input (@ (class "menu-hidden-input") + (type "radio") + (name "dropdown") + (id ,id))) + (label + (@ (for ,id)) + ,label) + (label + (@ (for "all-dropdowns-hidden")) + ,label))) + (div + (@ (class "submenu") + (id ,(string-append "submenu-" label-hash))) + (div (@ (class "submenu-triangle")) + " ") + (ul ,@items))))) + + +(define* (menu-item #:key (label "Item") (active-item "") (url "#")) + "Return an SHTML li element representing an item for the navbar. + + LABEL (string) + The text for the item. For example: 'About'. + + ACTIVE-ITEM (string) + A string representing the label of the current active item in the + navigation bar. If the values of LABEL and ACTIVE-ITEM are the + same, the menu item is highlighted. + + URL (string) + The URL of the web resource referenced by the menu item. Any + value used for an HTML a element is valid. If not specified, the + value defaults to #." + `(li + (a + (@ (class + ,(if (string=? (string-downcase label) (string-downcase active-item)) + "menu-item menu-item-active" + "menu-item")) + (href ,url)) + ,label))) + + +(define* (navbar #:key (active-item "About")) + "Return an SHTML header element with the given ACTIVE ITEM highlighted." + `(header + (@ (class "navbar")) + + ;; Branding. + (h1 + (a + (@ (class "branding") (href ,(hfweb-url))) + ,(C_ "website menu" `(span (@ (class "a11y-offset")) "Harmonic Flow")))) + + ;; Menu. + (nav (@ (class "menu")) + ,(G_ `(h2 (@ (class "a11y-offset")) "website menu:")) + (input (@ (class "menu-hidden-input") + (type "radio") + (name "dropdown") + (id "all-dropdowns-hidden"))) + (ul + ,(C_ "website menu" (menu-item #:label "Overview" #:active-item active-item #:url (hfweb-url))) + + ,(menu-dropdown #:label (C_ "website menu" "HFGE") + #:active-item active-item + #:items + (list + (C_ "website menu" + (menu-item #:label "About" + #:active-item active-item + #:url (hfweb-url "hfge-about/"))) + (C_ "website menu" + (menu-item #:label "Download" + #:active-item active-item + #:url (hfweb-url "hfge-download/"))) + (C_ "website menu" + (menu-item #:label "Git" + #:active-item active-item + #:url (hfweb-url "hfge-git/"))))) + + ,(menu-dropdown #:label (C_ "website menu" "Media") + #:active-item active-item + #:items + (list + (C_ "website menu" + (menu-item #:label "Screenshots" + #:active-item active-item + #:url (hfweb-url "screenshots/"))))) + + ,(C_ "website menu" (menu-item #:label "Blog" #:active-item active-item #:url (hfweb-url "blog/"))) + + ,(menu-dropdown #:label (C_ "website menu" "About") #:active-item active-item + #:items + (list + (C_ "website menu" (menu-item #:label "About Site" #:active-item active-item #:url (hfweb-url "about/"))) + (horizontal-line) + (C_ "website menu" (menu-item #:label "Contact" #:active-item active-item #:url (hfweb-url "contact/"))))) + ,(horizontal-skip))) + + + ;; Menu button. + (a + (@ (class "menu-btn") + (href ,(hfweb-url "menu/"))) ""))) + +(define (page-indicator page-number total-pages) + "Return an SHTML span element in the form 'page X of Y' if there is + more than one page. Otherwise, return an empty string. + + PAGE-NUMBER (number) + The number of the page that the user is seeing. + + TOTAL-PAGES (number) + The total number of pages that should be displayed." + (if (> total-pages 1) + (G_ `(span + (@ (class "page-number-indicator")) + " (Page " ,(number->string page-number) + " of " ,(number->string total-pages) ")")) + "")) + + +(define (page-selector pages active-page base-url) + "Return an SHTML nav element representing a page selection widget. + + PAGES (number) + The total number of pages that should be displayed. + + ACTIVE-PAGE (number) + The number of the page that should be displayed as active. + + BASE-URL (string) + Absolute URL path to prepend to page numbers. For example: + '/en/blog'. This would result in URLs like: '/en/blog/page/N', + where N is the number of the page." + `(nav + (@ (class "page-selector")) + (h3 + (@ (class "a11y-offset")) + ,(G_ (string-append "Page " (number->string active-page) " of " + (number->string pages) ". Go to another page: "))) + ,(if (> pages 1) + (map + (lambda (page-number) + (list + (button-little + #:label page-number + #:url (url-path-join base-url "page" + (number->string page-number) "") + #:active (= page-number active-page)) + " ")) ; NOTE: Force space for readability in non-CSS browsers. + (iota pages 1)) + ""))) diff --git a/apps/base/templates/contact.scm b/apps/base/templates/contact.scm new file mode 100644 index 0000000..88ab2a8 --- /dev/null +++ b/apps/base/templates/contact.scm @@ -0,0 +1,72 @@ +;;; Harmonic Flow web site + +(define-module (apps base templates contact) + #:use-module (apps base templates components) + #:use-module (apps base templates theme) + #:use-module (apps base types) + #:use-module (apps base utils) + #:use-module (apps i18n) + #:export (contact-t)) + + +(define (contact-t) + "Return the Contact page in SHTML." + (theme + #:title (C_ "webpage title" '("Contact |")) + #:description + (G_ "A list of channels to communicate with Harmonic Flow directly about anything you want.") + #:keywords + (string-split ;TRANSLATORS: |-separated list of webpage keywords + (G_ "Contact|Harmonic Flow") #\|) + #:active-menu-item (C_ "website menu" "Contact") + #:css (list + (hfweb-url "static/base/css/page.css")) + #:crumbs (list (crumb (C_ "website menu" "Contact") "./")) + #:content + `(main + (section + (@ (class "page centered-block limit-width")) + ,(G_ `(h2 "Contact")) + + ,(G_ + `(p + "Contact info email / xmpp: andreas at harmonicflow dot o r g")) + + ,(G_ + `(p + "Please download & import the following " + ,(G_ `(a (@ (href ,(hfweb-url "static/gnupg-pubkeys/andreas-pubkey.asc"))) " GPG key")) + " if you want to send me encrypted email:" + )) + + ,(G_ + `(pre + "gpg --import /path/to/andreas-pubkey.asc")) + ,(G_ + `(p + ".. or by using the following command:" + )) + + ,(G_ + `(pre + "gpg --recv-keys 0x14121B58362B5F22")) + + ,(G_ + `(p + "The public key fingerprint should be:")) + + ,(G_ + `(pre + "9ECF C528 9712 3654 F76B 63FD 1412 1B58 362B 5F22")) + + ,(G_ + `(p + "For more information about encryption and GnuPG, see: " + ,(G_ `(a (@ (href "https://www.gnupg.org")) + "GnuPG website.")) + )) + + ,(G_ + `(p + "The above public key is also used for signing releases.")) + )))) diff --git a/apps/base/templates/hfge-about.scm b/apps/base/templates/hfge-about.scm new file mode 100644 index 0000000..ab0b795 --- /dev/null +++ b/apps/base/templates/hfge-about.scm @@ -0,0 +1,52 @@ +;;; Harmonic Flow web site + +(define-module (apps base templates hfge-about) + #:use-module (apps base templates components) + #:use-module (apps base templates theme) + #:use-module (apps base types) + #:use-module (apps base utils) + #:use-module (apps i18n) + #:export (hfge-about-t)) + + +(define (hfge-about-t) + "Return the About HFGE page in SHTML." + (theme + #:title (C_ "webpage title" '("About HFGE |")) + #:description + (G_ "HFGE is a cross platform 3D game engine written in C++ and distributed under the zlib license.") + #:keywords + (string-split ;TRANSLATORS: |-separated list of webpage keywords + (G_ "HFGE|Harmonic Flow|Graphics Engine|Game Engine|3D game engine|cross platform|Free Software|C++|Libre software|Graphics Programming|Vulkan|Download") #\|) + #:active-menu-item (C_ "website menu" "About") + #:css (list + (hfweb-url "static/base/css/page.css")) + #:crumbs (list (crumb (C_ "website menu" "About HFGE") "./")) + #:content + `(main + (section + (@ (class "page centered-block limit-width")) + ,(G_ `(h2 "About HFGE")) + + ,(G_ + `(p + "HFGE is a new cross platform 3D engine currently in development. HFGE + is written in C++ and will initially support Windows and GNU/Linux + platforms. HFGE will use a modern renderer in the form of Vulkan. + ")) + + ,(G_ + `(p + "HFGE is free / libre software and will be distributed under the zlib + license. This license allows you to use HFGE freely in any software. + ")) + + ,(G_ + `(p + "More information, " + ,(G_ `(a (@ (href ,(hfweb-url "hfge-download/"))) " downloads")) + " and" + ,(G_ `(a (@ (href ,(hfweb-url "hfge-git/"))) " git repoistory")) + " will be available once it's ready for public release." + )) + )))) diff --git a/apps/base/templates/hfge-download.scm b/apps/base/templates/hfge-download.scm new file mode 100644 index 0000000..0e91657 --- /dev/null +++ b/apps/base/templates/hfge-download.scm @@ -0,0 +1,36 @@ +;;; Harmonic Flow web site + +(define-module (apps base templates hfge-download) + #:use-module (apps base templates components) + #:use-module (apps base templates theme) + #:use-module (apps base types) + #:use-module (apps base utils) + #:use-module (apps i18n) + #:export (hfge-download-t)) + + +(define (hfge-download-t) + "Return the Download HFGE page in SHTML." + (theme + #:title (C_ "webpage title" '("Download HFGE |")) + #:description + (G_ "Download the latest version of HFGE. Source code is available.") + #:keywords + (string-split ;TRANSLATORS: |-separated list of webpage keywords + (G_ "Download|HFGE|Source Code") #\|) + #:active-menu-item (C_ "website menu" "Download") + #:css (list + (hfweb-url "static/base/css/page.css")) + #:crumbs (list (crumb (C_ "website menu" "Download HFGE") "./")) + #:content + `(main + (section + (@ (class "page centered-block limit-width")) + ,(G_ `(h2 "Download HFGE")) + + ,(G_ + `(p + "HFGE is a new cross platform 3D engine currently in development. Once + HFGE is released you'll be able to download HFGE from here :) + ")) + )))) \ No newline at end of file diff --git a/apps/base/templates/hfge-git.scm b/apps/base/templates/hfge-git.scm new file mode 100644 index 0000000..7cc9266 --- /dev/null +++ b/apps/base/templates/hfge-git.scm @@ -0,0 +1,37 @@ +;;; Harmonic Flow web site + +(define-module (apps base templates hfge-git) + #:use-module (apps base templates components) + #:use-module (apps base templates theme) + #:use-module (apps base types) + #:use-module (apps base utils) + #:use-module (apps i18n) + #:export (hfge-git-t)) + + +(define (hfge-git-t) + "Return the HFGE git page in SHTML." + (theme + #:title (C_ "webpage title" '("HFGE git repository |")) + #:description + (G_ "Get the latest development updates through HFGE git repository.") + #:keywords + (string-split ;TRANSLATORS: |-separated list of webpage keywords + (G_ "Git|Repository|HFGE") #\|) + #:active-menu-item (C_ "website menu" "Git") + #:css (list + (hfweb-url "static/base/css/page.css")) + #:crumbs (list (crumb (C_ "website menu" "HFGE Git repository") "./")) + #:content + `(main + (section + (@ (class "page centered-block limit-width")) + ,(G_ `(h2 "HFGE Git repository")) + + ,(G_ + `(p + "HFGE is a new cross platform 3D engine currently in development. Once + HFGE is released you'll be able to get access to the latest + development updates through public Git repository from here :) + ")) + )))) \ No newline at end of file diff --git a/apps/base/templates/home.scm b/apps/base/templates/home.scm new file mode 100644 index 0000000..464cb0f --- /dev/null +++ b/apps/base/templates/home.scm @@ -0,0 +1,121 @@ +;;; Harmonic Flow web site + +(define-module (apps base templates home) + #:use-module (apps base templates components) + #:use-module (apps base templates theme) + #:use-module (apps base types) + #:use-module (apps base utils) + #:use-module (apps blog templates components) + #:use-module (apps media templates components) + #:use-module (apps media types) + #:use-module (apps i18n) + #:export (home-t)) + + +(define (home-t context) + "Return the Home page in SHTML using the data in CONTEXT." + (theme + #:title (C_ "webpage title" + '("HFGE 3D engine, coding and free software |")) + #:description + (G_ "This website is dedicated to free software primarily in the area of graphics engines but also free software in general.") + #:keywords + (string-split ;TRANSLATORS: |-separated list of webpage keywords + (G_ "Harmonic Flow|HFGE|Free Software|C++|Libre software|Engine|Game Engine|Graphics|3D|2D|Programming|Vulkan") #\|) + #:active-menu-item (C_ "website menu" "Overview") + #:css (list + (hfweb-url "static/base/css/item-preview.css") + (hfweb-url "static/base/css/index.css")) + #:content + `(main + ;; Featured content. + (section + (@ (class "featured-content")) + ,(G_ `(h2 (@ (class "a11y-offset")) "Summary")) + (ul + ;; Libre: + ,(G_ + `(li + ,(G_ `(b "Libre.")) + ,(G_ (link-yellow + #:label " HFGE" + #:url (hfweb-url "hfge-about/"))) + " will be distributed under the zlib license. This license allows you + to use HFGE freely in any software (it respects your freedom). " + )) + ;; Vulkan: + ,(G_ + `(li + ,(G_ `(b "Vulkan.")) + ,(G_ (link-yellow + #:label " HFGE" + #:url (hfweb-url "hfge-about/"))) + " comes with a modern, low level, low overhead, cross platform + renderer in the form of Vulkan (additional renderers can be added as + plugins if needed)." + )) + ;; Cross platform: + ,(G_ + `(li + ,(G_ `(b "Cross platform.")) + ,(G_ (link-yellow + #:label " HFGE" + #:url (hfweb-url "hfge-about/"))) + " will initially support Windows and GNU/Linux. More platforms such + as Android will be added later on." + )) + ;; Tools: + ,(G_ + `(li + ,(G_ `(b "Tools.")) + ,(G_ (link-yellow + #:label " HFGE" + #:url (hfweb-url "hfge-about/"))) + " comes with a few useful tools for generating bitmap fonts, texture + atlases, resource archives and a hash checksum tool." + )) + ) + + (div + (@ (class "action-box centered-text")) + ,(button-big + #:label (C_ "button" "MORE INFO") + #:url (hfweb-url "hfge-about/") + #:light #true) + " " ; A space for readability in non-CSS browsers. + ,(button-big + #:label (C_ "button" "DOWNLOAD") + #:url (hfweb-url "hfge-download/") + #:light #true))) + + ;; Screenshots: + (section + (@ (class "discovery-box")) + ,(G_ `(h2 "Screenshots")) + + ,(G_ + `(p + (@ (class "limit-width centered-block")) + "A few early development screenshots of " + ,(G_ (link-yellow #:label "HFGE" + #:url (hfweb-url "hfge-about/"))) + " in action.")) + + ,(screenshots-box (context-datum context "screenshots")) + + ;;,(horizontal-separator #:light #true) + ) + + ;; Latest Blog posts: + (section + (@ (class "centered-text")) + ,(G_ `(h2 "Blog")) + + ,@(map post-preview (context-datum context "posts")) + + (div + (@ (class "action-box centered-text")) + ,(button-big + #:label (C_ "button" "ALL POSTS") + #:url (hfweb-url "blog/")))) + ))) diff --git a/apps/base/templates/menu.scm b/apps/base/templates/menu.scm new file mode 100644 index 0000000..734ec50 --- /dev/null +++ b/apps/base/templates/menu.scm @@ -0,0 +1,20 @@ +;;; Harmonic Flow web site + +(define-module (apps base templates menu) + #:use-module (apps base templates components) + #:use-module (apps base templates theme) + #:use-module (apps base utils) + #:use-module (apps i18n) + #:export (menu-t)) + + +(define (menu-t) + "Return the Menu page in SHTML." + (theme + #:title (C_ "webpage title" '("Menu")) + #:description (G_ "Website menu.") + #:keywords + (string-split ;TRANSLATORS: |-separated list of webpage keywords + (G_ "Harmonic Flow|HFGE|Free Software|C++|Libre software|Graphics Programming|Vulkan") #\|) + #:active-menu-item (C_ "website menu" "Menu") + #:css (list (hfweb-url "static/base/css/menu.css")))) diff --git a/apps/base/templates/theme.scm b/apps/base/templates/theme.scm new file mode 100644 index 0000000..a944077 --- /dev/null +++ b/apps/base/templates/theme.scm @@ -0,0 +1,143 @@ +;;; Harmonic Flow web site + +(define-module (apps base templates theme) + #:use-module (apps base templates components) + #:use-module (apps base utils) + #:use-module (apps i18n) + #:export (theme)) + + +(define* (theme #:key + (lang-tag %current-ietf-tag) + (title '()) + (description "") + (keywords '()) + (index? #true) + (active-menu-item (C_ "website menu" "About")) + (css '()) + (scripts '()) + (crumbs '()) + (content '(div ""))) + "Return an SHTML document using the website's theme. + + LANG-TAG (string) + IETF language tag. This is used to specify the language of the + document. For example: en, en-CA. If not provided, the value + defaults to the currently built language, i.e. the + %current-ietf-tag from (apps i18n). + + TITLE (list) + A list of strings to form the value of the title element of the + document. The elements of the list are joined together with em + dashes as separators between them. For example, a list with two + strings like 'Hello', and 'Blog' will result in a title like + 'Hello т€” Blog т€” Guix'. + + DESCRIPTION (string) + The description of the document. This is the value used for the + description meta element. + + KEYWORDS (list) + A list of keyword strings that will be used as the value for + the keywords meta element of the document. + + INDEX? (boolean) + Indicate whether the page should be indexed by Internet robots, + such as search engine robots. If not provided, it defaults to + true. + + ACTIVE-MENU-ITEM (string) + The label of the menu item in the navigation bar that should be + highlighted to indicate the current section of the website that + is being browsed. If not provided, the value defaults to 'About'. + + CSS (list) + A list of strings that represent absolute URL paths to additional + style sheets. For example: '/static/app/css/style.css'. If not + provided, the value defaults to an empty list. + + SCRIPTS (list) + A list of strings that represent absolute URL paths to additional + script files. For example: '/static/app/js/builds.js'. If not + provided, the value defaults to an empty list. + + CRUMBS (list) + A list of objects as defined in (apps base types). This + objects are used to form the breadcrumbs of the website. + + CONTENT (SHTML) + A main element with the content of the page. For example: + '(main (h2 'Hello World!') (p 'Once upon a time...'))." + `((doctype "html") + + (html + (@ (lang ,lang-tag)) + + (head + ,(if (null? title) + `(title ,(C_ "webpage title" "Harmonic Flow")) + `(title ,(string-join (append title + (C_ "webpage title" '("Harmonic Flow")))))) + (meta (@ (charset "UTF-8"))) + (meta (@ (name "keywords") (content ,(string-join keywords ", ")))) + (meta (@ (name "description") (content ,description))) + (meta (@ (name "viewport") (content "width=device-width, initial-scale=1.0"))) + ;; Info for Internet robots. + ,(if index? + "" + '(meta (@ (name "robots") (content "noindex")))) + ;; Menu prefetch. + (link (@ (rel "prefetch") (href ,(hfweb-url "menu/index.html")))) + ;; Base CSS. + (link (@ (rel "stylesheet") (href ,(hfweb-url "static/base/css/elements.css")))) + (link (@ (rel "stylesheet") (href ,(hfweb-url "static/base/css/common.css")))) + (link (@ (rel "stylesheet") (href ,(hfweb-url "static/base/css/messages.css")))) + (link (@ (rel "stylesheet") (href ,(hfweb-url "static/base/css/navbar.css")))) + (link (@ (rel "stylesheet") (href ,(hfweb-url "static/base/css/breadcrumbs.css")))) + (link (@ (rel "stylesheet") (href ,(hfweb-url "static/base/css/buttons.css")))) + (link (@ (rel "stylesheet") (href ,(hfweb-url "static/base/css/footer.css")))) + (link (@ (rel "stylesheet") (href ,(hfweb-url "static/base/highlight/styles/stackoverflow-light.min.css")))) + ;; Additional CSS. + ,@(map (lambda (style-sheet) + `(link (@ (rel "stylesheet") (href ,style-sheet)))) + css) + ;; Feeds. + (link (@ (type "application/atom+xml") (rel "alternate") + (title ,(C_ "webpage title" "Harmonic Flow т€” Activity Feed")) + (href ,(hfweb-url "feeds/blog.atom")))) + (link (@ (rel "icon") (type "image/png") + (href ,(hfweb-url "static/base/img/icon.png")))) + (link (@ (rel "icon") (type "image/svg+xml") (sizes "any") + (href ,(hfweb-url "static/base/img/icon.svg")))) + ;; Scripts: + (script (@ (src ,(hfweb-url"static/base/highlight/highlight.min.js")))) + (script (("hljs.highlightAll();"))) + ;; Additional scripts. + ,@(map (lambda (script) + `(script (@ (src ,script)) "")) + scripts)) + + (body + ,(navbar #:active-item active-menu-item) + + ,(if (null? crumbs) "" (breadcrumbs crumbs)) + + ,content + ,(G_ + `(footer + "Powered by " + ,(G_ `(a + (@ (class "link-yellow") + (href ,(gnu-url "software/guile/"))) + "GNU Guile")) + ". Website " + ,(G_ `(a + (@ (class "link-yellow") + (href "https://git.harmonicflow.org/cgi-bin/cgit.cgi/hf-web.git/")) + " Source code")) + " is licensed the " + ,(G_ `(a + (@ (class "link-yellow") + (href ,(gnu-url "licenses/agpl-3.0.html"))) + "GNU AGPL")) + ".")))))) diff --git a/apps/base/types.scm b/apps/base/types.scm new file mode 100644 index 0000000..91e9729 --- /dev/null +++ b/apps/base/types.scm @@ -0,0 +1,124 @@ +;;; Harmonic Flow web site + +(define-module (apps base types) + #:use-module (srfi srfi-9) + #:export (contact + contact? + contact-description + contact-log + contact-name + contact-url + context-datum + crumb + crumb? + crumb-label + crumb-url)) + + +;;; +;;; Data types. +;;; + +;;; Contact (record type) +;;; --------------------- +;;; +;;; A contact object represents a contact medium such as a mailing +;;; list, IRC channel, email address, etc. +;;; +;;; Objects of this type can be created with the "contact" +;;; procedure as well (see Helper procedures below). +;;; +;;; Fields: +;;; +;;; name (string) +;;; The name of the contact medium. For example: +;;; "Development mailing list". +;;; +;;; description (SXML) +;;; A short description. For example: +;;; '(p "Discussion about the development of Guix."). +;;; +;;; url (string) +;;; A URL to the main page of the contact medium. +;;; +;;; log (string) +;;; A URL to the archive or log of previous public communications +;;; help on the contact medium (empty string if there is no log). +;;; +(define-record-type + (make-contact name description url log) + contact? + (name contact-name) + (description contact-description) + (url contact-url) + (log contact-log)) + +;;; Helper procedures. + +(define* (contact #:key (name "") (description "") (url "") (log "")) + "Return a object with the given attributes." + (make-contact name description url log)) + + + +;;; Context (association list) +;;; -------------------------- +;;; +;;; A context object is a collection of data to be rendered in the +;;; template of a web resource. +;;; +;;; A context can have any number of custom keys depending on the +;;; requirements of a given template. +;;; +;;; The following is an example of a context object to be used with an +;;; SHTML template: +;;; +(define some-context + (list + (cons "LANGUAGE" "es") + (cons "CHARSET" "UTF-8") + (cons "AUTHOR" "Jane Roe") + (cons "FRIENDS" (list "John Doe" "Nyoro N." "Jack the Lad")))) + +;;; Helper procedures. + +(define (context-datum context key) + "Return the value of KEY in the given CONTEXT. + + CONTEXT (Context) + See more information about the Context type in (apps base types). + + KEY (atom) + Any atomic value allowed for association list keys." + (assoc-ref context key)) + + + +;;; Crumb (record type) +;;; ------------------- +;;; +;;; A crumb object represents one of the parts of a breadcrumbs +;;; component of a website. +;;; +;;; Objects of this type can be created with the "crumb" procedure as +;;; well (see Helper procedures below). +;;; +;;; Fields: +;;; +;;; label (string) +;;; A human readable name for the crumb. For example: "Blog". +;;; +;;; url (string) +;;; The URL to the web resource related to the crumb. +;;; +(define-record-type + (make-crumb label url) + crumb? + (label crumb-label) + (url crumb-url)) + +;;; Helper procedures. + +(define (crumb label url) + "Return a object with the given attributes." + (make-crumb label url)) diff --git a/apps/base/utils.scm b/apps/base/utils.scm new file mode 100644 index 0000000..31e18ea --- /dev/null +++ b/apps/base/utils.scm @@ -0,0 +1,224 @@ +;;; Harmonic Flow web site + +(define-module (apps base utils) + #:use-module (apps aux lists) + #:use-module (apps aux system) + #:use-module (apps base types) + #:use-module (apps i18n) + #:use-module (haunt artifact) + #:use-module (ice-9 i18n) + #:use-module (ice-9 match) + #:use-module (srfi srfi-1) + #:export (gnu-url + hfweb-url + locale-display-name + manual-url + manual-devel-url + manual-url-with-language + number* + paginate + packages-url)) + + +;;; +;;; Harmonic Flow variables. +;;; + +(define* (gnu-url #:optional (path "")) + "Append PATH to GNU.org URL. + + PATH (string) + An optional relative URL path to a resource. For example: + 'software/guile/'. + + RETURN VALUE (string) + A URL. For example: https://gnu.org/software/guile/." + (string-append "https://gnu.org/" path)) + +(define hfweb-root-url-path + ;; Path to hfge site: + (let ((path (match (getenv "HFGE_WEB_SITE_LOCAL") + ;; If we are trying out the website locally, use "/" as the root. + ("yes" "/") + (else (or (getenv "HFGE_WEB_SITE_ROOT_PATH") "/"))))) + (make-parameter + path + ;; When setting hfweb-root-url-path, make it end in a slash. + (lambda (path) + (if (string-suffix? "/" path) + path + (string-append path "/")))))) + +(define (locale-display-name) + "Return the display name of the current locale." + ;; TRANSLATORS: The localeт€™s display name; please include a country + ;; code like in English (US) *only* if there are multiple + ;; translations for the same language. + (let ((str '(G_ "English"))) + ;;; XXX: If we ever add a separate English (UK) translation, then + ;;; change the display name to English (US), but maybe do not + ;;; change str, because it would break translated PO files. + (gettext (cadr str)))) + + + +;;; +;;; URL linking. +;;; + + +(define* (hfweb-url #:optional (subpath "") #:key (localize #t)) + "Append SUBPATH to Harmonic Flow root URL path (see hfweb-root-url-path). + + SUBPATH (string) + An optional relative URL path to a resource in the Harmonic Flwo path. + For example: 'indeed/something-XYZ/'. + + LOCALIZE (boolean) + Whether to prepend the result of 'localized-root-path' to the URL path. + + RETURN VALUE (string) + A URL path. For example: /indeed/something/-XYZ/." + (string-append (hfweb-root-url-path) + (if localize (localized-root-path subpath) "") + subpath)) + + +(define* (manual-url #:optional (subpath "") + #:key (language "en")) + "Append SUBPATH to the Harmonic Flow manual URL path. + + SUBPATH (string) + An optional relative URL path to a section of the manual. + For example: 'SomeFile.html'. + + RETURN VALUE (string) + A URL path. For example: + /indeed/SomeFile.html." + (string-append + (hfweb-url (string-append (string-append "manual/" language + "/html_node/") + subpath) #:localize #f))) + +(define* (manual-devel-url #:optional (subpath "") + #:key (language "en")) + "Similar to 'manual-url', but link to the development manual." + (string-append + (hfweb-url (string-append (string-append "manual/devel/" language + "/html_node/") + subpath) #:localize #f))) + +(define* (manual-url-with-language _ language #:optional (subpath "")) + "Shorthand for manual-url without keywords for prettier output +PO files when marked for translation. It can be marked for translation +as: + + (G_ (manual-url-with-language (G_ \"en\") (G_ \"Some-section.html\"))) + + LANGUAGE (string) + Normalized language for the Guix manual as produced by +'doc/build.scm' in the Guix source tree, i.e. \"en\" for the English +manual. + + SUBPATH (string) + Like manual-url. + + RETURN VALUE (string) + A URL path. For example: + /software/guix/manual/en/html_node/System-installation.html." + ;; The _ argument is a placeholder for an arg added by G_, cf. i18n-howto.txt. + (manual-url subpath #:language language)) + + +;;; +;;; Helper procedures. +;;; + +(define (number* number) + "Return NUMBER correctly formatting according to English conventions." + (number->locale-string number 0 + (or (false-if-exception + (make-locale LC_ALL "en_US.utf8")) + (make-locale LC_ALL "en_US.UTF-8")))) + + +(define* (paginate #:key dataset (limit 30) base-path template (context '()) writer) + "Distribute the objects of the DATASET in pages. + + DATASET (list) + A list with any kind of object. + + LIMIT (integer) + The maximum number of objects that should appear in a page. + + The limit is optional. If not provided, it defaults to 30. + + BASE-PATH (string) + A system path relative to the website directory where all the + pages will be written to. For example: 'blog' or 'blog/tags'. + + In the latter example, pages would be written to files in a path + like 'blog/tags/page/PAGE_NUMBER/index.html'. + + TEMPLATE (procedure) + A procedure that accepts a context and returns an SXML tree. + + CONTEXT (context) + A context object as defined in (apps base types). The context + holds additional data to insert into the TEMPLATE. + + The context is optional, and will always be extended to include + the following data that can be used in the TEMPLATE: + + items (list) + The list of items to insert into the page. + + total-pages (integer) + The number of pages generated to distribute all items. + + page-number (integer) + The number of the page. + + WRITER + A procedure that writes the page into a given format. See Haunt's + 'sxml->html' writer in the (haunt html) module, for example. + + RETURN VALUE (list) + A list of objects as defined in (haunt page) module." + (let* ((grouped-data (list-group dataset limit)) + (total-pages (cons "total-pages" (length grouped-data)))) + ;; Read the following like (cons Page ListOfPages): + (cons + ;; Page + ;; This is the cover of the pages. For example, the resource + ;; located in a path such as /blog/, which is identical to the + ;; resource available in /blog/page/1/. + (let* ((page-number (cons "page-number" 1)) + (path (path-join base-path "index.html")) + (items + (match grouped-data + (() + (cons "items" '())) + ((head _ ...) + (cons "items" head)))) + (new-context + (append context + (list items page-number total-pages)))) + + (serialized-artifact path (template new-context) writer)) + ;; ListOfPages + ;; This is a list of pages that are the actual ordered pages + ;; located in paths such as /blog/page/NUMBER/. + (map + (lambda (index) + (let* ((page-number (cons "page-number" (+ index 1))) + (path (path-join base-path + "page" + (number->string (+ index 1)) + "index.html")) + (items (cons "items" (list-ref grouped-data index))) + (new-context + (append context (list items page-number total-pages)))) + (serialized-artifact path (template new-context) writer))) + + (iota (length grouped-data)))))) diff --git a/apps/blog/builder.scm b/apps/blog/builder.scm new file mode 100644 index 0000000..969d056 --- /dev/null +++ b/apps/blog/builder.scm @@ -0,0 +1,154 @@ +;;; Harmonic Flow web site + +(define-module (apps blog builder) + #:use-module (apps aux system) + #:use-module (apps aux web) + #:use-module (apps base utils) + #:use-module (apps blog templates feed) + #:use-module (apps blog templates post-list) + #:use-module (apps blog templates post) + #:use-module (apps blog templates tag) + #:use-module (apps blog utils) + #:use-module (haunt html) + #:use-module (haunt artifact) + #:use-module (haunt post) + #:use-module (haunt site) + #:use-module (haunt utils) + #:use-module (sxml simple) + #:export (builder)) + + +;;; +;;; Application builder. +;;; + +(define (builder site posts) + "Return the list of web resources that compose the app. + + This procedure is a Haunt builder procedure. + + SITE () + A site object that defines all the properties of the website. See + Haunt objects for more information. + + POSTS (list of ) + A list of post objects that represent articles from the blog. See + Haunt objects for more information. + + RETURN (list of ) + A list of page objects that represent the web resources of the + application. See Haunt objects for more information." + (flatten + (list + (blog-feed-builder site posts) + (post-list-builder posts) + (posts-builder posts) + (tag-feed-builder site posts) + (tags-builder posts)))) + + + +;;; +;;; Helper builders. +;;; + +(define (sxml->xml* sxml port) ;from (haunt builder atom) + "Write SXML to PORT, preceded by an tag." + (set-port-encoding! port "UTF-8") + (display "" port) + (sxml->xml sxml port)) + +(define (blog-feed-builder site posts) + "Return a Haunt page representing the atom feed of the blog." + (let* ((domain (site-domain site)) + (sorted-posts (posts/reverse-chronological posts)) + (max-posts 10) ; Number of posts to add to the feed. + (context + (list + (cons "domain" domain) + (cons "title" "Harmonic Flow Blog") + (cons "id" (url-path-join domain "feeds" "blog.atom")) + (cons "alternate" (url-path-join domain "blog" "")) + (cons "posts" + (if (> (length sorted-posts) max-posts) + (list-head sorted-posts max-posts) + sorted-posts))))) + (serialized-artifact (path-join "feeds" "blog.atom") + (atom-feed-t context) + sxml->xml*))) + + +(define (post-list-builder posts) + "Return a list of Haunt pages representing paginated POSTS." + (let ((context + (list + (cons "tags" (post-groups->tag-list + (posts/group-by-tag posts)))))) + (paginate #:dataset (posts/reverse-chronological posts) + #:base-path "blog" + #:template post-list-t + #:context context + #:writer sxml->html))) + + +(define (posts-builder posts) + "Return a list of Haunt pages representing blog posts." + (map + (lambda (post) + (let ((context (list (cons "post" post)))) + (serialized-artifact (path-join (post-url-path post) "index.html") + (post-t context) + sxml->html))) + posts)) + + +(define (tag-feed-builder site posts) + "Return a Haunt page representing the atom feed of a blog topic." + (let ((post-groups (posts/group-by-tag posts))) + (map + (lambda (tagged-posts) + (let* ((domain (site-domain site)) + (tag-name (car tagged-posts)) + (tag-slug (slugify tag-name)) + (file-name (string-append tag-slug ".atom")) + (context + (list + (cons "domain" domain) + (cons "title" + (string-append "Harmonic Flow Blog т€” " tag-name)) + (cons "id" (url-path-join domain + "feeds" + "blog" + file-name)) + (cons "alternate" (url-path-join domain + "blog" + "tags" + tag-slug + "")) + (cons "posts" + (posts/reverse-chronological (cdr tagged-posts)))))) + (serialized-artifact (path-join "feeds" "blog" file-name) + (atom-feed-t context) + sxml->xml))) + post-groups))) + + +(define (tags-builder posts) + "Return a list of lists of Haunt pages representing POSTS grouped by + tag. + + Each list of pages corresponds to the paginated blog posts of one + tag." + (let ((post-groups (posts/group-by-tag posts))) + (map + (lambda (tagged-posts) + (let ((context + (list + (cons "tag" (car tagged-posts)) + (cons "tags" (post-groups->tag-list post-groups))))) + (paginate #:dataset (posts/reverse-chronological (cdr tagged-posts)) + #:base-path (tag-system-path (car tagged-posts)) + #:template tag-t + #:context context + #:writer sxml->html))) + post-groups))) diff --git a/apps/blog/templates/components.scm b/apps/blog/templates/components.scm new file mode 100644 index 0000000..6c49f94 --- /dev/null +++ b/apps/blog/templates/components.scm @@ -0,0 +1,78 @@ +;;; Harmonic Flow web site + +(define-module (apps blog templates components) + #:use-module (apps aux strings) + #:use-module (apps aux sxml) + #:use-module (apps aux web) + #:use-module (apps base utils) + #:use-module (apps blog utils) + #:use-module (apps i18n) + #:use-module (haunt post) + #:use-module (srfi srfi-19) + #:export (post-preview + sidebar)) + + +;;; +;;; Components. +;;; + +(define (post-preview post) + "Return an SHTML representation of the given post object. + + POST () + A post object (see Haunt's manual for more information)." + `(a + (@ (class "item-preview") + (href ,(hfweb-url (post-url-path post)))) + (h3 + (@ (lang "en")) + ,(post-ref post 'title)) + (p + (@ (class "item-date")) + ,(date->string (post-date post) (C_ "SRFI-19 date->string format" + "~B ~e, ~Y"))) + (p + (@ (class "item-summary") (lang "en")) + ,(string-summarize (sxml->string* (post-sxml post)) 30) + ,(C_ "blog post summary ellipsis" "т€І")))) + + +(define* (sidebar tags #:optional (current-tag #false)) + "Return an SHTML section element representing the sidebar of the blog. + + TAGS (association list) + An association list of tags mapped to blog posts as returned by + Haunt's 'posts/group-by-tag' procedure in (haunt post) module." + `(section + (@ (class "side-bar")) + (h3 (@ (class "a11y-offset")) (G_ "Blog menu: ")) + + (h4 + (@ (class "bar-title bar-title-top")) + ,(if current-tag + (G_ "Get topic updates") + (G_ "Get blog updates"))) + (ul + (@ (class "bar-list")) + (li (@ (class "bar-item")) + (a (@ (class "bar-link feed-link") + ,(if current-tag + `(href ,(hfweb-url + (url-path-join "feeds" "blog" + (string-append + (slugify current-tag) + ".atom")))) + `(href ,(hfweb-url (url-path-join "feeds" "blog.atom"))))) + ,(C_ "button" "Atom feed")))) + + (h4 (@ (class "bar-title")) (G_ "Posts by topic")) + (ul + (@ (class "bar-list")) + ,@(map + (lambda (tag) + `(li (@ (class "bar-item")) + (a (@ (class "bar-link") + (href ,(hfweb-url (url-path-join (tag-url-path tag) "")))) + ,tag))) + (sort tags tag-first?))))) diff --git a/apps/blog/templates/feed.scm b/apps/blog/templates/feed.scm new file mode 100644 index 0000000..bfa1cc4 --- /dev/null +++ b/apps/blog/templates/feed.scm @@ -0,0 +1,55 @@ +;;; Harmonic Flow web site + +(define-module (apps blog templates feed) + #:use-module (apps aux strings) + #:use-module (apps aux sxml) + #:use-module (apps aux web) + #:use-module (apps base templates theme) + #:use-module (apps base types) + #:use-module (apps base utils) + #:use-module (apps blog utils) + #:use-module (apps i18n) + #:use-module (haunt html) + #:use-module (haunt post) + #:use-module (srfi srfi-19) + #:export (atom-feed-t)) + + +(define (atom-feed-t context) + "Return an SXML representation of a Blog's topic atom feed." + (let ((domain (context-datum context "domain")) + (title (context-datum context "title")) + (id (context-datum context "id")) + (alternate (context-datum context "alternate")) + (posts (context-datum context "posts"))) + `(feed + ;; Feed info. + (@ (xmlns "http://www.w3.org/2005/Atom")) + (id ,id) + (title ,title) + (author (name (C_ "feed author name" "Harmonic Flow Blog")) (uri ,domain)) + (icon ,(hfweb-url "static/base/img/icon.png")) + (updated ,(date->string (current-date) "~4")) + (link (@ (rel "alternate") (href ,alternate))) + + ;; Feed entries. + ,@(map + (lambda (post) + `(entry + (id ,(url-path-join domain (post-url-path post) "")) + (title ,(post-ref post 'title)) + (author (name ,(post-ref post 'author))) + (published ,(date->string (post-date post) "~4")) + (updated ,(date->string (post-date post) "~4")) + ;(rights (@ (type "text")) ,(post-copyright post)) + (link (@ (rel "alternate") + (href ,(url-path-join domain + (post-url-path post) + "")))) + ,@(map + (lambda (tag) + `(category (@ (term ,tag)))) + (post-ref post 'tags)) + (summary ,(string-summarize (sxml->string* (post-sxml post)) 100) "т€І") + (content (@ (type "html")) ,(sxml->html-string (post-sxml post))))) + posts)))) diff --git a/apps/blog/templates/post-list.scm b/apps/blog/templates/post-list.scm new file mode 100644 index 0000000..c63b01a --- /dev/null +++ b/apps/blog/templates/post-list.scm @@ -0,0 +1,56 @@ +;;; Harmonic Flow web site + +(define-module (apps blog templates post-list) + #:use-module (apps aux web) + #:use-module (apps base templates components) + #:use-module (apps base templates theme) + #:use-module (apps base types) + #:use-module (apps base utils) + #:use-module ((apps blog templates components) #:prefix blog:) + #:use-module (apps i18n) + #:export (post-list-t)) + + +(define (post-list-t context) + "Return a list of blog posts in SHTML with the data in CONTEXT." + (let ((page-number + (number->string (context-datum context "page-number"))) + (total-pages + (number->string (context-datum context "total-pages")))) + (theme + #:title (list (G_ (string-append "Page " page-number "")) + (C_ "webpage title" "Blog |")) + #:description + (G_ "Blog posts about programming and free software.") + #:keywords + (string-split ;TRANSLATORS: |-separated list of webpage keywords + (G_ "Harmonic Flow Blog|HFGE|Free Software|C++|Libre software|Graphics Programming|Vulkan") #\|) + #:index? #false + #:active-menu-item (C_ "website menu" "Blog") + #:css + (list (hfweb-url "static/base/css/page.css") + (hfweb-url "static/base/css/item-preview.css") + (hfweb-url "static/base/css/sidebar.css")) + #:crumbs + (list (crumb (C_ "website menu" "Blog") (hfweb-url "blog/")) + (crumb (G_ (string-append "Page " page-number "")) + (hfweb-url (url-path-join "blog" + "page" + page-number + "")))) + #:content + `(main + (section + (@ (class "page centered-text")) + (h2 (G_ "Blog") + ,(page-indicator (string->number page-number) + (string->number total-pages))) + + (div + (@ (class "sheet")) + ,@(map blog:post-preview (context-datum context "items")) + ,(page-selector (string->number total-pages) + (string->number page-number) + (hfweb-url "blog"))) + + ,(blog:sidebar (context-datum context "tags"))))))) diff --git a/apps/blog/templates/post.scm b/apps/blog/templates/post.scm new file mode 100644 index 0000000..8a4880d --- /dev/null +++ b/apps/blog/templates/post.scm @@ -0,0 +1,69 @@ +;;; Harmonic Flow web site + +(define-module (apps blog templates post) + #:use-module (apps base templates components) + #:use-module (apps base templates theme) + #:use-module (apps base types) + #:use-module (apps base utils) + #:use-module (apps blog utils) + #:use-module ((apps blog templates components) #:prefix blog:) + #:use-module (apps i18n) + #:use-module (haunt post) + #:use-module (srfi srfi-19) + #:export (post-t)) + + +(define (post-t context) + "Return a page in SHTML for the post in the given CONTEXT." + (let* ((post (context-datum context "post")) + (tags (post-ref post 'tags))) + (theme + #:title (list (post-ref post 'title) + (C_ "webpage title" "|")) + #:description + (G_ (string-append "Blog post about " + (post-ref post 'title) + " on Harmonic Flow Blog.")) + #:keywords tags + #:active-menu-item (C_ "website menu" "Blog") + #:css + (list (hfweb-url "static/base/css/page.css") + (hfweb-url "static/blog/css/post.css")) + #:crumbs + (list (crumb (C_ "website menu" "Blog") (hfweb-url "blog/")) + (crumb (post-ref post 'title) + (hfweb-url (post-url-path post)))) + #:content + `(main + (article + (@ (class "page centered-block limit-width") (lang "en")) + (h2 ,(post-ref post 'title)) + (p + (@ (class "post-metadata centered-text") (lang ,%current-ietf-tag)) + ,(post-ref post 'author) " т€” " + ,(date->string (post-date post) (C_ "SRFI-19 date->string format" + "~B ~e, ~Y"))) + + ,(change-image-to-video + (syntax-highlight (post-sxml post))) + + (div + (@ (class "tag-list") (lang ,%current-ietf-tag)) + ,(G_ `(p "Related topics:")) + + ,@(map + (lambda (tag) + (list + (button-little + #:label tag + #:url (hfweb-url (tag-url-path tag))) + " ")) ; NOTE: Force space for readability in non-CSS browsers. + (sort tags tag-first?))) + + (div + (@ (class "license") (lang ,%current-ietf-tag)) + ,(G_ `(p "Unless otherwise stated, blog posts on this site are + copyrighted by their respective authors and published under the terms of the " + ,(G_ + `(a (@ (href "https://creativecommons.org/licenses/by-sa/4.0/")) + "CC-BY-SA 4.0 license.")))))))))) diff --git a/apps/blog/templates/tag.scm b/apps/blog/templates/tag.scm new file mode 100644 index 0000000..865f27a --- /dev/null +++ b/apps/blog/templates/tag.scm @@ -0,0 +1,61 @@ +;;; Harmonic Flow web site + +(define-module (apps blog templates tag) + #:use-module (apps aux web) + #:use-module (apps base templates components) + #:use-module (apps base templates theme) + #:use-module (apps base types) + #:use-module (apps base utils) + #:use-module ((apps blog templates components) #:prefix blog:) + #:use-module (apps blog utils) + #:use-module (apps i18n) + #:export (tag-t)) + + +(define (tag-t context) + "Return a list of blog posts in SHTML with the data in CONTEXT." + (let ((tag (context-datum context "tag")) + (page-number + (number->string (context-datum context "page-number"))) + (total-pages + (number->string (context-datum context "total-pages")))) + (theme + #:title (list (G_ (string-append "Page " page-number "")) + tag (C_ "webpage title" "Blog")) + #:description + (G_ (string-append "Blog posts about " + tag + " on Harmonic Flow Blog.")) + #:keywords + (string-split ;TRANSLATORS: |-separated list of webpage keywords + (G_ "Harmonic Flow Blog|HFGE|Free Software|C++|Libre software|Graphics Programming|Vulkan") #\|) + #:index? #false + #:active-menu-item (C_ "website menu" "Blog") + #:css + (list (hfweb-url "static/base/css/page.css") + (hfweb-url "static/base/css/item-preview.css") + (hfweb-url "static/base/css/sidebar.css")) + #:crumbs + (list (crumb (C_ "website menu" "Blog") (hfweb-url "blog/")) + (crumb tag (hfweb-url (tag-url-path tag))) + (crumb (G_ (string-append "Page " page-number "")) + (hfweb-url (url-path-join (tag-url-path tag) + "page" + page-number + "")))) + #:content + `(main + (section + (@ (class "page centered-text")) + (h2 ,(G_ "Blog т€” ") ,tag + ,(page-indicator (string->number page-number) + (string->number total-pages))) + + (div + (@ (class "sheet")) + ,@(map blog:post-preview (context-datum context "items")) + ,(page-selector (string->number total-pages) + (string->number page-number) + (hfweb-url "blog"))) + + ,(blog:sidebar (context-datum context "tags") tag)))))) diff --git a/apps/blog/utils.scm b/apps/blog/utils.scm new file mode 100644 index 0000000..6a3c4b2 --- /dev/null +++ b/apps/blog/utils.scm @@ -0,0 +1,143 @@ +;;; Harmonic Flow web site + +(define-module (apps blog utils) + #:use-module (apps aux lists) + #:use-module (apps aux web) + #:use-module (apps i18n) + #:use-module (haunt post) + #:use-module (ice-9 match) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-19) + #:use-module (syntax-highlight) + #:use-module (syntax-highlight scheme) + #:use-module (syntax-highlight lexers) + #:export (post-groups->tag-list + post-url-path + posts/latest + syntax-highlight + change-image-to-video + tag-first? + tag-system-path + tag-url-path)) + + +(define (post-groups->tag-list groups) + "Return a list of Haunt tags from the list of grouped posts. + + GROUPS (association list) + An association list of tags mapped to posts, as returned by the + posts/group-by-tag procedure from (haunt post) module." + (cond ((null? groups) '()) + (else + (cons (car (first groups)) + (post-groups->tag-list (rest groups)))))) + + +(define (post-url-path post) + "Return a URL path for the POST in the form blog/YYYY/POST-SLUG. + + POST () + A post object as defined in (haunt post) module." + ;; Note: End the path with a slash so 'localized-root-path' down the road + ;; prepends the language tag. + (url-path-join "blog" + (date->string (post-date post) "~Y") + (post-slug post) + "")) + + +(define (posts/latest posts n) + "Return the latest N posts from the given list of posts." + (let ((latest-posts (posts/reverse-chronological posts))) + (cond + ((null? posts) '()) + ((<= (length posts) n) latest-posts) + (else (list-head latest-posts n))))) + + +(define (tag-first? tag-a tag-b) + "Return true if TAG-A goes first than TAG-B alphabetically. + + This predicate is used for sorting tags. + + TAG-A, TAG-B (string) + A tag as used by Haunt posts. For example: 'User interface'." + (stringsxml + ;; (highlight lex-scheme/guix code-snippet)))) + ((tag ('@ attributes ...) body ...) + `(,tag (@ ,@attributes) ,@(map syntax-highlight body))) + ((tag body ...) + `(,tag ,@(map syntax-highlight body))) + ((? string? str) + str))) + +(define (change-image-to-video sxml) + "Replace tags in SXML that refer to WebM videos with proper