fix(markdown): require double-tilde strikethrough delimiters

This commit is contained in:
Armin Ronacher
2026-04-16 12:32:51 +02:00
parent 624a7f794f
commit db5274b48c
3 changed files with 65 additions and 2 deletions

View File

@@ -1,8 +1,32 @@
import { marked, type Token } from "marked";
import { Marked, type Token, Tokenizer, type Tokens } from "marked";
import { isImageLine } from "../terminal-image.js";
import type { Component } from "../tui.js";
import { applyBackgroundToLine, visibleWidth, wrapTextWithAnsi } from "../utils.js";
const STRICT_STRIKETHROUGH_REGEX = /^(~~)(?=[^\s~])((?:\\.|[^\\])*?(?:\\.|[^\s~\\]))\1(?=[^~]|$)/;
class StrictStrikethroughTokenizer extends Tokenizer {
override del(src: string): Tokens.Del | undefined {
const match = STRICT_STRIKETHROUGH_REGEX.exec(src);
if (!match) {
return undefined;
}
const text = match[2];
return {
type: "del",
raw: match[0],
text,
tokens: this.lexer.inlineTokens(text),
};
}
}
const markdownParser = new Marked();
markdownParser.setOptions({
tokenizer: new StrictStrikethroughTokenizer(),
});
/**
* Default text styling for markdown content.
* Applied to all text unless overridden by markdown formatting.
@@ -112,7 +136,7 @@ export class Markdown implements Component {
const normalizedText = this.text.replace(/\t/g, " ");
// Parse markdown to HTML-like tokens
const tokens = marked.lexer(normalizedText);
const tokens = markdownParser.lexer(normalizedText);
// Convert tokens to styled terminal output
const renderedLines: string[] = [];