Показать сообщение отдельно
  #2 (permalink)  
Старый 14.08.2013, 13:18
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Пример парсера. По идее можно сколь угодно усложнять и развивать форматирование, в отличие от твоего метода. Я тут сразу строю 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>
Ответить с цитированием