diff --git a/src/to_markdown.ts b/src/to_markdown.ts index 52b88e0..46eff2c 100644 --- a/src/to_markdown.ts +++ b/src/to_markdown.ts @@ -112,18 +112,21 @@ export const defaultMarkdownSerializer = new MarkdownSerializer({ } }, text(state, node) { - state.text(node.text!) + state.text(node.text!, !state.isAutolink) } }, { em: {open: "*", close: "*", mixable: true, expelEnclosingWhitespace: true}, strong: {open: "**", close: "**", mixable: true, expelEnclosingWhitespace: true}, link: { open(_state, mark, parent, index) { - return isPlainURL(mark, parent, index, 1) ? "<" : "[" + _state.isAutolink = isPlainURL(mark, parent, index, 1) + return _state.isAutolink ? "<" : "[" }, close(_state, mark, parent, index) { - return isPlainURL(mark, parent, index, -1) ? ">" + const cont = _state.isAutolink ? ">" : "](" + mark.attrs.href + (mark.attrs.title ? ' "' + mark.attrs.title.replace(/"/g, '\\"') + '"' : "") + ")" + _state.isAutolink = undefined + return cont } }, code: {open(_state, _mark, parent, index) { return backticksFor(parent.child(index), -1) }, @@ -159,6 +162,8 @@ export class MarkdownSerializerState { out: string = "" /// @internal closed: Node | null = null + /// @intermal + isAutolink?: boolean = undefined /// @internal inTightList: boolean = false diff --git a/test/test-parse.ts b/test/test-parse.ts index 5431be7..9622874 100644 --- a/test/test-parse.ts +++ b/test/test-parse.ts @@ -184,6 +184,20 @@ describe("markdown", () => { ) ) + it("ensure no escapes in url", () => + parse( + "[text](https://example.com/_file/#~anchor)", + doc(p(a({href: "https://example.com/_file/#~anchor"}, "text"))) + ) + ) + + it("ensure no escapes in autolinks", () => + same( + "", + doc(p(a({href: "https://example.com/_file/#~anchor"}, "https://example.com/_file/#~anchor"))) + ) + ) + it("escapes extra characters from options", () => { let markdownSerializer = new MarkdownSerializer(defaultMarkdownSerializer.nodes, defaultMarkdownSerializer.marks,