2014-12-15 8 views
6

Ich versuche ein Textdokument zu analysieren, das mehrere Aufzählungszeichen enthält.Parsen von Aufzählungszeichen mit Zeilenumbrüchen aus reinem Text

Ich möchte einen Aufzählungspunkt mit einzelnen Zeilenumbruch-Zeichen analysieren, würde aber gerne unterbrechen, wenn 2 oder mehr Zeilenvorschubzeichen gefunden werden.

for example : 
----------------------------------- 
* bullet 
text on new line 
more text 

this should be a separate block 
----------------------------------- 

when passed through the function, this should capture : 
----------------------------------- 
-> start 
bullet 
text on new line 
more text 
<- end capture 

this should be a seperate block 
----------------------------------- 

Das ist, was ich bisher habe, habe ich eine Javascript-Funktion geschrieben, die rekursiv bestellt/ungeordneten mediawiki'sh Listen html analysieren kann. Einziger Unterschied ist, dass die Blöcke auf 2 Zeilenumbrüchen gegen Mediawiki von 1 Zeilenumbrüchen aktiviert sind.

function parseLists(str) 
{ 
//How can I capture bulleted lines with less than or equal to "1" newline character? 
    return str.replace(/(?:(?:(?:^|\n)[\*#].*)+)/g, function (match) { 
     var listType = match.match(/(^|\n)#/) ? 'ol' : 'ul'; 
     match = match.replace(/(^|\n)[\*#][ ]{0,1}/g, "$1"); 
     match = parseLists(match); 
     return '<' 
       + listType + '><li>' 
       + match.replace(/^\n/, '').split(/\n/).join('</li><li>') 
       + '</li></' + listType 
       + '>'; 
    }); 
} 

http://jsfiddle.net/epinapala/L18y7zyx/7/

Ich denke, das Problem mit dem ersten regulären Ausdruck ist - /(?:(?:(?:^|\n)[*#].*)+)/g übereinstimmen Wenn ein Newline-Zeichen gefunden wird, bricht diese Regex tatsächlich zusammen. Wie kann ich Aufzählungszeilen mit weniger als oder gleich "1" Newline-Zeichen erfassen?

Ich möchte die Kugeln mit Zeilenumbrüchen in ihnen analysieren, und möchte nur eine Kugel brechen, wenn es 2 oder mehr Zeilenzeichen gibt. gefolgt von Aufzählungszeichen.

[Bearbeiten] - ich war in der Lage, einige Änderungen und die aktuelle Version meiner Funktion zu machen, sieht aus wie unter

function parseLists2(str) 
{ 
    return str.replace(/(?:(?:(?:^|\n)[\*#](?:.+\n)+.*))/g, function(match){ 
     match = match.replace(/\n(?![#\*])/g," "); 
     //alert(match); 
     var listType = match.match(/(^|\s)#/) ? 'ol' : 'ul'; 
     match = match.replace(/(^|\s)[\*#][ ]{0,1}/g, "$1"); 
     match = parseLists2(match); 
     return '<' 
       + listType + '><li>' 
       + match.replace(/^\s/, '') 
       .split(/\n/).join('</li><li>') 
       + '</li></' + listType 
       + '>'; 
    }); 
} 

Das einzige Problem, das ich bin vor, wenn ich ein Muster wie unten habe:

Das ul-Element wird nicht als Block getrennt, es sei denn, es ist durch einen doppelten Zeilenumbruch getrennt.

Danke!

+0

Haben Sie größere Testfälle haben? –

+0

Es wird nur das gleiche Markup wiederholt, wenn Sie den Testtext vergrößern möchten. Alles, was ich zu extrahieren versuche, ist jeder Aufzählungspunkt, wenn er nicht durch zwei oder mehr neue Zeilenzeichen getrennt wird. Problem ist jetzt, dass sogar ein Newline-Zeichen als ein neuer Textblock insgesamt geparst wird. –

+0

Ich vermutete etwas stimmt nicht mit rekursiven Regex, so kam ich mit diesem Beispiel: http://pastebin.com/RkGj3h4v –

Antwort

1

können Sie erste Listen erstellen und die <li> s für Ihre Kugeln mit diesen beiden (1, 2) regexs:

/\*\s*(([^\n]*(\n|$))*?)(?=\n|#|\*|<[uo]l>|$)/g; 
/#\s*(([^\n]*(\n|$))*?)(?=\n|#|\*|<[uo]l>|$)/g; 

Sie können dann neben <ul> s und <ol> s beitreten another regex mit:

/(<\/ul>\n?<ul>|<\/ol>\n?<ol>)/g; 

Beispiel

Das folgende snipp et zeigt dies:

txt1.onkeyup = txt1.onkeydown = txt1.onchange = replace; 
 
replace(); 
 
    
 
function replace() { 
 
    txt2.innerHTML = txt1.value. 
 
    replace (/\*\s*(([^\n]*(\n|$))*?)(?=\n|#|\*|<[uo]l>|$)/g, "<ul><li>\n$1</li></ul>"). 
 
    replace (/#\s*(([^\n]*(\n|$))*?)(?=\n|#|\*|<[uo]l>|$)/g, "<ol><li>\n$1</li></ol>"). 
 
    replace (/(<\/ul>\n?<ul>|<\/ol>\n?<ol>)/g, ""); 
 
}
#txt1, #txt2 { 
 
    width: 40%; 
 
    height: 150px; 
 
    display: inline-block; 
 
    overflow-y: scroll; 
 
}
<textarea id="txt1"> 
 
* aaaa 
 
* bbbb 
 
# cccc 
 
# dddd 
 

 
This text is separate. 
 
</textarea><div id="txt2"></div>