/**
 *		SpellChecker for AkelPad
 *		Panych Y.W. aka FeyFre (c) 2010-2014 (panych.y@gmail.com)
 *
 *		This piece of software is distributed under BSD license.
 *		AkelPad is property of its copyright holders.
 *		The New Aspell Copyright (C) 2001-2002 by Kevin Atkinson under the GNU LGPL
 *		license version 2.0 or 2.1.
 */ 

Описание

Плагин позволяет выполнить проверку орфографии текущего слова, выделения либо всего документа используя систему ASpell, а также inline подсветку слов с ошибками. Также есть возможность создавать собственные белые списки слов, которые по каким-либо причинам не попали в словари.

Установка:
Для работы плагин требует наличия ядра Aspell а также его словарей (Разработано и протестировано на версии 0.50.3.3 http://aspell.net/win32/)
По-умолчанию установленное ядро ищется в папке <AkelPadDir>\AkelFiles\Plugs\SpellCheck

Установка ASpell:
1. Качаем http://ftp.gnu.org/gnu/aspell/w32/Aspell-0-50-3-3-Setup.exe
2. Устанавливаем в удобное место.
3. На странице http://aspell.net/win32/ присутствует список готовых словарей, качаем оттуда нужные.
4. Устанавливаем словари(установщик в большинстве случаев может самостоятельно определить куда был установлен ASpell)
ВНИМАНИЕ: в установщике словарей присутствуют ошибки:
1) Установщик создает временную папку TmpInstall возле файла установки, потому запуск с read-only носителей будет не возможен.
2) Установщик после завершения работы не удаляет временную папку TmpInstall, что может вызвать конфликт при установке нескольких словарей подряд. Желательно удалять её самостоятельно.
3) При запуске из консоли установщик в процессе работы уничтожает её, при этом не закрывает процесс владелец консоли. Во избежание подобного конфуза рекомендую запускать установщик с консоли посредством команды start <dict-installer-name.exe>

Плагин реализует следующие функции:

CheckSelection	- выполняет проверку текущего слова либо выделения, предлагая варианты ошибочных слов
CheckDocument	- выполняет проверку текущего редактируемого текста
Settings		- настройка плагина
Background		- включение/выключение фоновой подсветки ошибок(можно поставить на автозапуск)
Suggest			- отображает список вариантов исправления ошибочного слова, на котором стоит курсор(если таковые имеются). Рекомендуется назначить клавишу горячего вызова.


Настраиваемые опции плагина:
 - язык проверки(в т.ч. жаргон- расширение языка)
 - опция обработки неизвестных слов как ошибочных
 - опция подсветки выделением текущего исправляемого слова выделением
 - тип подчеркивания inline проверки
 - цвет подчеркивания
 - использование белых списков
 - список словарей не участвующих в фоновой проверке

Функции CheckSelection, CheckDocument могут быть вызваны с двумя дополнительными параметрами(например из плагина ToolBar):
Синтаксис
Call("SpellCheck::CheckSelection",<lang>,<jargon>)
<lang>      - строка, язык словаря для проверки.
<jargon>    - строка, жаргон словаря, может быть пустой строкой. Список доступных пар язык-жаргон смотрите в настройках(до скобок - язык, в скобках - жаргон)
Если они заданы, то соотв. настройки плагина игнорируются.
Например:
Call("SpellCheck::CheckSelection","en","")					-- English
Call("SpellCheck::CheckSelection","en_GB","")				-- English(GB)
Call("SpellCheck::CheckSelection","en_GB","w-accents")		-- English(GB) жаргон w-accents
Call("SpellCheck::CheckSelection","uk","")					-- Ukrainian
Call("SpellCheck::CheckSelection","ru","")					-- Russian


Для быстрого изменения настроек функцию Settings можно также вызывать с параметрами
Call("SpellCheck::Settings",<code>,<arg1>,<arg2>)

<code>				- число, код настройки, которую нужно изменить
<arg1>,<arg2>		- значения настройки. тип определяется кодом

<code> = 0	язык и жаргон.
	<arg1> - строка, язык
	<arg2> - строка, жаргон

<code> = 2	обработка неизвестных слов как ошибочных
	<arg1> - число, 0 - выкл

<code> = 3	подсветка исправляемого слова
	<arg1> - число, 0 - выкл

<code> = 4	стиль подчеркивания 
	<arg1> - число, цвет подчеркивания, RGB в десятичном представлении(R*1+G*256+B*256*256), например
			красный = RGB(255,0,0) = 255*1 +   0*256 +   0*256*256 = 255
			зеленый = RGB(255,0,0) = 255*0 + 255*256 +   0*256*256 = 65280
			синий   = RGB(255,0,0) = 255*0 +   0*256 + 255*256*256 = 16711680
	<arg2> - число, значения:
			0 - сплошная линия			"---------"
			1 - штрих					"-- -- -- "
			2 - пунктир					". . . . ."
			3 - штрих-пунктир			"- . - . -"
			4 - штрих-двойной пунктир	"- .. - .."
			5 - пунктир(уплотнен)		"........."
			6 - волнистая линия			"~~~~~~~~~"

<code> = 5	установка пути к ядру ASpell(изменения приступят в силу после полной перегрузки плагина)
	<arg1> - строка, путь к ядру.

<code> = 6	разрешить применять белый список
	<arg1> - число, 0 - выкл.

Правила задания пути к ядру ASpell:

1. Если параметр пустой, то поиск выполняется в пути по умолчанию(<AkelPadDir>\AkelFiles\Plugs\SpellCheck)
2. Если параметр начинается с HKLM либо HKCU то это полный путь в Реестре к ключу типа строка(REG_SZ) в котором указан путь к модулю ASpell aspell-15.dll
3. В остальных случаях это считается путем к DLL ядра ASpell на файловой системе(включительно с названием самой DLL)
   Для задания относительного пути(относительно папки редактора) путь должен начинаться с ".\" без кавычек, например если модуль в папке выше на уровень чем папка AkelPad и называется my_aspell.dll то настройка должна выглядеть так: .\..\my_aspell.dll

Функция Background по-умолчанию использует белые списки ассоциированные с типом файла(исходя из расширения если такое имеется). Белый список можно выбрать принудительно, для этого нужно вызвать функцию с дополнительным аргументом строкой расширением, например из ToolBar плагина:
Call("SpellCheck::Background",0,"cpp")

Для возврата к списку по-умолчанию можно использовать следующий вызов.
Call("SpellCheck::Background",0,0)

Создание белых списков.

Поиск белых списков выполняется в папке <AkelPadDir>\AkelFiles\Plugs\SpellCheck. Загружаются все файлы со специальным расширением SPCK. Синтаксис файлов следующий:

Пробельные символы в начале каждой строки игнорируются
Строки, первый(только первый) не пробельный символ которых ";" игнорируются(комментарий)
Для того что-бы указать расширение, для которого задаются слова используется конструкция

+расширение

(новая строка, начинается со знака "+", за которым без ведущих и хвостовых пробелов указывается само расширение)

Каждое слово занимает отдельную строку.
Что-бы слово не учитывало регистр поставьте перед ним знак вертикальный слэш (|)
Слова ассоциируются со всеми ранее указанными расширениями. Для исключения расширения из списка предусмотрена конструкция:

-расширение

(новая строка, начинается со знака "-", за которым без ведущих и хвостовых пробелов указывается само расширение)

Файл может быть сохранен в любой кодировке и стилем переносов строки, из тех которые может определить AkelPad.
Также возможно дополнить белые списки динамически используя следующий вызов плагина:
Call("SpellCheck::Background", 1, whitelist_definition_data)
где whitelist_definition_data того же формата что и файлы белых списков(Потому по причине не компактности формата рекомендовано использовать эту функцию из Scripts-плагина). Динамическое дополнение белых списков действительно до выгрузки плагина.

Для пользователей старого/медленного/нагруженного оборудования добавлен механизм отложенной фоновой проверки.
Теперь при быстром редактировании текста(либо просто навигации) выполнение проверки(и подчеркивания) может быть отложено до момента не влияющего на скорость работы с текстом.
Механизм не активен по умолчанию, активируется с помощью ручных настроек(файл/реестр):
delayback - активирует механизм, принимает значения 0(не активен) или 1
delaytime - время в миллисекундах, интервал проверки активности пользователя. По-умолчанию 500мс, установка значений до 100мс не рекомендуется.

ВНИМАНИЕ: плагин требует среду WindowsXP SP2/Windows 2003 или новее