gpt4 book ai didi

javascript - 如何为 marked.js 编写自定义 InlineLexer 规则?

转载 作者:可可西里 更新时间:2023-11-01 02:44:46 24 4
gpt4 key购买 nike

Marked我可以在实现过程中轻松覆盖/添加/更改词法分析器规则,这太棒了!例如,我可以强制在哈希符号和文本之间使用空格来制作这样的标题:

var lexer = new marked.Lexer(options);
console.log(lexer);
lexer.rules.heading = /^\s*(#{1,6})\s+([^\n]+?) *#* *(?:\n+|$)/

console.log(marked.parser(lexer.lex('#hashtag?'), options));
//<p>#hashtag?</p>
console.log(marked.parser(lexer.lex('# heading?'), options));
//<h1 id="undefinedheading-">heading?</h1>

酷!

但有没有办法轻松地为 inlineLexer 做同样的事情?就像我需要让人们能够添加带有下一个序列的图像:%[My Image](http://example.com/img.jpg)?所以我修改了:

var inlineLexer = marked.InlineLexer;
inlineLexer.rules.link = /^[!%]{0,1}?\[((?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*)\]\(\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*\)/;
...

接下来我该做什么?如何将自定义 inlineLexer 绑定(bind)到标记实例?请告诉我如何做到这一点的例子!如何修改/添加自定义内联词法分析器规则?

最佳答案

我查看了 marked.js 的源代码,以找到一种方法来覆盖它的一部分,以便允许对内联词法分析器进行一些自定义,而无需更改库源或影响全局标记实例或原型(prototype)。

var renderer = new marked.Renderer();
var lexer = new marked.Lexer();
var parser = new marked.Parser();

var options = {
renderer: renderer,
gfm: true,
tables: false,
breaks: true,
pedantic: false,
sanitize: true,
smartLists: true,
smartypants: false
}

parser.inline = new marked.InlineLexer([], options);
parser.inline.rules = angular.copy(parser.inline.rules); // deep copy, otherwise global marked will be affected

parser.inline.rules.link = /^[!%]{0,1}?\[((?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*)\]\(\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*\)/;
renderer.link = function(href, title, text) {
// this is the standard link renderer that can be altered if desired ...
if (this.options.sanitize) {
try {
var prot = decodeURIComponent(unescape(href))
.replace(/[^\w:]/g, '')
.toLowerCase();
} catch (e) {
return '';
}
if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0) {
return '';
}
}
var out = '<a href="' + href + '"';
if (title) {
out += ' title="' + title + '"';
}
out += '>' + text + '</a>';
return out;
}

function parse(src) {
parser.inline.links = src.links;
parser.tokens = src.reverse();
var out = '';
while (parser.next()) {
out += parser.tok();
}
return out;
};

function parseText(text) {
var lex = lexer.lex(text);
var r = parse(lex);
return r;
}

关于javascript - 如何为 marked.js 编写自定义 InlineLexer 规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26507341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com