2016-11-05 65 views
3

我有一個這樣的節點模塊中導入的降價文件通過的WebPack裝載機轉換降價,以JSON對象

import mardownFile from './markdownfile.md'

這個文件是一個文本本書由##/H2標籤

分離章節

現在,我正在尋找一種方式將其轉換成在單獨的一章塊的每個H2標籤(或其他可能的包裝)一個JSON對象與頁面內容props.children一個反應頁面組件使用。什麼我試圖解決更多細節

我有這個在我的markdown.md文件

#Title 
##Chapter 1 
text text 
text 
##Chapter 2 
text 
etc 
##Chapter 3 
more text 
image 

我想讀這降價,並將其轉換爲對象,這樣的事情...

var aText = { 
pages: [ 
{ 
"title": "Chapter 1.", 
"text": "text", 
}, 
{ 
"title": "Chapter 2.", 
"text": "text", 
}, 
{ 
"title": "Chapter 3.", 
"text": "text", 
"img": "cat-stevens.png", 
} 
]} 

然後,在一個JavaScript反應成分呈現這樣

<Page page={aText.pages[0]} />

01一個網頁組件

我是Mac OSX計算機上,但這個是個人的Web客戶端的項目,我想在一個標準的瀏覽器解析這個,我使用Chrome,什麼是實現這一目標的最佳途徑,有什麼建議?

+2

能否請您爲我們提供了一個例子嗎?我不知道你想完成什麼。 –

+0

你在Linux,Mac或Windows?我可以根據您的情況更新我的答案。 –

回答

4

您不能導入MD文件,因爲進口爲只對JavaScript文件。 您需要使用一些markdown解析器或編寫自己的。例如markdown-it

var MarkdownIt = require('markdown-it'); 
var md = new MarkdownIt(); 
var result = md.parse('# markdown-it rulezz!'); 
console.log(result); 

您將獲得:

[Token { 
    type: 'heading_open', 
    tag: 'h1', 
    attrs: null, 
    map: [0, 1], 
    nesting: 1, 
    level: 0, 
    children: null, 
    content: '', 
    markup: '#', 
    info: '', 
    meta: null, 
    block: true, 
    hidden: false 
}, 
    Token { 
    type: 'inline', 
    tag: '', 
    attrs: null, 
    map: [0, 1], 
    nesting: 0, 
    level: 1, 
    children: [[Object]], 
    content: 'markdown-it rulezz!', 
    markup: '', 
    info: '', 
    meta: null, 
    block: true, 
    hidden: false 
}, 
    Token { 
    type: 'heading_close', 
    tag: 'h1', 
    attrs: null, 
    map: null, 
    nesting: -1, 
    level: 0, 
    children: null, 
    content: '', 
    markup: '#', 
    info: '', 
    meta: null, 
    block: true, 
    hidden: false 
}] 
+0

感謝這將作爲一個基礎,從這我可以循環通過結果尋找章節推他們到單獨的對象。 –

+0

這是正確的答案。任何輸出列表或標記(或任何其他低級日期結構)的Markdown解析器都可以工作。 – Waylan

1

嘗試markdown-to-json library

npm install -g markdown-to-json 

給定一個名爲lottery.md我去的目錄在我的終端和類型:

m2j lottery.md 

這在屏幕上輸出的JSON。

如果您使用的是bash based terminal您可以通過管道將輸出到像這樣的文件。

m2j lottery.md >> lottery.json 

,這將創造一個JSON文件在同一文件夾作爲降價稱爲lottery.json

如需其他幫助,您可以使用:

m2j -h 
+0

我正在尋找一個Web客戶端,基於這個cli版本的反應解決方案 –

0

對於我的第一次搜索就這一點,我已經找到了jsonmark包是有點您所要求的是什麼,但它爲了創建一個對象和內容,這是不因爲它基於正則表達式,所以很難修改它的代碼。

我同意加爾金的反應,使用減價解析器的令牌應該得到你想要的東西。

以下是我如何創建基於降價的json對象的示例。我的目標是擁有一個帶有頭部和身體元素的json數組,頭部是h1,身體就是它的下面。在示例中,我使用marked作爲降價解析器。 (我運行它作爲的NodeJS讀取文件從文件是不太可能的,否則。)

var fs = require('fs'); 
var marked = require('./marked.min.js'); 
var finally = []; 
var heading = ''; 
var lexbody = []; 

var loadmd = function(file){ 
    var markdown = fs.readFileSync(file, 'utf8'); 
    jsonraw = marked.lexer(markdown); 
    finally = []; 
    heading = ''; 
    lexbody = []; 
    jsonraw.forEach(getThem); 
    return finally; 
} 
var getThem = function(item, index){ 
    if (item.type == "heading" && item.depth == 1){ 
    if (heading == ''){ 
     heading = item.text; 
    } else { 
     lexbody['links']=jsonraw.links; 
     finally.push(
     { 
      "heading": heading, 
      "body": marked.parser(lexbody) 
     } 
    ); 
     heading = item.text; 
     lexbody = []; 
    } 
    } else { 
    lexbody.push(item); 
    } 
    // don't leave out the last element 
    if (index == jsonraw.length-1){ 
    lexbody['links']=jsonraw.links; 
    finally.push(
     { 
     "heading": heading, 
     "body": marked.parser(lexbody) 
     } 
    ); 
    } 
}