add tests
This commit is contained in:
parent
cb42b9003c
commit
db3b61bcc9
@ -72,8 +72,10 @@ function marked(src, opt, callback) {
|
|||||||
|
|
||||||
if (!tokens.length) return done();
|
if (!tokens.length) return done();
|
||||||
|
|
||||||
|
let pending = 0;
|
||||||
marked.iterateTokens(tokens, function(token) {
|
marked.iterateTokens(tokens, function(token) {
|
||||||
if (token.type === 'code') {
|
if (token.type === 'code') {
|
||||||
|
pending++;
|
||||||
highlight(token.text, token.lang, function(err, code) {
|
highlight(token.text, token.lang, function(err, code) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return done(err);
|
return done(err);
|
||||||
@ -82,11 +84,20 @@ function marked(src, opt, callback) {
|
|||||||
token.text = code;
|
token.text = code;
|
||||||
token.escaped = true;
|
token.escaped = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pending--;
|
||||||
|
if (pending === 0) {
|
||||||
|
done();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return done();
|
if (pending === 0) {
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -167,16 +178,20 @@ marked.iterateTokens = function(tokens, callback) {
|
|||||||
}
|
}
|
||||||
switch (token.type) {
|
switch (token.type) {
|
||||||
case 'table': {
|
case 'table': {
|
||||||
ret = marked.iterateTokens(token.tokens.header, callback);
|
for (const cell of token.tokens.header) {
|
||||||
if (ret === false) {
|
ret = marked.iterateTokens(cell, callback);
|
||||||
return false;
|
|
||||||
}
|
|
||||||
for (const row of token.tokens.cell) {
|
|
||||||
ret = marked.iterateTokens(row, callback);
|
|
||||||
if (ret === false) {
|
if (ret === false) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (const row of token.tokens.cells) {
|
||||||
|
for (const cell of row) {
|
||||||
|
ret = marked.iterateTokens(cell, callback);
|
||||||
|
if (ret === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'list': {
|
case 'list': {
|
||||||
|
@ -229,3 +229,167 @@ paragraph
|
|||||||
expect(html).toBe('arrow no options\nfunction options\nshorthand options\n');
|
expect(html).toBe('arrow no options\nfunction options\nshorthand options\n');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('async highlight', () => {
|
||||||
|
let highlight, markdown;
|
||||||
|
beforeEach(() => {
|
||||||
|
highlight = jasmine.createSpy('highlight', (text, lang, callback) => {
|
||||||
|
setImmediate(() => {
|
||||||
|
callback(null, `async ${text || ''}`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
markdown = `
|
||||||
|
\`\`\`lang1
|
||||||
|
text 1
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
> \`\`\`lang2
|
||||||
|
> text 2
|
||||||
|
> \`\`\`
|
||||||
|
|
||||||
|
- \`\`\`lang3
|
||||||
|
text 3
|
||||||
|
\`\`\`
|
||||||
|
`;
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should highlight codeblocks async', (done) => {
|
||||||
|
highlight.and.callThrough();
|
||||||
|
|
||||||
|
marked(markdown, { highlight }, (err, html) => {
|
||||||
|
if (err) {
|
||||||
|
fail(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(html).toBe(`<pre><code class="language-lang1">async text 1</code></pre>
|
||||||
|
<blockquote>
|
||||||
|
<pre><code class="language-lang2">async text 2</code></pre>
|
||||||
|
</blockquote>
|
||||||
|
<ul>
|
||||||
|
<li><pre><code class="language-lang3">async text 3</code></pre>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
`);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call callback for each error in highlight', (done) => {
|
||||||
|
highlight.and.callFake((lang, text, callback) => {
|
||||||
|
callback(new Error('highlight error'));
|
||||||
|
});
|
||||||
|
|
||||||
|
let numErrors = 0;
|
||||||
|
marked(markdown, { highlight }, (err, html) => {
|
||||||
|
expect(err).toBeTruthy();
|
||||||
|
expect(html).toBeUndefined();
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
numErrors++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (numErrors === 3) {
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('iterateTokens', () => {
|
||||||
|
it('should iterate over every token', () => {
|
||||||
|
const markdown = `
|
||||||
|
paragraph
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# heading
|
||||||
|
|
||||||
|
\`\`\`
|
||||||
|
code
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
| a | b |
|
||||||
|
|---|---|
|
||||||
|
| 1 | 2 |
|
||||||
|
| 3 | 4 |
|
||||||
|
|
||||||
|
> blockquote
|
||||||
|
|
||||||
|
- list
|
||||||
|
|
||||||
|
<div>html</div>
|
||||||
|
|
||||||
|
[link](https://example.com)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
**strong**
|
||||||
|
|
||||||
|
*em*
|
||||||
|
|
||||||
|
\`codespan\`
|
||||||
|
|
||||||
|
~~del~~
|
||||||
|
|
||||||
|
br
|
||||||
|
br
|
||||||
|
`;
|
||||||
|
const tokens = marked.lexer(markdown, { ...marked.getDefaults(), breaks: true });
|
||||||
|
const tokensSeen = [];
|
||||||
|
marked.iterateTokens(tokens, (token) => {
|
||||||
|
tokensSeen.push([token.type, (token.raw || '').replace(/\n/g, '')]);
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(tokensSeen).toEqual([
|
||||||
|
['paragraph', 'paragraph'],
|
||||||
|
['text', 'paragraph'],
|
||||||
|
['space', ''],
|
||||||
|
['hr', '---'],
|
||||||
|
['heading', '# heading'],
|
||||||
|
['text', 'heading'],
|
||||||
|
['code', '```code```'],
|
||||||
|
['table', '| a | b ||---|---|| 1 | 2 || 3 | 4 |'],
|
||||||
|
['text', 'a'],
|
||||||
|
['text', 'b'],
|
||||||
|
['text', '1'],
|
||||||
|
['text', '2'],
|
||||||
|
['text', '3'],
|
||||||
|
['text', '4'],
|
||||||
|
['blockquote', '> blockquote'],
|
||||||
|
['paragraph', 'blockquote'],
|
||||||
|
['text', 'blockquote'],
|
||||||
|
['list', '- list'],
|
||||||
|
['list_item', '- list'],
|
||||||
|
['text', 'list'],
|
||||||
|
['text', 'list'],
|
||||||
|
['space', ''],
|
||||||
|
['html', '<div>html</div>'],
|
||||||
|
['paragraph', '[link](https://example.com)'],
|
||||||
|
['link', '[link](https://example.com)'],
|
||||||
|
['text', 'link'],
|
||||||
|
['space', ''],
|
||||||
|
['paragraph', ''],
|
||||||
|
['image', ''],
|
||||||
|
['space', ''],
|
||||||
|
['paragraph', '**strong**'],
|
||||||
|
['strong', '**strong**'],
|
||||||
|
['text', 'strong'],
|
||||||
|
['space', ''],
|
||||||
|
['paragraph', '*em*'],
|
||||||
|
['em', '*em*'],
|
||||||
|
['text', 'em'],
|
||||||
|
['space', ''],
|
||||||
|
['paragraph', '`codespan`'],
|
||||||
|
['codespan', '`codespan`'],
|
||||||
|
['space', ''],
|
||||||
|
['paragraph', '~~del~~'],
|
||||||
|
['del', '~~del~~'],
|
||||||
|
['text', 'del'],
|
||||||
|
['space', ''],
|
||||||
|
['paragraph', 'brbr'],
|
||||||
|
['text', 'br'],
|
||||||
|
['br', ''],
|
||||||
|
['text', 'br']
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user