Scripts discussion (3)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 202
Joined: Sat Mar 28, 2015 2:36 pm
Location: Russia

Post by Kley »

Skif_off,
спасибо. Скрипт DeletePhrasesInText.js подправил.

Добавлено: смотреть здесь.
Last edited by Kley on Wed Mar 09, 2016 5:02 pm, edited 1 time in total.

Offline
Posts: 96
Joined: Tue Nov 10, 2015 4:56 am

Post by InFive »

Kley wrote:Скрипт DeletePhrasesInText.js подправил.
а у меня почему-то не работает... выполняю команду из примера, данного в скрипте

Code: Select all

Call("Scripts::Main", 1, "DeletePhrasesInText.js", "-ignorecase=1")
на маленьком текстовом документе - скрипт свою работу сделал, но AkelPad вылетел в ошибку что память не получается прочитать и всё, AkelPad только закрыть остается... что опять не так!? может из-за WinXP?

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

Post by Kley »

InFive
Вернул, пока (наверное), все, как было. Попробуйте. Сейчас, вроде, работает.

Skif_off
Простите, не прокатил вариант. Почти постоянное сообщение, особенно на XP:
AppName akelpad.exe AppVer 4.9.7.0 ModName lineboard.dll Offset 000042a4 ModVer 12.4.0.0

Может Instructor подскажет, что к чему.

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

Post by Skif_off »

Kley
Это та ссылка с Version: 2015-01-04 или есть где-то в коллекции? На предыдущей странице вижу только закомментированную строку

Code: Select all

//AkelPad.SetSel(nSelStart, nSelStart);
так стало совсем нехорошо :)

InFive
На WinXP SP2/SP3, 4.9.7 и 4.9.8, оригинальный скрипт Kley (Version: 2015-01-04), дополненный - нет проблем. (У меня английская версия с Russian.dll, но не думаю, что это имеет значение).

P.S.

Code: Select all

//  ============================================================================
//  Version: 2015-01-04
//  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");

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

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

    ScrollLock(hWndEdit, false);
    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);
}

function ScrollLock(hWnd, bLock)
{
  AkelPad.SendMessage(hWnd, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, bLock);
}
: добавлена ScrollLock() и чуть отформатирован код (из эстетических соображений :))

Добавлено:
Ага, спровоцировал: нужно сразу после дёрнуть вниз полосу прокрутки как можно ниже - там, где строк уже нет - валится.

Добавлено:
Если отключить плаг LineBoard - не валится.

Offline
Posts: 96
Joined: Tue Nov 10, 2015 4:56 am

Post by InFive »

Kley wrote:InFive
Вернул, пока (наверное), все, как было. Попробуйте. Сейчас, вроде, работает.
да, вот такой вариант у меня работает...

Skif_off
лично у меня, ваш вариант валит AkelPad, с отключенным плагином да, работает, но я оставил пока вариант Kley, а плагин LineBoard оставил включенным...

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

Post by Kley »

Skif_off wrote:Это та ссылка с Version: 2015-01-04 или есть где-то в коллекции?
Добавил DeletePhrasesInText.js в "Scripts collection".
Может кому понадобится. И путаницы меньше.

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

Post by Skif_off »

Любопытно, подумал, что у AEM_LOCKSCROLL трудности в WinXP (воспроизвёл проблему и с 4.9.6, ниже не пробовал), но в FindReplaceEx.js тоже используется - нет падений.

В Win7 пока оставил (чтобы и не забыть в т.ч.): если
сразу после дёрнуть вниз полосу прокрутки как можно ниже - там, где строк уже нет
постараться до конца документа - выглядит так же, только не валится. Как будто AkelPad слишком долго "убирает" то пространство в конце документа, которое остаётся после удаления строк. И WM_SETREDRAW и AEM_LOCKSCROLL по отдельности не роняют.
В общем, подождём Instructor :)

Offline
Posts: 96
Joined: Tue Nov 10, 2015 4:56 am

Post by InFive »

Skif_off wrote:скрипт Andrey_A_A DeletePhrasesInText.vbs не работает уже несколько версий AkelPad
по моему обращению, Andrey_A обновил свой скрипт DeletePhrasesInText.vbs... кому он нужен, надо обновить вручную этот скрипт по указанной ссылке

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

Post by Skif_off »

InFive
Там необходима регистрация. Здесь всё ещё старая версия.

Offline
Posts: 96
Joined: Tue Nov 10, 2015 4:56 am

Post by InFive »

Skif_off wrote:Там необходима регистрация
ну, это в наше время разве проблема?

Code: Select all

' DeletePhrasesInText.vbs
'========================   Описание   =====================================
' Удаление/замещение строк содержащих/не содержащих фразу в выделенном. А так же добавление к найденным строкам...
' (если ничего не выделено преобразовывается весь текст)
' В диалоговом окне вводится фраза для поиска удаления строк
' При втором параметре =2 выделенное является фразой, строки ищутся во всём тексте
'=======================   Параметры  ======================================
' 1-й параметр:
'      0 - замещение пустой строкой строк содержащих фразу с учётом регистра (по умолчанию)
'      1 - замещение пустой строкой строк содержащих фразу без учёта регистра
'      2 - удаление строк содержащих фразу с учётом регистра
'      3 - удаление строк  содержащих фразу без учёта регистра
'
'      4 - замещение пустой строкой строк НЕ содержащих фразу с учётом регистра
'      5 - замещение пустой строкой строк НЕ содержащих фразу без учёта регистра
'      6 - удаление строк НЕ содержащих фразу с учётом регистра
'      7 - удаление строк НЕ содержащих фразу без учёта регистра
'
'
'      8 - добавление в начало строк содержащих фразу с учётом регистра (по умолчанию)
'      9 - добавление в начало строк строк содержащих фразу без учёта регистра
'    10 - добавление в начало строк строк НЕ содержащих фразу с учётом регистра
'    11 - добавление в начало строк НЕ содержащих фразу без учёта регистра
'        (вставка берётся из условий 3-го параметра)
'
'    12 - добавление в конец строк содержащих фразу с учётом регистра (по умолчанию)
'    13 - добавление в конец строк строк содержащих фразу без учёта регистра
'    14 - добавление в конец строк строк НЕ содержащих фразу с учётом регистра
'    15 - добавление в конец строк НЕ содержащих фразу без учёта регистра
'        (вставка берётся из условий 3-го параметра)
'
'
' 2-й параметр:
'      0 - фраза берётся из буфера
'      1 - фразой является слово под курсором
'      2 - фразой является выделенное
'      3 - фраза вводится в диалоге
'      "фраза" - в параметре прописывается фраза для поиска
'
' 3-й параметр: текст для вставки
'      0 - текст берётся из буфера
'      1 - текст является слово под курсором
'      2 - текст является выделенное
'      3 - текст вводится в диалоге
'      "текст" - в параметре прописывается текст для вставки
'      
'========================   Примеры   ======================================
' -"Замещение строк содержащих выделенную фразу (учитывать регистр)" Call("Scripts::Main", 1, "DeletePhrasesInText.vbs", `0 2`)
' -"Замещение строк содержащих выделенную фразу (без регистра)" Call("Scripts::Main", 1, "DeletePhrasesInText.vbs", `1 2`)
' -"Вставить текст в начало найденных строк, содержащих фразу (фраза и текст вводится диалогах)" Call("Scripts::Main", 1, "DeletePhrasesInText.vbs", `9 3 3`)

' используется Functions.vbs, который следует положить в ...AkelFiles\Plugs\Scripts\Include\

' Автор:           Аверин Андрей
' Версия:          1.8 (07.06.2012 - 10.03.2016)
' Mail:            Averin-And@yandex.ru
' Site:            http://tc-image.3dn.ru/forum/9-494-2010-16-1339069198
'===========================================================================
With AkelPad If .GetEditWnd = 0 Then WScript.Quit
  .Include("Functions.vbs") : Sum = 0 : RG = 0 : A = 0 : S = 1 : V = 0 : Curs = .GetSelStart : Text = .GetSelText : sText = Text
  Cnt = WScript.Arguments.Count
  If Cnt > 0 Then
    RG = CInt(WScript.Arguments(0))
    If Cnt > 1 Then
      P = WScript.Arguments(1) : S = 0
      Select Case P
        Case "0" FStr = .GetClipboardText
        Case "1" FStr = GetWord : Text = ""
        Case "2" FStr = sText : Text = ""
        Case "3" S = 1
        Case Else FStr = P
      End Select
      If Cnt > 2 Then
        P = WScript.Arguments(2)
        Select Case P
          Case "0" sLine = .GetClipboardText
          Case "1" sLine = GetWord : Text = ""
          Case "2" sLine = sText : Text = ""
          Case "3" V = 1
          Case Else sLine = P
        End Select
      End If
    End If
  End If
  Select Case RG
    Case 0, 1 T1 = "Замещение строк" : S1 = "Введите фразу для поиска строк. Пустой строкой" & vb & "будут заменены строки, в которых есть эта фраза."
    Case 4, 5 T1 = "Замещение строк" : S1 = "Введите фразу для поиска строк. Пустой строкой" & vb & "будут заменены строки, в которых нет этой фразы."
    Case 2, 3 T1 = "Удаление строк" : S1 = "Введите фразу для поиска строк." & vb & "Будут удалены строки, в которых есть эта фраза."
    Case 6, 7 T1 = "Удаление строк" : S1 = "Введите фразу для поиска строк." & vb & "Будут удалены строки, в которых нет этой фразы."
    Case 8, 9 T1 = "Вставка в начало строк" : S1 = "Введите фразу для поиска строк. В начало строк, в" & vb & "которых есть эта фраза, будет вставлен заданный текст."
    Case 10, 11 T1 = "Вставка в начало строк" : S1 = "Введите фразу для поиска строк. В начало строк, в" & vb & "которых нет этой фразы, будет вставлен заданный текст."
    Case 12, 13 T1 = "Вставка в конец строк" : S1 = "Введите фразу для поиска строк. В конец строк, в" & vb & "которых есть эта фраза, будет вставлен заданный текст."
    Case 14, 15 T1 = "Вставка в конец строк" : S1 = "Введите фразу для поиска строк. В конец строк, в" & vb & "которых нет этой фразы, будет вставлен заданный текст."
  End Select
  
  SetRedraw .GetEditWnd, False
  If Len(Text) = 0 Then : Text = .GetTextRange(0, -1) : A = 1  : End If
  If Len(Text) = 0 Then EndRedraw

  If S = 1 Then
    FStr = .InputBox(.GetMainWnd, T1, S1, "фраза")
    If IsEmpty(FStr) Then EndRedraw
  End If
  If Len(FStr) = 0 Then EndRedraw
  
  If V = 1 Then
    sLine = .InputBox(.GetMainWnd, T1, "Введите текст для вставки в найденные строки", "текст")
    If IsEmpty(sLine) Then EndRedraw
  End If
  If Cnt > 2 And Len(sLine) = 0 Then EndRedraw
  
  If A = 1 Then cmd 4157

  Txt = Split(Text, Chr(13)) : Txt2 = Txt
  Select Case RG : Case 1, 3, 5, 7, 9, 11, 13, 15 Txt2 = Split(LCase(Text), Chr(13)) : FStr = LCase(FStr) : End Select
  C = Ubound(Txt)
  For k = 0 To C
    Select Case RG
      Case 0, 1, 2, 3
        If InStr(Txt2(k), FStr) = 0 Then
          T = T & Txt(k) : If k <> C Then T = T & vb
        Else
          If (RG = 0 Or RG = 1) And k <> C Then T = T & vb
        End If
      Case 4, 5, 6, 7
        If InStr(Txt2(k), FStr) > 0 Then
          T = T & Txt(k) : If k <> C Then T = T & vb
        Else
          If (RG = 4 Or RG = 5) And k <> C Then T = T & vb
        End If
      Case 8, 9
        If InStr(Txt2(k), FStr) > 0 Then T = T & sLine & Txt(k) Else T = T & Txt(k) End If
        If k <> C Then T = T & vb
      Case 10,11
        If InStr(Txt2(k), FStr) = 0 Then T = T & sLine & Txt(k) Else T = T & Txt(k) End If
        If k <> C Then T = T & vb
      Case 12,13
        If InStr(Txt2(k), FStr) > 0 Then T = T & Txt(k) & sLine Else T = T & Txt(k) End If
        If k <> C Then T = T & vb
      Case 14,15
        If InStr(Txt2(k), FStr) = 0 Then T = T & Txt(k) & sLine Else T = T & Txt(k) End If
        If k <> C Then T = T & vb
    End Select
  Next
  .SendMessage .GetEditWnd, 3185, 3, True
  .ReplaceSel T : .SetSel Curs, Curs
  SaveEditFile : EndRedraw
End With

Offline
Posts: 382
Joined: Wed Sep 28, 2011 3:05 pm

Post by Cuprum »

Instructor
Раскладка программно не меняется (зачем? Smile). Элемент управления EDIT стандартный.
Понятно. Значит, у меня какой-то особый случай :?

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

Post by KDJ »

TextReplace_function.js
In ReplaceWith function added to array of parameters:
n2 - offset of first character matched text,
n3 - offset of last character matched text + 1.

TextReplace.js
Added:
- templates,
- context menu in edit controls What and With.

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

Post by YuS »

KDJ wrote: TextReplace.js
Added:
- templates,
- context menu in edit controls What and With.

Code: Select all

  else if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1049) //Russian
  {
    ...
    sTxtUndo         = "От&менить";				//New
    sTxtRedo         = "&Повторить";				//New
    sTxtCut          = "&Вырезать";				//New
    sTxtCopy         = "&Копировать";				//New
    sTxtPaste        = "В&ставить";				//New
    sTxtDelete       = "&Удалить";				//New
    sTxtSelAll       = "Вы&делить всё";				//New
    sTxtAPFont       = "Шрифт AkelPad";				//New
    sTxtWrap         = "Перенос строк";				//New
    sTxtTemplates    = "&Шаблоны";				//New
    sTxtClose        = "Закрыть";
    sTxtOK           = "OK";
    sTxtCancel       = "Отмена";				//New
    sTxtAdd          = "Добавить";				//New
    sTxtRename       = "Переименовать";				//New
    sTxtMoveUp       = "Вверх";				//New
    sTxtMoveDown     = "Вниз";				//New
    sTxtRemove       = "Удалить";				//New
    sTxtName         = "Имя:";				//New
    ...
  }

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

Post by KDJ »

TextReplace.js
Updated Russian translation by YuS.
Added ability to undo in edit controls (What and With) after setting text from template.

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

Post by KDJ »

TextReplace.js
Added: ability to set height of edit windows (What, With) by dragging bottom edge.
Locked