doc: Port anchors preprocessor to jq script

Python is only pulled into the build closure by Mercurial, which might end up being removed.
Let’s port the script to jq, which is more likely to stay.
This commit is contained in:
Jan Tojnar 2022-05-26 16:47:40 +02:00
parent 4de84e095d
commit 3272afa17b
5 changed files with 35 additions and 59 deletions

31
doc/manual/anchors.jq Executable file
View file

@ -0,0 +1,31 @@
"\\[\\]\\{#(?<anchor>[^\\}]+?)\\}" as $empty_anchor_regex |
"\\[(?<text>[^\\]]+?)\\]\\{#(?<anchor>[^\\}]+?)\\}" as $anchor_regex |
def transform_anchors_html:
. | gsub($empty_anchor_regex; "<a name=\"" + .anchor + "\"></a>")
| gsub($anchor_regex; "<a href=\"#" + .anchor + "\" id=\"" + .anchor + "\">" + .text + "</a>");
def transform_anchors_strip:
. | gsub($empty_anchor_regex; "")
| gsub($anchor_regex; .text);
def map_contents_recursively(transformer):
. + {
Chapter: (.Chapter + {
content: .Chapter.content | transformer,
sub_items: .Chapter.sub_items | map(map_contents_recursively(transformer)),
}),
};
def process_command:
.[0] as $context |
.[1] as $body |
$body + {
sections: $body.sections | map(map_contents_recursively(if $context.renderer == "html" then transform_anchors_html else transform_anchors_strip end)),
};
process_command

View file

@ -1,56 +0,0 @@
#!/usr/bin/env python3
import argparse
import json
import re
import sys
empty_anchor_regex = re.compile(r"\[\]\{#(?P<anchor>[^\}]+?)\}")
anchor_regex = re.compile(r"\[(?P<text>[^\]]+?)\]\{#(?P<anchor>[^\}]+?)\}")
def transform_anchors_html(content):
content = empty_anchor_regex.sub(r'<a name="\g<anchor>"></a>', content)
content = anchor_regex.sub(r'<a href="#\g<anchor>" id="\g<anchor>">\g<text></a>', content)
return content
def transform_anchors_strip(content):
content = empty_anchor_regex.sub(r'', content)
content = anchor_regex.sub(r'\g<text>', content)
return content
def map_contents_recursively(transformer, chapter):
chapter["Chapter"]["content"] = transformer(chapter["Chapter"]["content"])
for sub_item in chapter["Chapter"]["sub_items"]:
map_contents_recursively(transformer, sub_item)
def supports_command(args):
sys.exit(0)
def process_command(args):
context, book = json.load(sys.stdin)
transformer = transform_anchors_html if context["renderer"] == "html" else transform_anchors_strip
for section in book["sections"]:
map_contents_recursively(transformer, section)
print(json.dumps(book))
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="mdBook preprocessor adding anchors."
)
parser.set_defaults(command=process_command)
subparsers = parser.add_subparsers()
supports_parser = subparsers.add_parser("supports", help="Check if given renderer is supported")
supports_parser.add_argument("renderer", type=str)
supports_parser.set_defaults(command=supports_command)
args = parser.parse_args()
args.command(args)

View file

@ -2,4 +2,5 @@
additional-css = ["custom.css"]
[preprocessor.anchors]
command = "python3 doc/manual/anchors.py"
renderers = ["html"]
command = "jq --from-file doc/manual/anchors.jq"

View file

@ -97,7 +97,7 @@ doc/manual/generated/man1/nix3-manpages: $(d)/src/command-ref/new-cli
done
@touch $@
$(docdir)/manual/index.html: $(MANUAL_SRCS) $(d)/book.toml $(d)/anchors.py $(d)/custom.css $(d)/src/SUMMARY.md $(d)/src/command-ref/new-cli $(d)/src/command-ref/conf-file.md $(d)/src/expressions/builtins.md $(call rwildcard, $(d)/src, *.md)
$(docdir)/manual/index.html: $(MANUAL_SRCS) $(d)/book.toml $(d)/anchors.jq $(d)/custom.css $(d)/src/SUMMARY.md $(d)/src/command-ref/new-cli $(d)/src/command-ref/conf-file.md $(d)/src/expressions/builtins.md $(call rwildcard, $(d)/src, *.md)
$(trace-gen) RUST_LOG=warn mdbook build doc/manual -d $(DESTDIR)$(docdir)/manual
endif

View file

@ -102,7 +102,7 @@
# Tests
buildPackages.git
buildPackages.mercurial # FIXME: remove? only needed for tests
buildPackages.jq
buildPackages.jq # Also for custom mdBook preprocessor.
]
++ lib.optionals stdenv.hostPlatform.isLinux [(buildPackages.util-linuxMinimal or buildPackages.utillinuxMinimal)];