поиск и замена

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

Post by YuS »

VladSh wrote: Что надо найти? И т.д. по теме.
Любые удвоения ">>", кроме:

Code: Select all

<p>> какой-либо текст </p>
Во всех остальных случаях удвоенный ">>" считать за ошибку.
Я бы сделал так:

Code: Select all

/<([^>]+)>>+[^<]*<[^/]?\1>/gmi

Code: Select all

<tag>> трам-пам-пам</tag>
<tag>>tram/pam\pam <tag><tag>>>>>tram/pam\pam <tag>
<p>>текст</p><PRODUCT>
  <TITLE>> Product #1 </TITLE>
</PRODUCT><PRODUCT>
  <TITLE>> Product #1 </TITLE>
  <SORT>
      <tag>>>
          >>tram/pam\pam 
      <tag>
      <COLOR> red </COLOR>
      <PRICE> $10.00 </PRICE>
  </SORT>
</PRODUCT>


Возможно, ещё надо добавить проверку на пробельные символы внутри тегов...

Добавлено:
Хотя... тут ведь, необходимо обратное действие, т.е. надо найти валидную комбинацию? Если да, тогда получится, что-то вроде этого:

Code: Select all

/<([^>]+)>>+[^<]*<\/\1>/gmi

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

Post by YuS »

VladSh wrote:Ребята, помогите пожалуйста доделать регулярку для search.
Надо найти первое вхождение:
>>текст<*
где, * - любой символ кроме слэша,
т.е. пропускать:
>>текст</
Пробую так:

Code: Select all

>>(?=\w|\W|\s<[^/])
>>(?=\w|\W|\s<?!/)
Но почему-то захватывается 1-я строка из строк для проверки:
<tag >> трам-пам-пам</tag>
<tag>>tram/pam\pam <tag>
Кстати, покопался в XMLValidator.js ...
Вообще, регэкспы не совсем ведь подходят для разбора подобных структур... или тут всё именно буквально необходимо понимать? Т.е. вот это:
>>текст</
должно быть без вложенных тегов, т.е. валидное выражение и если есть таки вложенные теги, то выдаем ошибку, т.е. выражение невалидное? Если так, то можно вместо:

Code: Select all

filepos = text.search(/>>.*<[^\/]/);
использовать:

Code: Select all

filepos = AkelPad.TextFind(0, "<([^>\\s]++)\\s*\\K>>++(?![^<]*+</\\1)", 0x00280001);

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

Post by VladSh »

YuS

Да, мне
FeyFre wrote:Так, вспоминаю вашу задачу: найти
>>текст<#
# любой символ кроме /
Так? Т.е нужно найти ">>" + "текст"+"<", только и только если после них не стоит "/", да? Т.е. если "/" стоит - то все три токена тоже считаются неподходящими, и ищем дальше?
Регулярка, которую я предложил: >>.*<[^\/]
Ставим себя на место регулярок, смотрим интересующее: <TITLE>> Product #1 </TITLE>
Тут всё правильно.
Нашел токен №1 >>
Токен №2 Product #1
Токен №3 <
Дальше смотрим следующий символ, который должен быть не / ( [^\/]): опана / - условие не выполняется, ищем дальше. И тут облом, и вот почему:
Мешает вам(и мне) с ходу понять тот ублюдочный факт что "." - захватывает всё кроме переноса строки(+нужно поставить опцию m регулярке - у вас не стоит, потому парсер закругляется). Правильная регулярка (с переносами) будет такой: />>[\s\S]*<[^\/]/m
И вот что она поймает в примере
<PRODUCT>
<TITLE>> Product #1 </TITLE>
<SORT>
<COLOR> red </COLOR>
<PRICE> $10.00 </PRICE>
</SORT>
</PRODUCT>
Но я так понял, это не совсем то чего хотели?..


Поэтому Ваша последняя регулярка

Code: Select all

filepos = AkelPad.TextFind(0, "<([^>\\s]++)\\s*\\K>>++(?![^<]*+</\\1)", 0x00280001);
работает правильно!

Единственное - она выделяет вхождение ">>", чего ненужно, т.к. курсор д.б. установлен согласно тем данным о номере строки и позиции, которые передаются в панель Log'а. Это критично при задании в аргументах скрипта `-keep=1`. Т.е. должна быть консистентность во всех случаях работы скрипта.

Можно ли как-то переделать этот вызов, чтобы с курсором и выделением ничего не происходило, а только возвращался номер позиции? Я пытался понять, что за флаги передаются в TextFind (думал, что может быть можно как-то отключить переброску курсора и установку выделения), но... безуспешно)), т.к. не нашёл таких флагов в документации к функции.

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

Post by YuS »

VladSh wrote: Единственное - она выделяет вхождение ">>", чего ненужно, т.к. курсор д.б. установлен согласно тем данным о номере строки и позиции, которые передаются в панель Log'а. Это критично при задании в аргументах скрипта `-keep=1`. Т.е. должна быть консистентность во всех случаях работы скрипта.
Можно ли как-то переделать этот вызов, чтобы с курсором и выделением ничего не происходило, а только возвращался номер позиции?
Хмм, вобще-то она не должна ничего выделять в таком виде, ибо:
Scripts-Rus.txt wrote:Возвращаемое значение
Число. Позиция найденного текста.
Если ничего не найдено, возвращаемое значение –1.
Если синтаксическая ошибка в регулярном выражении (с флагом FRF_REGEXP), возвращаемое значение (–100 - СмещениеШаблона).
Например, pFindIt равен "ab[c", синтаксическая ошибка в третьем символе, возвращаемое значение –102.
И у меня, действительно, не выделяет. Эта строка в Вашем скрипте даёт такой результат:

Code: Select all

Call("Scripts::Main", 1, "XMLValidator.js", `-msgOpts=1 -parse2gt=1`)
Image

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

Post by VladSh »

YuS
При `-keep=0` или без параметра там работает код:

Code: Select all

if (!bKeep)
   AkelPad.SetSel(filepos, filepos);
который после выделения, которое делает AkelPad.TextFind, ставит курсор куда нужно.

Для чистоты эксперимента (чтобы не влиял параметр `-keep=?`) попробуйте закоментировать вышеуказанные строки. В таком варианте использования больше ничего не может установить выделение, только AkelPad.TextFind.

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

Post by YuS »

VladSh wrote:YuS
При `-keep=0` или без параметра там работает код:

Code: Select all

if (!bKeep)
   AkelPad.SetSel(filepos, filepos);
который после выделения, которое делает AkelPad.TextFind, ставит курсор куда нужно.
Там, имхо, не хватает строки присваивания значения из параметра переменной bKeep. Т.е. я взял код XMLValidator.js, но в нем, в том самом месте, о котором идет речь, bKeep всегда false, поэтому при использовании параметра у меня он и не работал.
VladSh wrote: Для чистоты эксперимента (чтобы не влиял параметр `-keep=?`) попробуйте закоментировать вышеуказанные строки. В таком варианте использования больше ничего не может установить выделение, только AkelPad.TextFind.
Да, именно он. Но ведь, это и правильно. Мы указываем функции регэкспом, что необходимо найти - получаем найденный текст со значением начала и конца выделения... вроде логично, да и не представляю как это можно сделать по-другому.

Что-то я не совсем понимаю, в чем именно загвоздка?
Выделение можно снять, позицию начала или конца получить тоже можем... т.е. процессом можно управлять.

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

Post by VladSh »

YuS wrote:в том самом месте, о котором идет речь, bKeep всегда false, поэтому при использовании параметра у меня он и не работал.
Не, там всё правильно) bKeep имеет смысл, а соответственно и присваивается, только когда есть выделение.
YuS wrote:Выделение можно снять, позицию начала или конца получить тоже можем... т.е. процессом можно управлять.
Неудобно, хотелось бы не нарушать однообразность, которая есть в коде. Придётся восстанавливать выделение с помощью SetSel, а это моргание, значит надо тянуть SETREDRAW.., чего также не хотелось бы.

Есть ли возможность как-то, может быть флагами, задать методу AkelPad.TextFind не выделять найденную строку?
Добавлено: по видимому, что нет. А так был бы идеальный метод, которым можно было бы заменить все регулярки с search.

Если нет, то можно ли сделать это на обычных регулярках, с помощью search?

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

Post by YuS »

VladSh wrote:
YuS wrote:в том самом месте, о котором идет речь, bKeep всегда false, поэтому при использовании параметра у меня он и не работал.
Не, там всё правильно) bKeep имеет смысл, а соответственно и присваивается, только когда есть выделение.
Хмм, наверное, я чего-то недопонял...
Для проверки добавляю перед:

Code: Select all

if (!bKeep)
  AkelPad.SetSel(filepos, filepos);
вот такую строку:

Code: Select all

output("Это переменная bKeep = " + bKeep + "\n")
запускаю с разными значениями keep и без него:

Code: Select all

Call("Scripts::Main", 1, "XMLValidator.js", `-append=2 -keep=1 -msgOpts=1 -parse2gt=1`)
результат:
bKeep всегда false

Инициализация и получение параметра в переменную, происходит в одном месте, вот тут:

Code: Select all

var text = AkelPad.GetSelText(); 
var selection;
var bKeep = false; 
if (!text) { 
   ...
} else { 
   ... 
   bKeep = AkelPad.GetArgValue("keep", 0); 
   ... 
}
- если на момент входа в этот условный блок, переменная text пустая, т.е. никакого выбранного текста нет (а я ничего и не выделяю, просто запускаю скрипт на редактируемом документе), то, соответственно, и значение bKeep остается тем, которое переменная получила при инициализации...

VladSh wrote: Есть ли возможность как-то, может быть флагами, задать методу AkelPad.TextFind не выделять найденную строку?
Добавлено: по видимому, что нет. А так был бы идеальный метод, которым можно было бы заменить все регулярки с search.

Если нет, то можно ли сделать это на обычных регулярках, с помощью search?
1. Тут нужно просить Instructor-а, чтобы добавил функциональности во флагах...
2. С помощью search, регэкспы ограничены правилами синтаксиса, т.е. \K и lookbehind мы не получим...

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

Post by YuS »

VladSh wrote:Придётся восстанавливать выделение с помощью SetSel, а это моргание, значит надо тянуть SETREDRAW.., чего также не хотелось бы.
Перечитал ещё раз сообщение и дошло таки о чем речь. :)
Восстановить ведь легко, тем более, там всё есть для этого. Надо добавить перед:

Code: Select all

output(extInfo + "XML parsing error:\r(" + linenum + "," + linepos + ")\t\t'>>' was found.", 48 /*MB_ICONEXCLAMATION*/);
вот это:

Code: Select all

         if (selection) {
         	if (bKeep)
         		AkelPad.SetSel(npStart,npEnd);
         }
А лучше там же вместо:

Code: Select all

         if (!bKeep)
            AkelPad.SetSel(filepos, filepos);
добавить вот это:

Code: Select all

         if (bKeep) {
         	if (selection)
         		AkelPad.SetSel(npStart,npEnd);
         } else {
         	AkelPad.SetSel(filepos, filepos);
         }
А на счет моргания - пусть себе моргает, ничего страшного в этом нет ведь...

Добавлено:
Кстати, если присутствуют манипуляции с выделением, то и поиск ошибки должен происходить только в нём, если оно есть? Если да, то вместо:

Code: Select all

		filepos = AkelPad.TextFind(hWndEdit, "<([^>\\s]++)\\s*\\K>>++(?![^<]*+</\\1)", 0x00280001);
необходимо добавить условный блок:

Code: Select all

	if (selection) {
		filepos = AkelPad.TextFind(hWndEdit, "<([^>\\s]++)\\s*\\K>>++(?![^<]*+</\\1)", 0x00680001);
	} else {
		filepos = AkelPad.TextFind(hWndEdit, "<([^>\\s]++)\\s*\\K>>++(?![^<]*+</\\1)", 0x00280001);
	}

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

Post by VladSh »

YuS
Да, это всё элементарно) Просто хотелось бы обойтись... Но если нет, то нет.
Просто FeyFre и так не хотел добавлять эти костыли с ">>", а тут ещё это геморрой) Так что в таком варианте перспективы уже даже не туманны...

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

Post by KDJ »

VladSh wrote:Есть ли возможность как-то, может быть флагами, задать методу AkelPad.TextFind не выделять найденную строку?
Добавлено: по видимому, что нет. А так был бы идеальный метод, которым можно было бы заменить все регулярки с search.
Use AEM_FINDTEXTW message to find text without its selection.

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

Post by VladSh »

KDJ
Спасибо! Но... для меня сложновато, - надо долго разбираться(

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

Post by KDJ »

VladSh

Code: Select all

var aFind = [];

if (FindText(0, "\\w+", 0x00080001 /*FRF_REGEXP|FRF_DOWN*/, aFind))
  WScript.Echo("Found text:\t" + AkelPad.GetTextRange(aFind[0], aFind[1]) + "\nBegin (offset):\t" + aFind[0] + "\nEnd (offset):\t" + aFind[1]);
else
{
  if (aFind[0])
    WScript.Echo("Error in regular expression at position: " + (aFind[0] - 1));
  else
    WScript.Echo("Not found!");
}

function FindText(hEditWnd, sFindIt, nFlags, aFind)
{
  var nAEFR  = 0x00200000 /*AEFR_REGEXPMINMATCH*/;
  var lpText = AkelPad.MemAlloc((sFindIt.length + 1) * 2);
  var lpFind = AkelPad.MemAlloc(_X64 ? 136 : 68 /*sizeof(AEFINDTEXTW)*/);
  var nAEGI1;
  var nAEGI2;
  var bFound;

  if (! hEditWnd)
    hEditWnd = AkelPad.GetEditWnd();

  aFind.length = 0;

  if ((nFlags & 0x00000001 /*FRF_DOWN*/) || (nFlags & 0x00200000 /*FRF_BEGINNING*/) || (nFlags & 0x00400000 /*FRF_SELECTION*/))
    nAEFR |= 0x00000001 /*AEFR_DOWN*/;
  if (nFlags & 0x00000002 /*FRF_WHOLEWORD*/)
    nAEFR |= 0x00000002 /*AEFR_WHOLEWORD*/;
  if (nFlags & 0x00000004 /*FRF_MATCHCASE*/)
    nAEFR |= 0x00000004 /*AEFR_MATCHCASE*/;
  if (nFlags & 0x00040000 /*FRF_REGEXPNONEWLINEDOT*/)
    nAEFR |= 0x00100000 /*AEFR_REGEXPNONEWLINEDOT*/;
  if (nFlags & 0x00080000 /*FRF_REGEXP*/)
    nAEFR |= 0x00080000 /*AEFR_REGEXP*/;

  if (nFlags & 0x00200000 /*FRF_BEGINNING*/)
  {
    nAEGI1 = 1 /*AEGI_FIRSTCHAR*/;
    nAEGI2 = 2 /*AEGI_LASTCHAR*/;
  }
  else if (nFlags & 0x00400000 /*FRF_SELECTION*/)
  {
    nAEGI1 = 3 /*AEGI_FIRSTSELCHAR*/;
    nAEGI2 = 4 /*AEGI_LASTSELCHAR*/;
  }
  else if (nFlags & 0x00000001 /*FRF_DOWN*/)
  {
    nAEGI1 = 5 /*AEGI_CARETCHAR*/;
    nAEGI2 = 2 /*AEGI_LASTCHAR*/;
  }
  else //(nFlags & FRF_UP)
  {
    nAEGI1 = 1 /*AEGI_FIRSTCHAR*/;
    nAEGI2 = 5 /*AEGI_CARETCHAR*/;
  }

  AkelPad.MemCopy(lpText, sFindIt, 1 /*DT_UNICODE*/);
  AkelPad.MemCopy(lpFind /*dwFlags*/, nAEFR, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpFind, _X64 ?  8 :  4) /**pText*/, lpText, 2 /*DT_QWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpFind, _X64 ? 16 :  8) /*dwTextLen*/, sFindIt.length, 2 /*DT_QWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpFind, _X64 ? 24 : 12) /*nNewLine*/, 3 /*AELB_ASIS*/, 3 /*DT_DWORD*/);

  AkelPad.SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, nAEGI1, _PtrAdd(lpFind, _X64 ?  32 : 16) /*crSearch.ciMin*/);
  AkelPad.SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, nAEGI2, _PtrAdd(lpFind, _X64 ?  56 : 28) /*crSearch.ciMax*/);

  if (bFound = AkelPad.SendMessage(hEditWnd, 3041 /*AEM_FINDTEXTW*/, 0, lpFind))
  {
    aFind[0] = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, _PtrAdd(lpFind, _X64 ?  80 : 40) /*crFound.ciMin*/);
    aFind[1] = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, _PtrAdd(lpFind, _X64 ? 104 : 52) /*crFound.ciMax*/);
  }
  else
    aFind[0] = AkelPad.MemRead(_PtrAdd(lpFind, _X64 ? 128 : 64) /*nCompileErrorOffset*/, 2 /*DT_QWORD*/);

  AkelPad.MemFree(lpText);
  AkelPad.MemFree(lpFind);

  return bFound;
}

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

Post by YuS »

KDJ wrote: FindText_function.js
Отлично! Как раз то, что было нужно... Спасибо за помощь!
Лично мне, для полного понимания и возможности написать что-то подобное, ещё много чего необходимо изучить... :)
VladSh wrote: Так что в таком варианте перспективы уже даже не туманны...
Ну, вот и туман рассеялся. И не надо Инструктора отвлекать, можно обойтись тем, что уже работает.
Немного адаптировать функцию и будет работать так, как и требовалось.

Добавлено:

Code: Select all

///Validates selected XML fragment or whole document, pointing potential error place
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=15256#p15256
// https://github.com/FeyFre/akelpad-customisations/blob/scripts/XMLValidator.js
// Version: ???
// Version: 2.0 (2016.02.28) by VladSh
// Version: 1.9 (2016.02.24) by Skif_off
// Version: 1.8 (2015.04.10) by VladSh
// Version: 1.7 (2014.12.01) by VladSh
// Version: 1.6 (2012.10.24) by VladSh
// Version: 1.0 (2011.10.25) (c) Panych Y.W. aka FeyFre
//
// Arguments:
//   validate:
//      • [true | без параметра] - производить проверку синтаксиса xml и валидацию согласно схеме;
//      • false - только проверку правильности структуры xml
//   parse2gt:
//      • [false | без параметра] - не производить проверку удвоенного символа '>'
//      • true - производить
//   keep:
//      • [0 | без параметра] - не сохранять исходное выделение, устанавливая курсор в место ошибки
//      • 1 - сохранять исходное выделение; если выделения нет, то курсор также будет установлен в место ошибки
//   msgOpts - параметры вывода сообщений:
//      • [0 | без параметра] - в диалоговое окно;
//      • перечень кодов сообщений через запятую, которые выводить в панели вывода Log-плагина:
//         1 - все сообщения/ошибки;
//         16 - критическая ошибка xml-парсера;
//         48 - ошибка xml-синтаксиса (можно выводить только её, т.к. можно переходить на место ошибки);
//         64 - сообщение об успешно пройденной валидации
//   append - параметры вывода в панель Log-плагина:
//      • [0 | без параметра] - очищать содержимое панели перед записью
//      • 1, 2 - не очищать (см. Log-Rus.txt -> вызов с кодом 4 -> параметр "APPEND")
//   lClose - параметры закрытия панели Log-плагина (при msgOpts=1 игнорируется):
//      • [0 | без параметра] - не закрывать (в панели может остаться нужный текст, в т.ч. и от других вкладок программы);
//      • 1 - закрывать только при успешно пройденной валидации;
//      • 2 - закрывать всегда (только при msgOpts=0)
//
// Examples:
//    Call("Scripts::Main", 1, "XMLValidator.js")               - вывод в обычное диалоговое сообщение
//    Call("Scripts::Main", 1, "XMLValidator.js", `-msgOpts=1`) - вывод всех сообщений в панель Log-плагина
//    Call("Scripts::Main", 1, "XMLValidator.js", `-msgOpts=48 -lClose=1`) - вывод в панель Log-плагина только сообщений об ошибках xml-синтаксиса с закрытием панели при успешно пройденной валидации
//    Call("Scripts::Main", 1, "XMLValidator.js", `-msgOpts=48 -append=1`) - вывод в панель Log-плагина только сообщений об ошибках xml-синтаксиса с добавлением их к уже существующим в панели сообщениям

var hWndEdit = AkelPad.GetEditWnd();
var parserName = "msxml2.DOMDocument";
var xml = new ActiveXObject(parserName);
try {
   xml.async = false;
   xml.validateOnParse = AkelPad.GetArgValue("validate", true);
   xml.resolveExternals = false;
} catch (e) {
   output("Internal parser " + parserName + " error: " + e.description, 16 /*MB_ICONSTOP*/);
}

var text = AkelPad.GetSelText();
var selection;
var bKeep = false;

if (!text) {
   text = AkelPad.GetTextRange(0, -1);
   selection = false;
} else {
   selection = true;
   var npStart = AkelPad.GetSelStart();
   var npEnd = AkelPad.GetSelEnd();
   bKeep = AkelPad.GetArgValue("keep", 0);
   var npMin = Math.min(AkelPad.GetSelStart(), AkelPad.GetSelEnd());
}
var filepos, linepos, oLine;
var linenum = 0;

var t = new Date();
var extInfo = t.toLocaleTimeString() + " " + (AkelPad.GetEditFile(0) || "*") + " -> ";
var aFind = [];

xml.loadXML(text);
if (xml.parseError.errorCode !== 0) {
   var err = xml.parseError;
   linepos = err.linepos;
   if (selection) {
      filepos = npMin + err.filepos;
      oLine = getLogLine(filepos);
      linenum = oLine.linenum;
   }
   else {
      linenum = err.line;
      filepos = err.filepos;
   }
   if (!bKeep)
      AkelPad.SetSel(filepos, filepos);
   output(extInfo + "XML validation error:\r(" + linenum + "," + linepos + ")\t\t" + err.reason, 48 /*MB_ICONEXCLAMATION*/);

} else {
   if (AkelPad.GetArgValue("parse2gt", false)) {
		if (FindText(0, "<([^>\\s]++)\\s*\\K>>++(?![^<]*+</\\1)", selection ? 0x00480001 : 0x00280001 /*FRF_SELECTION|FRF_BEGINNING|FRF_REGEXP|FRF_DOWN*/, aFind)) {
			filepos = aFind[0];
		} else {
		if (aFind[0])
			WScript.Echo("Error in regular expression at position: " + (aFind[0] - 1));
//		else
//			WScript.Echo("Not found!");
		}
      if (filepos >= 0) {
         filepos += 1;
//         if (selection)
//            filepos = npMin + filepos;
         oLine = getLogLine(filepos);
         linenum = oLine.linenum;
         linepos = filepos - oLine.startpos;
         if (!bKeep)
            AkelPad.SetSel(filepos, filepos);
         output(extInfo + "XML parsing error:\r(" + linenum + "," + linepos + ")\t\t'>>' was found.", 48 /*MB_ICONEXCLAMATION*/);
      }
   }
   output(extInfo + "XML fragment is valid.\r", 64 /*MB_ICONINFORMATION*/);
}

function output(msg, nIcon /*MB_ICON...*/) {
   var slog = AkelPad.GetArgValue("msgOpts", "0");
   if (slog == "1" || (slog != "0" && slog.indexOf(nIcon.toString()) != -1)) {
      var fLogOutput = "Log::Output";
      if (AkelPad.Call(fLogOutput, 1, "", "", "^\\((\\d+),(\\d+)\\)", "/GOTOLINE=\\1:\\2") != -1) {
         var nAppend = AkelPad.GetArgValue("append", 0);
         AkelPad.Call(fLogOutput, 4, msg, -1, nAppend);
      }
   } else {
      var lClose = AkelPad.GetArgValue("lClose", 0);
      if ((lClose == 1 && nIcon == 64) || lClose == 2)
         AkelPad.Call("Log::Output", 6);
      AkelPad.MessageBox(hWndEdit, msg, WScript.ScriptName, nIcon);
   }
   WScript.Quit();
}

// Function returns a LineObject for Log-panel
function getLogLine(filepos) {
   var wrpLine = AkelPad.SendMessage(hWndEdit, 1078 /*EM_EXLINEFROMCHAR*/, 0, filepos);
   var start = AkelPad.SendMessage(hWndEdit, 187 /*EM_LINEINDEX*/, wrpLine, 0);
   var unwrpLine = AkelPad.SendMessage(hWndEdit, 3143 /*AEM_GETUNWRAPLINE*/, wrpLine, 0);
   return {
      linenum: unwrpLine + 1,
      startpos: start - 1
   };
}

function FindText(hEditWnd, sFindIt, nFlags, aFind)
{
  var nAEFR  = 0x00200000 /*AEFR_REGEXPMINMATCH*/;
  var lpText = AkelPad.MemAlloc((sFindIt.length + 1) * 2);
  var lpFind = AkelPad.MemAlloc(_X64 ? 136 : 68 /*sizeof(AEFINDTEXTW)*/);
  var nAEGI1;
  var nAEGI2;
  var bFound;

  if (! hEditWnd)
    hEditWnd = AkelPad.GetEditWnd();

  aFind.length = 0;

  if ((nFlags & 0x00000001 /*FRF_DOWN*/) || (nFlags & 0x00200000 /*FRF_BEGINNING*/) || (nFlags & 0x00400000 /*FRF_SELECTION*/))
    nAEFR |= 0x00000001 /*AEFR_DOWN*/;
  if (nFlags & 0x00000002 /*FRF_WHOLEWORD*/)
    nAEFR |= 0x00000002 /*AEFR_WHOLEWORD*/;
  if (nFlags & 0x00000004 /*FRF_MATCHCASE*/)
    nAEFR |= 0x00000004 /*AEFR_MATCHCASE*/;
  if (nFlags & 0x00040000 /*FRF_REGEXPNONEWLINEDOT*/)
    nAEFR |= 0x00100000 /*AEFR_REGEXPNONEWLINEDOT*/;
  if (nFlags & 0x00080000 /*FRF_REGEXP*/)
    nAEFR |= 0x00080000 /*AEFR_REGEXP*/;

  if (nFlags & 0x00200000 /*FRF_BEGINNING*/)
  {
    nAEGI1 = 1 /*AEGI_FIRSTCHAR*/;
    nAEGI2 = 2 /*AEGI_LASTCHAR*/;
  }
  else if (nFlags & 0x00400000 /*FRF_SELECTION*/)
  {
    nAEGI1 = 3 /*AEGI_FIRSTSELCHAR*/;
    nAEGI2 = 4 /*AEGI_LASTSELCHAR*/;
  }
  else if (nFlags & 0x00000001 /*FRF_DOWN*/)
  {
    nAEGI1 = 5 /*AEGI_CARETCHAR*/;
    nAEGI2 = 2 /*AEGI_LASTCHAR*/;
  }
  else //(nFlags & FRF_UP)
  {
    nAEGI1 = 1 /*AEGI_FIRSTCHAR*/;
    nAEGI2 = 5 /*AEGI_CARETCHAR*/;
  }

  AkelPad.MemCopy(lpText, sFindIt, 1 /*DT_UNICODE*/);
  AkelPad.MemCopy(lpFind /*dwFlags*/, nAEFR, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpFind, _X64 ?  8 :  4) /**pText*/, lpText, 2 /*DT_QWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpFind, _X64 ? 16 :  8) /*dwTextLen*/, sFindIt.length, 2 /*DT_QWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpFind, _X64 ? 24 : 12) /*nNewLine*/, 3 /*AELB_ASIS*/, 3 /*DT_DWORD*/);

  AkelPad.SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, nAEGI1, _PtrAdd(lpFind, _X64 ?  32 : 16) /*crSearch.ciMin*/);
  AkelPad.SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, nAEGI2, _PtrAdd(lpFind, _X64 ?  56 : 28) /*crSearch.ciMax*/);

  if (bFound = AkelPad.SendMessage(hEditWnd, 3041 /*AEM_FINDTEXTW*/, 0, lpFind))
  {
    aFind[0] = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, _PtrAdd(lpFind, _X64 ?  80 : 40) /*crFound.ciMin*/);
    aFind[1] = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, _PtrAdd(lpFind, _X64 ? 104 : 52) /*crFound.ciMax*/);
  }
  else
    aFind[0] = AkelPad.MemRead(_PtrAdd(lpFind, _X64 ? 128 : 64) /*nCompileErrorOffset*/, 2 /*DT_QWORD*/);

  AkelPad.MemFree(lpText);
  AkelPad.MemFree(lpFind);

  return bFound;
}


Копирайты не корректировал... функция поиска текста без выделения украд... ( :) ) , скопирована (если, конечно, автор не будет против) из TextFind_function.js от KDJ

Offline
Posts: 1
Joined: Mon Oct 10, 2016 1:43 am

Post by darkvoland »

Будьте добры, подскажите, как написать условия для рандомной автозамены слов.

В тексте есть слово "SLOVO"
его надо рандомно заменить при прогоне на слова:
слово_01, слово_02, слово_03

Можно и не рандомно, а по порядку списка вышеуказанного.

Заранее большое спасибо!
Post Reply