Пример парсера. По идее можно сколь угодно усложнять и развивать форматирование, в отличие от твоего метода. Я тут сразу строю DOM, но можно просто формировать HTML, а дальше скормить браузеру через innerHTML.
Недостатки: громоздко (но вроде вполне все ясно), не быстро (посимвольный просмотр).
<body>
<script>
function Parser() {
this.fragment = document.createDocumentFragment();
this.buffer = '';
}
Parser.prototype.State = {
IN_TEXT: 0,
IN_LIST: 1
};
Parser.prototype.parse = function(text) {
var state = this.State.IN_TEXT;
for (var i = 0; i < text.length; i++) {
var c = text.charAt(i);
switch (state) {
case this.State.IN_TEXT:
if (c == '.') {
this.fragment.appendChild(this.createNodeFromBuffer('text'));
this.fragment.appendChild(this.createNode('break'));
} else if (c == ':') {
this.fragment.appendChild(this.createNodeFromBuffer('list-header'));
this.fragment.appendChild(this.createNode('list'));
state = this.State.IN_LIST;
} else {
this.buffer += c;
}
break;
case this.State.IN_LIST:
if (c == '.') {
state = this.State.IN_TEXT;
} else if (c == ';') {
var list = this.fragment.childNodes[this.fragment.childNodes.length -1];
list.appendChild(this.createNodeFromBuffer('list-item'));
} else {
this.buffer += c;
}
break;
}
}
return this.fragment;
};
Parser.prototype.createNodeFromBuffer = function(type) {
var content = this.buffer;
this.buffer = '';
return this.createNode(type, content);
};
Parser.prototype.createNode = function(type, content) {
switch (type) {
case 'text':
return document.createTextNode(content);
case 'break':
return document.createElement('br');
case 'list-header':
var element = document.createElement('strong');
element.appendChild(document.createTextNode(content));
return element;
case 'list':
return document.createElement('ul');
case 'list-item':
var element = document.createElement('li');
element.appendChild(document.createTextNode(content));
return element;
}
};
// юзание:
var string = "Это пробный текст.Переносов по строкам нету.Выделений по шрифтам нету. Списков нету:хотя это был бы 1; Это 2;Этопоследний;.";
document.body.appendChild(new Parser().parse(string));
</script>
</body>