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!
Czy masz jakieś większe przypadki testowe? –
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. –
Podejrzewałem, że coś jest nie tak z rekurencyjnym wyrażeń regularnych, więc wymyśliłem ten przykład: http://pastebin.com/RkGj3h4v –