Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.03.2014, 23:31
Аватар для Roman Koff
Аспирант
Отправить личное сообщение для Roman Koff Посмотреть профиль Найти все сообщения от Roman Koff
 
Регистрация: 14.04.2010
Сообщений: 46

Чистка текста
Пишу надстройку над CodeMirror для редактирования html-кода. Совсем не силен в регулярных выражениях, подскажите, пожалуйста, как можно закодить следующий алгоритм –

Имеется текст в переменной s.
var s = cm.getSelection();

Нужно:
1. Добавить в начало "<p>"
2. Добавить в конец "</p>"
3. "\n" заменить на "</p><p>"
4. Заменить все пробельные символы на пробел
5. Удалить все двойные пробелы
6. Удалить все пробелы между "</p>" и "<p>"
7. Удалить пробелы до "</p><p>"
8. Удалить пробелы после "</p><p>"
9. После "</p>" вставить "\n\n"


Алгоритм ниже в Чистка текста.

Последний раз редактировалось Roman Koff, 16.03.2014 в 01:39.
Ответить с цитированием
  #2 (permalink)  
Старый 15.03.2014, 23:50
Аватар для Zuenf
Кандидат Javascript-наук
Отправить личное сообщение для Zuenf Посмотреть профиль Найти все сообщения от Zuenf
 
Регистрация: 27.01.2012
Сообщений: 134

var s = 'test\n   kuku kuku  kuku     kukuk  \n test   ';
s = s.replace(/\s*\n\s*/g, '</p>\n\n<p>').replace(/(\s(?!\n|\S))+/g, '');
alert("<p>"+s+"</p>");

Последний раз редактировалось Zuenf, 16.03.2014 в 00:24. Причина: Понял зачем 9 пункт, поправил
Ответить с цитированием
  #3 (permalink)  
Старый 16.03.2014, 00:16
Аватар для Roman Koff
Аспирант
Отправить личное сообщение для Roman Koff Посмотреть профиль Найти все сообщения от Roman Koff
 
Регистрация: 14.04.2010
Сообщений: 46

Возможно неправильно сформулировал.

В тексте уже могут быть параграфы (<p>text</p>). Нужно все переводы строк заменить на параграфы исключая дублирование и вложенность. При этом нужно пофиксить лишние пробельные символы и оформить параграфы отступом друг от друга.

Пункт 9 -- имеется в виду: После всех "</p>" вставить "\n\n"

Пример исходного текста может быть такой:
var s = "   \t\t   \t\t  Принцип восприятия   \t\t  \t \t   \t\t\t непредвзято создает паллиативный интеллект, условно.  \t   \n Концепция ментально оспособляет закон внешнего мира. Сомнение раскладывает на элементы неоднозначный структурализм. \n \n \n\nСмысл жизни профанирует принцип восприятия, отрицая очевидное. <p>Жизнь философски ассоциирует напряженный постмодернизм.</p>   <p> Объект деятельности означает конфликт. Согласно предыдущему, конфликт, в рамках сегодняшних воззрений, ясен не всем.</p> \n\nИсточник: http://www.artlebedev.ru/kovodstvo/sections/66/";

На выходе хочется получить вот это:
<p>Принцип восприятия непредвзято создает паллиативный интеллект, условно.</p>

<p>Концепция ментально оспособляет закон внешнего мира. Сомнение раскладывает на элементы неоднозначный структурализм.</p>

<p>Смысл жизни профанирует принцип восприятия, отрицая очевидное. Жизнь философски ассоциирует напряженный постмодернизм.</p>

<p>Объект деятельности означает конфликт. Согласно предыдущему, конфликт, в рамках сегодняшних воззрений, ясен не всем.</p>

<p>Источник: http://www.artlebedev.ru/kovodstvo/sections/66/</p>



Пример хороший. Спасибо.

Последний раз редактировалось Roman Koff, 16.03.2014 в 00:27.
Ответить с цитированием
  #4 (permalink)  
Старый 16.03.2014, 00:33
Аватар для Roman Koff
Аспирант
Отправить личное сообщение для Roman Koff Посмотреть профиль Найти все сообщения от Roman Koff
 
Регистрация: 14.04.2010
Сообщений: 46

Zuenf,
s = s.replace(/\s*\n\s*/g, '</p>\n\n<p>').replace(/(\s(?!\n|\S))+/g, ' ');
это уже очень близко, но не то.

Всегда преклонялся перед людьми умеющими разговаривать с автоматами
Ответить с цитированием
  #5 (permalink)  
Старый 16.03.2014, 00:34
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Что-то подобное я видел в Live street движке. Но там вроде на сервере реализация.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #6 (permalink)  
Старый 16.03.2014, 00:51
Аватар для Zuenf
Кандидат Javascript-наук
Отправить личное сообщение для Zuenf Посмотреть профиль Найти все сообщения от Zuenf
 
Регистрация: 27.01.2012
Сообщений: 134

Теперь вроде нормально.
var s = "   \t\t   \t\t  Принцип восприятия   \t\t  \t \t   \t\t\t непредвзято создает паллиативный интеллект, условно.  \t   \n Концепция ментально оспособляет закон внешнего мира. Сомнение раскладывает на элементы неоднозначный структурализм. \n \n \n\nСмысл жизни профанирует принцип восприятия, отрицая очевидное. <p>Жизнь философски ассоциирует напряженный постмодернизм.</p>   <p> Объект деятельности означает конфликт. Согласно предыдущему, конфликт, в рамках сегодняшних воззрений, ясен не всем.</p> \n\nИсточник: http://www.artlebedev.ru/kovodstvo/sections/66/";

s = s.replace(/(<\/p>|)\s*\n\s*|<p>/g, '</p><p>').replace(/\s+/g, ' ').replace(/<\/p>.*?<p>/g, '</p>\n\n<p>');

alert('<p>'+s+'</p>');

Последний раз редактировалось Zuenf, 16.03.2014 в 01:10. Причина: Теперь вроде нормально.
Ответить с цитированием
  #7 (permalink)  
Старый 16.03.2014, 01:00
Аватар для Roman Koff
Аспирант
Отправить личное сообщение для Roman Koff Посмотреть профиль Найти все сообщения от Roman Koff
 
Регистрация: 14.04.2010
Сообщений: 46

Zuenf,
Гениально! Но не продакшн. Если несколько раз прогнать, то теперь <p></p> -- плодиться.

Принцип понял, спасибо. Дальше могу сам, если не интересно...

danik.js,
Серверная фильтрация есть, но она менее жесткая. Это действие должно делаться выборочно и вручную пользователем (редактором).

Последний раз редактировалось Roman Koff, 16.03.2014 в 01:05. Причина: Если несколько раз прогнать, то теперь <p></p> -- плодиться.
Ответить с цитированием
  #8 (permalink)  
Старый 16.03.2014, 01:03
Аватар для Zuenf
Кандидат Javascript-наук
Отправить личное сообщение для Zuenf Посмотреть профиль Найти все сообщения от Zuenf
 
Регистрация: 27.01.2012
Сообщений: 134

Сообщение от Roman Koff Посмотреть сообщение
Zuenf,
ПС: не понял про function rep(test). Это баг или фича?
Сначала начал по другому делать, забыл убрать.

Последний раз редактировалось Zuenf, 16.03.2014 в 01:05.
Ответить с цитированием
  #9 (permalink)  
Старый 16.03.2014, 01:22
Аватар для Roman Koff
Аспирант
Отправить личное сообщение для Roman Koff Посмотреть профиль Найти все сообщения от Roman Koff
 
Регистрация: 14.04.2010
Сообщений: 46

Я понял свою ошибку. Я не правильно алгоритм составил.

Нужно:
1.	Заменить "</p>" и "<p>" на "\n"
2.	Добавить в начало и конец "\n"
3.	Заменить "\n" на "</p><p>"
4.	Заменить все пробельные символы на пробел
5.	Удалить все двойные пробелы
6.	Заменить "</p> <p>" на "</p><p>"
7.	Заменить " </p>" на "</p>"
8.	Заменить "<p> " на "<p>"
9.	Заменить все "</p><p></p><p>" на "</p><p>"
10.	Удалить "</p>" в начале (если есть)
11.	Удалить "<p>" в конце (если есть)
12.	Заменить "</p>" на "</p>\n\n"

Есть альтернативный вариант:
1.	Заменить "</p>" и "<p>" на "\n"
2.	Заменить все пробельные символы за исключением "\n" на пробел
3.	Удалить все двойные пробелы
4.	Получить массив строк по разделителю "\n" исключая пустые (пробельные) строки
5.	Объединить массив в строку используя соединитель "</p>\n\n<p>"
6.	Добавить в начало "<p>" и в конец "</p>"


Не знаю, что на JS будет оптимальнее. На C# делал бы 2 вариант.

Последний раз редактировалось Roman Koff, 16.03.2014 в 01:32.
Ответить с цитированием
  #10 (permalink)  
Старый 16.03.2014, 01:39
Аватар для Zuenf
Кандидат Javascript-наук
Отправить личное сообщение для Zuenf Посмотреть профиль Найти все сообщения от Zuenf
 
Регистрация: 27.01.2012
Сообщений: 134

Оп:
var s = "   \t\t   \t\t  Принцип восприятия   \t\t  \t \t   \t\t\t непредвзято создает паллиативный интеллект, условно.  \t   \n Концепция ментально оспособляет закон внешнего мира. Сомнение раскладывает на элементы неоднозначный структурализм. \n \n \n\nСмысл жизни профанирует принцип восприятия, отрицая очевидное. <p>Жизнь философски ассоциирует напряженный постмодернизм.</p>   <p> Объект деятельности означает конфликт. Согласно предыдущему, конфликт, в рамках сегодняшних воззрений, ясен не всем.</p> \n\nИсточник: http://www.artlebedev.ru/kovodstvo/sections/66/";

s = s.replace(/[\t ]+/g, ' ')
     .replace(/<\/p>|<p>/g, '\n')
     .replace(/\s*\n\s*/g,'</p>\n\n<p>');
//повтор для проверки
s = s.replace(/[\t ]+/g, ' ')
     .replace(/<\/p>|<p>/g, '\n')
     .replace(/\s*\n\s*/g,'</p>\n\n<p>');

alert('<p>'+s+'</p>');

Последний раз редактировалось Zuenf, 16.03.2014 в 01:42.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен хитрый селектор NikZ jQuery 6 16.07.2013 19:55
Как запретить отмену выделения текста от клика мышью? Маэстро Internet Explorer 0 03.04.2012 21:21
Чудеса математики js при padding borovik Элементы интерфейса 6 09.07.2011 22:02
Получение позиции текста по координатам traa Events/DOM/Window 20 08.02.2011 14:19
Firefox: перехватить соббытие при перетаскивании текста no_alex Общие вопросы Javascript 9 21.08.2008 18:02