cli.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #!/usr/bin/env node
  2. // Simple CLI for KaTeX.
  3. // Reads TeX from stdin, outputs HTML to stdout.
  4. // To run this from the repository, you must first build KaTeX by running
  5. // `yarn` and `yarn build`.
  6. /* eslint no-console:0 */
  7. let katex;
  8. try {
  9. katex = require("./");
  10. } catch (e) {
  11. console.error(
  12. "KaTeX could not import, likely because dist/katex.js is missing.");
  13. console.error("Please run 'yarn' and 'yarn build' before running");
  14. console.error("cli.js from the KaTeX repository.");
  15. console.error();
  16. throw e;
  17. }
  18. const {version} = require("./package.json");
  19. const fs = require("fs");
  20. const {program} = require("commander");
  21. program.version(version);
  22. for (const prop in katex.SETTINGS_SCHEMA) {
  23. if (katex.SETTINGS_SCHEMA.hasOwnProperty(prop)) {
  24. const opt = katex.SETTINGS_SCHEMA[prop];
  25. if (opt.cli !== false) {
  26. program.option(opt.cli || "--" + prop, opt.cliDescription ||
  27. opt.description, opt.cliProcessor, opt.cliDefault);
  28. }
  29. }
  30. }
  31. program.option("-f, --macro-file <path>",
  32. "Read macro definitions, one per line, from the given file.")
  33. .option("-i, --input <path>", "Read LaTeX input from the given file.")
  34. .option("-o, --output <path>", "Write html output to the given file.");
  35. let options;
  36. function readMacros() {
  37. if (options.macroFile) {
  38. fs.readFile(options.macroFile, "utf-8", function(err, data) {
  39. if (err) {throw err;}
  40. splitMacros(data.toString().split('\n'));
  41. });
  42. } else {
  43. splitMacros([]);
  44. }
  45. }
  46. function splitMacros(macroStrings) {
  47. // Override macros from macro file (if any)
  48. // with macros from command line (if any)
  49. macroStrings = macroStrings.concat(options.macro);
  50. const macros = {};
  51. for (const m of macroStrings) {
  52. const i = m.search(":");
  53. if (i !== -1) {
  54. macros[m.substring(0, i).trim()] = m.substring(i + 1).trim();
  55. }
  56. }
  57. options.macros = macros;
  58. readInput();
  59. }
  60. function readInput() {
  61. let input = "";
  62. if (options.input) {
  63. fs.readFile(options.input, "utf-8", function(err, data) {
  64. if (err) {throw err;}
  65. input = data.toString();
  66. writeOutput(input);
  67. });
  68. } else {
  69. process.stdin.on("data", function(chunk) {
  70. input += chunk.toString();
  71. });
  72. process.stdin.on("end", function() {
  73. writeOutput(input);
  74. });
  75. }
  76. }
  77. function writeOutput(input) {
  78. // --format specifies the KaTeX output
  79. const outputFile = options.output;
  80. options.output = options.format;
  81. const output = katex.renderToString(input, options) + "\n";
  82. if (outputFile) {
  83. fs.writeFile(outputFile, output, function(err) {
  84. if (err) {
  85. return console.log(err);
  86. }
  87. });
  88. } else {
  89. console.log(output);
  90. }
  91. }
  92. if (require.main !== module) {
  93. module.exports = program;
  94. } else {
  95. options = program.parse(process.argv).opts();
  96. readMacros();
  97. }