diff --git a/src/subParsers/makehtml/githubCodeBlock.js b/src/subParsers/makehtml/githubCodeBlock.js index 4833c11..ad09aa7 100644 --- a/src/subParsers/makehtml/githubCodeBlock.js +++ b/src/subParsers/makehtml/githubCodeBlock.js @@ -32,9 +32,37 @@ showdown.subParser('makehtml.githubCodeBlock', function (text, options, globals) startEvent = globals.converter.dispatch(startEvent); text = startEvent.output + '¨0'; - let pattern = /(?:^|\n) {0,3}(```+|~~~+) *([^\n\t`~]*)\n([\s\S]*?)\n {0,3}\1/g; + //const accentRegex = /(?:^|\n) {0,3}(```+|~~~+) *([^\n\t`~]*)\n([\s\S]*?)(?:(\n {0,3}\1[`~]*)|¨0)/g; + const closedBlockRegex = /^ {0,3}(```+|~~~+) *([^\n\t`~]*)\n([\s\S]*?)\n {0,3}\1[`~]*/gm; + const unclosedBlockRegex = /^ {0,3}(```+|~~~+) *([^\n\t`~]*)\n([\s\S]*?)¨0/gm; + const emptyBlockRegex = /^ {0,3}(```+|~~~+) *([^\n\t`~]*)\n {0,3}\1[`~]*/gm; - text = text.replace(pattern, function (wholeMatch, delim, language, codeblock) { + text = text.replace(closedBlockRegex, function (wholeMatch, delim, language, codeblock) { + return parse(closedBlockRegex, wholeMatch, delim, language, codeblock); + }); + + text = text.replace(emptyBlockRegex, function (wholeMatch, delim, language) { + console.log('|', wholeMatch, '|>'); + return parse(emptyBlockRegex, wholeMatch, delim, language, ''); + }); + + text = text.replace(unclosedBlockRegex, function (wholeMatch, delim, language, codeblock) { + return parse(unclosedBlockRegex, wholeMatch, delim, language, codeblock); + }); + + // attacklab: strip sentinel + text = text.replace(/¨0/, ''); + + let afterEvent = new showdown.Event('makehtml.githubCodeBlock.onEnd', text); + afterEvent + .setOutput(text) + ._setGlobals(globals) + ._setOptions(options); + afterEvent = globals.converter.dispatch(afterEvent); + return afterEvent.output; + + + function parse (pattern, wholeMatch, delim, language, codeblock) { let end = (options.omitExtraWLInCodeBlocks) ? '' : '\n', otp, attributes = { @@ -119,16 +147,7 @@ showdown.subParser('makehtml.githubCodeBlock', function (text, options, globals) // store the primitive text and the parsed text in a global var, // and then return a token return '\n\n¨G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: otp}) - 1) + 'G\n\n'; - }); + } - // attacklab: strip sentinel - text = text.replace(/¨0/, ''); - let afterEvent = new showdown.Event('makehtml.githubCodeBlock.onEnd', text); - afterEvent - .setOutput(text) - ._setGlobals(globals) - ._setOptions(options); - afterEvent = globals.converter.dispatch(afterEvent); - return afterEvent.output; }); diff --git a/test/functional/makehtml/extra.testsuite.commonmark.js b/test/functional/makehtml/extra.testsuite.commonmark.js index 1194f63..16edca8 100644 --- a/test/functional/makehtml/extra.testsuite.commonmark.js +++ b/test/functional/makehtml/extra.testsuite.commonmark.js @@ -10,6 +10,7 @@ let bootstrap = require('./makehtml.bootstrap.js'), }), assertion = bootstrap.assertion, testsuite = bootstrap.getJsonTestSuite('test/functional/makehtml/cases/commonmark.testsuite.json'); +const {tests} = require('commonmark-spec'); describe('makeHtml() commonmark testsuite', function () { 'use strict'; @@ -24,10 +25,21 @@ describe('makeHtml() commonmark testsuite', function () { case 'Setext headings_93': // spec says it cannot be lazy continuation but then proceeds to make it a lazy continuation. case 'Thematic breaks_43': // malformed input of test case case 'Thematic breaks_61': // hr inside lists does not make sense + case 'Fenced code blocks_146': // as of date, github doesn't support this so we don't either continue; + case 'Setext headings_91': //it's failing because the testcase converts " to " even though it's not supposed to testsuite[section][i].expected = testsuite[section][i].expected.replace(/"/g, '"') break; + + case 'Fenced code blocks_142': // we use different classes to mark languages in fenced code blocks + case 'Fenced code blocks_143': // we use different classes to mark languages in fenced code blocks + testsuite[section][i].expected = testsuite[section][i].expected.replace('language-ruby', 'ruby language-ruby'); + break; + + case 'Fenced code blocks_144': // we use different classes to mark languages in fenced code blocks + testsuite[section][i].expected = testsuite[section][i].expected.replace('language-;', '; language-;'); + break; } it(name, assertion(testsuite[section][i], converter, true)); }