2014-12-15 10 views
6

Próbuję parsować dokument tekstowy zawierający wiele punktorów.Parsowanie pocisków zawierających znaki nowej linii z prostego tekstu

Chciałbym przetworzyć punkt wypunktowania z pojedynczymi znakami nowej linii, ale chciałbym podzielić, gdy znaleziono 2 lub więcej znaków nowego wiersza.

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 
----------------------------------- 

To, co mam tak daleko, napisałem funkcji javascript, które mogą rekurencyjnie analizowania uporządkowaną/nieuporządkowane listy mediawiki'sh do html. Jedyna różnica polega na tym, że bloki są wstawiane na 2 liniowych przerwach w stosunku do mediawiki z 1 liniowym podziałem.

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/

Myślę, że problem jest z pierwszym regex - /(?:(?:(?:^|\n)[*#].*)+)/g dopasować Bulls, to regex faktycznie pęka po znalezieniu znaku nowej linii, Jak mogę przechwytywać wypunktowane linie z mniejszą lub równą "1" znakiem nowej linii?

Chciałbym przeanalizować pociski z nowymi liniami i chciałbym przerwać kulę tylko wtedy, gdy są 2 lub więcej nowych znaków. a następnie treść punktora.

[Edit] - Udało mi się dokonać pewnych zmian i aktualną wersję mojej funkcji wygląda poniżej

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 
       + '>'; 
    }); 
} 

Jedyny problem jestem stoi to, czy mam wzoru jak poniżej:

* some ul item 
* some ul item 
# some ol item 

Element ul nie jest oddzielany jako blok, chyba że jest oddzielony dwukrotnym łamaniem linii.

Dzięki!

+0

Czy masz jakieś większe przypadki testowe? –

+0

Powtarzane jest to samo oznaczenie, jeśli chcesz zwiększyć rozmiar tekstu testowego. Wszystko, co próbuję wyodrębnić, to każdy punkt wypunktowania, chyba że rozdzielone są dwoma lub więcej znakami nowego wiersza. Problem polega na tym, że nawet jedna znak nowej linii jest analizowany jako nowy blok tekstu. –

+0

Podejrzewałem, że coś jest nie tak z rekurencyjnym wyrażeń regularnych, więc wymyśliłem ten przykład: http://pastebin.com/RkGj3h4v –

Odpowiedz

1

można najpierw utworzyć listy i <li> s dla swoich kul korzystających z tych dwóch (1, 2) regexs:

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

Następnie można przystąpić sąsiedztwie <ul> s i <ol> s używając another regex:

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

Przykład

Poniższy fragment i demonstruje to:

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>

Powiązane problemy