12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- #!/usr/bin/env node
- // Simple command-line code highlighting tool. Reads code from stdin,
- // spits html to stdout. For example:
- //
- // echo 'function foo(a) { return a; }' | bin/source-highlight -s javascript
- // bin/source-highlight -s
- var fs = require("fs");
- CodeMirror = require("../addon/runmode/runmode.node.js");
- require("../mode/meta.js");
- var sPos = process.argv.indexOf("-s");
- if (sPos == -1 || sPos == process.argv.length - 1) {
- console.error("Usage: source-highlight -s language");
- process.exit(1);
- }
- var lang = process.argv[sPos + 1].toLowerCase(), modeName = lang;
- CodeMirror.modeInfo.forEach(function(info) {
- if (info.mime == lang) {
- modeName = info.mode;
- } else if (info.name.toLowerCase() == lang) {
- modeName = info.mode;
- lang = info.mime;
- }
- });
- function ensureMode(name) {
- if (CodeMirror.modes[name] || name == "null") return;
- try {
- require("../mode/" + name + "/" + name + ".js");
- } catch(e) {
- console.error("Could not load mode " + name + ".");
- process.exit(1);
- }
- var obj = CodeMirror.modes[name];
- if (obj.dependencies) obj.dependencies.forEach(ensureMode);
- }
- ensureMode(modeName);
- function esc(str) {
- return str.replace(/[<&]/, function(ch) { return ch == "&" ? "&" : "<"; });
- }
- var code = fs.readFileSync("/dev/stdin", "utf8");
- var curStyle = null, accum = "";
- function flush() {
- if (curStyle) process.stdout.write("<span class=\"" + curStyle.replace(/(^|\s+)/g, "$1cm-") + "\">" + esc(accum) + "</span>");
- else process.stdout.write(esc(accum));
- }
- CodeMirror.runMode(code, lang, function(text, style) {
- if (style != curStyle) {
- flush();
- curStyle = style; accum = text;
- } else {
- accum += text;
- }
- });
- flush();
|