2014-10-22 73 views
8

With Marked我可以輕鬆地在執行期間覆蓋/添加/更改詞法分析規則,而且它非常棒! 例如,我可以強制使用哈希空間之間簽署的文本,使頭是這樣的:如何編寫標記.js的自定義InlineLexer規則?

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綁定到標記的實例? 請給我一個如何做到這一點的例子!我如何修改/添加自定義行內詞法分析規則?

+1

請看這[問題](https://github.com/chjj/marked/issues/504)我發佈了我的解決方案。 – Rugal 2017-05-05 19:39:44

回答

4

我已經查看了marked.js的源代碼,以便找到一種重寫部分代碼的方法,以便允許一些內聯詞法分析器的自定義,而無需更改庫源或影響全局標記的實例或原型。

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; 
} 
+0

我已經使用angular.copy()來執行內聯詞法分析器規則的深層副本,只是爲了簡潔,並且因爲我使用了angularjs,但任何深度複製都可以。 – 2015-07-21 10:36:46

+1

太好了。我會試試看。但是幾個世紀以前。 :) – 2015-07-21 21:10:42