diff --git a/src/Renderer.ts b/src/Renderer.ts index 0f3496c3..017043a9 100644 --- a/src/Renderer.ts +++ b/src/Renderer.ts @@ -193,7 +193,10 @@ export class _Renderer { return out; } - image({ href, title, text }: Tokens.Image): string { + image({ href, title, text, tokens }: Tokens.Image): string { + if (tokens) { + text = this.parser.parseInline(tokens, this.parser.textRenderer); + } const cleanHref = cleanUrl(href); if (cleanHref === null) { return escape(text); diff --git a/src/Tokenizer.ts b/src/Tokenizer.ts index cdbab358..f5e30f2a 100644 --- a/src/Tokenizer.ts +++ b/src/Tokenizer.ts @@ -14,26 +14,17 @@ function outputLink(cap: string[], link: Pick, ra const title = link.title || null; const text = cap[1].replace(rules.other.outputLinkReplace, '$1'); - if (cap[0].charAt(0) !== '!') { - lexer.state.inLink = true; - const token: Tokens.Link = { - type: 'link', - raw, - href, - title, - text, - tokens: lexer.inlineTokens(text), - }; - lexer.state.inLink = false; - return token; - } - return { - type: 'image', + lexer.state.inLink = true; + const token: Tokens.Link | Tokens.Image = { + type: cap[0].charAt(0) === '!' ? 'image' : 'link', raw, href, title, text, + tokens: lexer.inlineTokens(text), }; + lexer.state.inLink = false; + return token; } function indentCodeCompensation(raw: string, text: string, rules: Rules) { diff --git a/src/Tokens.ts b/src/Tokens.ts index a5dc1427..c9a0acd2 100644 --- a/src/Tokens.ts +++ b/src/Tokens.ts @@ -123,6 +123,7 @@ export namespace Tokens { href: string; title: string | null; text: string; + tokens: Token[]; } export interface Link { diff --git a/test/specs/commonmark/commonmark.0.31.2.json b/test/specs/commonmark/commonmark.0.31.2.json index 86c3e4c7..6e14498b 100644 --- a/test/specs/commonmark/commonmark.0.31.2.json +++ b/test/specs/commonmark/commonmark.0.31.2.json @@ -4596,8 +4596,7 @@ "example": 573, "start_line": 8548, "end_line": 8554, - "section": "Images", - "shouldFail": true + "section": "Images" }, { "markdown": "![foo ![bar](/url)](/url2)\n", @@ -4605,8 +4604,7 @@ "example": 574, "start_line": 8557, "end_line": 8561, - "section": "Images", - "shouldFail": true + "section": "Images" }, { "markdown": "![foo [bar](/url)](/url2)\n", @@ -4614,8 +4612,7 @@ "example": 575, "start_line": 8564, "end_line": 8568, - "section": "Images", - "shouldFail": true + "section": "Images" }, { "markdown": "![foo *bar*][]\n\n[foo *bar*]: train.jpg \"train & tracks\"\n", @@ -4623,8 +4620,7 @@ "example": 576, "start_line": 8578, "end_line": 8584, - "section": "Images", - "shouldFail": true + "section": "Images" }, { "markdown": "![foo *bar*][foobar]\n\n[FOOBAR]: train.jpg \"train & tracks\"\n", @@ -4632,8 +4628,7 @@ "example": 577, "start_line": 8587, "end_line": 8593, - "section": "Images", - "shouldFail": true + "section": "Images" }, { "markdown": "![foo](train.jpg)\n", @@ -4697,8 +4692,7 @@ "example": 585, "start_line": 8655, "end_line": 8661, - "section": "Images", - "shouldFail": true + "section": "Images" }, { "markdown": "![Foo][]\n\n[foo]: /url \"title\"\n", @@ -4730,8 +4724,7 @@ "example": 589, "start_line": 8700, "end_line": 8706, - "section": "Images", - "shouldFail": true + "section": "Images" }, { "markdown": "![[foo]]\n\n[[foo]]: /url \"title\"\n", diff --git a/test/specs/gfm/commonmark.0.31.2.json b/test/specs/gfm/commonmark.0.31.2.json index cecdf9cd..c8ffbc14 100644 --- a/test/specs/gfm/commonmark.0.31.2.json +++ b/test/specs/gfm/commonmark.0.31.2.json @@ -4596,8 +4596,7 @@ "example": 573, "start_line": 8548, "end_line": 8554, - "section": "Images", - "shouldFail": true + "section": "Images" }, { "markdown": "![foo ![bar](/url)](/url2)\n", @@ -4605,8 +4604,7 @@ "example": 574, "start_line": 8557, "end_line": 8561, - "section": "Images", - "shouldFail": true + "section": "Images" }, { "markdown": "![foo [bar](/url)](/url2)\n", @@ -4614,8 +4612,7 @@ "example": 575, "start_line": 8564, "end_line": 8568, - "section": "Images", - "shouldFail": true + "section": "Images" }, { "markdown": "![foo *bar*][]\n\n[foo *bar*]: train.jpg \"train & tracks\"\n", @@ -4623,8 +4620,7 @@ "example": 576, "start_line": 8578, "end_line": 8584, - "section": "Images", - "shouldFail": true + "section": "Images" }, { "markdown": "![foo *bar*][foobar]\n\n[FOOBAR]: train.jpg \"train & tracks\"\n", @@ -4632,8 +4628,7 @@ "example": 577, "start_line": 8587, "end_line": 8593, - "section": "Images", - "shouldFail": true + "section": "Images" }, { "markdown": "![foo](train.jpg)\n", @@ -4697,8 +4692,7 @@ "example": 585, "start_line": 8655, "end_line": 8661, - "section": "Images", - "shouldFail": true + "section": "Images" }, { "markdown": "![Foo][]\n\n[foo]: /url \"title\"\n", @@ -4730,8 +4724,7 @@ "example": 589, "start_line": 8700, "end_line": 8706, - "section": "Images", - "shouldFail": true + "section": "Images" }, { "markdown": "![[foo]]\n\n[[foo]]: /url \"title\"\n", diff --git a/test/types/marked.ts b/test/types/marked.ts index 64968caa..833fde6a 100644 --- a/test/types/marked.ts +++ b/test/types/marked.ts @@ -104,7 +104,7 @@ class ExtendedRenderer extends marked.Renderer { br = ({ type, raw }: Tokens.Br): string => super.br({ type, raw }); del = ({ type, raw, text, tokens }: Tokens.Del): string => super.del({ type, raw, text, tokens }); link = ({ type, raw, href, title, text, tokens }: Tokens.Link): string => super.link({ type, raw, href, title, text, tokens }); - image = ({ type, raw, href, title, text }: Tokens.Image): string => super.image({ type, raw, href, title, text }); + image = ({ type, raw, href, title, text }: Tokens.Image): string => super.image({ type, raw, href, title, text, tokens }); } const rendererOptions: MarkedOptions = renderer.options; diff --git a/test/unit/Lexer.test.js b/test/unit/Lexer.test.js index a1dee780..59c90640 100644 --- a/test/unit/Lexer.test.js +++ b/test/unit/Lexer.test.js @@ -1340,6 +1340,12 @@ paragraph text: 'image', href: 'https://example.com/image.png', title: null, + tokens: [{ + type: 'text', + raw: 'image', + text: 'image', + escaped: false, + }], }, ], }); @@ -1355,6 +1361,12 @@ paragraph text: 'image', href: 'https://example.com/image.png', title: 'title', + tokens: [{ + type: 'text', + raw: 'image', + text: 'image', + escaped: false, + }], }, ], }); diff --git a/test/unit/Parser.test.js b/test/unit/Parser.test.js index a45f428c..118beed5 100644 --- a/test/unit/Parser.test.js +++ b/test/unit/Parser.test.js @@ -396,6 +396,12 @@ describe('Parser', () => { text: 'image', href: 'image.png', title: 'title', + tokens: [{ + type: 'text', + raw: 'image', + text: 'image', + escaped: false, + }], }, ], html: 'image', diff --git a/test/unit/marked.test.js b/test/unit/marked.test.js index 40622968..9e9cb7d1 100644 --- a/test/unit/marked.test.js +++ b/test/unit/marked.test.js @@ -959,6 +959,7 @@ br ['space', ''], ['paragraph', '![image](https://example.com/image.jpg)'], ['image', '![image](https://example.com/image.jpg)'], + ['text', 'image'], ['space', ''], ['paragraph', '**strong**'], ['strong', '**strong**'],