diff --git a/docs/default.nix b/docs/default.nix index 662dd403..49f90b80 100644 --- a/docs/default.nix +++ b/docs/default.nix @@ -92,7 +92,7 @@ # Generate the HTML manual pages html = pkgs.callPackage ./manual.nix { - inherit inputs release; + inherit release; inherit (nvimModuleDocs) optionsJSON; }; in { diff --git a/docs/manual.nix b/docs/manual.nix index 132c20ef..50a5dab4 100644 --- a/docs/manual.nix +++ b/docs/manual.nix @@ -1,47 +1,114 @@ { - inputs, - path, + lib, stdenvNoCC, + fetchzip, runCommandLocal, - optionsJSON, + # build inputs + nixos-render-docs, + documentation-highlighter, + dart-sass, + path, + # nrd configuration release, + optionsJSON, } @ args: let manual-release = args.release or "unstable"; + + scss-reset = fetchzip { + url = "https://github.com/Frontend-Layers/scss-reset/archive/refs/tags/1.4.2.zip"; + hash = "sha256-cif5Sx8Ca5vxdw/mNAgpulLH15TwmzyJFNM7JURpoaE="; + }; + + compileStylesheet = runCommandLocal "compile-nvf-stylesheet" {} '' + mkdir -p $out + + tmpfile=$(mktemp -d) + trap "rm -r $tmpfile" EXIT + + ln -s "${scss-reset}/build" "$tmpfile/scss-reset" + + ${dart-sass}/bin/sass --load-path "$tmpfile" \ + ${./static/style.scss} "$out/style.css" + + echo "Generated styles" + ''; in - runCommandLocal "nvf-docs-html" { - nativeBuildInputs = [ - (inputs.ndg.packages.${stdenvNoCC.system}.ndg.overrideAttrs - { - # FIXME: the tests take too long to build - doCheck = false; - }) - ]; - } '' - mkdir -p $out/share/doc + stdenvNoCC.mkDerivation { + name = "nvf-manual"; + src = builtins.path { + name = "nvf-manual-${manual-release}"; + path = lib.sourceFilesBySuffices ./manual [".md" ".md.in"]; + }; - # Copy the markdown sources to be processed by ndg. This is not - # strictly necessary, but allows us to modify the Markdown sources - # as we see fit. - cp -rvf ${./manual} ./manual + strictDependencies = true; + nativeBuildInputs = [nixos-render-docs]; - # Replace variables following the @VARIABLE@ style in the manual - # pages. This can be built into ndg at a later date. - substituteInPlace ./manual/index.md \ - --subst-var-by NVF_VERSION ${manual-release} + postPatch = '' + ln -s ${optionsJSON}/share/doc/nixos/options.json ./config-options.json + ''; - # Generate the final manual from a set of parameters. This uses - # feel-co/ndg to render the web manual. - ndg html \ - --jobs $NIX_BUILD_CORES --title "NVF" \ - --module-options ${optionsJSON}/share/doc/nixos/options.json \ - --manpage-urls ${path}/doc/manpage-urls.json \ - --options-depth 3 \ - --generate-search \ - --highlight-code \ - --input-dir ./manual \ - --output-dir "$out/share/doc" + buildPhase = '' + dest="$out/share/doc/nvf" + mkdir -p "$(dirname "$dest")" + mkdir -p $dest/{highlightjs,script} - # Hydra support. Probably not necessary. - mkdir -p $out/nix-support/ - echo "doc manual $dest index.html" >> $out/nix-support/hydra-build-products - '' + # Copy highlight scripts to /highlights in document root. + cp -vt $dest/highlightjs \ + ${documentation-highlighter}/highlight.pack.js \ + ${documentation-highlighter}/LICENSE \ + ${documentation-highlighter}/mono-blue.css \ + ${documentation-highlighter}/loader.js + + # Copy anchor scripts to the script directory in document root. + cp -vt "$dest"/script \ + ${./static/script}/anchor-min.js \ + ${./static/script}/anchor-use.js \ + ${./static/script}/search.js + + substituteInPlace ./options.md \ + --subst-var-by OPTIONS_JSON ./config-options.json + + substituteInPlace ./manual.md \ + --subst-var-by NVF_VERSION ${manual-release} + + substituteInPlace ./hacking/additional-plugins.md \ + --subst-var-by NVF_REPO "https://github.com/notashelf/nvf/blob/${manual-release}" + + # Move compiled stylesheet + cp -vt $dest \ + ${compileStylesheet}/style.css + + # Move release notes + cp -vr ${./release-notes} release-notes + + # Generate final manual from a set of parameters. Explanation of the CLI flags are + # as follows: + # + # 1. --manpage-urls will allow you to use manual pages as they are defined in + # the nixpkgs documentation. + # 2. --revision is the project revision as it is defined in 'release.json' in the + # repository root + # 3. --script will inject a given Javascript file into the resulting pages inside + # the