summaryrefslogtreecommitdiffstats
path: root/lib/utils
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2015-03-23 10:31:48 +0100
committerSamy Pessé <samypesse@gmail.com>2015-03-23 10:31:48 +0100
commit7d9dc08a382d2fb82074aa0ca7544c8929261a0e (patch)
tree1e3e3131f11ededaf4ad456a770549a05add2d2c /lib/utils
parenta836bdedb4ebb3428032d9d1637c31f62d238c44 (diff)
downloadgitbook-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.js36
-rw-r--r--lib/utils/page.js28
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;