diff options
-rw-r--r-- | lib/utils/code.js | 36 | ||||
-rw-r--r-- | lib/utils/page.js | 28 | ||||
-rw-r--r-- | package.json | 5 |
3 files changed, 66 insertions, 3 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; diff --git a/package.json b/package.json index 62aab45..f5e29ae 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "resolve": "0.6.3", "fs-extra": "0.16.5", "fstream-ignore": "1.0.2", - "gitbook-parsers": "0.5.4", + "gitbook-parsers": "0.6.0", "nunjucks": "git+https://github.com/mozilla/nunjucks.git#0f8b21b8df7e8e852b2e1889388653b7075f0d09", "nunjucks-autoescape": "0.1.1", "nunjucks-filter": "0.1.0", @@ -31,7 +31,8 @@ "request": "2.51.0", "npm": "2.4.1", "dom-serializer": "0.1.0", - "spawn-cmd": "0.0.2" + "spawn-cmd": "0.0.2", + "highlight.js": "8.4.0" }, "devDependencies": { "mocha": "2.2.1", |