Typofilter.js

Когда-то давно, полтора года назад, разработал для домовой страницы модуль Typofilter, исправляющий дефисы на тире, заменяющий (c) на ©, в общем — полезный. В модуле использовался Типограф, несколько измененный под мои нужды и встроенный в систему фильтров Друпала. Модуль работал вполне исправно (да и сейчас работает), но пользоваться им мне в последнее время надоело.

Во-первых, так как модуль по сути — фильтр в форматах ввода, то чтобы насладиться оттипографленным текстом заметки или комментария, нужно нажать «Сохранить» или хотя бы «Предпросмотр», то есть перезагрузить страницу. Во-вторых — непонятно, почему этим должен заниматься сервер, когда на самом деле написание красивого текста — забота клиента (то есть браузера). В третьих, я как раз недавно включил для всех редактор BUEditor, и кнопка «Типограф» была бы очень кстати.

В общем, решил я портировать «Типограф» в JavaScript. Поначалу подумал, что это вообще ерунда — чего там, все регулярки-то уже написаны. Но в процессе выяснилось, что, оказывается, правила построения регулярных выражений в PHP и в JavaScript несколько отличаются. Но где наша не пропадала. Поломал немного башку (люблю я регулярки) и сделал-таки скрипт, выполняющий типографскую работу на стороне клиента.

Скрипт в конце заметки приложен для всех желающих скачать и воспользоваться. А далее — некоторые подробности его работы.

Опции фильтрации

 — замена (c) на ©;
 — замена (r) на ®;
 — замена (tm) на ™;
 — замена нескольких точек на многоточия;
 — замена +- на ±;
 — замена -> на →;
 — замена <- на ←;
 — исправление кавычек (использование кавычек типа «елочка»);
 — исправление дефисов на тире в тексте;
 — исправление дефисов на короткое тире в числовых диапазонах;
 — удаление пробелов между числом и знаком процента.

Отличия от модуля Typofilter

Скрипт был изначально сделан для интеграции в WYSIWYG-редакторы (BUEditor, CKEditor, TinyMCE) и поэтому не добавляется на страницу никаким модулем Друпала. В связи с чем у скрипта, в отличие от модуля Typofilter, отсутствуют настройки включения/выключения опций замены и добавления безопасных блоков (блоков текста, которые не будут подвергаться типографированию). Однако можно добавлять эти блоки прямо в код скрипта: место добавления отмечено комментарием.
В настоящий момент безопасным блоком считается текст, заключенный между тегами:
 — <safeblock></safeblock>
 — <pre></pre>
 — <style></style>
 — <script></script>
 — <code></code>
 — <!-- -->
 — <?php ?>
 — <drupal6></drupal6>
 — <php></php>
 — <cpp></cpp>
 — <object></object>
 — <javascript></javascript>
 — <qt></qt>

Кроме того, лично я не испытываю нужды в расстановке разных вложенных кавычек (елочки → лапки → елочки …), этой опции в скрипте тоже нет. Но если кому понадобится — могу добавить.

Интеграция в BUEditor

Интегрировать скрипт в BUEditor довольно просто.

1. Скопируйте скрипт typofilter.js на сайт, лучше всего в директорию %modules/bueditor/library, где %modules — директория, в которой вы храните дополнительные модули (напр. sites/all/modules/).

2. Пройдите на страницу admin/settings/bueditor/ и выберите редактор, к которому нужно добавить кнопку.

3. В секции Editor pathsEditor specific library files добавьте новую строчку, содержащую путь к файлу typofilter.js. Если вы копировали его в bueditor/library, это будет строчка %BUEDITOR/library/typofilter.js.

4. Нажмите «Сохранить конфигурацию».

5. В секции Import Buttons вставьте приведенный ниже код в поле Editor Code и нажмите «Импорт».

array (
  'buttons' => array (
    0 => array (
      'title' => 'Typograph!',
      'content' => 'js:
         s = E.getSelection();
         if (s != \'\') {
           E.replaceSelection(Typographus_Lite_UTF8.process(s));
         } else {
           E.setContent(Typographus_Lite_UTF8.process(E.getContent()));
         }'
,
      'icon' => 'Типограф',
      'accesskey' => '',
      'weight' => '18',
    ),
  ),
)

6. Нажмите «Сохранить конфигурацию».

7. Все, скрипт установлен, кнопка появилась, можно пользоваться.

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

Интеграция в CKEditor

1. Распакуйте архив и скопируйте директорию typofilter в директорию plugins установленного модуля ckeditor (напр. sites/all/modules/ckeditor/plugins).

2. В конец файла ckeditor.config.js (в корне директории установленного модуля ckeditor) добавьте строки:

   config.extraPlugins += (config.extraPlugins ? ',typofilter' : 'typofilter' );
   CKEDITOR.plugins.addExternal('typofilter', Drupal.settings.ckeditor.module_path + '/plugins/typofilter/');

3. Добавьте кнопку в нужный тулбар. Для этого отредактируйте тот же файл ckeditor.config.js. Например:
config.toolbar_DrupalBasic = [ [ 'Format', '-', 'Bold', 'Italic', '-', 'NumberedList','BulletedList', '-', 'Link', 'Unlink', 'Image', 'Typofilter' ] ];

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

5. Все, кнопка установлена.

Для редактора CKEditor скрипт Typofilter.js выполнен в виде плагина. Однако работа плагина ограничена типографированием выделенного в редакторе текста, а при нажатии на кнопку без выделения — ничего не происходит. Кроме того, ввиду серьезнейшей wysiwygнутости редактора, все теги при типографировании удаляются, так что рекомендуется сначала расставлять кавычки и тире, а уже потом — ссылки и разметку.

Интеграция в TinyMCE

Обратите внимание, что плагин для TinyMCE рассчитан на установку этого редактора через модуль wysiwyg.

1. Распакуйте архив и скопируйте директорию typofilter в директорию plugins по месту установки библиотеки tinymce. Путь должен быть примерно такой: sites/all/libraries/tinymce/jscripts/tiny_mce/plugins

2. К файлу tinymce.inc в директории wysiwyg/editors примените прилагающийся в архиве патч tinymce.inc.patch.

3. Включите кнопку Typofilter на странице админки модуля Wisywig, то есть поставьте галочку в настройках тех профилей, в которых вам нужна кнопка.

4. Все, кнопка готова.

Плагин для TinyMCE также работает только с выделенным текстом. Если при обработке в тексте попадаются теги (BBCode или просто) — после обработки они появятся в тексте. Чтобы их убрать, нажмите стандартную кнопку Cleanup messy code.

Сам я CKEditor и TinyMCE не использую и поэтому улучшать плагины в ближайшее время не намерен. Но если кто подредактирует и пришлет — буду признателен и стану прославлять этого человека на каждом углу. Все пожелания, предложения и модификации с радостью будут рассмотрены, пишите.

Прикрепленный файлРазмер
typofilter.js.tar.gz2.05 кб
typofilter.js.ckeditor.tar.gz3.04 кб
typofilter.js.tinymce.tar.gz3.71 кб
sergip (гость)
Аватар пользователя sergip

А интеграцию для ckeditor и соответствующего модуля можете добавить?

unic (гость)
Аватар пользователя unic

Для FCK типограф есть тут:
http://drupal.ru/node/21349
Для TinyMCE:
http://drupal.ru/node/23149
Ну и для BuEditor есть :)
http://habrahabr.ru/blogs/drupal/83294/

graker
Аватар пользователя graker

Думаю, что да. Надо?

graker
Аватар пользователя graker

unic, тот что на хабре — серверный, в отличие от. И требует связи с постороним сайтом, в отличие от. И не любит работать с тегами в тексте. В отличие от.

unic (гость)
Аватар пользователя unic

Да, разные подходы. У каждого свои достоинства и недостатки (работа с тегами в недостатки типографа от Лебедева не входит).

graker
Аватар пользователя graker

А люди говорят — входит, как быть? :)

unic (гость)
Аватар пользователя unic

Очевидно, попробовать самому :)

graker
Аватар пользователя graker

Не, ну я-то не буду, мне и других недостатков хватает, чтобы не пробовать :) А вообще, я весь набор типографов еще в 2009-м рассматривал, прежде чем typofilter сделать.

krak
Аватар пользователя krak

graker, спасибо. Прикручу к своему сайту. А то на днях устал менять тире на дефис. Для ckeditor тоже было бы замечательно, чтобы на корпоративные сайты прикрутить. Хотя от их вида меня воротит, т.ч. с типографией или без — хрен редьки не слаще.

graker
Аватар пользователя graker

Сделаю для ckeditor на днях, да.
Просто не сразу, т.к. я им сам не пользуюсь — надо поставить, посмотреть.

mamba (гость)
Аватар пользователя mamba

У меня на сайте люди пишут в таком виде. http://krd.name/gov/drugoe/pozor/1998.html (один из примеров)
Не очень хорошо, согласись? Как с ЭТИМ бороться?

graker
Аватар пользователя graker

Либо ставить принудительные lowercase и т.п. Либо ругать, наказывать и банить.

Лично я считаю — лучше второй вариант.

mamba (гость)
Аватар пользователя mamba

graker пишет:
Либо ставить принудительные lowercase и т.п. Либо ругать, наказывать и банить.

Лично я считаю — лучше второй вариант.


да крупные буквы это еще полбеды. Тут запятые расставлены как на пьяную голову писали. Одна запятая так,другая так , и т.п.

graker
Аватар пользователя graker

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

Только массовые расстрелы спасут Родину!!!

UksusoFF (гость)
Аватар пользователя UksusoFF

Чтото не хочет он у меня работать на ckeditor-7.x-1.9, вроде все правильно добавил, но кнопка нигде не появляется...

graker
Аватар пользователя graker

Я же по этому сообщению не пойму, в чем дело, правда?
Подсказать могу только одно: если не ставится по тексту выше, ищешь мануал как добавлять свои кнопки к CKE — и делаешь как там написано, используя мой скрипт.

Пару месяцев назад ставил, как раз на CKEditor в семерке — работало.

upd: А, вспомнил. Там надо скрипт переоформить в соответствии с правилами JS в семерке. Нетрудно, в принципе. Если найду свой вариант где-нибудь — чуть позже приложу.

UksusoFF (гость)
Аватар пользователя UksusoFF

Забавно, но ничего что написано в статье делать не нужно :)
Нужно только в настройках профиля CKEditor включить плагин и вытащить кнопку на панель там же... :)
Только вопрос, можно ли гдето менять правила замены, например добавить убирание двойных пробелов и пробелов перед точкой?

graker
Аватар пользователя graker

Ну да, в семерке проще.

Менять можно только в коде. В главной функции, там где rules_main и прочие rules — прямо в массив можно добавлять. Ключ — регулярное выражение для поиска, значение — то, на что заменять.

А друпал разве двойные пробелы не убирает? Я забыл уже.

UksusoFF (гость)
Аватар пользователя UksusoFF

что-то не нашел

graker
Аватар пользователя graker

Да чего там искать. Вот в функции типографа:

//main rules
var rules_main = {};
//fix dashes
rules_main[' +(?:--?|—|&mdash;)(?=\\s)'] = sym['nbsp'] + sym['mdash'];
rules_main['^(?:--?|—|&mdash;)(?=\\s)'] = sym['mdash'];
rules_main['(?:^|\\s+)(?:--?|—|&mdash;)(?=\\s)'] = "\n" + sym['nbsp'] + sym['mdash'];
//fix digit-dash
rules_main['(\\d{1,})(-)(?=\\d{1,})'] = '$1' + sym['ndash'];
//glue percent
rules_main['([0-9]+)\\s+%'] = '$1%';

Дописываешь новые элементы в rules_main — вот тебе новые правила.

UksusoFF (гость)
Аватар пользователя UksusoFF

да не, я про

А друпал разве двойные пробелы не убирает? Я забыл уже.

это разобрался, спасибо :)

graker
Аватар пользователя graker

А, понял :)
Ну значит не убирает. Я помню, что он где-то их убирал, лишние пробелы. В начале абзаца, что ли.

UksusoFF (гость)
Аватар пользователя UksusoFF

а подскажите как в точку зачменить? пробовал экранировать \ — не хочет

graker
Аватар пользователя graker

Какую точку, чем заменить?

http://javascript.ru/basic/regular-expression

UksusoFF (гость)
Аватар пользователя UksusoFF

Черт, половина предложения кудато пропало :)
Я имею ввиду как заменить " ." на "."? Да я знаю что это делается с помощью regex, но никак не разбирусь в них :(
Просто в случае с запятой прокатило так:
  rules_main[' ,'] = ','; а с точкой так не хочет =)

graker
Аватар пользователя graker

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

UksusoFF (гость)
Аватар пользователя UksusoFF

ахты ж емае! двумя \\ нада экранировать, спасибо :)

graker
Аватар пользователя graker

Да не за что :)

Отправить комментарий

CAPTCHA
Пройдите, пожалуйста, проверку. Она нужна, чтобы отличать людей от спам-роботов. А если не хотите проходить эту проверку регулярно — зарегистрируйтесь.
Image CAPTCHA
Введите цифры, изображенные на картинке (без пробелов).