Supply original string for special case processing
Opened this issue · 3 comments
We're developing a web platform for teachers to create questions. Often they'll create questions with blanks like this:
Markdown
The quick brown fox ________ (jump) over the lazy dog
Which is rendered as The quick brown fox ________ (jump) over the lazy dog
on GitHub here but is rendered as The quick brown fox (jump) over the lazy dog
using markdown-to-jsx (which is understandable, as there are no characters within the bold text).
I'd like to render the original text if there's no characters within the bold text. Currently I can set component overrides like this:
function Strong(props: any) {
if (props.children.length) return <strong {...props} />;
return <span>____</span>;
}
function Em(props: any) {
if (props.children.length) return <em {...props} />;
return <span>__</span>;
}
Nonetheless as the original text isn't provided as prop, we can't tell ________
from ********
. How can we tell them apart?
That ____
is emitting an <em>
is actually a bug to me, it should be the plain text if there is nothing between the delimiters.
Here's some patch codes for underscores.
function checkIsAllUnderline(node: MarkdownToJSX.ParserResult): number | false {
if (node.type === RuleType.text) return /^_+$/.test(node.text) ? node.text.length : false;
if (node.type !== RuleType.textEmphasized && node.type !== RuleType.textBolded) return false;
let count = 0;
for (let n of node.children) {
const c = checkIsAllUnderline(n);
if (c) count += c;
else return false;
}
return count + (node.type === RuleType.textEmphasized ? 2 : 4);
}
renderRule(next, node, renderChildren, state) {
if (node) {
// @ts-expect-error
if (node.type === RuleType.gfmTask) return node.completed ? `[x]` : `[]`;
const count = checkIsAllUnderline(node);
if (count) {
return Array.from({ length: count }, () => '_').join('');
}
}
return next();
}
I get Cannot access ambient const enums when 'isolatedModules' is enabled.
all over the place but it otherwise works for outputting _
s.
That piece of code will generate issues like changing
**A
B
C**
to
**A
B
C__
so it isn't perfect by all means