diff --git a/lib/jsdoc/util/markdown.js b/lib/jsdoc/util/markdown.js index 003ee2a4..4f2e198c 100644 --- a/lib/jsdoc/util/markdown.js +++ b/lib/jsdoc/util/markdown.js @@ -1,4 +1,4 @@ -/*global env: true */ +/*global env */ /** * Provides access to Markdown-related functions. @@ -8,6 +8,8 @@ */ 'use strict'; +var util = require('util'); + /** * Enumeration of Markdown parsers that are available. * @enum {String} @@ -64,6 +66,18 @@ function unescapeUrls(source) { return source.replace(/(https?)\:\\\/\\\//g, '$1://'); } +/** + * Escape characters in text within a code block. + * + * @param {string} source - The source text to escape. + * @return {string} The escaped source text. + */ +function escapeCode(source) { + return source.replace(/%s', level, text, level); }; + // Allow prettyprint to work on inline code samples markedRenderer.code = function(code, language) { - return '
' + code + '
'; + var langClass = language ? ' lang-' + language : ''; + + return util.format( '
%s
', + langClass, escapeCode(code) ); }; parserFunction = function(source) { diff --git a/test/specs/jsdoc/util/markdown.js b/test/specs/jsdoc/util/markdown.js index 488065fa..70062ed6 100644 --- a/test/specs/jsdoc/util/markdown.js +++ b/test/specs/jsdoc/util/markdown.js @@ -54,6 +54,18 @@ describe('jsdoc/util/markdown', function() { expect(parser._parser).toEqual('marked'); }); + it('should log an error if an unrecognized Markdown parser is requested', function() { + var logger = require('jsdoc/util/logger'); + var parser; + var storage = setMarkdownConf({parser: 'not-a-real-markdown-parser'}); + + spyOn(logger, 'error'); + + parser = markdown.getParser(); + + expect(logger.error).toHaveBeenCalled(); + }); + it('should not apply formatting to inline tags when the marked parser is enabled', function() { var storage = setMarkdownConf({parser: 'marked'}); var parser = markdown.getParser(); @@ -72,16 +84,18 @@ describe('jsdoc/util/markdown', function() { .toBe('

Visit {@link https://google.com}.

'); }); - it('should log an error if an unrecognized Markdown parser is requested', function() { - var logger = require('jsdoc/util/logger'); - var parser; - var storage = setMarkdownConf({parser: 'not-a-real-markdown-parser'}); + it('should escape characters in code blocks as needed', function() { + var parser = markdown.getParser(); + var markdownText = '' + + '```html\n' + + '

Sample \'HTML.\'

\n' + + '```'; + var convertedText = '' + + '
' +
+                '<p><a href="#">Sample \'HTML.\'</a></p>' +
+                '
'; - spyOn(logger, 'error'); - - parser = markdown.getParser(); - - expect(logger.error).toHaveBeenCalled(); + expect(parser(markdownText)).toBe(convertedText); }); }); });