diff options
author | Samy Pessé <samypesse@gmail.com> | 2015-03-23 10:31:48 +0100 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2015-03-23 10:31:48 +0100 |
commit | 7d9dc08a382d2fb82074aa0ca7544c8929261a0e (patch) | |
tree | 1e3e3131f11ededaf4ad456a770549a05add2d2c /lib/utils | |
parent | a836bdedb4ebb3428032d9d1637c31f62d238c44 (diff) | |
download | gitbook-7d9dc08a382d2fb82074aa0ca7544c8929261a0e.zip gitbook-7d9dc08a382d2fb82074aa0ca7544c8929261a0e.tar.gz gitbook-7d9dc08a382d2fb82074aa0ca7544c8929261a0e.tar.bz2 |
Highlight codeblocks in gitbook instead than the parsers
Diffstat (limited to 'lib/utils')
-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; |