TOGOUTECH

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

coder 2024-05-16 原文

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/

有关javascript - 如何为 marked.js 编写自定义 InlineLexer 规则?的更多相关文章

  1. javascript - 如何使用 Node js 和 babel 保留正确的行号 - 2

    我有以下设置并且我的错误/堆栈跟踪有问题我是否遗漏了什么?package.json看起来像:{"name":"xxxxxx","main":"server.js","private":true,"scripts":{"start":"nodemon--exec./node_modules/.bin/babel-nodeserver.js"},"dependencies":{"babel":"^6.5.2","babel-cli":"^6.6.5","babel-preset-es2015":"^6.6.0","babel-preset-react":"^6.5.0","babel-pr

  2. javascript - 已知的 JavaScript 指令 - 2

    ECMAScript规范定义了UseStrictDirective,但允许实现定义自己的指令。来自here:ImplementationsmaydefineimplementationspecificmeaningsforExpressionStatementproductionswhicharenotaUseStrictDirectiveandwhichoccurinaDirectivePrologue.什么是已知的特定于实现的指令?在Google上快速搜索一下,除了usestrict什么也没有。我能想到useasm和usestrong.还有其他的在用吗?

  3. javascript - 谷歌浏览器导航器在线始终为真 - 2

    基于mozilla开发者网络https://developer.mozilla.org/en-US/docs/Web/API/NavigatorOnLine/onLine它说Returnstheonlinestatusofthebrowser.Thepropertyreturnsabooleanvalue,withtruemeaningonlineandfalsemeaningoffline.Thepropertysendsupdateswheneverthebrowser'sabilitytoconnecttothenetworkchanges.Theupdateoccurswhen

  4. javascript - 如何使用 nodemailer 和电子邮件模板发送消息? - 2

    我尝试使用nodemailer和电子邮件模板发送电子邮件。现在我从这里exampleemailtemplates得到了例子。但是当我检查这段代码时,出现错误apromisewasrejectedwithanon-error:[objectUndefined]请帮帮我。这是我的代码varnodemailer=require('nodemailer');varEmailTemplate=require('email-templates').EmailTemplate;exports.sendOne=function(){vartemplatesDir=config.templatesDir

  5. javascript - 在注册表单上,表单字段未保存在提交时自动填写的浏览器中。(ReactJs) - 2

    我的站点中有一个注册表单,我正在其中保存字段,并且在用户再次返回该注册表单时保存表单后,我希望将以前的字段值保存在浏览器自动填充中。下面是我的代码片段-SignUp在anchor标记的onClick代码中,我通过注册用户函数进行ajax调用。之后,我希望用户数据自动填充到chrome中的浏览器自动填充地址中。我尝试了以下方法:-1.很少有人建议使用表单“提交”按钮功能将数据保存在自动填充中,而不是使用ajax调用表单anchor标记的onClick事件。但这对我来说也不起作用。2.我看过一些帖子,其中他们告诉我要为字段使用专有名称和自动完成属性。但使用该浏览器只能猜测正确的字段值。

  6. javascript - CORS 预检错误 redux & loopback API - 2

    我在react-redux上有一个客户端应用程序,在loopback上有一个API应用程序。对于本地测试,我在端口8080上运行客户端应用程序,在端口3000上运行服务器应用程序。当我尝试使用客户端应用测试GoogleOAuth(使用loopback-passport组件)时,出现以下错误。当我使用POSTMAN对其进行测试时,没有任何问题。这是客户端代码,require('babel-polyfill');import{CALL_API}from'redux-api-middleware';importCfrom'../constants';constAPI_ROOT='http:/

  7. javascript - 在 Webpack 和 React.js 中设置代码拆分 - 2

    我正在尝试在我的应用程序中设置代码拆分/分块-通过路由,使用require.ensure。所以这是我的路线:{require.ensure([],(require)=>{cb(null,require('attendee/containers/Profile/').default)},'attendee')}}/>以下是我的webpack配置中的相关行:constPATHS={app:path.join(__dirname,'../src'),build:path.join(__dirname,'../dist'),};constcommon={entry:[PATHS.app,],o

  8. javascript - 如何忽略 node.js 中另一个文件或组件所需的文件 - 2

    以下可以忽略或对导入的文件进行一些修改,例如在我的index.js中require.extensions['.js']=function(file){console.log(file.id)return;};但是我真的不想忽略index.js中的这些文件我想忽略在后续文件/组件中导入的文件require.extensions['.js']=function(file){console.log(file.id)return;};require('babel-register')require('./components/Test.spec.js');例如,这会记录以下内容并返回/User

  9. javascript - 将对象数组转换为与 nodejs/pg/unnest 兼容的数组 - 2

    关于UPDATEmultiplerowsfrommultipleparamsinnodejs/pg,我需要运行以下命令:updateportfoliospsetvotes=s.votesfromunnest(array[(5,1),(15,1),(25,2)])s(votesint,idint)wherep.id=s.id其中unnest中我的数组是$1,如下:updateportfoliospsetvotes=s.votesfromunnest($1)s(votesint,idint)wherep.id=s.id但是,我的数组最初由对象组成,如:[{votes:5,id:1},{vo

  10. javascript - 使用 AJAX 的 Bootstrap 工具提示(再来一次) - 2

    平凡、常见的用例我想要一个工具提示,它在鼠标悬停时立即显示正在加载的GIF,该GIF被AJAX成功回调产生的HTML所取代。AJAX工具提示的错误答案几乎与在线问这个确切问题的人一样多。特别是,我一直在模拟我在this上的努力。,this,尤其是几个答案here.对于所有这些解决方案(即使是那些专门声称可以解决该问题的解决方案),我一直遇到的问题是,工具提示偶尔会延迟出现并且无法消失。这也不是库问题,因为我过去在使用jQuery-UI工具提示时遇到过同样的问题。图书馆jQueryv2.2.3Bootstrapv3.3.6之前尝试过使用jQuery1并遇到了同样的问题:jQueryv1.

随机推荐