diff --git a/src/renderer.js b/src/renderer.js index 289e7b9..2fd6a91 100644 --- a/src/renderer.js +++ b/src/renderer.js @@ -5,6 +5,55 @@ const showdown = require('showdown'); module.exports = (config) => { const converter = new showdown.Converter(config['showdown']); + /** + * get parts outside of codes/scripts + * @param {string} data + * @returns {{index:number, end:number, text:string}[]} parts + */ + const getParts = (data) => { + let parts = []; + let match; + let i = 0; + while ((match = /```/m.exec(data.slice(i)))) { + parts.push({ + index: i, + end: i + match.index, + text: data.slice(i, i + match.index), + }); + i += match.index + match[0].length; + } + if (i < data.length) + parts.push({ + index: i, + end: data.length, + text: data.slice(i, data.length), + }); + + parts = parts.filter((p, i) => i % 2 === 0); //filter out code parts + + // detect scripts outside of code + parts.forEach((p, pi) => { + let i = 0; + const subParts = []; + while ((match = /(\n\n``````kenobi'; + const parts = renderer.getParts(data); + expect(parts.map(p => p.text)).toEqual([ + 'Hello\nthere\n', '\ngeneral', '\n', '\n', 'kenobi' + ]); + }); +}); + describe('Test Showdown', () => { test('normal', (done) => { renderer.renderShowDown('# Hello', (html) => { @@ -112,6 +129,13 @@ describe('Test PlantUML', () => { }); }); + test('plantuml ignored in code', (done) => { + renderer.renderPlantUML('code:\n```@startuml\nBob -> Alice : hello\n@enduml```', (data) => { + expect(data).toBe('code:\n```@startuml\nBob -> Alice : hello\n@enduml```'); + done(); + }); + }); + test('plantuml multiple uml', (done) => { renderer.renderPlantUML('@startuml\nBob -> Alice : hello\n@enduml\n@startuml\nBob -> Alice : hello\n@enduml', (data) => { expect(data).toBe('generated PlantUML diagram\ngenerated PlantUML diagram');