diff options
Diffstat (limited to 'src/doc/prep.js')
| -rwxr-xr-x | src/doc/prep.js | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/doc/prep.js b/src/doc/prep.js new file mode 100755 index 00000000000..3a1e60ec423 --- /dev/null +++ b/src/doc/prep.js @@ -0,0 +1,77 @@ +#!/usr/local/bin/node + +/*** + * Pandoc-style markdown preprocessor that drops extra directives + * included for running doc code, and that optionally, when + * --highlight is provided, replaces code blocks that are Rust code + * with highlighted HTML blocks. The directives recognized are: + * + * '## ignore' tells the test extractor (extract-tests.js) to ignore + * the block completely. + * '## notrust' makes the test extractor ignore the block, makes + * this script not highlight the block. + * '# [any text]' is a line that is stripped out by this script, and + * converted to a normal line of code (without the leading #) by + * the test extractor. + */ + +var fs = require("fs"); +CodeMirror = require("./lib/codemirror-node"); +require("./lib/codemirror-rust"); + +function help() { + console.log("usage: " + process.argv[0] + " [--highlight] [-o outfile] [infile]"); + process.exit(1); +} + +var highlight = false, infile, outfile; + +for (var i = 2; i < process.argv.length; ++i) { + var arg = process.argv[i]; + if (arg == "--highlight") highlight = true; + else if (arg == "-o" && outfile == null && ++i < process.argv.length) outfile = process.argv[i]; + else if (arg[0] != "-") infile = arg; + else help(); +} + +var lines = fs.readFileSync(infile || "/dev/stdin").toString().split(/\n\r?/g), cur = 0, line; +var out = outfile ? fs.createWriteStream(outfile) : process.stdout; + +while ((line = lines[cur++]) != null) { + if (/^~~~/.test(line)) { + var block = "", bline; + var notRust = + /notrust/.test(line) + // These are all used by the language ref to indicate things + // that are not Rust source code + || /ebnf/.test(line) + || /abnf/.test(line) + || /keyword/.test(line) + || /field/.test(line) + || /precedence/.test(line); + var isRust = !notRust; + while ((bline = lines[cur++]) != null) { + if (/^~~~/.test(bline)) break; + if (!/^\s*##? /.test(bline)) block += bline + "\n"; + } + if (!highlight || !isRust) + out.write(line + "\n" + block + bline + "\n"); + else { + var html = '<pre class="cm-s-default">', curstr = "", curstyle = null; + function add(str, style) { + if (style != curstyle) { + if (curstyle) html += + '<span class="cm-' + CodeMirror.htmlEscape(curstyle) + '">' + + CodeMirror.htmlEscape(curstr) + "</span>"; + else if (curstr) html += CodeMirror.htmlEscape(curstr); + curstr = str; curstyle = style; + } else curstr += str; + } + CodeMirror.runMode(block, "rust", add); + add("", "bogus"); // Flush pending string. + out.write(html + "</pre>\n"); + } + } else { + out.write(line + "\n"); + } +} |
