Scripts discussion (3)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 276
Joined: Mon Jun 20, 2011 8:33 am
Location: Электросталь

Post by yozhic »

Skif_off wrote:одинаковый цвет шрифта
Подтверждаю. А я то думаю, почему опубликованного кода на форуме не видно! У меня ж фон – белый. В тегах не догадался посмотреть.

Offline
Site Admin
Posts: 6403
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Skif_off, yozhic
CodePoster.js 2.5 не совместим с разрабатываемой версией AkelPad'а. После релиза 4.9.7 будет выложена новая версия.

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

Post by KDJ »

Kley wrote:Создавая диалог с кнопкой и текстовым полем (oSys.Call("user32::CreateWindowEx"...)
dwStyle=WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER|BS_OWNERDRAW
dwStyle=WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER|ES_AUTOHSCROLL
Вокруг "контролов" выводится плоская и черная рамка, что мне, собственно, и нужно.
Используя функцию AkelPad.CreateDialog не могу добиться того же.
Подскажите троеШнику, пожалуйста, как это сделать? :oops: Спасибо.
Maybe in this way:

Code: Select all

var IDBUTTON = 1000;
var IDEDIT   = 1001;
var oSys     = AkelPad.SystemFunction();
var hMainWnd = AkelPad.GetMainWnd();
var sClass   = "AkelPad::Scripts::" + WScript.ScriptName + "::" + AkelPad.GetInstanceDll();
var hDlg;

AkelPad.WindowRegisterClass(sClass);

//0x90CA0000 = WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX
//0x5081000B = WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP|BS_OWNERDRAW
//0x50810080 = WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP|ES_AUTOHSCROLL
AkelPad.CreateDialog(0, sClass, WScript.ScriptName, 0x90CA0000, 100, 100, 300, 90, hMainWnd, DialogCallback, 0x2 /*CDF_PIXELS*/, 0, 0, "", 0, 0, "|",
  //ExSt, Class,    Title,       Style,   X,   Y,   W,   H, ID,      lParam,
  0x0000, "BUTTON", "",     0x5081000B,  10,  10,  25,  25, IDBUTTON,     0, "|",
  0x0000, "EDIT",   "Edit", 0x50810080,  10,  50, 280,  21, IDEDIT,       0);

if (hDlg)
{
  AkelPad.ScriptNoMutex();
  AkelPad.WindowGetMessage(0x2 /*WGM_NOKEYSEND*/);
}

AkelPad.WindowUnregisterClass(sClass);

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  var nID;

  if (uMsg == 272 /*WM_INITDIALOG*/)
  {
    hDlg = hWnd;

    //enforce set STYLE and EXSTYLE in controls
    oSys.Call("User32::SetWindowLongW", GetDlgItem(IDBUTTON), -16 /*GWL_STYLE*/, 0x5081000B);
    oSys.Call("User32::SetWindowLongW", GetDlgItem(IDBUTTON), -20 /*GWL_EXSTYLE*/, 0);
    oSys.Call("User32::SetWindowLongW", GetDlgItem(IDEDIT), -16 /*GWL_STYLE*/, 0x50810080);
    oSys.Call("User32::SetWindowLongW", GetDlgItem(IDEDIT), -20 /*GWL_EXSTYLE*/, 0);
    oSys.Call("User32::SetWindowPos", GetDlgItem(IDBUTTON), 0, 0, 0, 0, 0, 0x37 /*SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE*/);
    oSys.Call("User32::SetWindowPos", GetDlgItem(IDEDIT), 0, 0, 0, 0, 0, 0x37 /*SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE*/);
  }

  else if (uMsg == 273 /*WM_COMMAND*/)
  {
    nID = LoWord(wParam);

    if (nID == IDBUTTON)
    {
      WScript.Echo("Button was pressed.");
    }

    else if (nID == 2 /*IDCANCEL*/)
      oSys.Call("User32::PostMessageW", hDlg, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 16 /*WM_CLOSE*/)
  {
    oSys.Call("User32::PostQuitMessage", 0);
    oSys.Call("User32::DestroyWindow", hDlg);
  }

  return 0;
}

function LoWord(nParam)
{
  return (nParam & 0xFFFF);
}

function GetDlgItem(nID)
{
  return oSys.Call("User32::GetDlgItem", hDlg, nID);
}

Offline
Posts: 202
Joined: Sat Mar 28, 2015 2:36 pm
Location: Russia

Post by Kley »

KDJ
Thank you very much for your help and responsiveness!

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Why not set proper ExStyle in creating routine?

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

Post by KDJ »

FeyFre
Can you give any example?

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

Post by KDJ »

FindReplaceEx.js
TextMarker.js
Added:
- Ctrl+F1 - view AkelHelp-*.htm in default browser (if "Regular expressions" is checked),
- Shift+F1 - view AkelHelp-*.htm in HtmlView.js (if "Regular expressions" is checked).

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

Post by SFC »

Добрый день.
Напишите плз плагин. Думаю нужен не только мне будет.

Когда читаешь англ текст встречаются незнакомые слова. Хотелось бы не читая текста сразу определить какие слова незнакомые чтобы заранее их выучить и уже спокойно читать текст.

В принципе все это и сейчас можно делать в несколько действий но не быстро и не просто:

Есть файл dictionary.txt в UTF-8 в котором в столбик все известные слова и их формы. И есть какой-то проверяемый файл текста.
1. В тексте все пробелы и знаки препинания меняются на символ конца строки. До получения всех слов текста в столбце.

!!! также весь текст приводится к нижнему регистру, чтобы были маленькие буквы. Выкидываются все цифры.

Без пробелов.

2. Из этого столбца удаляются все строки которые есть в файле dictionary.
Почему именно строки, а не слова - чтобы из слова booking не удалилось book.
3. из файла текста удаляются все пустые строки и он сортируется.
Все.
Получился список слов которых нет в файле dictionary.

Постепенно пополняя файл dictionary пользователь сможет определять только незнакомые слова.

Желательно чтобы ссылка на файл dictionary было как параметр вызова скрипта. Или имя бы совпадало с именем скрипта чтобы сделать неск копий скрипта на случаи разных языков.

Аналогичные функции есть на сайтах словарей - типа на проверку во входимость в список Oxford 3000 и т.д.

Спасибо.

Offline
Posts: 1162
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

SFC
Если вам нужен обязательно плагин, то зачем писать о нём в теме уже существующего плагина? А если нужен скрипт, то и для него есть своя тема.
Стало любопытно,

Code: Select all

// Отсюда http://akelpad.sourceforge.net/forum/viewtopic.php?p=29871#p29871 и ниже,
// скрипт http://akelpad.sourceforge.net/forum/viewtopic.php?p=29873#p29873
// 2015-11-16

var pText = AkelPad.GetTextRange(0, -1).toLowerCase();
var aWordList = GetWords(pText);
var aDict;

pText = "";

for (i = 0; i < aWordList.length; ++i)
{
  if (aWordList[i].length > 1)
    pText += aWordList[i] + "\r";
}
// Читаем \AkelFiles\Tools\dictionary.txt (в UTF-8 без BOM) и режем в массив
aDict = AkelPad.ReadFile(AkelPad.GetAkelDir(1) + "\\Tools\\dictionary.txt", 0x10 /*OD_ADT_NOMESSAGES*/, 65001 /*UTF-8*/, false).split(/[\r\n]+/);
// Ищем в тексте документа слова из массива, если есть - удаляем
for (var i = 0; i < aDict.length; i++)
{
  if (pText.indexOf(aDict[i]) >= 0)
  {
    oPattern = new RegExp("^" + aDict[i] + "\r+", "gm");
    pText = pText.replace(oPattern, "");
  }
}
// Вставляем отсутствующие слова в документ, заменяя существующий текст
AkelPad.SetSel(0, -1);
AkelPad.ReplaceSel(pText);

// Kley, http://akelpad.sourceforge.net/forum/viewtopic.php?p=29879#p29879
function GetWords(pText)
{
  var aAllWords;
  var nAllWords;
  var aWords = [];
  var sWord;
  var i = 0;

  aAllWords = pText.match(/[^\s`"\\\|\[\]\(\)\{\}<>,\.;:\+\-=~!#\$%^&\*/\?«»]+/g);
  nAllWords = aAllWords ? aAllWords.length : 0;

  if (nAllWords)
  {
    aAllWords.sort();

    while (i < nAllWords)
    {
      sWord = aAllWords[i];
      ++i;
      while ((i < nAllWords) && (sWord == aAllWords[i]))
      {
        ++i;
      }
      // Пропускаем итерацию, если в строке содержится что-нибудь кроме "a-z'"
      if (sWord.search(/[^a-z']+/g) >= 0) continue;
      aWords.push(sWord);
    }
  }
  return aWords;
}
. Только английский, файл dictionary.txt в UTF-8 без BOM положить в \AkelFiles\Tools\dictionary.txt.

Добавлено:
Более быстрый и удобный вариант.
Last edited by Skif_off on Sun Nov 22, 2015 10:01 pm, edited 7 times in total.

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

Post by SFC »

Skif_off
Да, с темой чтото не разобрался. Спасибо.
Скрипт работает частично. Но если самое ПЕРВОЕ слово текста есть в словаре, то оно не удаляется и еще чтото ни так.

Вот попробуйте словарь:
book
booked
take
took

Текст:
booked took door take book have booked booking fr554 gfd 34
dssdfsdfsd hgfh
fgh
Результат:
не должно быть слов: book booked - а они есть

Offline
Posts: 1162
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

SFC wrote:Но если самое ПЕРВОЕ слово текста есть в словаре, то оно не удаляется
Моя ошибка, забыл, что .indexOf() возвращает позицию, начиная с нуля, тогда условие

Code: Select all

if (pTextRange.indexOf(aDict[i]))
не срабатывает, если индекс равен 0, изменил, добавил удаление пустых строк, пост исправил.

Надо подумать над удалением всего, кроме слов, т.к. сейчас "fr554" превращается в "fr", а это неправильно.

Добавлено:
Теперь "fr554" остаётся "fr554", но не сообразил пока, как убрать.

Offline
Posts: 202
Joined: Sat Mar 28, 2015 2:36 pm
Location: Russia

Post by Kley »

Skif_off

Code: Select all

// Основан на коде KDJ (FileInfo.js)

var pText = AkelPad.GetTextRange(0, -1).toLowerCase();
var aWordList = GetWords(pText);

pText = "";

for (i = 0; i < aWordList.length; ++i)
{
  if (aWordList[i].length > 1)
    pText += aWordList[i] + "\n";
}

AkelPad.SetSel(0, -1);
AkelPad.ReplaceSel(pText.substr(0, pText.length - 1));

function GetWords(pText)
{
  var aAllWords;
  var nAllWords;
  var aWords=[];
  var sWord;
  var i = 0;

  aAllWords = pText.match(/[^\s'`"\\\|\[\]\(\)\{\}<>,\.;:\+\-=~!@#\$%^&\*/\?\d]+/g); //оригинал (без \d в конце)
  nAllWords = aAllWords ? aAllWords.length : 0;

  if (nAllWords)
  {
    aAllWords.sort();

    while (i < nAllWords)
    {
      sWord = aAllWords[i];
      ++i;
      while ((i < nAllWords) && (sWord == aAllWords[i]))
      {
        ++i;
      }
      aWords.push(sWord);
    }
  }
  return aWords;
}

Offline
Posts: 1162
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Kley
Спасибо, любопытная функция, только использовать все разделители из AkelPad не очень правильно (по крайней мере - в данном случае): попадёт много мусора, типа e-mail, в то же время срежутся сокращения с " ' " (don't превратиться в don).
В общем, для метода .match() изменил список, а перед добавлением в массив проверяю

Code: Select all

if (sWord.search(/[^a-z]+/g) >= 0) continue; // Пропускаем итерацию, если в строке содержится что-нибудь кроме a-z
Скрипт обновил в том же сообщении.

P.S. По хорошему ещё, наверное, выпиливать аббревиатуры и сокращения (dr. и прочее).

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

Post by SFC »

Skif_off
Спасибо. Сейчас работает лучше.

> Теперь "fr554" остаётся "fr554", но не сообразил пока, как убрать.

Это исчезает вообще сейчас. По идее или fr554 должно остаться или fr. Тут я сам не соображу.

> P.S. По хорошему ещё, наверное, выпиливать аббревиатуры и сокращения (dr. и прочее).

Не думаю. Пусть будет общее правило: удалять знаки препинания и сравнивать. Абревиатуры будут в словаре - и оно будет работать так как сейчас есть.

Замечание:
От hgfh остается hgf
т.е. съедается последний символ. И так у любого последнего слова.

Я добавил третью строку:
nod's far
nod's - исчезает, а должен остаться. И от hgfh остается hgf все равно

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

Post by SFC »

Вот так вроде нормально делает первый шаг - приводит в столбец:
Что:
(\ |\.|\,|\"|\:|\;|\d|\\|\/|\+|\!|\#|\$|\%|\&|\*|\(|\)|\=|\[|\]|\{|\}|\?|\<|\>|\!|\~|\@)
Чем:
\n

короткого тире пока не вставил. Пока так.
Locked