This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/app/assets/javascripts/discourse/dialects/code_dialect.js
Robin Ward f2db4bfcf3 FIX: Conflict in dialect method names broke code formatting
Sometimes newlines were being stripped from code contents due to the
table formatting using the same method name.

In the future we will be rewriting dialects to prevent this.
2015-08-24 16:30:42 -04:00

82 lines
2.2 KiB
JavaScript

/**
Support for various code blocks
**/
var acceptableCodeClasses;
function init() {
acceptableCodeClasses = Discourse.SiteSettings.highlighted_languages.split("|");
if (Discourse.SiteSettings.highlighted_languages.length > 0) {
var regexpSource = "^lang-(" + "nohighlight|auto|" + Discourse.SiteSettings.highlighted_languages + ")$";
Discourse.Markdown.whiteListTag('code', 'class', new RegExp(regexpSource, "i"));
}
}
if (Discourse.SiteSettings && Discourse.SiteSettings.highlighted_languages) {
init();
} else {
Discourse.initializer({initialize: init, name: 'load-acceptable-code-classes'});
}
var textCodeClasses = ["text", "pre", "plain"];
function codeFlattenBlocks(blocks) {
var result = "";
blocks.forEach(function(b) {
result += b;
if (b.trailing) { result += b.trailing; }
});
return result;
}
Discourse.Dialect.replaceBlock({
start: /^`{3}([^\n\[\]]+)?\n?([\s\S]*)?/gm,
stop: /^```$/gm,
emitter: function(blockContents, matches) {
var klass = Discourse.SiteSettings.default_code_lang;
if (matches[1] && acceptableCodeClasses.indexOf(matches[1]) !== -1) {
klass = matches[1];
}
if (textCodeClasses.indexOf(matches[1]) !== -1) {
return ['p', ['pre', ['code', {'class': 'lang-nohighlight'}, codeFlattenBlocks(blockContents) ]]];
} else {
return ['p', ['pre', ['code', {'class': 'lang-' + klass}, codeFlattenBlocks(blockContents) ]]];
}
}
});
Discourse.Dialect.replaceBlock({
start: /(<pre[^\>]*\>)([\s\S]*)/igm,
stop: /<\/pre>/igm,
rawContents: true,
skipIfTradtionalLinebreaks: true,
emitter: function(blockContents) {
return ['p', ['pre', codeFlattenBlocks(blockContents)]];
}
});
// Ensure that content in a code block is fully escaped. This way it's not white listed
// and we can use HTML and Javascript examples.
Discourse.Dialect.on('parseNode', function (event) {
var node = event.node,
path = event.path;
if (node[0] === 'code') {
var contents = node[node.length-1],
regexp;
if (path && path[path.length-1] && path[path.length-1][0] && path[path.length-1][0] === "pre") {
regexp = / +$/g;
} else {
regexp = /^ +| +$/g;
}
node[node.length-1] = Handlebars.Utils.escapeExpression(contents.replace(regexp,''));
}
});