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:
parent
4de84e095d
commit
3272afa17b
31
doc/manual/anchors.jq
Executable file
31
doc/manual/anchors.jq
Executable 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
|
|
@ -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)
|
|
|
@ -2,4 +2,5 @@
|
||||||
additional-css = ["custom.css"]
|
additional-css = ["custom.css"]
|
||||||
|
|
||||||
[preprocessor.anchors]
|
[preprocessor.anchors]
|
||||||
command = "python3 doc/manual/anchors.py"
|
renderers = ["html"]
|
||||||
|
command = "jq --from-file doc/manual/anchors.jq"
|
||||||
|
|
|
@ -97,7 +97,7 @@ doc/manual/generated/man1/nix3-manpages: $(d)/src/command-ref/new-cli
|
||||||
done
|
done
|
||||||
@touch $@
|
@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
|
$(trace-gen) RUST_LOG=warn mdbook build doc/manual -d $(DESTDIR)$(docdir)/manual
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -102,7 +102,7 @@
|
||||||
# Tests
|
# Tests
|
||||||
buildPackages.git
|
buildPackages.git
|
||||||
buildPackages.mercurial # FIXME: remove? only needed for tests
|
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)];
|
++ lib.optionals stdenv.hostPlatform.isLinux [(buildPackages.util-linuxMinimal or buildPackages.utillinuxMinimal)];
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue