summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2015-03-06 16:41:23 +0100
committerSamy Pessé <samypesse@gmail.com>2016-12-22 15:00:36 +0100
commit8e2f8f0b469a57b0898d781874d108a359fa2b90 (patch)
treed7296617d78f9bb4de6bda142154c446a3bdd14c
parente8f309f35071f9140225e2d8aeca23c6a6a1d329 (diff)
downloadgitbook-8e2f8f0b469a57b0898d781874d108a359fa2b90.zip
gitbook-8e2f8f0b469a57b0898d781874d108a359fa2b90.tar.gz
gitbook-8e2f8f0b469a57b0898d781874d108a359fa2b90.tar.bz2
Add method page.prepare to escape codeblock
Related to GitbookIO/gitbook#625
-rw-r--r--packages/gitbook-markdown/lib/page.js26
-rw-r--r--packages/gitbook-markdown/test/page.js12
2 files changed, 37 insertions, 1 deletions
diff --git a/packages/gitbook-markdown/lib/page.js b/packages/gitbook-markdown/lib/page.js
index 61a3b78..3a130ea 100644
--- a/packages/gitbook-markdown/lib/page.js
+++ b/packages/gitbook-markdown/lib/page.js
@@ -1,10 +1,33 @@
var _ = require('lodash');
var kramed = require('kramed');
-
var hljs = require('highlight.js');
var lnormalize = require('./utils/lang').normalize;
+var RAW_START = "{% raw %}";
+var RAW_END = "{% endraw %}";
+var CODEBLOCKS = {
+ md: /(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/,
+ fences: /`([^`]+)`/g
+};
+
+function preparePage(src) {
+ // GFM Fences
+ src = src.replace(CODEBLOCKS.fences, function(all) {
+ return RAW_START+all+RAW_END;
+ });
+
+ // Normal codeblocks
+ src += "~0";
+ src = src.replace(CODEBLOCKS.md, function(all, m1, m2) {
+ all = all.slice(0, -m2.length);
+ return RAW_START+all+RAW_END+m2;
+ });
+ src = src.replace(/~0/, "");
+
+ return src;
+}
+
function parsePage(src) {
var options = _.extend({}, kramed.defaults, {
// Synchronous highlighting with highlight.js
@@ -34,3 +57,4 @@ function parsePage(src) {
// Exports
module.exports = parsePage;
+module.exports.prepare = preparePage;
diff --git a/packages/gitbook-markdown/test/page.js b/packages/gitbook-markdown/test/page.js
index 158f09f..8486435 100644
--- a/packages/gitbook-markdown/test/page.js
+++ b/packages/gitbook-markdown/test/page.js
@@ -19,4 +19,16 @@ describe('Page parsing', function() {
it('should gen content for normal sections', function() {
assert(LEXED[0].content);
});
+
+ it('should escape codeblocks in preparation', function() {
+ assert.equal(page.prepare("Hello `world`"), "Hello {% raw %}`world`{% endraw %}");
+ assert.equal(
+ page.prepare("Hello\n\n\n\tworld\n\thello\n\n\ntest"),
+ "Hello\n{% raw %}\n\n\tworld\n\thello\n\n\n{% endraw %}test"
+ );
+ assert.equal(
+ page.prepare("Hello\n\n\n\tworld\n\thello\n\n\n"),
+ "Hello\n{% raw %}\n\n\tworld\n\thello\n\n\n{% endraw %}"
+ );
+ });
});