Scripts discussion (1)

Discuss and announce AkelPad plugins
  • Author
  • Message
Offline
Posts: 124
Joined: Tue Jun 03, 2008 10:32 pm

Post by Xephon »

AkelPad 4.0.0 Final
Scripts plugin v3.5

Upd: Заметил, что такое происходит, если конец файла находится в пределах экрана. Тогда после замены виден значек конца файла, после которого идут удаленные фантомные строки и старый значек конца файла.
Если конец файла за экраном, то все нормально.

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

Post by Instructor »

Ясно. В функции SetRedraw необходимо

Code: Select all

oFunction.AddParameter(false);
заменить на

Code: Select all

oFunction.AddParameter(true);

Offline
Posts: 124
Joined: Tue Jun 03, 2008 10:32 pm

Post by Xephon »

Спасибо, заработало как надо.

Скажите, а есть ли в планах, хотя бы отдаленных, появление регулярных выражений в стандартных диалогах?

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

Post by Instructor »

Xephon wrote:Подскажите, а есть ли возможность при замене с помощью регулярных выражений проводить замену на табуляцию или символ новой строки? При подстановке \t в строку замены, замена происходит непосредственно на "\t", а не на табуляцию.
В новой версии SearchReplace.js вы можете для этого раскомментировать:

Code: Select all

pReplaceWithEsc=pReplaceWithEsc.replace(/(?:\\r\\n|\\r|\\n)/g, "\r");
pReplaceWithEsc=pReplaceWithEsc.replace(/\\t/g, "\t");

Offline
Posts: 124
Joined: Tue Jun 03, 2008 10:32 pm

Post by Xephon »

Большое спасибо, очень полезное обновление.
Еще одно пожелание по поводу диалога SearchReplace, думаю его реализация была бы полезно всем, кто часто пользуется регулярными выражениями: хотелось бы сохранять 10 последних использованных вариантов, как это сделано в диалоге обычной замены.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor wrote:В новой версии SearchReplace.js вы можете для этого раскомментировать:

Code: Select all

pReplaceWithEsc=pReplaceWithEsc.replace(/(?:\\r\\n|\\r|\\n)/g, "\r");
pReplaceWithEsc=pReplaceWithEsc.replace(/\\t/g, "\t");
Гм, по-моему, лучше вот так:

Code: Select all

pReplaceWithEsc=pReplaceWithEsc.replace(/(^|[^\\])(?:\\r\\n|\\r|\\n)/g, "$1\r");
pReplaceWithEsc=pReplaceWithEsc.replace(/(^|[^\\])\\t/g, "$1\t");
pReplaceWithEsc=pReplaceWithEsc.replace(/\\(\\[rnt])/g, "$1");
– тогда можно будет использовать «\\n» для получения «\n» и «\n» для перевода строки.

P.S. И не проще ли делать, например, так:

Code: Select all

function addParameters() {
	for(var i = 0; i < arguments.length; i++)
		oFunction.AddParameter(arguments[i]);
}

//Create dialog
AkelPad.MemCopy(lpBuffer, pScriptName, DT_ANSI);
addParameters(
	0,
	lpBuffer,
	0,
	0x90CA0000,      //WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX
	0,
	0,
	392,
	223,
	hMainWnd,
	0,               //ID
	hInstanceDLL,
	DialogCallbackA  //Script function callback. To use it class must be registered by WindowRegisterClass.
);

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

Post by Instructor »

Infocatcher
...
– тогда можно будет использовать «\\n» для получения «\n» и «\n» для перевода строки.
В новой версии скрипта учтена данная ситуация.

Xephon
Теперь можно не редактировать скрипт - в диалоге SearchReplace.js появилась галочка "Esc-последовательности".

Offline
Posts: 124
Joined: Tue Jun 03, 2008 10:32 pm

Post by Xephon »

Обнаружил странный глюк: когда в регулярном выражении присутствует positive look-ahead assertion, то кнопка "Заменить" работает аналогично кнопке "Найти", т.е. только подсвечивает найденное, но не заменяет. При этом кнопка "Заменить все" работает как надо.

[Added] Заглянул в скрипт и понял, что глюк не странный, а вполне закономерный. Сначала создается выделение, соответствующее искомому выражению, а потом замена производится в выделении, но т.к. тект соотвествующий positive look-ahead assertion не включается в выделение, то соотвествие пропадает. С negative look-ahead assertion соотвествие сохряняется.

Offline
Posts: 124
Joined: Tue Jun 03, 2008 10:32 pm

Post by Xephon »

Поправил скрипт, чтобы кнопка "Заменить" работала, когда присутствует look-ahead assertion. Т.к. скрипт довольно большой, укажу только измененнные куски (мои добавления/исправления выделены жирным):


...
//Options
var pFindIt="";
var pReplaceWith="";
var bSensitive=false;
var bMultiline=false;
var bEscSequences=false;
var nDirection=DN_DOWN;
var oIsLookAhead=new RegExp("\\(\\?=");
...
...
function SearchReplace()
{
var hWndInitialEdit;
var hWndCurrentEdit;
var oPattern;
var oCutOffPattern;
var pSelText;
var pArray;
var pResult;
var pCutLookAhead;
var nInitialSelStart;
var nInitialSelEnd;
var nSelStart;
var nSelEnd;
var nError;
var nResult=-1;
var i;

hWndInitialEdit=AkelPad.GetEditWnd();
hWndCurrentEdit=hWndInitialEdit;
oPattern=new RegExp(pFindIt, (bSensitive?"":"i") + (nButton == BT_REPLACEALL || nDirection & DN_UP?"g":"") + (bMultiline?"m":""));

if (oIsLookAhead.test(pFindIt) === true)
{
pCutLookAhead = LAAssertion(pFindIt);
oCutOffPattern = new RegExp(pCutLookAhead, (bSensitive?"":"i") + (bMultiline?"m":""));
}
else
oCutOffPattern = oPattern;


while (1)
{
nInitialSelStart=AkelPad.GetSelStart();
nInitialSelEnd=AkelPad.GetSelEnd();

if (nButton == BT_REPLACE)
{
if (nInitialSelStart != nInitialSelEnd)
{
pSelText=AkelPad.GetSelText();

if (pArray=pSelText.match(oCutOffPattern))
{
if (pArray.index == 0 && pArray[0].length == (nInitialSelEnd - nInitialSelStart))
{
pResult=pSelText.replace(oCutOffPattern, pReplaceWithEsc);
AkelPad.ReplaceSel(pResult);

nInitialSelStart=AkelPad.GetSelStart();
nInitialSelEnd=AkelPad.GetSelEnd();
}
}
}
nButton=BT_FINDNEXT;
}
...
...
function LAAssertion(pTestPattern)
{
var pStartLookAhead = pTestPattern.match(oIsLookAhead);
var pSymbol = "";
var pResult = "";
var nOpenParenthesis = 1;
var nCloseParentesis = 0;
var nStartLookAhead = pStartLookAhead.index;
var nCounter = nStartLookAhead + 1;

while (nOpenParenthesis != nCloseParentesis)
{
pSymbol = pTestPattern.charAt(nCounter);
if (pSymbol == "(")
nOpenParenthesis++;
if (pSymbol == ")")
nCloseParentesis++;
nCounter++;
}
pResult = pTestPattern.substring(0,nStartLookAhead) + pTestPattern.substring(nCounter,pTestPattern.length);
return pResult;
}

Offline
Posts: 124
Joined: Tue Jun 03, 2008 10:32 pm

Post by Xephon »

Поиск и одиночная замена не работают, если в регулярном выражении нет ничего, кроме look-ahead assertion, т.к. при этом выделение пустое. Есть функция, позволяющая из скрипта помещать курсор в заданную позицию?

LEN
Offline
Posts: 30
Joined: Thu Aug 21, 2008 9:31 pm

Перекодировка русских SMS

Post by LEN »

GSM модем (Nokia D211) ноутбука может получать SMS'ки, но русские буквы показываются кракозябрами. Оказалось, что их код получен по принципу: hex=ANSI-80h.

Хотелось бы иметь плагин, выполняющий обратную перекодировку ВЫДЕЛЕННОГО текста: ANSI=hex+80h, но не хочется разбираться с тонкостями написания скриптов.

Может кто поможет?

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

Посмотрел на скрипт SearchReplace и понял, что с помощью данного плагина можно фактически написать на JS новый Акель))
Единственное замечание: там в конце куча if-ов, туда так и просится switch.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

scriptToBookmarklet.js
Делает из нормально написанного скрипта букмарклет: удаляет переносы строк и комментарии.
Результат копируется в буфер обмена.

Если в 17-й строке заменить
scriptToBookmarklet(false);
на
scriptToBookmarklet(true);
, то дополнительно производится замена любой последовательности пробельных символов на один пробел (что нужно учитывать при написании кода).

P.S. Для того, чтобы не происходило удаление штук вида «http://abc», за комментарии считаются только «//» после любого пробельного символа.

[UPD]
Добавил восстановление выделения.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

encodeHTML.js
Заменяет символы <, >, & и " на <, >, & и " соответственно.

decodeHTML.js
Осуществляет обратную замену.

P.S. Если в ближайшее время не всплывут какие-нибудь глюки, или не окажется, что я что-то забыл, добавлю скрипты в сборник. :)

Offline
Posts: 15
Joined: Thu Nov 29, 2007 2:15 pm
Location: St. Petersburg

Post by Paulus »

я установил плугин "scripts", зарегистрировал его батником, но теперь при запуске любого скрипта вылезает сообщение: akelpad's window not found ... видимо ему надо чтобы akelpad был запущен, но ведь он запущен, в чем же дело?
Locked