stop remark from decoding HTML entities
This commit is contained in:
parent
d3c12db8ef
commit
9e0d7696ee
@ -0,0 +1,24 @@
|
||||
import unified from 'unified';
|
||||
import markdownToRemark from 'remark-parse';
|
||||
import remarkAllowHtmlEntities from '../remarkAllowHtmlEntities';
|
||||
|
||||
const process = markdown => {
|
||||
const mdast = unified().use(markdownToRemark).use(remarkAllowHtmlEntities).parse(markdown);
|
||||
|
||||
/**
|
||||
* The MDAST will look like:
|
||||
*
|
||||
* { type: 'root', children: [
|
||||
* { type: 'paragraph', children: [
|
||||
* // results here
|
||||
* ]}
|
||||
* ]}
|
||||
*/
|
||||
return mdast.children[0].children[0].value;
|
||||
};
|
||||
|
||||
describe('remarkAllowHtmlEntities', () => {
|
||||
it('should not decode HTML entities', () => {
|
||||
expect(process('<div>')).toEqual('<div>');
|
||||
});
|
||||
});
|
@ -8,7 +8,7 @@ describe('slate', () => {
|
||||
expect(process('a\n')).toEqual('a\n');
|
||||
});
|
||||
|
||||
xit('should not decode encoded html entities in inline code', () => {
|
||||
it('should not decode encoded html entities in inline code', () => {
|
||||
expect(process('<code><div></code>')).toEqual('<code><div></code>\n');
|
||||
});
|
||||
|
||||
|
@ -18,6 +18,7 @@ import remarkImagesToText from './remarkImagesToText';
|
||||
import remarkShortcodes from './remarkShortcodes';
|
||||
import remarkEscapeMarkdownEntities from './remarkEscapeMarkdownEntities';
|
||||
import remarkStripTrailingBreaks from './remarkStripTrailingBreaks';
|
||||
import remarkAllowHtmlEntities from './remarkAllowHtmlEntities';
|
||||
import slateToRemark from './slateRemark';
|
||||
import registry from '../../../../lib/registry';
|
||||
|
||||
@ -66,6 +67,7 @@ export const markdownToRemark = markdown => {
|
||||
const parsed = unified()
|
||||
.use(markdownToRemarkPlugin, { fences: true, commonmark: true })
|
||||
.use(markdownToRemarkRemoveTokenizers, { inlineTokenizers: ['url'] })
|
||||
.use(remarkAllowHtmlEntities)
|
||||
.parse(markdown);
|
||||
|
||||
/**
|
||||
|
@ -0,0 +1,59 @@
|
||||
export default function remarkAllowHtmlEntities() {
|
||||
this.Parser.prototype.inlineTokenizers.text = text;
|
||||
|
||||
/**
|
||||
* This is a port of the `remark-parse` text tokenizer, adapted to exclude
|
||||
* HTML entity decoding.
|
||||
*/
|
||||
function text(eat, value, silent) {
|
||||
var self = this;
|
||||
var methods;
|
||||
var tokenizers;
|
||||
var index;
|
||||
var length;
|
||||
var subvalue;
|
||||
var position;
|
||||
var tokenizer;
|
||||
var name;
|
||||
var min;
|
||||
var now;
|
||||
|
||||
/* istanbul ignore if - never used (yet) */
|
||||
if (silent) {
|
||||
return true;
|
||||
}
|
||||
|
||||
methods = self.inlineMethods;
|
||||
length = methods.length;
|
||||
tokenizers = self.inlineTokenizers;
|
||||
index = -1;
|
||||
min = value.length;
|
||||
|
||||
while (++index < length) {
|
||||
name = methods[index];
|
||||
|
||||
if (name === 'text' || !tokenizers[name]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
tokenizer = tokenizers[name].locator;
|
||||
|
||||
if (!tokenizer) {
|
||||
eat.file.fail('Missing locator: `' + name + '`');
|
||||
}
|
||||
|
||||
position = tokenizer.call(self, value, 1);
|
||||
|
||||
if (position !== -1 && position < min) {
|
||||
min = position;
|
||||
}
|
||||
}
|
||||
|
||||
subvalue = value.slice(0, min);
|
||||
|
||||
eat(subvalue)({
|
||||
type: 'text',
|
||||
value: subvalue,
|
||||
});
|
||||
}
|
||||
};
|
Loading…
x
Reference in New Issue
Block a user