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. c# - 需要在单元测试中向请求添加自定义 header - 2

    通过在线查找一些代码,我终于能够让HttpContext.Current不为空。但是我仍然无法在单元测试中向请求添加自定义header。这是我的测试:[TestClass]publicclassTagControllerTest{privatestaticMock<IGenericService<Tag>>Service{get;set;}privateTagControllercontroller;[TestInitialize]publicvoidThingServiceTestSetUp(){Tagtag=newTag(1,"people"

  2. c# - 自定义模型 Binder 不触发 - 2

    我已经在global.asax中为MyList注册了一个自定义模型联编程序。然而,模型绑定(bind)器不会为嵌套属性触发,对于简单类型它工作正常。在下面的示例中,它会触发Index()但不会触发Index2()Global.asaxprotectedvoidApplication_Start(){AreaRegistration.RegisterAllAreas();ModelBinders.Binders.Add(typeof(MyList),newMyListBinder());WebApiConfig.Register(GlobalConfiguration.Configura

  3. c# - .NET 自定义配置部分 : Configuration. GetSection 引发 'unable to locate assembly' 异常 - 2

    我已经为一个插件DLL创建了一个自定义配置部分,它将.configXML存储在一个单独的(与主可执行应用程序不同的)文件中。这是自定义部分类的示例:usingSystem;usingSystem.Configuration;namespacePluginFramework.MyConfiguration{publicclassMyConfigurationSettings:ConfigurationSection{privateConfiguration_Config=null;#regionConfigurationProperties///<summary>///Acu

  4. c# - 如何使用 C# 将自定义 XML 添加到打开的 Excel 2007 工作簿? - 2

    我正在尝试使用C#将自定义XML添加到打开的Excel2007工作簿。我使用Microsoft.Office.Interop.Excel作为界面。我发现有一个CustomXMLPart类,但我不知道如何使用它。最初我希望代码像这样简单:CustomXMLPartmyXMLPart=newCustomXMLPart(xmlString);myWorkBook.XMLCustomParts.Add(myXMLPart);但这离工作还很远。我试过在网上找到示例,但它们在谈论包、插件、OpenXML、VSTO流等时复杂得令人费解。我解压了一个合适的工作簿(xlsx),发现它有docProps/

  5. c# - C#中Raspberry Pi的CPU温度 - 2

    我已经阅读了很多关于这个主题的文章和论坛帖子,但几乎所有内容都非常复杂,而且都是2多年前的事。所以我想知道,在C#中获取RaspberryPiCPU温度的最佳方法是什么?我有最新版本的Windows10IoT核心版。更新我不想降低CPU温度。我正在使用SenseHAT。那东西的温度传感器位于CPU附近,因此读数不准确。我找到了使读数准确的python脚本,但它需要CPU温度。注意:我正在使用Windows10IoT核心版!我没有有这个文件:/sys/class/thermal/thermal_zone0/temp更新2:如果唯一的方法是编写自己的驱动程序,请指导我如何做。我对编写驱动程

  6. c# - 是否可以使 WcfTestClient 用于自定义传输 channel ? - 2

    目标我希望能够在我正在设计的托管框架内通过WCF托管和连接到普通套接字服务器。我希望能够使用WCF来规范当今必须由套接字程序员手动管理的传输和协议(protocol)通信。这将允许我与Linux服务器守护进程实现最终的互操作性,这些守护进程只暴露传统套接字和专有协议(protocol)。此时我只对一般使用WcfTestClient验证传输channel层感兴趣。我的理解是WcfTestClient不支持复杂的服务方法。有人认为可以让WcfTestClient为自定义传输channel工作吗?如果能够通用地使用此客户端来测试任意数量的自定义传输channel,那将是非常棒的。概览我正在努

  7. c# - 如何在服务器端验证我的自定义 Oauth2 访问 token - 2

    publicclassSimpleAuthorizationServerProvider:OAuthAuthorizationServerProvider{publicoverrideasyncTaskGrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContextcontext){boolisvalidUser=AuthenticateUser(context.UserName,context.Password);//validatemyuser&passwordif(!isvalidUser){c

  8. c# - 如何在 WCF 中使用自定义绑定(bind)并使用用户名客户端凭据保持消息安全模式? - 2

    我可以通过Internet访问WCF服务,该服务使用wsHttpBinding和消息安全模式以及用户名客户端凭据。<bindings><wsHttpBinding><bindingname="wsHttpEndpointBinding"messageEncoding="Mtom"maxReceivedMessageSize="104857600"><readerQuotasmaxArrayLength="104857600"/><securitymode="Me

  9. c# - 在自定义 Visual Studio 编辑器中覆盖字体 - 2

    问题在于使VS扩展中的自定义编辑器看起来与当前主题指示的不同。编辑器托管在一个对话框中,并且应该具有托管对话框定义的相同字体。编辑器的内容类型定义如下:[Export][Name("MyContent")][BaseDefinition("code")]publicstaticreadonlyContentTypeDefinitionExportContentTypeDefinition=null;还有一个分类类型定义:[Export][Name("MyContentText")][BaseDefinition("text"

  10. c# - 为什么会有 List<T>.BinarySearch(...)? - 2

    我正在查看List,我看到一个带有一些重载的BinarySearch方法,我不禁想知道在List中使用这样的方法是否有意义?除非列表已排序,否则为什么我要进行二分查找?如果列表未排序,调用该方法只会浪费CPU时间。在List上使用该方法有什么意义? 最佳答案 除了其他正确答案外,我还注意到二分查找出奇地难以正确编写。有很多极端情况和一些棘手的整数运算。由于二分搜索显然是排序列表上的常见操作,BCL团队通过一次正确编写二分搜索算法而不是鼓励客户都编写自己的二分搜索算法来为世界提供服务;很多客户编写的算法都是错误的。

随机推荐

  1. c# - 当我们使用时线程被中止 - 2

    我收到以下异常:System.Threading.ThreadAbortException:Threadwasbeingaborted.atSystem.Threading.Thread.AbortInternal()atSystem.Threading.Thread.Abort(ObjectstateInfo)atSystem.Web.HttpResponse.End()atSystem.Web.HttpResponse.Redirect(Stringurl,BooleanendResponse)atSystem.Web.HttpResponse.Redirect(Stringurl

  2. c# - 什么是 protected 虚拟新 - 2

    我正在阅读有关制作自定义主体的教程,我遇到了代码:publicclassBaseController:Controller{protectedvirtualnewUserPrincipalUser{get{returnHttpContext.UserasUserPrincipal;}}}“protected虚拟新”究竟是如何工作的?关键字“new”是最让我困惑的。 最佳答案 protected意味着它只在这个类和从它派生的类中可见。virtual意味着它可以在派生类中被覆盖。new意味着您在这里创建新的重写层次结构,即您停止重写基类

  3. C# 从文本框中获取字符串 - 2

    我只是一个C#菜鸟,我有这个问题想问你。我这里有一个表单,要求提供登录详细信息。它有两个文本字段:用户名密码我想要的是获取在该文本字段中输入的字符串。我还不熟悉C#中的方法..(在java中,使用getString方法)。C#中的“等效”方法可能是什么? 最佳答案 在C#中,与java不同,我们不必使用任何方法。TextBox属性Text用于获取或设置其文本。获取stringusername=txtusername.Text;stringpassword=txtpassword.Text;设置txtusername.Text=

  4. c# - String.Join 对象列表 - 2

    在C#中,如果我有一个List<MyObj>其中MyObj是一个重写了ToString()的自定义类方法使得每个MyObjList中的对象可以很容易地转换为字符串。我如何加入这个List<MyObj>带有分隔符,例如管道(|)到单个字符串。所以,如果我有3个MyObj对象,它们的ToString方法将分别生成AAA、BBB、CCC。我会创建一个字符串:AAA|BBB|CCC。对于更简单类型的列表,例如List<string>,我将其简单地执行为:String.Join("|",myList.ToArray());.有什么办法可以做类似

  5. c# - Asp.net session 变量 - 2

    我有一个带有c#代码的asp.net项目。我有一个名为GlobalVariable的静态类,我在其中存储了一些信息,例如当前选择的产品。但是,我看到当有两个用户使用该网站时,如果一个更改所选产品,则为每个人更改。静态变量似乎对每个人都是公共(public)的。我想创建(从C#代码)某种仅从C#代码使用的session变量,但不仅从页面,而且从任何类。 最佳答案 是的,静态变量由整个应用程序共享,它们绝不是用户/session私有(private)的。要从非页面类访问Session对象,您应该使用HttpContext.Current

  6. c# - 字符串比较 == 是否仅因为字符串不可变才起作用? - 2

    我之前在比较两个字符串和它们的变量时有一个想法:stringstr1="foofoo";stringstrFoo="foo";stringstr2=strFoo+strFoo;//Eventhoughtstr1andstr2reference2different//objectsthefollowingassertionistrue.Debug.Assert(str1==str2);这是否纯粹是因为.NET运行时识别字符串的值是相同的并且因为字符串是不可变的使得str2的引用等于str1的引用?所以当我们执行str1==str2时,我们实际上比较引用而不

  7. c# - 对列表进行排序,使特定值排在最前面 - 2

    我有一个Offer类,其中包含一个已归档的类别。我希望特定类别的所有报价显示在顶部,然后是其他所有报价。我试过了,但没有用,你有什么推荐的?Offers=Offers.OrderBy(x=>x.Category=="Corporate").ToList(); 最佳答案 当您按bool值排序时,false(0)出现在true(1)之前。要首先获取与谓词匹配的元素,您应该使用OrderByDescending反转排序顺序:Offers=Offers.OrderByDescending(x=>x.Categor

  8. c# - 代码隐藏中的动态上下文菜单 - 2

    我只想为我动态创建的几个对象添加ContextMenu,但是我发现的唯一方法是像这样在运行时创建ContextMenu:ContextMenupMenu=newContextMenu();MenuItemitem1=newMenuItem();MenuItemitem2=newMenuItem();//Ihaveabout10items//...item1.Header="item1";item1.Click+=newRoutedEventHandler(item1_Click);pMenu.Items.Add(item1);item2.Header="item

  9. c# - 以管理员身份运行 : requireAdministrator & ClickOnce + emulating system time - 2

    我的应用程序使用ClickOnce技术。今天我需要以管理员身份运行它。我修改了来自的list文件<requestedExecutionLevellevel="asInvoker"uiAccess="false"/>到<requestedExecutionLevellevel="requireAdministrator"uiAccess="false"/>但是VS无法编译项目:Error35ClickOncedoesnotsupporttherequestexecutionlevel'requ

  10. c# - 从 C# 中删除数据库 - 2

    在使用MSTEST进行测试期间,我有一个MDF文件附加到我的本地SQL服务器,我不想在运行测试集50次后手动删除这些临时数据库。(我已经这样做了,但我不喜欢它>.在我的TestCleanup方法中,我正在寻找一种在完成测试后从服务器中删除数据库的方法。我只需要一些关于我将使用哪些SQL语句来执行此操作的指导。EDIT(由SoftwareMonkey,从OP拒绝的编辑到ODED的回答)这是对我有用的代码:varserver=newServer(serverName);//Canuseoverloadthatspecifiesforeach(Databasedbinserver.Datab