Page 69 of 99

Posted: Tue Oct 27, 2015 10:11 am
by yozhic
Skif_off wrote:одинаковый цвет шрифта
Подтверждаю. А я то думаю, почему опубликованного кода на форуме не видно! У меня ж фон – белый. В тегах не догадался посмотреть.

Posted: Wed Oct 28, 2015 6:04 pm
by Instructor
Skif_off, yozhic
CodePoster.js 2.5 не совместим с разрабатываемой версией AkelPad'а. После релиза 4.9.7 будет выложена новая версия.

Posted: Wed Oct 28, 2015 7:37 pm
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);
}

Posted: Fri Oct 30, 2015 9:59 am
by Kley
KDJ
Thank you very much for your help and responsiveness!

Posted: Fri Oct 30, 2015 10:10 am
by FeyFre
Why not set proper ExStyle in creating routine?

Posted: Fri Oct 30, 2015 10:35 am
by KDJ
FeyFre
Can you give any example?

Posted: Sat Oct 31, 2015 7:01 pm
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).

Posted: Sun Nov 15, 2015 3:06 pm
by SFC
Добрый день.
Напишите плз плагин. Думаю нужен не только мне будет.

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

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

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

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

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

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

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

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

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

Спасибо.

Posted: Sun Nov 15, 2015 6:08 pm
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.

Добавлено:
Более быстрый и удобный вариант.

Posted: Sun Nov 15, 2015 7:15 pm
by SFC
Skif_off
Да, с темой чтото не разобрался. Спасибо.
Скрипт работает частично. Но если самое ПЕРВОЕ слово текста есть в словаре, то оно не удаляется и еще чтото ни так.

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

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

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

Code: Select all

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

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

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

Posted: Sun Nov 15, 2015 8:24 pm
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;
}

Posted: Sun Nov 15, 2015 9:49 pm
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. и прочее).

Posted: Mon Nov 16, 2015 6:21 am
by SFC
Skif_off
Спасибо. Сейчас работает лучше.

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

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

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

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

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

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

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

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