2014-07-25 78 views
-4

我需要一個字符串,它看起來像下面的轉換:轉換降價到HTML標記

'* [-]Tree Item1', 
'** [-]Tree Item1-1', 
'*** Tree Item1-1-1', 
'*** Tree Item1-1-2', 
'*** Tree Item1-1-3', 
'** Tree Item1-2', 
'*** Tree Item1-2-1', 
'** Tree Item1-3', 
'* Tree Item2', 
'** [-]Tree Item2-1', 
'*** Tree Item2-1-1', 
'**** Tree Item2-1-1-1', 
'* Tree Item3' 

成HTML無序列表。例如:

<ul> 
    <li> 
     Tree Item1 
     <ul> 
     <li>Tree Item1-1</li> 
     ... 
     <ul> 
    </li> 
    <li> 
     Tree Item2 
     <ul> 
     <li>Tree Item2-1</li> 
     ... 
     <ul> 
    </li> 
    ... 
</ul> 

任何幫助表示讚賞。 PS:Markdown庫不是我需要實現的選項。一個算法可以完成這個任務。

+3

這很好。祝你好運。你試過什麼了? –

+3

你有沒有嘗試過自己? – Tricky12

+0

你有沒有試過...谷歌搜索? – sgroves

回答

0

降價庫似乎有點矯枉過正,並不是真正的選擇。我已經能夠找出一個現在看來令人滿意的解決方案...

本質上,類降低標記的字符串首先被分成一個數組。然後對於數組中的每個項目,計算深度和文本信息,並將其用於構建嵌套數組。就像是;

var arrList = str.split(','), //where str contains markdown-like string from question above 
    nestedArray = []; 

Array.forEach(arrList, function (item) { 
    var nodeData = this.getNodeDataFromString(item);     
    //build nested array based on level/text information returned for each item, 
    nestedArray.push(someWorkedOutData(nodeData)); 
} 

function getNodeDataFromString() { 
    var matches = str.match(/\*/g), 
     retVal = { 
      level: matches.length - 1 
     }, 
     regex; 

    regex = new RegExp('^\\' + matches.join('\\') + ' (.*)'); 
    str.replace(regex, function (match, p1) { 
     retVal.text = p1; 
    }); 
    return retVal; 
} 

嵌套數組然後用於通過遞歸函數構建HTML標記。

Working solution here(我目前正在使用ExtJS,所以解決方案是使用這個庫編寫的)。

評論/批評歡迎。

感謝,

C.

0

堆棧溢出使用PageDown,這可能會滿足您的需求。