2014-02-26 56 views
7

我正在構建一個iOS應用程序,該應用程序的視圖將通過降價獲得源代碼。如何使用Node.js對標記進行標記化?

我的想法是能夠分析存儲在MongoDB中成JSON對象降價看起來像:

{ 
    "h1": "This is the heading", 
    "p" : "Heres the first paragraph", 
    "link": { 
     "text": "Text for link", 
     "url": "http://exampledomain.com", 
    } 
} 

在我運行的Node.js,服務器一直在尋找在模塊marked這似乎是那裏最受歡迎的一個。它讓我可以訪問Lexer,這是標記化某些自定義對象的降價。但是當我看着這個對象時,它並沒有標記這個鏈接。如果我繼續並將標記解析爲HTML,則會檢測到該鏈接,並且HTML看起來正確。

看了一些更多的模塊,並失敗後,我認爲,也許我可以在客戶端上做到這一點,而發現MMMarkdown這似乎很有前途,但然後再次..直接解析HTML時,但工作正常,但當步入之間並且只是解析所謂的MMDocument的降價,它不包含任何類型的鏈接的MMElement。

那麼,有什麼基本的關於降價解析,我失蹤了?內聯鏈接的Lexing應該在第二輪完成,或者什麼?我無法繞過它。

如果沒有其他的工作,我可能會使用一個UIWebView來填充從解析的降價的HTML中填充,但我們必須再次設計整個事情,但與CSS,我們沒有時間,所以我們不能承擔雙重工作。

回答

7

您是否看過https://github.com/evilstreak/markdown-js

它似乎給你訪問語法樹。

例如:

var md = require("markdown").markdown, 
text = "Header\n---------------\n\n" + 
     "This is a paragraph\n\n" + 
"This is [an example](http://example.com/ \"Title\") inline link."; 

// parse the markdown into a tree and grab the link references 
var tree = md.parse(text), 
    refs = tree[ 1 ].references; 

console.log(JSON.stringify(tree)); 

產生

[ 
    "markdown", 
    [ 
     "header", 
     { 
      "level": 2 
     }, 
     "Header" 
    ], 
    [ 
     "para", 
     "This is a paragraph" 
    ], 
    [ 
     "para", 
     "This is ", 
     [ 
      "link", 
      { 
       "href": "http://example.com/", 
       "title": "Title" 
      }, 
      "an example" 
     ], 
     " inline link." 
    ] 
] 
+0

我實實在在地做了,並且對令牌化數據的格式化方式感到不滿意。我不明白爲什麼它使用嵌套數組而不是對象?好吧。我想你的答案已經足夠好了,但我認爲就我而言,手動解析數據會更容易。我只需要支持h1,h2,p和鏈接,所以它可能比嘗試重新格式化markdown-js的結果更容易。 – bobmoff

+2

哇,閱讀這一年多後,我意識到他們使用數組來保持令牌的順序正確:)(doh!) – bobmoff

1

下面是我最終使用,而不是代碼。

var nodes = markdownText.split('\r\n'); 
var content = []; 

nodes.forEach(function(node) { 

    // Heading 2 
    if (node.indexOf('##') == 0) { 
     content.push({ 
      h2: node.replace('##','') 
     }) 
    } 

    // Heading 1 
    else if (node.indexOf('#') == 0) { 
     content.push({ 
      h1: node.replace('#','') 
     }) 
    } 

    // Link (Text + URL) 
    else if (node.indexOf('[') == 0) { 
     var matches = node.match(/\[(.*)\]\((.*)\)/); 
     content.push({ 
      link: { 
       text: matches[1], 
       url: matches[2] 
      } 
     }) 
    } 

    // Paragraph 
    else if (node.length > 0) { 
     content.push({ 
      p: node 
     }) 
    } 

}); 

我知道這個匹配非常不寬容,但在我們的案例中它工作正常。