This CL can be used to compare the style of nixpkgs-fmt against other formatters (nixpkgs, alejandra). Change-Id: I87c6abff6bcb546b02ead15ad0405f81e01b6d9e Reviewed-on: https://cl.tvl.fyi/c/depot/+/4397 Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org> Reviewed-by: lukegb <lukegb@tvl.fyi> Reviewed-by: wpcarro <wpcarro@gmail.com> Reviewed-by: Profpatsch <mail@profpatsch.de> Reviewed-by: kanepyork <rikingcoding@gmail.com> Reviewed-by: tazjin <tazjin@tvl.su> Reviewed-by: cynthia <cynthia@tvl.fyi> Reviewed-by: edef <edef@edef.eu> Reviewed-by: eta <tvl@eta.st> Reviewed-by: grfn <grfn@gws.fyi>
		
			
				
	
	
		
			268 lines
		
	
	
	
		
			6.7 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			268 lines
		
	
	
	
		
			6.7 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{ depot, lib, pkgs, ... }:
 | 
						|
 | 
						|
let
 | 
						|
  inherit (depot.nix)
 | 
						|
    getBins
 | 
						|
    runExecline
 | 
						|
    yants
 | 
						|
    ;
 | 
						|
 | 
						|
  inherit (depot.tools)
 | 
						|
    cheddar
 | 
						|
    ;
 | 
						|
 | 
						|
  inherit (pkgs)
 | 
						|
    mandoc
 | 
						|
    coreutils
 | 
						|
    fetchurl
 | 
						|
    writers
 | 
						|
    ;
 | 
						|
 | 
						|
  bins = getBins cheddar [ "cheddar" ]
 | 
						|
    // getBins mandoc [ "mandoc" ]
 | 
						|
    // getBins coreutils [ "cat" "mv" "mkdir" ]
 | 
						|
  ;
 | 
						|
 | 
						|
  normalizeDrv = fetchurl {
 | 
						|
    url = "https://necolas.github.io/normalize.css/8.0.1/normalize.css";
 | 
						|
    sha256 = "04jmvybwh2ks4dlnfa70sb3a3z3ig4cv0ya9rizjvm140xq1h22q";
 | 
						|
  };
 | 
						|
 | 
						|
  execlineStdoutInto = target: line: [
 | 
						|
    "redirfd"
 | 
						|
    "-w"
 | 
						|
    "1"
 | 
						|
    target
 | 
						|
  ] ++ line;
 | 
						|
 | 
						|
  # I will not write a pure nix markdown renderer
 | 
						|
  # I will not write a pure nix markdown renderer
 | 
						|
  # I will not write a pure nix markdown renderer
 | 
						|
  # I will not write a pure nix markdown renderer
 | 
						|
  # I will not write a pure nix markdown renderer
 | 
						|
  markdown = md:
 | 
						|
    let
 | 
						|
      html = runExecline.local "rendered-markdown"
 | 
						|
        {
 | 
						|
          stdin = md;
 | 
						|
        }
 | 
						|
        ([
 | 
						|
          "importas"
 | 
						|
          "-iu"
 | 
						|
          "out"
 | 
						|
          "out"
 | 
						|
        ] ++ execlineStdoutInto "$out" [
 | 
						|
          bins.cheddar
 | 
						|
          "--about-filter"
 | 
						|
          "description.md"
 | 
						|
        ]);
 | 
						|
    in
 | 
						|
    builtins.readFile html;
 | 
						|
 | 
						|
  indexTemplate = { title, description, pages ? [ ] }: ''
 | 
						|
    <!doctype html>
 | 
						|
    <html>
 | 
						|
      <head>
 | 
						|
        <meta charset="utf-8">
 | 
						|
        <title>${title}</title>
 | 
						|
        <link rel="stylesheet" type="text/css" href="style.css"/>
 | 
						|
      </head>
 | 
						|
      <body>
 | 
						|
        <div class="index-text">
 | 
						|
          <h1>${title}</h1>
 | 
						|
          ${markdown description}
 | 
						|
          <h2>man pages</h2>
 | 
						|
          <ul>
 | 
						|
            ${lib.concatMapStrings ({ name, section, ... }: ''
 | 
						|
              <li><a href="${name}.${toString section}.html">${name}(${toString section})</a></li>
 | 
						|
            '') pages}
 | 
						|
          </ul>
 | 
						|
        </div>
 | 
						|
      </body>
 | 
						|
    </html>
 | 
						|
  '';
 | 
						|
 | 
						|
  defaultStyle = import ./defaultStyle.nix { };
 | 
						|
 | 
						|
  # This deploy script automatically copies the build result into
 | 
						|
  # a TARGET directory and marks it as writeable optionally.
 | 
						|
  # It is exposed as the deploy attribute of the result of
 | 
						|
  # htmlman, so an htmlman expression can be used like this:
 | 
						|
  # nix-build -A deploy htmlman.nix && ./result target_dir
 | 
						|
  deployScript = title: drv: writers.writeDash "deploy-${title}" ''
 | 
						|
    usage() {
 | 
						|
      printf 'Usage: %s [-w] TARGET\n\n' "$0"
 | 
						|
      printf 'Deploy htmlman documentation to TARGET directory.\n\n'
 | 
						|
      printf '  -h    Display this help message\n'
 | 
						|
      printf '  -w    Make TARGET directory writeable\n'
 | 
						|
    }
 | 
						|
 | 
						|
    if test "$#" -lt 1; then
 | 
						|
      usage
 | 
						|
      exit 100
 | 
						|
    fi
 | 
						|
 | 
						|
    writeable=false
 | 
						|
 | 
						|
    while test "$#" -gt 0; do
 | 
						|
      case "$1" in
 | 
						|
        -h)
 | 
						|
          usage
 | 
						|
          exit 0
 | 
						|
          ;;
 | 
						|
        -w)
 | 
						|
          writeable=true
 | 
						|
          ;;
 | 
						|
        -*)
 | 
						|
          usage
 | 
						|
          exit 100
 | 
						|
          ;;
 | 
						|
        *)
 | 
						|
          if test -z "$target"; then
 | 
						|
            target="$1"
 | 
						|
          else
 | 
						|
            echo "Too many arguments"
 | 
						|
            exit 100
 | 
						|
          fi
 | 
						|
          ;;
 | 
						|
      esac
 | 
						|
 | 
						|
      shift
 | 
						|
    done
 | 
						|
 | 
						|
    if test -z "$target"; then
 | 
						|
      echo "Missing TARGET"
 | 
						|
      usage
 | 
						|
      exit 100
 | 
						|
    fi
 | 
						|
 | 
						|
    set -ex
 | 
						|
 | 
						|
    mkdir -p "$target"
 | 
						|
    cp -RTL --reflink=auto "${drv}" "$target"
 | 
						|
 | 
						|
    if $writeable; then
 | 
						|
      chmod -R +w "$target"
 | 
						|
    fi
 | 
						|
  '';
 | 
						|
 | 
						|
  htmlman =
 | 
						|
    { title
 | 
						|
      # title of the index page
 | 
						|
    , description ? ""
 | 
						|
      # description which is displayed after
 | 
						|
      # the main heading on the index page
 | 
						|
    , pages ? [ ]
 | 
						|
      # man pages of the following structure:
 | 
						|
      # {
 | 
						|
      #   name : string;
 | 
						|
      #   section : int;
 | 
						|
      #   path : either path string;
 | 
						|
      # }
 | 
						|
      # path is optional, if it is not given,
 | 
						|
      # the man page source must be located at
 | 
						|
      # "${manDir}/${name}.${toString section}"
 | 
						|
    , manDir ? null
 | 
						|
      # directory in which man page sources are located
 | 
						|
    , style ? defaultStyle
 | 
						|
      # CSS to use as a string
 | 
						|
    , normalizeCss ? true
 | 
						|
      # whether to include normalize.css before the custom CSS
 | 
						|
    , linkXr ? "all"
 | 
						|
      # How to handle cross references in the html output:
 | 
						|
      #
 | 
						|
      # * none:     don't convert cross references into hyperlinks
 | 
						|
      # * all:      link all cross references as if they were
 | 
						|
      #             rendered into $out by htmlman
 | 
						|
      # * inManDir: link to all man pages which have their source
 | 
						|
      #             in `manDir` and use the format string defined
 | 
						|
      #             in linkXrFallback for all other cross references.
 | 
						|
    , linkXrFallback ? "https://manpages.debian.org/unstable/%N.%S.en.html"
 | 
						|
      # fallback link to use if linkXr == "inManDir" and the man
 | 
						|
      # page is not in ${manDir}. Placeholders %N (name of page)
 | 
						|
      # and %S (section of page) can be used. See mandoc(1) for
 | 
						|
      # more information.
 | 
						|
    }:
 | 
						|
 | 
						|
    let
 | 
						|
      linkXrEnum = yants.enum "linkXr" [ "all" "inManDir" "none" ];
 | 
						|
 | 
						|
      index = indexTemplate {
 | 
						|
        inherit title description pages;
 | 
						|
      };
 | 
						|
 | 
						|
      resolvePath = { path ? null, name, section }:
 | 
						|
        if path != null
 | 
						|
        then path
 | 
						|
        else "${manDir}/${name}.${toString section}";
 | 
						|
 | 
						|
      mandocOpts = lib.concatStringsSep "," ([
 | 
						|
        "style=style.css"
 | 
						|
      ] ++ linkXrEnum.match linkXr {
 | 
						|
        all = [ "man=./%N.%S.html" ];
 | 
						|
        inManDir = [ "man=./%N.%S.html;${linkXrFallback}" ];
 | 
						|
        none = [ ];
 | 
						|
      });
 | 
						|
 | 
						|
      html =
 | 
						|
        runExecline.local "htmlman-${title}"
 | 
						|
          {
 | 
						|
            derivationArgs = {
 | 
						|
              inherit index style;
 | 
						|
              passAsFile = [ "index" "style" ];
 | 
						|
            };
 | 
						|
          }
 | 
						|
          ([
 | 
						|
            "multisubstitute"
 | 
						|
            [
 | 
						|
              "importas"
 | 
						|
              "-iu"
 | 
						|
              "out"
 | 
						|
              "out"
 | 
						|
              "importas"
 | 
						|
              "-iu"
 | 
						|
              "index"
 | 
						|
              "indexPath"
 | 
						|
              "importas"
 | 
						|
              "-iu"
 | 
						|
              "style"
 | 
						|
              "stylePath"
 | 
						|
            ]
 | 
						|
            "if"
 | 
						|
            [ bins.mkdir "-p" "$out" ]
 | 
						|
            "if"
 | 
						|
            [ bins.mv "$index" "\${out}/index.html" ]
 | 
						|
            "if"
 | 
						|
            (execlineStdoutInto "\${out}/style.css" [
 | 
						|
              "if"
 | 
						|
              ([
 | 
						|
                bins.cat
 | 
						|
              ] ++ lib.optional normalizeCss normalizeDrv
 | 
						|
              ++ [
 | 
						|
                "$style"
 | 
						|
              ])
 | 
						|
            ])
 | 
						|
            # let mandoc check for available man pages
 | 
						|
            "execline-cd"
 | 
						|
            "${manDir}"
 | 
						|
          ] ++ lib.concatMap
 | 
						|
            ({ name, section, ... }@p:
 | 
						|
              execlineStdoutInto "\${out}/${name}.${toString section}.html" [
 | 
						|
                "if"
 | 
						|
                [
 | 
						|
                  bins.mandoc
 | 
						|
                  "-mdoc"
 | 
						|
                  "-T"
 | 
						|
                  "html"
 | 
						|
                  "-O"
 | 
						|
                  mandocOpts
 | 
						|
                  (resolvePath p)
 | 
						|
                ]
 | 
						|
              ])
 | 
						|
            pages);
 | 
						|
    in
 | 
						|
    html // {
 | 
						|
      deploy = deployScript title html;
 | 
						|
    };
 | 
						|
in
 | 
						|
htmlman
 |