Moved underscore escaping to a dedicated function, fixed typo in test comment (evilstreak -> gfm)

This commit is contained in:
mathematicalcoffee 2012-11-21 15:52:59 +10:00
parent 0973e636fc
commit 280d98f00a
2 changed files with 17 additions and 12 deletions

View File

@ -21,6 +21,20 @@ var parsers = {
gfm: "github-flavored-markdown" gfm: "github-flavored-markdown"
}; };
/**
* Escape underscores that occur within {@ ... } in order to protect them
* from the markdown parser(s).
* @param {String} source the source text to sanitize.
* @returns {String} `source` where underscores within {@ ... } have been
* protected with a preceding backslash (i.e. \_) -- the markdown parsers
* will strip the backslash and protect the underscore.
*/
function escapeUnderscores(source) {
return source.replace(/\{@[^}\r\n]+\}/g, function (wholeMatch) {
return wholeMatch.replace(/(^|[^\\])_/g, '$1\\_');
});
}
/** /**
* Retrieve a function that accepts a single parameter containing Markdown source. The function uses * Retrieve a function that accepts a single parameter containing Markdown source. The function uses
* the specified parser to transform the Markdown source to HTML, then returns the HTML as a string. * the specified parser to transform the Markdown source to HTML, then returns the HTML as a string.
@ -48,11 +62,7 @@ function getParseFunction(parser, conf) {
parser.hardwrap = !!conf.hardwrap; parser.hardwrap = !!conf.hardwrap;
return function(source) { return function(source) {
// 1. protect underscores within inline tags {@....} source = escapeUnderscores(source);
source = source.replace(/\{@[^}\r\n]+\}/g, function (wholeMatch) {
return wholeMatch.replace(/(^|[^\\])_/g, '$1\\_');
});
// 2. send through markdown (the protective '\' will be removed
// by the parser) // by the parser)
return parser.parse(source, githubConf); return parser.parse(source, githubConf);
}; };
@ -60,12 +70,7 @@ function getParseFunction(parser, conf) {
parser = require(parser).markdown; parser = require(parser).markdown;
return function(source) { return function(source) {
// 1. protect underscores within inline tags {@....} source = escapeUnderscores(source);
source = source.replace(/\{@[^}\r\n]+\}/g, function (wholeMatch) {
return wholeMatch.replace(/(^|[^\\])_/g, '$1\\_');
});
// 2. send through markdown (the protective '\' will be removed
// by the parser)
// evilstreak parser expects line endings to be \n // evilstreak parser expects line endings to be \n
source = source.replace(/\r\n|\r/g, '\n'); source = source.replace(/\r\n|\r/g, '\n');
return parser.toHTML(source, conf.dialect); return parser.toHTML(source, conf.dialect);

View File

@ -52,7 +52,7 @@ describe('jsdoc/util/markdown', function() {
var old = (env.conf.markdown ? env.conf.markdown.parser : undefined); var old = (env.conf.markdown ? env.conf.markdown.parser : undefined);
env.conf.markdown = {parser: 'gfm'}; env.conf.markdown = {parser: 'gfm'};
// get the evilstreak parser and do the test // get the gfm parser and do the test
var parser = markdown.getParser(); var parser = markdown.getParser();
expect(parser('{@link MyClass#_x} and {@link MyClass#_y}')).toEqual( expect(parser('{@link MyClass#_x} and {@link MyClass#_y}')).toEqual(
'<p>{@link MyClass#_x} and {@link MyClass#_y}</p>'); '<p>{@link MyClass#_x} and {@link MyClass#_y}</p>');