diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/utils/code.js | 36 | ||||
-rw-r--r-- | lib/utils/page.js | 28 |
2 files changed, 63 insertions, 1 deletions
diff --git a/lib/utils/code.js b/lib/utils/code.js new file mode 100644 index 0000000..0d98869 --- /dev/null +++ b/lib/utils/code.js @@ -0,0 +1,36 @@ +var hljs = require('highlight.js'); + +var MAP = { + 'py': 'python', + 'js': 'javascript', + 'json': 'javascript', + 'rb': 'ruby', + 'csharp': 'cs', +}; + +function normalize(lang) { + if(!lang) { return null; } + + var lower = lang.toLowerCase(); + return MAP[lower] || lower; +} + +function highlight(lang, code) { + if(!lang) return code; + + // Normalize lang + lang = normalize(lang); + + try { + return hljs.highlight(lang, code).value; + } catch(e) { } + + return code; +} + +// Exports +module.exports = { + highlight: highlight, + normalize: normalize, + MAP: MAP +}; diff --git a/lib/utils/page.js b/lib/utils/page.js index 689cf74..3c7d0b0 100644 --- a/lib/utils/page.js +++ b/lib/utils/page.js @@ -11,6 +11,7 @@ var links = require('./links'); var imgUtils = require('./images'); var fs = require('./fs'); var batch = require('./batch'); +var code = require('./code'); // Render a cheerio dom as html var renderDom = function($, dom, options) { @@ -183,6 +184,7 @@ function normalizeHtml(src, options) { $(this).attr("src", src); }); + // Normalize links $("a").each(function() { var href = $(this).attr("href"); if (!href) return; @@ -210,7 +212,31 @@ function normalizeHtml(src, options) { $(this).attr("href", href); }); - // Replace glossayr terms + // Highlight code blocks + $("code").each(function() { + // Extract language + var lang = _.chain( + ($(this).attr("class") || "").split(" ") + ) + .map(function(cl) { + if (cl.search("lang-") === 0) return cl.slice("lang-".length); + return null; + }) + .compact() + .first() + .value(); + + if (lang) { + var html = code.highlight( + lang, + $(this).text() + ); + + $(this).html(html); + } + }); + + // Replace glossary terms _.each(options.glossary, function(term) { var r = new RegExp( "\\b(" + pregQuote(term.name.toLowerCase()) + ")\\b" , 'gi' ); var includedInFiles = false; |