Подсветка длинных предложений с использованием jQuery - PullRequest
6 голосов
/ 26 февраля 2010

Я хотел бы выделить длинные предложения (скажем, 50 слов или более), содержащиеся в массиве объектов абзаца на странице, т.е. $("#content p"). Я не уверен, как с этим справиться.

Первоначально я пытался выделить все предложения, но столкнулся с трудностями, когда они содержали теги HTML (пример кода подсветки в сети, кажется, предназначен только для отдельных слов, поэтому они не учитывают дочерние узлы). Я знаю, что разделять предложения сложно; Я хотел бы использовать.!? за которым следует либо пробел, затем заглавная буква, либо вообще ничего (т. е. конец абзаца).

Заранее спасибо за любую помощь / совет.

Ответы [ 4 ]

2 голосов
/ 26 февраля 2010

Как вы уже сказали, будет сложно разобраться с правдой, учитывая тот факт, что вы не собираетесь их всех ловить, я бы придерживался чего-то простого, например:

var regex = \[^.!?]{50,}[.!?]\;

Становясь слишком умными в конечном итоге вы потратите больше времени на кодирование для крайних случаев, чем, я думаю, вам разумно хотелось бы.

0 голосов
/ 01 марта 2010

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

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

Затем разбейте каждое предложение на пробел и удалите все «слова» из массива, который состоит только из пробела. Это дает вам длину предложения. Если он превышает ваш лимит, вставьте соответствующий HTML-код в начальную и конечную позиции предложения в исходной HTML-строке. Вам нужно будет отслеживать, сколько лишнего HTML вы добавили, чтобы найти правильную начальную и конечную позиции последующих длинных предложений.

0 голосов
/ 27 февраля 2010

Это, вероятно, довольно медленное решение, и уродливое, но код должен быть довольно простым:

Прочитайте весь текст в строку, а затем проанализируйте ее, считая символы и находя каждый.!? - символ. В цикле синтаксического анализа вы также ищите <и>, где <означает «игнорировать все.!? До нахождения другого>». Затем каждый раз, когда вы находите символ.!? -, вы проверяете длину с момента последнего, и, если он достаточно длинный, вы сохраняете индекс для начальной и конечной точки в массив или что-то еще.

Когда все это сделано, создайте еще один цикл, который перемещает подстроки из первой строки в новую строку, добавляя каждое «длинное предложение» с помощью тега выделения и добавляя тег конца выделения в конец это, прежде чем двигаться дальше.

Когда закончите, положите новую строку туда, откуда вы ее взяли ...

0 голосов
/ 26 февраля 2010

Я не уверен, что лучше всего делать это на стороне клиента. Я хотел бы рассмотреть отправку абзацев обратно на сервер, чтобы сделать работу. Но работа должна быть одинаковой в любом случае.

Сначала возьмите все содержимое абзаца, убедитесь, что все это может быть в нескольких узлах в DOM. ( Read This ) Затем вам нужно будет создать парсер, который будет искать ваши разделенные символы, игнорируя их, пока они находятся в HTML-сущностях.

В качестве примера. в атрибуте href следует игнорировать и не разбивать. Выполняя разбор, вы можете сохранять количество слов и нарушать работу с пробелами. Сделайте каждое предложение объектом, который содержит все предложение и количество слов. Таким образом, вы можете поместить эти объекты в массив, представляющий абзац. После этого вы можете выполнить итерацию по массиву и обернуть любое предложение в промежуток для выделения с помощью CSS, если количество слов достигает вашего порога.

Основная проблема - это теги, которые могут быть частью двух предложений, таких как следующее.

I'm typing <b> in bold. NOW!</b>

то, о чем я говорил, с этим не справляется, но вы могли бы позже сделать синтаксический анализатор более сложным, чтобы это поддерживать.

Итак, краткий обзор моего бессвязного анализа всех символов с помощью конечного автомата, который занимается подсчетом слов и расщеплением в правильном месте. При разделении добавьте собранные данные в массив. Когда закончите, переберите массив, выводя вновь обернутые предложения.

...