Разрывы строк на основе длины текста с сохранением пользовательской разметки HTML

0

Возможно, пропустил его, но не нашел регулярное выражение (или другое), которое выполняет то, что я пытаюсь сделать лаконично.

Я генерирую длинные строки символов, которые содержат пользовательские теги HTML, которые будут отображаться как HTML. Я генерирую две строки отдельно, которые имеют текст одинаковой длины и должны поддерживать выравнивание символов, но каждая из них имеет свою собственную уникальную разметку. Например (хотя будет намного больше):

xxxxx<mytag>nnnn</mytag>xxxx

<mytag2>xxxxx</mytag2>nnnn<mytag3>xxxx</mytag3>

Я хочу разбить их на более короткие строки (например, 80 символов), чтобы выравнивание поддерживалось. Очевидно, что, поскольку разметка различна, я не могу просто разделить число символов. Мне также нужно поддерживать теги HTML.

В конечном счете, они будут отображаться как выравнивание с одной строкой над другой. Я открыт для других способов сделать это, но вам нужно поддерживать события указателя (пользовательские теги будут анализировать на промежутки, отображающие всплывающие подсказки при наведении указателя мыши). Решение на уровне строк было бы идеальным, поскольку функциональность была бы полезной помимо этого одного HTML-элемента. Я работаю с AngularJS, и функция запускает каждое нажатие клавиши, поэтому не может быть слишком интенсивным.

Любая помощь оценивается. Благодарю.

Теги:

1 ответ

0

Я не думаю, что в этом случае полезно использовать регулярное выражение.

Я выбрал базовый метод прохода по функциям, который работает здесь довольно хорошо:

function splitByLength(str, length) {
    var lines = [];
    var isInTag = false;
    var start = 0;
    var count = 0;
    var tagLength = 0;

    for (i = 0; i < str.length; i++) {
        if (str[i] == "<") {
            isInTag = true;
        }

        if (!isInTag) {
            count++;
        } else {
            tagLength++;
        }

        if (count >= length) {
            lines.push(str.substr(start, count+tagLength));
            start = count+tagLength;
            count = 0;
            tagLength = 0;
        }

        if (str[i] == ">") {
            isInTag = false;
        }
    }

    lines.push(str.substr(start));

    return lines;
}

Примеры:

splitByLength("xxxxx<mytag>nnnn</mytag>xxxx", 10)
>>> ["xxxxx<mytag>nnnn</mytag>x", "xxx"]

splitByLength("<mytag2>xxxxx</mytag2>nnnn<mytag3>xxxx</mytag3>", 10)
>>> ["<mytag2>xxxxx</mytag2>nnnn<mytag3>x", "xxx</mytag3>"]
  • 0
    немного поздно ... просто отмечая причину, по которой я не принимаю это слишком медленно для строк длиной в несколько тысяч символов. Я использовал такую функцию перемещения и столкнулся с проблемами

Ещё вопросы

Сообщество Overcoder
Наверх
Меню