Scripts discussion (3)

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

Post by YuS »

KDJ wrote:"TextReplace.js"

Code: Select all

  else if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1049) //Russian
  {
    sTxtDlgTitle     = "Замена текста";
    sTxtWhat         = "Ч&то:";
    sTxtWith         = "Ч&ем:";
    sTxtRegExp       = "Регулярные в&ыражения";
    sTxtMatchCase    = "Учитывать &регистр";
    sTxtWithFunc     = "Заменять на &функцию";
    sTxtRange        = "Направление";
    sTxtBegToCaret   = "&1 - До курсора";
    sTxtCaretToEnd   = "&2 - От курсора";
    sTxtSelection    = "&3 - В выделении";
    sTxtEntireDoc    = "&4 - Весь файл";
    sTxtAllDocs      = "&5 - Все файлы";
    sTxtReplace1     = "&Одна замена";
    sTxtReplaceAll   = "Заменить &всё";
    sTxtClose        = "Закрыть";
    sTxtNotFound     = "Не найдено!";
    sTxtChangedDocs  = "Изменённые документы: ";
    sTxtCountChanges = "Количество замен: ";
    sTxtRegExpErr    = "Синтаксическая ошибка в регулярном выражении!";
    sTxtNoFuncErr    = "Не удаётся создать функцию замены!";
    sTxtNoTextErr    = "Функция замены текст не вернула!";
    sTxtRunTimeErr   = "Ошибка во время выполнения функции замены:";
  }
Может быть, существуют более корректные варианты перевода и кто-нибудь поправит...
Last edited by YuS on Sun Mar 06, 2016 5:53 am, edited 2 times in total.

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

Post by Kley »

YuS
Может быть:

Code: Select all

    sTxtBegToCaret   = "&1 - До каретки";
    sTxtCaretToEnd   = "&2 - После каретки";
каретка \ курсор - как понятнее.

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

Post by YuS »

Kley wrote:YuS
Может быть:

Code: Select all

    sTxtBegToCaret   = "&1 - До каретки";
    sTxtCaretToEnd   = "&2 - После каретки";
каретка \ курсор - как понятнее.
Да, наверное, лучше в таком варианте...
А каретка - это, имхо, устаревшее название относительно компьютера, наследие от печатных машинок...
курсор - будет более понятное название.

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

Post by KDJ »

TextReplace.js
Added Russian translation by YuS.

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

Post by YuS »

KDJ wrote:TextReplace.js
Кстати, вопрос возник:
Поле для ввода текста IDWHATE и IDWITHE имеют стиль 0x50011004, то есть они мультистроковые - это можно как-то использовать?

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

Post by KDJ »

YuS

TextReplace_function.js
Fixed: multiline replace.

If "Regular expressions" is checked, the following texts (What and With) are equivalent:

Code: Select all

a
b

Code: Select all

a\nb

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

Post by YuS »

KDJ wrote: Fixed: multiline replace.

If "Regular expressions" is checked, the following texts (What and With) are equivalent:
Спасибо! Теперь понятно.
Ранее пробовал так использовать, но видимо, из-за ошибки и не работало.

Offline
Posts: 19
Joined: Sun Jan 17, 2016 5:41 pm

Post by nbsp »

KDJ wrote:FindReplaceEx.js
Changed:
- removed manual parameter "bLinesInLog",
- in "Find all" added option "Show in Log panel - entire lines".
Thanks, it works fine.

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

Post by YuS »

VladSh wrote:Ребята, это тема Scripts collection, здесь предложения и обсуждения не ведутся.
Да, спасибо. Заметил где мы пишем уже после того, как написал... но функция "удалить/переместить сообщения" доступна только модератору.


Instructor, пожалуйста, удалите (то, что там написано уже смысла не имеет) или переместите лишние сообщения отсюда в более подходящее место.

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

Post by Skif_off »

Подскажите, пожалуйста, нужен совет: скрипт Andrey_A_A DeletePhrasesInText.vbs не работает уже несколько версий AkelPad, но возможность удалить строки просто выделив текст и запустив скрипт нужна,

Code: Select all

// Argumens:
//   -delete=
//           0   - удаление строки (по умолчанию);
//           1   - очистка строки;
//   -direction=
//           0   - поиск с начала (по умолчанию);
//           1   - вниз;
//           2   - вверх;
//   -case=
//           0   - не учитывать регистр (по умолчанию);
//           1   - учитывать регистр;

var nArgDel = AkelPad.GetArgValue("delete", 1);
var nArgDir = AkelPad.GetArgValue("direction", 0);
var nArgCas = AkelPad.GetArgValue("case", 0);

var hMainWnd    = AkelPad.GetMainWnd();
var hWndEdit    = AkelPad.GetEditWnd();
var oSys        = AkelPad.SystemFunction();
var nStart      = AkelPad.GetSelStart();
var pSearchText = AkelPad.GetSelText();
var nFlag;
var nWordWrap;
var nResult;
// Flags:
switch (nArgDir)
{
  case 0:
    nFlag = 0x00200001; /*FRF_DOWN|FRF_BEGINNING*/
    break;
  case 1:
    nFlag = 0x00000001; /*FRF_DOWN*/
    break;
  case 2:
    nFlag = 0x00100000; /*FRF_UP*/
    break;
}
if (nArgCas == 1)
  nFlag = nFlag + 0x00000004; /* +FRF_MATCHCASE*/
// Lock edit windows
ScrollLock(hWndEdit, true);
SetRedraw(hWndEdit, false);
// Disable word wrap if it enabled
nWordWrap = AkelPad.SendMessage(hWndEdit, 3241 /*AEM_GETWORDWRAP*/, 0, 0);
if (nWordWrap > 0)
  AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);
// Find
if (nArgDel == 0)
{
  // Delete lines:
  if (nFlag > 0x00100000)
    AkelPad.SetSel(0, 0);
  else
  {
    AkelPad.SetSel(nStart, nStart);
    AkelPad.Command(4197 /*IDM_EDIT_DELLINE*/, 1); //Delete current line
  }
  for (;;)
  {
    nResult = AkelPad.TextFind(hWndEdit, pSearchText, nFlag);
    if (nResult != -1)
    {
      AkelPad.SetSel(nResult, nResult);
      AkelPad.Command(4197 /*IDM_EDIT_DELLINE*/, 1);
    }
    else
      break;
  }
}
else
{
  // Clean lines (replace on ""):
  if (nFlag > 0x00100000)
    AkelPad.SetSel(0, 0);
  else
  {
    AkelPad.SetSel(nStart, nStart);
    CleanLine(AkelPad.GetSelStart()); //Clean current line
  }
  for (;;)
  {
    nResult = AkelPad.TextFind(hWndEdit, pSearchText, nFlag);
    if (nResult != -1)
      CleanLine(nResult);
    else
      break;
  }
}
// Enable word wrap if it was enabled
if (nWordWrap > 0)
  AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);
// Restore cursor position
AkelPad.SetSel(nStart, nStart);
// Unlock and redraw edit windows
ScrollLock(hWndEdit, false);
SetRedraw(hWndEdit, true);

//
function CleanLine(nPos)
{
  var nLine       = AkelPad.SendMessage(hWndEdit, 1078 /*EM_EXLINEFROMCHAR*/, 0, nPos);
  var nLineIndex  = AkelPad.SendMessage(hWndEdit, 187 /*EM_LINEINDEX*/, nLine, 0);
  var nLineLength = AkelPad.SendMessage(hWndEdit, 193 /*EM_LINELENGTH*/, AkelPad.GetSelStart(), 0);
  AkelPad.SetSel(nLineIndex, nLineIndex + nLineLength, 0x008 /*AESELT_LOCKSCROLL*/);
  AkelPad.ReplaceSel("");
}

function SetRedraw(hWnd, bRedraw)
{
  AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
  bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}

function ScrollLock(hWnd, bLock)
{
  AkelPad.SendMessage(hWnd, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, bLock);
}
, но теперь возник вопрос: а может, зря и стоит разобраться, как это делает LinesFilter.js (с массивом вроде)? Хотел с AkelPad.TextFind(), чтобы не зависеть от символов, на которых могут споткнуться методы JScript, но не сглупил ли?

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

Post by Kley »

Skif_off
Skif_off wrote:Хотел с AkelPad.TextFind()
Не рекомендую. Если текст достаточно большой (скажем строк 200 000) и искомого текста много - выполнения скрипта не дождетесь.
Один из моих первых (или самый первый?) скрипт на JScript. Вроде из скрипта Andrey_A_A DeletePhrasesInText.vbs и переделанный.

Code: Select all

//  ============================================================================
//  Version: 2016-03-08
//  Author: Kley
//
//  *** Удаление строк содержащих/не содержащих выделенную фразу ***
//
//  Параметры:
//  -toempty=1    -действие со строкой:
//                   0  удаление (по умолчанию);
//                   1  замена на пустую.
//  -nophrase=1   -поиск строк по содержимому:
//                   0  строки с фразой (по умолчанию);
//                   1  строки без фразы.
//  -ignorecase=1 -метод сравнения строк:
//                   0  с учетом регистра (по умолчанию);
//                   1  без учета регистра.
//  -clipboard=1  -фраза (текст для поиска):
//                   0  выделенный текст (по умолчанию);
//                   1  текст из буфера обмена.
//
//  Применение:
//  Заменить строки с фразой из буфера на пустую
//  Call("Scripts::Main", 1, "DeletePhrasesInText.js", "-toempty=1 -clipboard=1 -ignorecase=1")
//  Удалить строки не содержащие фразу (с учетом регистра)
//  Call("Scripts::Main", 1, "DeletePhrasesInText.js", "-nophrase=1")
//
//  Примечание:
//  Поиск и замена ведется во всем тексте
//  ============================================================================
var argClipBoard   = AkelPad.GetArgValue("clipboard", 0);
var argEmptyString = AkelPad.GetArgValue("toempty", 0);
var argNoPhrase    = AkelPad.GetArgValue("nophrase", 0);
var argIgnoreCase  = AkelPad.GetArgValue("ignorecase", 0);

var hWndEdit  = AkelPad.GetEditWnd();
var nSelStart = AkelPad.GetSelStart();
var pEditText = AkelPad.GetTextRange(0, -1);
var aText;
var aNewText  = [];
var pSearchText;
var pCurLine;
var bFaind = false;

if (hWndEdit) {

  pSearchText = (argClipBoard != 0)
              ? AkelPad.GetClipboardText()
              : AkelPad.GetSelText();

  if (pEditText && pSearchText) {

    pSearchText = GetIgnoreCase(pSearchText);
    aText = pEditText.split("\r");

    for (var i = 0; i < aText.length; i++) {

      pCurLine = GetIgnoreCase(aText[i]);

      if (argNoPhrase != 0)
        bFaind = pCurLine.indexOf(pSearchText) == -1;
      else
        bFaind = pCurLine.indexOf(pSearchText) != -1;

      AddInNewArrey(aText[i], bFaind);
    }

    pEditText = aNewText.join("\n");

    SetRedraw(hWndEdit, false);

    AkelPad.SetSel(0, -1);
    AkelPad.ReplaceSel(pEditText);
    //AkelPad.SetSel(nSelStart, nSelStart);

    SetRedraw(hWndEdit, true);
  }
}

function AddInNewArrey(sTxt, bEmpty) {

  if (bEmpty) {

    if (argEmptyString != 0)
      aNewText.push("");
  }
  else
    aNewText.push(sTxt);
}

function GetIgnoreCase(sTxt) {

  return (argIgnoreCase != 0) ? sTxt.toLowerCase() : sTxt;
}

function SetRedraw(hWnd, bRedraw) {

  AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
  if (bRedraw) AkelPad.SystemFunction().Call("user32::InvalidateRect", hWnd, 0, true);
}
Last edited by Kley on Tue Mar 08, 2016 8:44 pm, edited 2 times in total.

Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Skif_off
Похоже надо лишь добавить аргумент в LinesFilter.js для подхвата выделенного теста и ничего дополнительно не надо мудрить.

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

Post by Skif_off »

Kley
VladSh
Спасибо, сглупил, пожалуй, но хотя бы кое-какие знания приобрёл - не совсем бестолково :)
У AkelPad.TextFind() есть преимущество - можно искать не по всему тексту, а ещё вверх и вниз, но сейчас подумал: получить номер текущей строки легко, он же станет и номером ячейки массива. Надо будет прикинуть, а пригодиться ли на самом деле.

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

Post by Skif_off »

Kley
Предлагаю дополнить скрипт:

Code: Select all

...
    ScrollLock(hWndEdit, true);
    SetRedraw(hWndEdit, false);

...
    ScrollLock(hWndEdit, false);
    SetRedraw(hWndEdit, true);
...

function ScrollLock(hWnd, bLock)
{
  AkelPad.SendMessage(hWnd, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, bLock);
}
чтобы окно редактирования не дёргалось.

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

Post by Instructor »

Cuprum wrote:Если проблема в AkelPad.InputBox, можно ли сделать, чтобы раскладка языка не менялась, когда начинаешь вводить текст?
Раскладка программно не меняется (зачем? :)). Элемент управления EDIT стандартный.
Kley wrote:...если его вызвать из какого-нибудь своего диалога, по ошибке, скажем, указав...
Не ошибайтесь.
Locked