diff --git a/modules/plugins/formatter/conform-nvim/builders/builderTemplate.nix b/modules/plugins/formatter/conform-nvim/builders/builderTemplate.nix deleted file mode 100644 index 02d20412..00000000 --- a/modules/plugins/formatter/conform-nvim/builders/builderTemplate.nix +++ /dev/null @@ -1,66 +0,0 @@ -# This function acts as a template for creating new builders. -# It enforces providing all the parameters required for creating -# a new builder for it to be able to work in the existing code. -# -# The first layer requirements are as follows: -{ - # This is the name of the builder, it will only be used internally and - # should match the .nix file that the builder is implemented in. - name, - # - # Module attribute set. This is the attribute set that the module that is - # defining a builder is passed as its input. - moduleInheritancePackage, - # - # These are the standard options for the builder just like creating any - # other module. Some options are required and are described below but - # it will also accept any other options that are provided to it. - options, - # - # These are the command line arguments that will accompany the executable - # when the build command is called. - # This is a function that will take in the cfg of its own builder. - # i.e. will be called as "args cfg.build.builders.${name}" - args, - ... -}: let - # Inherit the necessary variables available to any module. - inherit (moduleInheritancePackage) lib config; - # - # Inherit other useful functions. - inherit (lib.modules) mkIf; - # - # Set the cfg variable - cfg = config.vim.languages.tex; -in { - # These are the options for the builder. It will accept any options - # provided to it but some options are mandatory: - options.vim.languages.tex.build.builders.${name} = ({ - # The enable option. This one is self explanatory. - enable, - # - # This is the package option for the builder. - package, - # - # This is the executable that will be used to call the builder. - # It, along with package will result in: - # "/bin/" - executable, - # - # Any other options provided are accepted. - ... - } @ opts: - opts) - options; - - # Check that the language and this builder have been enabled - # before making any config. - config = mkIf (cfg.enable && cfg.build.builders.${name}.enable) { - vim.languages.tex.build.builder = { - inherit name; - package = cfg.build.builders.${name}.package; - executable = cfg.build.builders.${name}.executable; - args = args cfg.build.builders.${name}; - }; - }; -} diff --git a/modules/plugins/formatter/conform-nvim/builders/latexmk.nix b/modules/plugins/formatter/conform-nvim/builders/latexmk.nix index 4d024eb3..510c9561 100644 --- a/modules/plugins/formatter/conform-nvim/builders/latexmk.nix +++ b/modules/plugins/formatter/conform-nvim/builders/latexmk.nix @@ -1,57 +1,53 @@ # TODO: I need testing. { - pkgs, + config, lib, + pkgs, ... -} @ moduleInheritancePackage: let +}: let # The name of the builder name = "latexmk"; - # The builder template - template = import ./builderTemplate.nix; - + inherit (lib.modules) mkIf; + inherit (lib.nvim.config) mkBool; inherit (lib.options) mkOption mkEnableOption; - inherit (lib.types) bool package str; -in ( - template { - inherit name moduleInheritancePackage; + inherit (lib.types) package str; - options = { - enable = mkEnableOption "Whether to enable Tex Compilation Via latexmk"; + texCfg = config.vim.languages.tex; + cfg = texCfg.build.builders.${name}; +in { + options.vim.languages.tex.build.builders.${name} = { + enable = mkEnableOption "Whether to enable Tex Compilation Via latexmk"; - package = mkOption { - type = package; - default = pkgs.texlive.withPackages (ps: [ps.latexmk]); - description = "latexmk package"; - }; - - executable = mkOption { - type = str; - default = "latexmk"; - description = "The executable name from the build package that will be used to build/compile the tex."; - }; - - # Flag options - pdfOutput = mkOption { - type = bool; - default = true; - example = false; - description = "Insure the output file is a pdf."; - }; + package = mkOption { + type = package; + default = pkgs.texlive.withPackages (ps: [ps.latexmk]); + description = "latexmk package"; }; - args = builderCfg: ( - # Flags - ( - if builderCfg.pdfOutput - then ["-pdf"] - else [] - ) - # Base args - ++ [ - "-quiet" - "%f" - ] - ); - } -) + executable = mkOption { + type = str; + default = "latexmk"; + description = "The executable name from the build package that will be used to build/compile the tex."; + }; + + # Flag options + pdfOutput = mkBool true "Insure the output file is a pdf."; + }; + + config = mkIf (texCfg.enable && cfg.enable) { + vim.languages.tex.build.builder = { + inherit name; + inherit (cfg) package executable; + args = ( + # Flags + (lib.lists.optional cfg.pdfOutput "-pdf") + # Base args + ++ [ + "-quiet" + "%f" + ] + ); + }; + }; +} diff --git a/modules/plugins/formatter/conform-nvim/builders/tectonic.nix b/modules/plugins/formatter/conform-nvim/builders/tectonic.nix index 1b131b33..0991cff4 100644 --- a/modules/plugins/formatter/conform-nvim/builders/tectonic.nix +++ b/modules/plugins/formatter/conform-nvim/builders/tectonic.nix @@ -1,203 +1,161 @@ { config, - pkgs, lib, + pkgs, ... -} @ moduleInheritancePackage: let +}: let # The name of the builder name = "tectonic"; - # The builder template - template = import ./builderTemplate.nix; - - inherit (lib.options) mkOption mkEnableOption; - inherit (lib.types) enum ints listOf package str; + inherit (builtins) concatLists elem map toString match; + inherit (lib.modules) mkIf; inherit (lib.nvim.config) mkBool; - inherit (builtins) concatLists elem map toString; + inherit (lib.options) mkOption mkEnableOption; + inherit (lib.strings) toLower optionalString stringAsChars; + inherit (lib.types) enum ints listOf package str; - cfg = config.vim.languages.tex; -in ( - template { - inherit name moduleInheritancePackage; + texCfg = config.vim.languages.tex; + cfg = texCfg.build.builders.${name}; +in { + options.vim.languages.tex.build.builders.${name} = { + enable = mkEnableOption "Whether to enable Tex Compilation Via Tectonic"; - options = { - enable = mkEnableOption "Whether to enable Tex Compilation Via Tectonic"; - - package = mkOption { - type = package; - default = pkgs.tectonic; - description = "tectonic package"; - }; - - executable = mkOption { - type = str; - default = "tectonic"; - description = "The executable name from the build package that will be used to build/compile the tex."; - }; - - # -- Flags -- - keepIntermediates = mkBool false '' - Keep the intermediate files generated during processing. - - If texlab is reporting build errors when there shouldn't be, disable this option. - ''; - keepLogs = mkBool true '' - Keep the log files generated during processing. - - Without the keepLogs flag, texlab won't be able to report compilation warnings. - ''; - onlyCached = mkBool false "Use only resource files cached locally"; - synctex = mkBool true "Generate SyncTeX data"; - untrustedInput = mkBool false "Input is untrusted -- disable all known-insecure features"; - - # -- Options -- - reruns = mkOption { - type = ints.unsigned; - default = 0; - example = 2; - description = '' - Rerun the TeX engine exactly this many times after the first. - - Setting this value to 0 will disable setting this option. - ''; - }; - - bundle = mkOption { - type = str; - default = ""; - description = "Use this directory or Zip-format bundle file to find resource files instead of the default"; - }; - - webBundle = mkOption { - type = str; - default = ""; - description = "Use this URL to find resource files instead of the default"; - }; - - outfmt = mkOption { - type = enum [ - "pdf" - "html" - "xdv" - "aux" - "fmt" - "" - ]; - default = ""; - description = "The kind of output to generate"; - }; - - hidePaths = mkOption { - type = listOf str; - default = []; - example = [ - "./secrets.tex" - "./passwords.tex" - ]; - description = "Tell the engine that no file at exists, if it tries to read it."; - }; - - format = mkOption { - type = str; - default = ""; - description = "The name of the \"format\" file used to initialize the TeX engine"; - }; - - color = mkOption { - type = enum [ - "always" - "auto" - "never" - "" - ]; - default = ""; - example = "always"; - description = "Enable/disable colorful log output"; - }; - - extraOptions = { - type = listOf str; - default = []; - description = '' - Add extra command line options to include in the tectonic build command. - Extra options added here will not overwrite the options set in as nvf options. - ''; - }; + package = mkOption { + type = package; + default = pkgs.tectonic; + description = "tectonic package"; }; - args = builderCfg: ( - # Base args - [ - "-X" - "compile" - "%f" - ] - # Flags - ++ ( - if builderCfg.keepIntermediates - then ["--keep-intermediates"] - else [] - ) - ++ ( - if builderCfg.keepLogs - then ["--keep-logs"] - else [] - ) - ++ ( - if builderCfg.onlyCached - then ["--only-cached"] - else [] - ) - ++ ( - if builderCfg.synctex - then ["--synctex"] - else [] - ) - ++ ( - if builderCfg.untrustedInput - then ["--untrusted"] - else [] - ) - # Options - ++ ( - if builderCfg.reruns > 0 - then ["--reruns" "${toString builderCfg.reruns}"] - else [] - ) - ++ ( - if builderCfg.bundle != "" - then ["--bundle" "${toString builderCfg.bundle}"] - else [] - ) - ++ ( - if builderCfg.webBundle != "" - then ["--web-bundle" "${toString builderCfg.webBundle}"] - else [] - ) - ++ ( - if builderCfg.outfmt != "" - then ["--outfmt" "${toString builderCfg.outfmt}"] - else [] - ) - ++ (concatLists (map (x: ["--hide" x]) builderCfg.hidePaths)) - ++ ( - if builderCfg.format != "" - then ["--format" "${toString builderCfg.format}"] - else [] - ) - ++ ( - if builderCfg.color != "" - then ["--color" "${toString builderCfg.color}"] - else [] - ) - # Still options but these are not defined by builder specific options but - # instead synchronize options between the global build options and builder - # specific options - ++ ( - if !(elem cfg.build.pdfDirectory ["." ""]) - then ["--outdir" "${cfg.build.pdfDirectory}"] - else [] - ) - ); - } -) + executable = mkOption { + type = str; + default = "tectonic"; + description = "The executable name from the build package that will be used to build/compile the tex."; + }; + + # -- Flags -- + keepIntermediates = mkBool false '' + Keep the intermediate files generated during processing. + + If texlab is reporting build errors when there shouldn't be, disable this option. + ''; + keepLogs = mkBool true '' + Keep the log files generated during processing. + + Without the keepLogs flag, texlab won't be able to report compilation warnings. + ''; + onlyCached = mkBool false "Use only resource files cached locally"; + synctex = mkBool true "Generate SyncTeX data"; + untrustedInput = mkBool false "Input is untrusted -- disable all known-insecure features"; + + # -- Options -- + reruns = mkOption { + type = ints.unsigned; + default = 0; + example = 2; + description = '' + Rerun the TeX engine exactly this many times after the first. + + Setting this value to 0 will disable setting this option. + ''; + }; + + bundle = mkOption { + type = str; + default = ""; + description = "Use this directory or Zip-format bundle file to find resource files instead of the default"; + }; + + webBundle = mkOption { + type = str; + default = ""; + description = "Use this URL to find resource files instead of the default"; + }; + + outfmt = mkOption { + type = enum [ + "pdf" + "html" + "xdv" + "aux" + "fmt" + "" + ]; + default = ""; + description = "The kind of output to generate"; + }; + + hidePaths = mkOption { + type = listOf str; + default = []; + example = [ + "./secrets.tex" + "./passwords.tex" + ]; + description = "Tell the engine that no file at exists, if it tries to read it."; + }; + + format = mkOption { + type = str; + default = ""; + description = "The name of the \"format\" file used to initialize the TeX engine"; + }; + + color = mkOption { + type = enum [ + "always" + "auto" + "never" + "" + ]; + default = ""; + example = "always"; + description = "Enable/disable colorful log output"; + }; + + extraOptions = { + type = listOf str; + default = []; + description = '' + Add extra command line options to include in the tectonic build command. + Extra options added here will not overwrite the options set in as nvf options. + ''; + }; + }; + + config = mkIf (texCfg.enable && cfg.enable) { + vim.languages.tex.build.builder = { + inherit name; + inherit (cfg) package executable; + args = let + inherit (lib.lists) optional optionals; + snakeCaseToKebabCase = str: stringAsChars (x: "${optionalString ((match "[A-Z]" x) != null) "-"}${toLower x}") str; + generateOptionFlag = option: (optionals (cfg.${option} != "") ["--${snakeCaseToKebabCase option}" "${toString cfg.${option}}"]); + in ( + # Base args + [ + "-X" + "compile" + "%f" + ] + # Flags + ++ (optional cfg.keepIntermediates "--keep-intermediates") + ++ (optional cfg.keepLogs "--keep-logs") + ++ (optional cfg.onlyCached "--only-cached") + ++ (optional cfg.synctex "--synctex") + ++ (optional cfg.untrustedInput "--untrusted") + # Options + ++ (optionals (cfg.reruns > 0) ["--reruns" "${toString cfg.reruns}"]) + ++ (generateOptionFlag "bundle") + ++ (generateOptionFlag "webBundle") + ++ (generateOptionFlag "outfmt") + ++ (concatLists (map (x: ["--hide" x]) cfg.hidePaths)) + ++ (generateOptionFlag "format") + ++ (generateOptionFlag "color") + # Still options but these are not defined by builder specific options but + # instead synchronize options between the global build options and builder + # specific options. + ++ (optionals (!(elem texCfg.build.pdfDirectory ["." ""])) ["--outdir" "${texCfg.build.pdfDirectory}"]) + ); + }; + }; +} diff --git a/modules/plugins/languages/tex/build/builders/builderTemplate.nix b/modules/plugins/languages/tex/build/builders/builderTemplate.nix deleted file mode 100644 index 02d20412..00000000 --- a/modules/plugins/languages/tex/build/builders/builderTemplate.nix +++ /dev/null @@ -1,66 +0,0 @@ -# This function acts as a template for creating new builders. -# It enforces providing all the parameters required for creating -# a new builder for it to be able to work in the existing code. -# -# The first layer requirements are as follows: -{ - # This is the name of the builder, it will only be used internally and - # should match the .nix file that the builder is implemented in. - name, - # - # Module attribute set. This is the attribute set that the module that is - # defining a builder is passed as its input. - moduleInheritancePackage, - # - # These are the standard options for the builder just like creating any - # other module. Some options are required and are described below but - # it will also accept any other options that are provided to it. - options, - # - # These are the command line arguments that will accompany the executable - # when the build command is called. - # This is a function that will take in the cfg of its own builder. - # i.e. will be called as "args cfg.build.builders.${name}" - args, - ... -}: let - # Inherit the necessary variables available to any module. - inherit (moduleInheritancePackage) lib config; - # - # Inherit other useful functions. - inherit (lib.modules) mkIf; - # - # Set the cfg variable - cfg = config.vim.languages.tex; -in { - # These are the options for the builder. It will accept any options - # provided to it but some options are mandatory: - options.vim.languages.tex.build.builders.${name} = ({ - # The enable option. This one is self explanatory. - enable, - # - # This is the package option for the builder. - package, - # - # This is the executable that will be used to call the builder. - # It, along with package will result in: - # "/bin/" - executable, - # - # Any other options provided are accepted. - ... - } @ opts: - opts) - options; - - # Check that the language and this builder have been enabled - # before making any config. - config = mkIf (cfg.enable && cfg.build.builders.${name}.enable) { - vim.languages.tex.build.builder = { - inherit name; - package = cfg.build.builders.${name}.package; - executable = cfg.build.builders.${name}.executable; - args = args cfg.build.builders.${name}; - }; - }; -} diff --git a/modules/plugins/languages/tex/build/builders/latexmk.nix b/modules/plugins/languages/tex/build/builders/latexmk.nix index bbb4ecd5..a840f1b2 100644 --- a/modules/plugins/languages/tex/build/builders/latexmk.nix +++ b/modules/plugins/languages/tex/build/builders/latexmk.nix @@ -1,59 +1,57 @@ # TODO: I need testing. { - pkgs, + config, lib, + pkgs, ... -} @ moduleInheritancePackage: let +}: let # The name of the builder name = "latexmk"; - # The builder template - template = import ./builderTemplate.nix; - - inherit (lib) optionals; + inherit (lib.modules) mkIf; + inherit (lib.nvim.config) mkBool; inherit (lib.options) mkOption mkEnableOption; - inherit (lib.types) bool package str; -in ( - template { - inherit name moduleInheritancePackage; + inherit (lib.types) package str; - options = { - enable = mkEnableOption "Tex Compilation Via latexmk"; + texCfg = config.vim.languages.tex; + cfg = texCfg.build.builders.${name}; +in { + options.vim.languages.tex.build.builders.${name} = { + enable = mkEnableOption "Tex Compilation Via latexmk"; - package = mkOption { - type = package; - default = pkgs.texlive.withPackages (ps: [ps.latexmk]); - description = "latexmk package"; - }; - - executable = mkOption { - type = str; - default = "latexmk"; - description = '' - The executable name from the build package that will be used to - build/compile the tex. - ''; - }; - - # Flag options - pdfOutput = mkOption { - type = bool; - default = true; - example = false; - description = "Insure the output file is a pdf."; - }; + package = mkOption { + type = package; + default = pkgs.texlive.withPackages (ps: [ps.latexmk]); + description = "latexmk package"; }; - # Optional flags must come before the base args because of how the latexmk - # command works - args = builderCfg: ( - # Flags - (optionals builderCfg.pdfOutput ["-pdf"]) - # Base args - ++ [ - "-quiet" - "%f" - ] - ); - } -) + executable = mkOption { + type = str; + default = "latexmk"; + description = '' + The executable name from the build package that will be used to + build/compile the tex. + ''; + }; + + # Flag options + pdfOutput = mkBool true "Insure the output file is a pdf."; + }; + + config = mkIf (texCfg.enable && cfg.enable) { + vim.languages.tex.build.builder = { + inherit name; + inherit (cfg) package executable; + + args = ( + # Flags + (lib.lists.optional cfg.pdfOutput "-pdf") + # Base args + ++ [ + "-quiet" + "%f" + ] + ); + }; + }; +} diff --git a/modules/plugins/languages/tex/build/builders/tectonic.nix b/modules/plugins/languages/tex/build/builders/tectonic.nix index 6c680cff..f65db0ea 100644 --- a/modules/plugins/languages/tex/build/builders/tectonic.nix +++ b/modules/plugins/languages/tex/build/builders/tectonic.nix @@ -1,229 +1,184 @@ { config, - pkgs, lib, + pkgs, ... -} @ moduleInheritancePackage: let +}: let # The name of the builder name = "tectonic"; - # The builder template - template = import ./builderTemplate.nix; - - inherit (lib) optionals; - inherit (lib.options) mkOption mkEnableOption mkPackageOption; - inherit (lib.types) enum ints listOf str nullOr; + inherit (builtins) concatLists elem map toString match; + inherit (lib.modules) mkIf; inherit (lib.nvim.config) mkBool; - inherit (builtins) concatLists elem map toString attrNames filter isList; + inherit (lib.options) mkOption mkEnableOption mkPackageOption; + inherit (lib.strings) toLower optionalString stringAsChars; + inherit (lib.types) enum ints listOf str nullOr; - notNull = x: x != null; - forceCheck = x: true; - toList = x: - if isList x - then x - else [x]; + texCfg = config.vim.languages.tex; + cfg = texCfg.build.builders.${name}; +in { + options.vim.languages.tex.build.builders.${name} = { + enable = mkEnableOption "Tex Compilation Via Tectonic"; - cfg = config.vim.languages.tex; -in ( - template { - inherit name moduleInheritancePackage; + package = mkPackageOption pkgs "tectonic" {}; - options = { - enable = mkEnableOption "Tex Compilation Via Tectonic"; - - package = mkPackageOption pkgs "tectonic" {}; - - executable = mkOption { - type = str; - default = "tectonic"; - description = '' - The executable name from the build package that will be used to - build/compile the tex. - ''; - }; - - # -- Flags -- - keepIntermediates = mkBool false '' - Whether to keep the intermediate files generated during processing. - - If texlab is reporting build errors when there shouldn't be, disable - this option. + executable = mkOption { + type = str; + default = "tectonic"; + description = '' + The executable name from the build package that will be used to + build/compile the tex. ''; - keepLogs = mkBool true '' - Whether to keep the log files generated during processing. - - Without the keepLogs flag, texlab won't be able to report compilation - warnings. - ''; - onlyCached = mkBool false '' - Whether to use only resource files cached locally - ''; - synctex = mkBool true "Whether to generate SyncTeX data"; - untrustedInput = mkBool false '' - Whether to disable all known-insecure features if the input is untrusted - ''; - - # -- Options -- - reruns = mkOption { - type = ints.unsigned; - default = 0; - example = 2; - description = '' - How many times to *rerun* the TeX build engine. - The build engine (if a builder is enabled) will always run at least - once. - - Setting this value to 0 will disable setting this option. - ''; - }; - - bundle = mkOption { - type = nullOr str; - default = null; - description = '' - The directory or Zip-format bundle file to find resource files instead - of the default. - ''; - }; - - webBundle = mkOption { - type = nullOr str; - default = null; - description = '' - Use this URL to find resource files instead of the default. - ''; - }; - - outfmt = mkOption { - type = nullOr (enum [ - "pdf" - "html" - "xdv" - "aux" - "fmt" - ]); - default = null; - description = '' - The kind of output to generate. - - Setting this to `null` (default) will let tectonic decide the most - appropriate output format, which usually be a pdf. - ''; - }; - - hidePaths = mkOption { - type = listOf str; - default = []; - example = [ - "./secrets.tex" - "./passwords.tex" - ]; - description = '' - Tell the engine that no file at `` exists, if it tries - to read it. - ''; - }; - - format = mkOption { - type = nullOr str; - default = null; - description = '' - The name of the \"format\" file used to initialize the TeX engine. - ''; - }; - - color = mkOption { - type = nullOr (enum [ - "always" - "auto" - "never" - ]); - default = null; - example = "always"; - description = "Enable/disable colorful log output"; - }; - - extraOptions = mkOption { - type = listOf str; - default = []; - description = '' - Add extra command line options to include in the tectonic build - command. - Extra options added here will not overwrite the options set in as nvf - options. - ''; - }; }; - # args = builderCfg: ( - # # Base args - # [ - # "-X" - # "compile" - # "%f" - # ] - # # Flags - # ++ (optionals builderCfg.keepIntermediates ["--keep-intermediates"]) - # ++ (optionals builderCfg.keepLogs ["--keep-logs"]) - # ++ (optionals builderCfg.onlyCached ["--only-cached"]) - # ++ (optionals builderCfg.synctex ["--synctex"]) - # ++ (optionals builderCfg.untrustedInput ["--untrusted"]) - # # Options - # ++ (optionals (builderCfg.reruns > 0) ["--reruns" "${toString builderCfg.reruns}"]) - # ++ (optionals (builderCfg.bundle != null) ["--bundle" "${toString builderCfg.bundle}"]) - # ++ (optionals (builderCfg.webBundle != null) ["--web-bundle" "${toString builderCfg.webBundle}"]) - # ++ (optionals (builderCfg.outfmt != null) ["--outfmt" "${toString builderCfg.outfmt}"]) - # ++ (concatLists (map (x: ["--hide" x]) builderCfg.hidePaths)) - # ++ (optionals (builderCfg.format != null) ["--format" "${toString builderCfg.format}"]) - # ++ (optionals (builderCfg.color != null) ["--color" "${toString builderCfg.color}"]) - # # Still options but these are not defined by builder specific options but - # # instead synchronize options between the global build options and builder - # # specific options - # ++ (optionals (!(elem cfg.build.pdfDirectory ["." ""])) ["--outdir" "${cfg.build.pdfDirectory}"]) - # ); + # -- Flags -- + keepIntermediates = mkBool false '' + Whether to keep the intermediate files generated during processing. - args = builderCfg: let - option = setCheck: flag: {inherit setCheck flag;}; - args = { - baseArgs = ["-X" "compile" "%f"]; + If texlab is reporting build errors when there shouldn't be, disable + this option. + ''; + keepLogs = mkBool true '' + Whether to keep the log files generated during processing. - flags = { - keepIntermediates = "--keep-intermediates"; - keepLogs = "--keep-logs"; - onlyCached = "--only-cached"; - synctex = "--synctex"; - untrustedInput = "--untrusted"; - }; + Without the keepLogs flag, texlab won't be able to report compilation + warnings. + ''; + onlyCached = mkBool false '' + Whether to use only resource files cached locally + ''; + synctex = mkBool true "Whether to generate SyncTeX data"; + untrustedInput = mkBool false '' + Whether to disable all known-insecure features if the input is untrusted + ''; - options = { - reruns = option (x: x > 0) "--reruns"; - bundle = option notNull "--bundle"; - webBundle = option notNull "--web-bundle"; - outfmt = option notNull "--outfmt"; - format = option notNull "--format"; - color = option notNull "--color"; - hidePaths = option forceCheck "--hide"; - }; + # -- Options -- + reruns = mkOption { + type = ints.unsigned; + default = 0; + example = 2; + description = '' + How many times to *rerun* the TeX build engine. + The build engine (if a builder is enabled) will always run at least + once. - externalOptions = concatLists [ - (optionals (!(elem cfg.build.pdfDirectory ["." ""])) ["--outdir" "${cfg.build.pdfDirectory}"]) - ]; - }; + Setting this value to 0 will disable setting this option. + ''; + }; - flags = map (flag: args.flags.${flag}) (filter (flag: builderCfg.${flag}) (attrNames args.flags)); - options = let - getOptionFlagsList = opt: - concatLists ( - map - (y: [args.options."${opt}".flag "${toString y}"]) - (toList builderCfg."${opt}") - ); - processOption = opt: - optionals - (args.options."${opt}".setCheck builderCfg."${opt}") - (getOptionFlagsList opt); - in (concatLists (map processOption (attrNames args.options))); - in - concatLists (with args; [baseArgs flags options externalOptions]); - } -) + bundle = mkOption { + type = nullOr str; + default = null; + description = '' + The directory or Zip-format bundle file to find resource files instead + of the default. + ''; + }; + + webBundle = mkOption { + type = nullOr str; + default = null; + description = '' + Use this URL to find resource files instead of the default. + ''; + }; + + outfmt = mkOption { + type = nullOr (enum [ + "pdf" + "html" + "xdv" + "aux" + "fmt" + ]); + default = null; + description = '' + The kind of output to generate. + + Setting this to `null` (default) will let tectonic decide the most + appropriate output format, which usually be a pdf. + ''; + }; + + hidePaths = mkOption { + type = listOf str; + default = []; + example = [ + "./secrets.tex" + "./passwords.tex" + ]; + description = '' + Tell the engine that no file at `` exists, if it tries + to read it. + ''; + }; + + format = mkOption { + type = nullOr str; + default = null; + description = '' + The name of the \"format\" file used to initialize the TeX engine. + ''; + }; + + color = mkOption { + type = nullOr (enum [ + "always" + "auto" + "never" + ]); + default = null; + example = "always"; + description = "Enable/disable colorful log output"; + }; + + extraOptions = mkOption { + type = listOf str; + default = []; + description = '' + Add extra command line options to include in the tectonic build + command. + Extra options added here will not overwrite the options set in as nvf + options. + ''; + }; + }; + + config = mkIf (texCfg.enable && cfg.enable) { + vim.languages.tex.build.builder = { + inherit name; + inherit (cfg) package executable; + + args = let + inherit (lib.lists) optional optionals; + snakeCaseToKebabCase = str: stringAsChars (x: "${optionalString ((match "[A-Z]" x) != null) "-"}${toLower x}") str; + generateOptionFlag = option: (optionals (cfg.${option} != "" && cfg.${option} != null) ["--${snakeCaseToKebabCase option}" "${toString cfg.${option}}"]); + in ( + # Base args + [ + "-X" + "compile" + "%f" + ] + # Flags + ++ (optional cfg.keepIntermediates "--keep-intermediates") + ++ (optional cfg.keepLogs "--keep-logs") + ++ (optional cfg.onlyCached "--only-cached") + ++ (optional cfg.synctex "--synctex") + ++ (optional cfg.untrustedInput "--untrusted") + # Options + ++ (optionals (cfg.reruns > 0) ["--reruns" "${toString cfg.reruns}"]) + ++ (generateOptionFlag "bundle") + ++ (generateOptionFlag "webBundle") + ++ (generateOptionFlag "outfmt") + ++ (concatLists (map (x: ["--hide" x]) cfg.hidePaths)) + ++ (generateOptionFlag "format") + ++ (generateOptionFlag "color") + # Still options but these are not defined by builder specific options but + # instead synchronize options between the global build options and builder + # specific options. + ++ (optionals (!(elem texCfg.build.pdfDirectory ["." ""])) ["--outdir" "${texCfg.build.pdfDirectory}"]) + ); + }; + }; +}