название для официального сайта inFlowia Lab
  • помощь 4 free! :)
  • делаем добро :)
  • делаю сайты, скрипты и хорошее настроение :)
  • всё поправимо! :)
  • Свобода и OPENsource!
  • Linux - это любовь!
  • Linux - это Lюбовь
  • творим добро с 2019/03/22 :)

Ace Editor Spellcheck - MultiLang 0.1 :: Проверка орфографии в редакторе Ace сразу на нескольких языках + пользовательский словарь

Ace Editor Spellcheck - MultiLang 0.1 на GitHub

Это форк плагина от Christopher Swenson для проверки орфографии в редакторе ace. В отличии от оригинала здесь можно добавлять несколько словарей, в том числе русский, добавлять слова в исключения и больше не париться о куче глобальных переменных, так как весь функционал был обёрнут в класс.

Что нового:

(отличия от оригинального плагина)
  • Добавлена возможность загружать сразу несколько словарей (проверка орфографии будет происходить сразу по всем добавленным).
  • Добавлена поддержка символов отличных от латиницы. Однако в связи с этим сильно повысились требования к свежести браузера (для большинства браузеров пойдут релизы 2018-го года, для Firefox - 2020-го. Подробнее см. в таблице совместимости, строку "Unicode property escapes (\p{...})".).
    Причина: замена части регулярных выражений типа /[^a-zA-Z\-']/ на /[^\p{Alpha}\-']/u.
    При желании возвращения поддержки старых браузеров можете заменить новую форму регулярного выражения на более консервативную но менее универсальную: /[^a-zA-Zа-яА-Я\-']/ (пример для русского языка).
  • Добавлена поддержка пользовательского словаря с возможностью добавления в него слов.
    Для добавления слова вызовите функцию add_to_usr_dict('нужное_слово'). Если слово не добавляется нужно проверить права доступа к usr-dict.dic
  • Функционал плагина обёрнут в класс.
  • Загрузка словарей больше не происходит автоматически, так как большие словари вызывают ощутимое зависание браузера. Чтобы выполнить загрузку словарей вызовите метод load_dictionary();
  • Включать проверку орфографии теперь можно сразу после вызова загрузки словарей, не заботясь об асинхронности их загрузки. Если вы запросили включение, а словари ещё не загружены, она включится сразу после того как все будут полностью загружены.
  • Из проверки исключены слова равные пустой строке, которые образуются в результате несовершенства разбивки строк на массивы слов. Это немного улучшает производительность + исключает возникновение ошибки, которая возникала в type.js при проверке такой пустой строки, если словари заданы не верно.

Как пользоваться

Главный файл плагина - это файл spellcheck-ace.js

  • Зайдите на страницу плагина на GitHub и ознакомьтесь с соглашением в файле LICENCE.md.
  • Скачайте все файлы плагина с GitHub и поместите их в какой либо каталог на своём сайте.
  • Подключите главный файл плагина к каждой странице, на которой требуется работоспособность этого плагина.
  • Обеспечьте доступность для плагина JS-функции get_this_dir_url(). Вы можете получить её из репозитория зависимостей inFlowia Lab.
  • Добавьте в какой либо удобный для вас php-файл php-функцию doc_root(). Вы можете получить её из репозитория зависимостей inFlowia Lab.
  • В файле add-to-usr-dict.php поправьте константу DEPS_PATH, так чтобы она верно указывала на путь к файлу, куда вы скопировали функцию doc_root()
  • Убедитесь что jQuery, typo.js и ace.js подключены ко всем страницам, где планируется использовать этот плагин.
  • Typo.js на данный момент распространяется только с английским словарём. Найдите словари, для нужных вам языков. Формат словарей должен быть совместим с typo.js. Разместите эти словари в удобных для вас каталогах.
  • В главном файле плагина отредактируйте массив словарей, так, чтобы пути к словарям были верными.
    Никаких особых требований к полю lang нет. Можете вписывать в него любое желаемое обозначение словаря.
    Не удаляйте словарь user-dict. Это ваш пользовательский словарь, в который будут добавляться слова, если вы будете пользоваться функцией добавления в пользовательский словарь (добавление в исключения).
    Можете добавлять любое количество словарей. Проверка будет происходить по каждому из добавленных. Учитывайте, что каждый дополнительный словарь увеличивает время загрузки словарей и процесс проверки.
  • Выберите подходящее место в вашем коде для инициализации объекта плагина. Дело в том, что большие словари, вроде русского, вызывают ощутимое зависание браузера во время загрузки этих словарей (она происходит во время инициализации объекта плагина), так что делать инициализацию, например при загрузке страницы может оказаться не самым рациональным решением. Я, например запускаю инициализацию по нажатию на горячую кнопку, так как проверка орфографии мне нужна не всегда.
  • После того как определитесь с местом, добавьте в него код инициализации объекта плагина: if(typeof spellcheck_ace === 'undefined') spellcheck_ace = new Spellcheck_ace('ace_editor_id');
    Аргумент Spellcheck_ace - это id редактора ace.
    Имейте в виде, что переменную spellcheck_ace не нужно объявлять. Она уже объявлена в главном файле плагина.
  • Включите проверку орфографии методом spellcheck_ace.enable_spellcheck(). Вы можете вызывать его сразу после кода инициализации объекта не заботясь об асинхронности процесса инициализации. Проверка запустися сразу после завершения загрузки всех словарей если вы включили её этим методом.
  • Для отключения проверки орфографии вызовите spellcheck_ace.disable_spellcheck().
  • Для добавления слова в пользовательский словарь (в исключения), передайте это слово в метод spellcheck_ace.add_to_usr_dict(desired_word). Аргумент - это желаемое слово. Имейте в виду, что из слова будут удалены все символы кроме букв , одинарной кавычки и дефиса.
  • Для получения массива вариантов для замены слова с ошибкой, передайте его в метод spellcheck_ace.suggest_word_for_misspelled(misspelled_word)

Пример организации подключения и использования

Пусть загрузка словарей включается на ГК super+F2 и на эту же ГК переключается состояние вкл. / выкл. проверки орфографии. При выделении слова по ГК super+A, слово будет добавляться в пользовательский словарь.

Будем считать, что jQuery и ace вы уже подключили, остаётся подключить:

<script src = '/lib/typo-js/typo/typo.js'></script> <script src = '/lib/ace-spell-check-js-multilang/spellcheck-ace.js'></script>

В то место где вы задаёте настройки редактора ace добавляется подобный код:

this._ace_editor.commands.addCommand({name: 'iFL: Spellcheck Switch', bindKey: 'super-f2', exec: ()=>{ if(typeof spellcheck_ace === 'undefined') spellcheck_ace = new Spellcheck_ace('content'); if(!spellcheck_ace.spellcheckEnabled) spellcheck_ace.enable_spellcheck(); else spellcheck_ace.disable_spellcheck(); }, readOnly: false, }); this._ace_editor.commands.addCommand({name: 'iFL: Spellcheck: add selected word to user dictonary', bindKey: 'super-a', exec: ()=>{ if(typeof spellcheck_ace !== 'undefined') spellcheck_ace.add_to_usr_dict(this._ace_editor.getSelectedText()); else sys_msg_panel.tell_after('Вы попытались добавить слово в пользовательский словарь Spellcheck ace, но проверка орфографии ещё не включена. Слово не будет добавлено.'); }, readOnly: false, });

Имейте в виду, что на месте this._ace_editor подразумевается экземпляр вашего редактора ace, ну и в конструкторе на месте строчки content соответственно id того элемента к которому ваш ace подключен.

Недоработки

  • После первого включения, отключение проверки орфографии просто скрывает оформление но не отключает обработчик изменения редактора.
  • Неплохо бы отделить пользовательский словарь от typo и проверять по нему своим методом, это позволило бы добавлять в него произвольные слова, без ограничений hunspell.
  • Если слово находится по соседству с одинарной кавычкой - это слово скорее всего будет помечено как неправильное, так как кавычка включается в слово
  • Разбивка строк на слова в методе _misspelled() вызывает появление в массиве элементов массива равных пустой строке. Сейчас они отсеиваются из проверки, но всё же это лишняя нагрузка.

Помогло? :)

Черкани Инфловии пару строк если нашёл здесь помощь. Можешь писать под любым постом в группе VK или по старинке на почту: inFlowia@netc.it :)

inFlowia Lab. не делает добро за деньги, но знать, что её труды кому-то помогают очень классно. Если тебе помогли - не поленись, всего пара слов: "Спасибо! Помогло :)" сделают дни инфловии светлее. ^^

Количество откликнувшихся: 8