You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.4 KiB
48 lines
1.4 KiB
#!/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"); |
|
|
|
var 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; |
|
var found = CodeMirror.findModeByMIME(lang) || CodeMirror.findModeByName(lang) |
|
if (found) { |
|
modeName = found.mode |
|
lang = found.mime |
|
} |
|
|
|
if (!CodeMirror.modes[modeName]) |
|
require("../mode/" + modeName + "/" + modeName + ".js"); |
|
|
|
function esc(str) { |
|
return str.replace(/[<&]/g, 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();
|
|
|