From d1ea7b536427b0dfd180607534cc769f51d4cf4e Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Wed, 13 Jan 2021 21:39:35 -0800 Subject: [PATCH] Add Hugo codelines post. --- content/blog/codelines/example.png | Bin 0 -> 42591 bytes content/blog/codelines/index.md | 268 +++++++++++++++++++++++++++++ 2 files changed, 268 insertions(+) create mode 100644 content/blog/codelines/example.png create mode 100644 content/blog/codelines/index.md diff --git a/content/blog/codelines/example.png b/content/blog/codelines/example.png new file mode 100644 index 0000000000000000000000000000000000000000..aed915f9175f5e54e23924c7e3bda4b12299753a GIT binary patch literal 42591 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, +I began to include more and more fragments of code into my blog. +I didn't want to be copy-pasting my code between my project +and my Markdown files, so I quickly wrote up a Hugo [shortcode](https://gohugo.io/content-management/shortcodes/) +to pull in other files in the local directory. I've since improved on this +some more, so I thought I'd share what I created with others. + +### Including Entire Files and Lines +My needs for snippets were modest at first. For the most part, +I had a single code file that I wanted to present, so it was +acceptable to plop it in the middle of my post in one piece. +The shortcode for that was quite simple: + +``` +{{ highlight (readFile (printf "code/%s" (.Get 1))) (.Get 0) "" }} +``` + +This leverages Hugo's built-in [`highlight`](https://gohugo.io/functions/highlight/) +function to provide syntax highlighting to the included snippet. Hugo +doesn't guess at the language of the code, so you have to manually provide +it. Calling this shortcode looks as follows: + +``` +{{}} +``` + +Note that this implicitly adds the `code/` prefix to all +the files I include. This is a personal convention: I want +all my code to be inside a dedicated directory. + +Of course, including entire files only takes you so far. +What if you only need to discuss a small part of your code? +Alternaitvely, what if you want to present code piece-by-piece, +in the style of literate programming? I quickly ran into the +need to do this, for which I wrote another shortcode: + +``` +{{ $s := (readFile (printf "code/%s" (.Get 1))) }} +{{ $t := split $s "\n" }} +{{ if not (eq (int (.Get 2)) 1) }} +{{ .Scratch.Set "u" (after (sub (int (.Get 2)) 1) $t) }} +{{ else }} +{{ .Scratch.Set "u" $t }} +{{ end }} +{{ $v := first (add (sub (int (.Get 3)) (int (.Get 2))) 1) (.Scratch.Get "u") }} +{{ if (.Get 4) }} +{{ .Scratch.Set "opts" (printf ",%s" (.Get 4)) }} +{{ else }} +{{ .Scratch.Set "opts" "" }} +{{ end }} +{{ highlight (delimit $v "\n") (.Get 0) (printf "linenos=table,linenostart=%d%s" (.Get 2) (.Scratch.Get "opts")) }} +``` + +This shortcode takes a language and a filename as before, but it also takes +the numbers of the first and last lines indicating the part of the code that should be included. After +splitting the contents of the file into lines, it throws away all lines before and +after the window of code that you want to include. It seems to me (from my commit history) +that Hugo's [`after`](https://gohugo.io/functions/after/) function (which should behave +similarly to Haskell's `drop`) doesn't like to be given an argument of `0`. +I had to add a special case for when this would occur, where I simply do not invoke `after` at all. +The shortcode can be used as follows: + +``` +{{}} +``` + +To support a fuller range of Hugo's functionality, I also added an optional argument that +accepts Hugo's Chroma settings. This way, I can do things like highlight certain +lines in my code snippet, which is done as follows: + +``` +{{}} +``` + +Note that the `hl_lines` field doesn't seem to work properly with `linenostart`, which means +that the highlighted lines are counted from 1 no matter what. This is why in the above snippet, +although I include lines 31 through 39, I feed lines 7, 8, and 9 to `hl_lines`. It's unusual, +but hey, it works! + +### Linking to Referenced Code +Some time after implementing my initial system for including lines of code, +I got an email from a reader who pointed out that it was hard for them to find +the exact file I was referencing, and to view the surrounding context of the +presented lines. To address this, I decided that I'd include the link +to the file in question. After all, my website and all the associated +code is on a [Git server I host](https://dev.danilafe.com/Web-Projects/blog-static), +so any local file I'm referencing should -- assuming it was properly committed -- +show up there, too. I hardcoded the URL of the `code` directory on the web interface, +and appended the relative path of each included file to it. The shortcode came out as follows: + +``` +{{ $s := (readFile (printf "code/%s" (.Get 1))) }} +{{ $t := split $s "\n" }} +{{ if not (eq (int (.Get 2)) 1) }} +{{ .Scratch.Set "u" (after (sub (int (.Get 2)) 1) $t) }} +{{ else }} +{{ .Scratch.Set "u" $t }} +{{ end }} +{{ $v := first (add (sub (int (.Get 3)) (int (.Get 2))) 1) (.Scratch.Get "u") }} +{{ if (.Get 4) }} +{{ .Scratch.Set "opts" (printf ",%s" (.Get 4)) }} +{{ else }} +{{ .Scratch.Set "opts" "" }} +{{ end }} +
+
From {{ path.Base (.Get 1) }}, + {{ if eq (.Get 2) (.Get 3) }}line {{ .Get 2 }}{{ else }} lines {{ .Get 2 }} through {{ .Get 3 }}{{ end }}
+ {{ highlight (delimit $v "\n") (.Get 0) (printf "linenos=table,linenostart=%d%s" (.Get 2) (.Scratch.Get "opts")) }} +
+``` + +This results in code blocks like the one in the image below. The image +is the result of the `codelines` call for the Idris language, presented above. + +{{< figure src="example.png" caption="An example of how the code looks." class="medium" >}} + +I got a lot of mileage out of this setup . . . until I wanted to include code from _other_ git repositories. +For instance, I wanted to talk about my [Advent of Code](https://adventofcode.com/) submissions, +without having to copy-paste the code into my blog repository! + +### Code from Submodules +My first thought when including code from other repositories was to use submodules. +This has the added advantage of "pinning" the version of the code I'm talking about, +which means that even if I push significant changes to the other repository, the code +in my blog will remain the same. This, in turn, means that all of my `codelines` +shortcodes will work as intended. + +The problem is, most Git web interfaces (my own included) don't display paths corresponding +to submodules. Thus, even if all my code is checked out and Hugo correctly +pulls the selected lines into its HTML output, the _links to the file_ remain +broken! + +There's no easy way to address this, particularly because _different submodules +can be located on different hosts_! The Git URL used for a submodule is +not known to Hugo (since, to the best of my knowledge, it can't run +shell commands), and it could reside on `dev.danilafe.com`, or `github.com`, +or elsewhere. Fortunately, it's fairly easy to tell when a file is part +of a submodule, and which submodule that is. It's sufficient to find +the longest submodule path that matches the selected file. If no +submodule path matches, then the file is part of the blog repository, +and no special action is needed. + +Of course, this means that Hugo needs to be made aware of the various +submodules in my repository. It also needs to be aware of the submodules +_inside_ those submodules, and so on: it needs to be recursive. Git +has a command to list all submodules recursively: + +```Bash +git submodule status --recursive +``` + +However, this only prints the commit, submodule path, and the upstream branch. +I don't think there's a way to list the remotes' URLs with this command; however, +we do _need_ the URLs, since that's how we create links to the Git web interfaces. + +There's another issue: how do we let Hugo know about the various submodules, +even if we can find them? Hugo can read files, but doing any serious +text processing is downright impractical. However, Hugo +itself is not able to run commands, so it needs to be able to read in +the output of another command that _can_ find submodules. + +I settled on using Hugo's `params` configuration option. This +allows users to communicate arbitrary properties to Hugo themes +and templates. In my case, I want to communicate a collection +of submodules. I didn't know about TOML's inline tables, so +I decided to represent this collection as a map of (meaningless) +submodule names to tables: + +```TOML +[params] + [params.submoduleLinks] + [params.submoduleLinks.aoc2020] + url = "https://dev.danilafe.com/Advent-of-Code/AdventOfCode-2020/src/commit/7a8503c3fe1aa7e624e4d8672aa9b56d24b4ba82" + path = "aoc-2020" +``` + +Since it was seemingly impossible to wrangle Git into outputting +all of this information using one command, I decided +to write a quick Ruby script to generate a list of submodules +as follows. I had to use `cd` in one of my calls to Git +because Git's `--git-dir` option doesn't seem to work +with submodules, treating them like a "bare" checkout. +I also chose to use an allowlist of remote URLs, +since the URL format for linking to files in a +particular repository differs from service to service. +For now, I only use my own Git server, so only `dev.danilafe.com` +is allowed; however, just by adding `elsif`s to my code, +I can add other services in the future. + +```Ruby +puts "[params]" +puts " [params.submoduleLinks]" + +def each_submodule(base_path) + `cd #{base_path} && git submodule status`.lines do |line| + hash, path = line[1..].split " " + full_path = "#{base_path}/#{path}" + url = `git config --file #{base_path}/.gitmodules --get 'submodule.#{path}.url'`.chomp.delete_suffix(".git") + safe_name = full_path.gsub(/\/|-|_\./, "") + + if url =~ /dev.danilafe.com/ + file_url = "#{url}/src/commit/#{hash}" + else + raise "Submodule URL #{url.dump} not in a known format!" + end + + yield ({ :path => full_path, :url => file_url, :name => safe_name }) + each_submodule(full_path) { |m| yield m } + end +end + +each_submodule(".") do |m| + next unless m[:path].start_with? "./code/" + puts " [params.submoduleLinks.#{m[:name].delete_prefix(".code")}]" + puts " url = #{m[:url].dump}" + puts " path = #{m[:path].delete_prefix("./code/").dump}" +end +``` + +I pipe the output of this script into a separate configuration file +called `config-gen.toml`, and then run Hugo as follows: + +``` +hugo --config config.toml,config-gen.toml +``` + +Finally, I had to modify my shortcode to find and handle the longest submodule prefix. +Here's the relevant portion, and you can +[view the entire file here](https://dev.danilafe.com/Web-Projects/blog-static/src/commit/bfeae89ab52d1696c4a56768b7f0c6682efaff82/themes/vanilla/layouts/shortcodes/codelines.html). + +``` +{{ .Scratch.Set "bestLength" -1 }} +{{ .Scratch.Set "bestUrl" (printf "https://dev.danilafe.com/Web-Projects/blog-static/src/branch/master/code/%s" (.Get 1)) }} +{{ $filePath := (.Get 1) }} +{{ $scratch := .Scratch }} +{{ range $module, $props := .Site.Params.submoduleLinks }} +{{ $path := index $props "path" }} +{{ $bestLength := $scratch.Get "bestLength" }} +{{ if and (le $bestLength (len $path)) (hasPrefix $filePath $path) }} +{{ $scratch.Set "bestLength" (len $path) }} +{{ $scratch.Set "bestUrl" (printf "%s%s" (index $props "url") (strings.TrimPrefix $path $filePath)) }} +{{ end }} +{{ end }} +``` + +And that's what I'm using at the time of writing! + +### Conclusion +My current system for code includes allows me to do the following +things: + +* Include entire files or sections of files into the page. This +saves me from having to copy and paste code manually, which +is error prone and can cause inconsistencies. +* Provide links to the files I reference on my Git interface. +This allows users to easily view the entire file that I'm talking about. +* Correctly link to files in repositories other than my blog +repository, when they are included using submodules. This means +I don't need to manually copy and update code from other projects. + +I hope some of these shortcodes and script come in handy for someone else. +Thank you for reading!