|
1 |
| -/* eslint-disable no-undef */ |
2 |
| -const expect = require('chai').expect; |
3 |
| -const jsdom = require('jsdom'); |
4 |
| -const { JSDOM } = jsdom; |
| 1 | +const { assert } = require('chai'); |
| 2 | +const { createScopedPrismDom } = require('../../helper/prism-dom-util'); |
5 | 3 |
|
6 |
| -require('../../../prism'); |
7 |
| -// fake DOM |
8 |
| -global.self = {}; |
9 |
| -global.self.Prism = Prism; |
10 |
| -global.document = {}; |
11 |
| -document.createRange = function () { |
12 |
| -}; |
13 |
| -global.self.document = document; |
14 | 4 |
|
15 |
| -require('../../../plugins/keep-markup/prism-keep-markup'); |
| 5 | +describe('Keep Markup', function () { |
| 6 | + const { Prism, document } = createScopedPrismDom(this, { |
| 7 | + plugins: 'keep-markup' |
| 8 | + }); |
| 9 | + |
16 | 10 |
|
17 |
| -describe('Prism Keep Markup Plugin', function () { |
| 11 | + /** |
| 12 | + * @param {string} html |
| 13 | + * @param {string} language |
| 14 | + */ |
| 15 | + function highlightInElement(html, language = 'none') { |
| 16 | + const pre = document.createElement('pre'); |
| 17 | + pre.className = `language-${language}`; |
| 18 | + pre.innerHTML = `<code>${html}</code>`; |
18 | 19 |
|
19 |
| - function execute(code) { |
20 |
| - const start = []; |
21 |
| - const end = []; |
22 |
| - const nodes = []; |
23 |
| - document.createRange = function () { |
24 |
| - return { |
25 |
| - setStart: function (node, offset) { |
26 |
| - start.push({ node, offset }); |
27 |
| - }, |
28 |
| - setEnd: function (node, offset) { |
29 |
| - end.push({ node, offset }); |
30 |
| - }, |
31 |
| - extractContents: function () { |
32 |
| - return new JSDOM('').window.document.createTextNode(''); |
33 |
| - }, |
34 |
| - insertNode: function (node) { |
35 |
| - nodes.push(node); |
36 |
| - }, |
37 |
| - detach: function () { |
38 |
| - } |
39 |
| - }; |
40 |
| - }; |
41 |
| - const beforeHighlight = Prism.hooks.all['before-highlight'][0]; |
42 |
| - const afterHighlight = Prism.hooks.all['after-highlight'][0]; |
43 |
| - const env = { |
44 |
| - element: new JSDOM(code).window.document.getElementsByTagName('code')[0], |
45 |
| - language: 'javascript' |
46 |
| - }; |
47 |
| - beforeHighlight(env); |
48 |
| - afterHighlight(env); |
49 |
| - return { start, end, nodes }; |
| 20 | + Prism.highlightElement(pre); |
| 21 | + |
| 22 | + return pre.querySelector('code').innerHTML; |
| 23 | + } |
| 24 | + |
| 25 | + /** |
| 26 | + * @param {string} html |
| 27 | + * @param {string} language |
| 28 | + */ |
| 29 | + function keepMarkup(html, language = 'none') { |
| 30 | + assert.equal(highlightInElement(html, language), html); |
50 | 31 | }
|
51 | 32 |
|
52 | 33 | it('should keep <span> markup', function () {
|
53 |
| - const result = execute(`<code class="language-javascript">x<span>a</span>y</code>`); |
54 |
| - expect(result.start.length).to.equal(1); |
55 |
| - expect(result.end.length).to.equal(1); |
56 |
| - expect(result.nodes.length).to.equal(1); |
57 |
| - expect(result.nodes[0].nodeName).to.equal('SPAN'); |
| 34 | + keepMarkup(`x<span>a</span>y`); |
58 | 35 | });
|
59 | 36 | it('should preserve markup order', function () {
|
60 |
| - const result = execute(`<code class="language-javascript">x<a></a><b></b>y</code>`); |
61 |
| - expect(result.start.length).to.equal(2); |
62 |
| - expect(result.start[0].offset).to.equal(0); |
63 |
| - expect(result.start[0].node.textContent).to.equal('y'); |
64 |
| - expect(result.start[1].offset).to.equal(0); |
65 |
| - expect(result.start[1].node.textContent).to.equal('y'); |
66 |
| - expect(result.end.length).to.equal(2); |
67 |
| - expect(result.end[0].offset).to.equal(0); |
68 |
| - expect(result.end[0].node.textContent).to.equal('y'); |
69 |
| - expect(result.end[1].offset).to.equal(0); |
70 |
| - expect(result.end[1].node.textContent).to.equal('y'); |
71 |
| - expect(result.nodes.length).to.equal(2); |
72 |
| - expect(result.nodes[0].nodeName).to.equal('A'); |
73 |
| - expect(result.nodes[1].nodeName).to.equal('B'); |
| 37 | + keepMarkup(`x<a></a><b></b>y`); |
74 | 38 | });
|
75 |
| - it('should keep last <span> markup', function () { |
76 |
| - const result = execute(`<code class="language-javascript">xy<span>a</span></code>`); |
77 |
| - expect(result.start.length).to.equal(1); |
78 |
| - expect(result.end.length).to.equal(1); |
79 |
| - expect(result.nodes.length).to.equal(1); |
80 |
| - expect(result.nodes[0].nodeName).to.equal('SPAN'); |
| 39 | + |
| 40 | + it('should keep last markup', function () { |
| 41 | + keepMarkup(`xy<span>a</span>`); |
| 42 | + keepMarkup(`xy<a>a</a>`); |
81 | 43 | });
|
| 44 | + |
82 | 45 | // The markup is removed if it's the last element and the element's name is a single letter: a(nchor), b(old), i(talic)...
|
83 | 46 | // https://github.com/PrismJS/prism/issues/1618
|
84 | 47 | /*
|
85 | 48 | it('should keep last single letter empty markup', function () {
|
86 |
| - const result = execute(`<code class="language-javascript">xy<a></a></code>`) |
| 49 | + const result = execute(`<code class="language-none">xy<a></a></code>`) |
87 | 50 | expect(result.start.length).to.equal(1)
|
88 | 51 | expect(result.end.length).to.equal(1)
|
89 | 52 | expect(result.nodes.length).to.equal(1)
|
|
0 commit comments