Scripts discussion (3)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

SFC
Corrected and added some parameters:

Code: Select all

// This script extracts from the current text whole words and leaves only those words that don't exist in the dictionary.
// I assume that dictionary file contains one word in each line and is saved as UTF-8 without BOM in location: ...\AkelPad\AkelFiles\Tools\dictionary.txt
//
// Usage:
//  Call("Scripts::Main", 1, "Dict2.js", '-minLen=2 -latin=1 -sort=1 -info=0')
//
// Arguments:
//   -minLen - minimum length of word in characters (default=2);
//             if < 1, shows the input box
//   -latin:
//     0 - use also non latin characters in words
//     1 - use latin characters only (default)
//     2 - question message box
//   -sort - means that the output list of words will be sorted:
//     0 - not sorted
//     1 - sorted (default)
//     2 - question message box
//   -info - information message box after end:
//     0 - don't show (default)
//     1 - show

var nMinLen  = AkelPad.GetArgValue("minLen", 2);
var nLatin   = AkelPad.GetArgValue("latin", 1);
var nSort    = AkelPad.GetArgValue("sort", 1);
var bInfo    = AkelPad.GetArgValue("info", 0);
var hMainWnd = AkelPad.GetMainWnd();
var nChoice;
var oRE;
var nTime;
var aWordAll;
var aWord;
var oDict;
var nDictLen;
var i;

if (nMinLen < 1)
{
  nMinLen = parseInt(AkelPad.InputBox(hMainWnd, WScript.ScriptName, "Minimum length of word in characters (>0):", "2"), 10);

  if ((! nMinLen) || (nMinLen < 1))
    WScript.Quit();
}

if ((nLatin != 0) && (nLatin != 1))
{
  nChoice = AkelPad.MessageBox(hMainWnd, "Use only latin characters in words?", WScript.ScriptName, 0x23 /*MB_ICONQUESTION|MB_YESNOCANCEL*/);

  if (nChoice == 2 /*IDCANCEL*/)
    WScript.Quit();
  else if (nChoice == 6 /*IDYES*/)
    nLatin = 1;
  else
    nLatin = 0;
}

if ((nSort != 0) && (nSort != 1))
{
  nChoice = AkelPad.MessageBox(hMainWnd, "Sort the output list of words?", WScript.ScriptName, 0x23 /*MB_ICONQUESTION|MB_YESNOCANCEL*/);

  if (nChoice == 2 /*IDCANCEL*/)
    WScript.Quit();
  else if (nChoice == 6 /*IDYES*/)
    nSort = 1;
  else
    nSort = 0;
}

if (nLatin)
  oRE = new RegExp("[a-z']{" + nMinLen + ",}", "g");
else
  oRE = new RegExp("[^\x00-\x26\x28-\x40\x5B-\x60\x7B-\xBF\xD7\xF7]{" + nMinLen + ",}", "g");

nTime = new Date().getTime();

if (aWordAll = AkelPad.GetTextRange(0, -1).toLowerCase().match(oRE))
{
  aWord = [];
  oDict = {};

  if (nDictLen = GetDictionary(oDict))
  {
    for (i = 0; i < aWordAll.length; ++i)
    {
      if (! (aWordAll[i] in oDict))
      {
        aWord.push(aWordAll[i]);
        oDict[aWordAll[i]] = true;
      }
    }

    if (nSort)
      aWord.sort();

    AkelPad.SetSel(0, -1);
    AkelPad.ReplaceSel(aWord.join("\r"), -1);
  }
}

if (bInfo)
  AkelPad.MessageBox(hMainWnd,
                     "Words in dictionary: " + ((typeof nDictLen == "number") ? nDictLen : "?") + "\n\n" +
                     "Min length of word: " + nMinLen + "\n" +
                     "Non latin chracters: " + (nLatin ? "No" : "Yes") + "\n\n" +
                     "Input words: " + (aWordAll ? aWordAll.length : 0) + "\n" +
                     "Output words: " + (aWord ? aWord.length + ((aWord.length > 1) && nSort ? " (sorted)" : "") : 0) + "\n\n" +
                     "Total time: " + (new Date().getTime() - nTime) + " ms",
                     WScript.ScriptName, 64 /*MB_ICONINFORMATION*/);

function GetDictionary(oDict)
{
  var aDict = AkelPad.ReadFile(AkelPad.GetAkelDir(1) + "\\Tools\\dictionary.txt", 0x10 /*OD_ADT_NOMESSAGES*/, 65001 /*UTF-8*/, 0).toLowerCase().match(/[^\r\n]+/g);
  var i;

  if (aDict)
  {
    for (i = 0; i < aDict.length; ++i)
      oDict[aDict[i]] = true;

    return aDict.length;
  }

  return 0;
}

Offline
Posts: 276
Joined: Mon Jun 20, 2011 8:33 am
Location: Электросталь

Post by yozhic »

KDJ
Есть предложение (пожелание) для FindReplaceEx.js. Если заинтересуетесь, не могли бы добавить в скрипт функцию «Extract to Clipboard» (другими словами «Copy Matches»)? Чтобы она помещала в буфер обмена все найденные совпадения. Например, найти: «<[^>\n\r]+>»; заменить: «\0» – нажимаю кнопку «Extract to Clipboard» и у меня в буфере обмена все html-теги из текущего файла. Потом можно вставить результат в новый файл и исследовать его. Мне кажется, что это – очень удобная и полезная функция. Я подсмотрел её в программе EditPad Pro.

SFC
Offline
Posts: 24
Joined: Sun Jul 12, 2015 9:37 am

Post by SFC »

KDJ
Many Thanks.
I tested scripts in several modes and files. It is working. Info is useful also.
Please, add script to collection. I think It is interesting for people.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

FindReplaceEx.js
Added context menu for "Find all" button with options:
- "Show in Log panel",
- "Copy to clipboard".

Offline
Posts: 276
Joined: Mon Jun 20, 2011 8:33 am
Location: Электросталь

Post by yozhic »

KDJ
context menu for "Find all" button
Не могу найти :? Правой кнопкой мыши по кнопке "Find all" – меню не появляется.
...
Уфф... Yus, спасибо большое. Разбит ещё один стереотип :)
Last edited by yozhic on Tue Nov 24, 2015 12:03 pm, edited 1 time in total.

YuS
Offline
Posts: 513
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

yozhic wrote: Правой кнопкой мыши по кнопке "Find all" – меню не появляется.
ЛКМ
Image

YuS
Offline
Posts: 513
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

KDJ wrote: Added context menu for "Find all" button with options:
- "Show in Log panel",
- "Copy to clipboard".

Code: Select all

/**************************************************
FindReplaceEx.js - ver. 2015-11-23
Interface language
Language:      Russian (1049)
Translated by: F. Phoenix, Andrey_A_A, VladSh, YuS
**************************************************/
sTxtMore          = 'Ещё';
sTxtCount         = 'Подсчитать';
sTxtFindAll       = 'Найти все';
sTxtShowInLog     = 'Показать в Log-панели';              //new
sTxtCopyToCB      = 'Копировать в буфер';              //new
sTxtBookmarkAll   = 'Закладки на все';
sTxtUnmarkAll     = 'Убрать закладки';
sTxtTemplates     = 'Шаблоны';
sTxtBatches       = 'Пакеты';
sTxtWait          = 'Подождите...';
sTxtTotalFound    = 'Всего вхождений: ';
sTxtReplAllCD     = '"Заменить всё" закрывает диалог';
sTxtReplAllWM     = '"Заменить всё" без сообщения';
sTxtCheckInSel    = 'Отметить "В выделении" если есть выделение';
sTxtCycleSearch   = 'Поиск по кругу';
sTxtPrompt        = 'Запрос';
sTxtWhatFind      = 'Что найти';
sTxtReplaceWith   = 'Чем заменить';
sTxtMatchCase     = '&Учитывать регистр';
sTxtWholeWord     = 'Слово &целиком';
sTxtRegExp        = '&Регулярные выражения';
sTxtEscSeq        = 'Esc-&последовательности';
sTxtDirection     = 'Направление';
sTxtDirDown       = 'Вни&з';
sTxtDirUp         = 'Ввер&х';
sTxtDirBeginning  = '&С начала';
sTxtDirInSel      = 'В в&ыделении';
sTxtDirAllFiles   = 'Все &файлы';
sTxtNew           = 'Создать';
sTxtAdd           = 'Добавить';
sTxtRename        = 'Изменить';
sTxtMoveUp        = 'Вверх';
sTxtMoveDown      = 'Вниз';
sTxtRemove        = 'Удалить';
sTxtCheckRE       = 'Проверить RegExp';
sTxtAddToBatch    = 'В пакет';
sTxtOK            = 'OK';
sTxtClose         = 'Закрыть';
sTxtBatchReplace  = 'Пакетная замена';
sTxtBatchReplAll  = 'Заменить всё (пакетом)';
sTxtEnableAll     = 'Включить&/выключить всё';
sTxtClosesDialog  = 'Закрывает диалог';
sTxtWithoutMsg    = 'Без сообщения';
sTxtTemplateName  = 'Имя шаблона';
sTxtConditions    = 'Условия';
sTxtAllColumns    = 'Все колонки';
sTxtNameOnly      = 'Только имя';
sTxtSortByName    = 'Сортировка по имени';
sTxtNameInvalid   = 'Неверное имя.';
sTxtNameExists    = 'Такое наименование шаблона уже используется.';
sTxtWantRemove    = 'Вы действительно хотите удалить этот шаблон?';
sTxtBatchNumber   = 'Пакет №';
sTxtWantBatchRepl = 'Заменить всё этим пакетом?';
sTxtNoFindText    = 'Нет текста в поле "Что найти".';
sTxtRegExpOK      = 'Регулярное выражение правильное.';
sTxtRegExpError   = 'Ошибка в регулярном выражении.';
sTxtCountChanges  = 'Количество замен: ';
//context menu edit
sMnuUndo      = '&Отменить';
sMnuRedo      = '&Повторить';
sMnuCut       = 'Вырезать';
sMnuCopy      = '&Копировать';
sMnuPaste     = '&Вставить';
sMnuDelete    = '&Удалить';
sMnuSelectAll = 'Выделить всё';
sMnuAPFont    = 'Шрифт (Вид->Шрифт)';
sMnuNextTempl = 'Следующий шаблон';
sMnuPrevTempl = 'Предыдущий шаблон';
//RegExp help
sHlpAnyChar        = 'любой символ (точка)';
sHlpSpecChars      = '()[]{}^$.?+*|\\ специальные символы';
sHlpFF             = 'перевод страницы \\x0C';
sHlpAnyNL          = 'перевод строки';
sHlpTab            = 'табуляция \\x09';
sHlpVTab           = 'вертикальная табуляция \\x0B';
sHlpDigit          = 'цифра [0-9]';
sHlpNonDigit       = 'не цифра [^0-9]';
sHlpWhiteSp        = 'пробельный символ [ \\f\\n\\t\\v]';
sHlpNonWhiteSp     = 'непробельный символ';
sHlpWordChar       = 'словесный символ  (non-delimiter)';
sHlpNonWordChar    = 'несловесный символ (delimiter)';
sHlpCharHex        = 'символ - код в диапазоне 0-10FFFF';
sHlpCharHex2       = 'символ - 2-значный код';
sHlpCharHex4       = 'символ - 4-значный код';
sHlpAlternative    = 'одна из альтернатив: ab либо xy';
sHlpCharSet        = 'набор символов, нужен любой из них';
sHlpNegCharSet     = 'исключающий набор символов';
sHlpRange          = 'диапазон символов от a до z';
sHlpNegRange       = 'исключающий диапазон';
sHlpBeginLine      = 'начало строки';
sHlpEndLine        = 'конец строки';
sHlpBeginText      = 'начало документа';
sHlpEndText        = 'конец документа';
sHlpBeginRange     = 'начало диапазона поиска';
sHlpEndRange       = 'конец диапазона поиска';
sHlpWordBoun       = 'граница слова';
sHlpNonWordBoun    = 'не граница слова';
sHlpExcludePrev    = 'исключить предыдущее из результата';
sHlpZeroOrOne      = '0 или 1 раз';
sHlpZeroOrMore     = '0 или более раз';
sHlpOneOrMore      = '1 или более раз';
sHlpExactly        = 'ровно 3 раза';
sHlpAtLeast        = 'не менее 3 раз';
sHlpFromTo         = 'от 3 до 7 раз';
sHlpBackslash      = 'обратный слеш';
sHlpNL             = 'перевод строки';
sHlpEntireStr      = 'вся захваченная строка';
sHlpSubmatch9      = '9я подстрока (диапазон 1-9)';
sHlpSubmatch99     = '99я подстрока (диапазон 01-99)';
sHlpGreedy         = '- выше жадные квантификаторы ';
sHlpLazy           = 'добавить для ленивого квантификатора';
sHlpPossesive      = 'добавить для сверхжадного квантификатора';
sHlpCapture1       = 'запоминающая скобка';
sHlpCapture2       = 'соответствует негативному ab, захвату';
sHlpNotCapture     = 'незапоминающая скобка';
sHlpAtomicGrouping = 'атомарная группа (незапоминающая)';
sHlpPreceded       = 'строка следует за ab';
sHlpNotPreceded    = 'строка не следует за ab';
sHlpFollowed       = 'строка предшествует ab';
sHlpNotFollowed    = 'строка не предшествует ab';
sHlpCondition      = 'если (1) то x, иначе y';
sHlpBackrefer9     = 'обратная ссылка, диапазон 1-9';
sHlpBackrefer99    = 'обратная ссылка, диапазон 01-99';
sHlpIgnoreCase     = 'не учитывать регистр символов';
sHlpMultiline      = 'многострочный поиск (по умолчанию)';
sHlpDotDefault     = 'точке соответствует любой символ (по умолчанию)';
sHlpInvertGreed    = 'инвертировать жадность квантификаторов';
sHlpMatchCase      = 'учитывать регистр символов';
sHlpMultilineOff   = 'выключить многострочный поиск';
sHlpDotDefaultOff  = 'точке соответствует любой символ, кроме \\n';
sHlpInvertGreedOff = 'отменить инвертирование жадности';

Offline
Posts: 53
Joined: Mon Jan 03, 2011 11:02 pm

Post by ABTOP »

KDJ, а как можно заставить скрипт по-умолчанию запускать интерфейс замены? Если нельзя, не мог бы ты сделать такую возможность. Сейчас приходится два раза нажимать ctrl+H — я скрипт повесил на эту комбинацию

YuS
Offline
Posts: 513
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

ABTOP wrote:KDJ, а как можно заставить скрипт по-умолчанию запускать интерфейс замены?
FindRreplaceEx.js

Code: Select all

  sArg = AkelPad.GetArgValue("dlg", "F").toUpperCase(); ->  sArg = AkelPad.GetArgValue("dlg", "R").toUpperCase();
Точнее в этой строке:
"F" -> "R"

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

YuS
Thanks for the translation. Uploaded: FindReplaceEx_1049.lng

ABTOP
Simply, assign Ctrl+H to:

Code: Select all

Call("Scripts::Main", 1, "FindReplaceEx.js", '-dlg="R"')

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

FindReplaceEx.js
Added option: "Find all" -> "Open in new tab".

Offline
Posts: 53
Joined: Mon Jan 03, 2011 11:02 pm

Post by ABTOP »

KDJ, а как сделать, чтобы по Ctrl + F вызывался расширенный поиск, а по Ctrl +H расширенную замена? Пока сделал две копии скрипта, одну оригинальную, вторую модифицированную которую повесил на Ctrl +H

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

ABTOP
You don't need two copies of the script.
For "Find" dialog assign Ctrl+F to:

Code: Select all

Call("Scripts::Main", 1, "FindReplaceEx.js")
and for "Replace" dialog assign Ctrl+H to:

Code: Select all

Call("Scripts::Main", 1, "FindReplaceEx.js", '-dlg="R"')
and for "Go to" dialog assign Ctrl+G to:

Code: Select all

Call("Scripts::Main", 1, "FindReplaceEx.js", '-dlg="G"')

Offline
Posts: 53
Joined: Mon Jan 03, 2011 11:02 pm

Post by ABTOP »

KDJ, а куда это прописывать? В InputBox_function.js или в файл скрипта?

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

ABTOP
In Hotkeys plugin.
Locked