about summary refs log tree commit diff
path: root/users/sterni/nix/build/toPlainText/default.nix
{ pkgs, depot, lib, ... }:

{ fmt ? null
, passthru ? { }
, ...
}@args:

let
  inherit (depot.nix) getBins utils;

  bins = getBins pkgs.lowdown [
    "lowdown"
  ] // getBins pkgs.mandoc [
    "mandoc"
  ] // getBins pkgs.gnused [
    "sed"
  ];

  actions = {
    mdoc = ''
      ${bins.mandoc} -T utf8 "${thing}" > "$out"
    '';

    # Use lowdown's terminal target, but strip all ANSI SGR escape sequences
    markdown = ''
      ${bins.lowdown} -Tterm "${thing}" \
      | ${bins.sed} -e 's|\\x1b\\[[;0-9]*m||g' \
      > "$out"
    '';

    plain = ''
      cp --reflink=auto "${thing}" "$out"
    '';
  };

  thingType = builtins.head (
    builtins.filter (x: x != null) (
      builtins.map (t: if args ? ${t} then t else null) (
        builtins.attrNames actions
      )
    )
  );

  thing = args.${thingType};
  name = args.name or utils.storePathName thing;
in

pkgs.runCommand name
{
  inherit passthru;
}
  (
    actions.${thingType} + lib.optionalString (fmt != null) ''
      fmt -w "${lib.escapeShellArg (toString fmt)}" "$out"
    ''
  )