Page 4 of 97

Posted: Sat Aug 09, 2008 4:40 pm
by Xephon
AkelPad 4.0.0 Final
Scripts plugin v3.5

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

Posted: Sat Aug 09, 2008 5:30 pm
by Instructor
Ясно. В функции SetRedraw необходимо

Code: Select all

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

Code: Select all

oFunction.AddParameter(true);

Posted: Sat Aug 09, 2008 6:15 pm
by Xephon
Спасибо, заработало как надо.

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

Posted: Tue Sep 30, 2008 11:58 am
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");

Posted: Tue Sep 30, 2008 4:46 pm
by Xephon
Большое спасибо, очень полезное обновление.
Еще одно пожелание по поводу диалога SearchReplace, думаю его реализация была бы полезно всем, кто часто пользуется регулярными выражениями: хотелось бы сохранять 10 последних использованных вариантов, как это сделано в диалоге обычной замены.

Posted: Tue Sep 30, 2008 5:39 pm
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.
);

Posted: Thu Oct 02, 2008 8:32 am
by Instructor
Infocatcher
...
– тогда можно будет использовать «\\n» для получения «\n» и «\n» для перевода строки.
В новой версии скрипта учтена данная ситуация.

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

Posted: Sun Oct 05, 2008 4:58 pm
by Xephon
Обнаружил странный глюк: когда в регулярном выражении присутствует positive look-ahead assertion, то кнопка "Заменить" работает аналогично кнопке "Найти", т.е. только подсвечивает найденное, но не заменяет. При этом кнопка "Заменить все" работает как надо.

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

Posted: Thu Oct 09, 2008 12:26 am
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;
}

Posted: Thu Oct 09, 2008 1:01 pm
by Xephon
Поиск и одиночная замена не работают, если в регулярном выражении нет ничего, кроме look-ahead assertion, т.к. при этом выделение пустое. Есть функция, позволяющая из скрипта помещать курсор в заданную позицию?

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

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

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

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

Posted: Wed Nov 26, 2008 7:47 am
by Fr0sT
Посмотрел на скрипт SearchReplace и понял, что с помощью данного плагина можно фактически написать на JS новый Акель))
Единственное замечание: там в конце куча if-ов, туда так и просится switch.

Posted: Tue Mar 10, 2009 8:38 pm
by Infocatcher
scriptToBookmarklet.js
Делает из нормально написанного скрипта букмарклет: удаляет переносы строк и комментарии.
Результат копируется в буфер обмена.

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

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

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

Posted: Wed Mar 11, 2009 10:44 pm
by Infocatcher
encodeHTML.js
Заменяет символы <, >, & и " на <, >, & и " соответственно.

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

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

Posted: Fri Mar 13, 2009 1:58 pm
by Paulus
я установил плугин "scripts", зарегистрировал его батником, но теперь при запуске любого скрипта вылезает сообщение: akelpad's window not found ... видимо ему надо чтобы akelpad был запущен, но ведь он запущен, в чем же дело?