Page 40 of 97
Posted: Tue Dec 07, 2010 9:25 pm
by KDJ
KDJ wrote:I need a function that gets the text in columns.
For example:
AkelPad.GetTextRangeColumn(Start, End[, nNewLine])
where
Start = [nLineStart, nColumnStart]
End = [nLineEnd, nColumnEnd]
Is it possible to do this?
FeyFre wrote:KDJ, definitely yes

AkelEdit message AEM_GETTEXTRANGE
There is usage example in source of AkelPad (AkelEdit.h)
The function should retrieve the text without selecting. I wrote this function:
Code: Select all
// Example of use
var Txt = GetTextRangeColumn([0, 0], [6, 9]);
AkelPad.Command(4101);
AkelPad.ReplaceSel(Txt);
///////////////////////////////////////////
// aBeg = [nBeginLine, nBeginColumn]
// aEnd = [nEndLine, nEndColumn]
// nNewLine = 1 //"\r" new line (default)
// 2 //"\n" new line
// 3 //"\r\n" new line
///////////////////////////////////////////
function GetTextRangeColumn(aBeg, aEnd, nNewLine)
{
var DT_DWORD = 3;
var hEditWnd = AkelPad.GetEditWnd();
var Txt = "";
var lpAETEXTRANGEW;
var nTxtLen;
var lpTxt;
if (! nNewLine) nNewLine = 1;
nNewLine += 4;
if (lpAETEXTRANGEW = AkelPad.MemAlloc(56 /*sizeof(AETEXTRANGEW)*/))
{
AkelPad.MemCopy(lpAETEXTRANGEW, aBeg[0], DT_DWORD);
AkelPad.MemCopy(lpAETEXTRANGEW + 8, aBeg[1], DT_DWORD);
AkelPad.MemCopy(lpAETEXTRANGEW + 12, aEnd[0], DT_DWORD);
AkelPad.MemCopy(lpAETEXTRANGEW + 20, aEnd[1], DT_DWORD);
AkelPad.MemCopy(lpAETEXTRANGEW + 24, 1, DT_DWORD);
AkelPad.MemCopy(lpAETEXTRANGEW + 28, 0, DT_DWORD);
AkelPad.MemCopy(lpAETEXTRANGEW + 32, 0, DT_DWORD);
AkelPad.MemCopy(lpAETEXTRANGEW + 36, nNewLine, DT_DWORD);
AkelPad.MemCopy(lpAETEXTRANGEW + 40, 0, DT_DWORD);
AkelPad.MemCopy(lpAETEXTRANGEW + 44, 0, DT_DWORD);
AkelPad.MemCopy(lpAETEXTRANGEW + 48, 0, DT_DWORD);
AkelPad.MemCopy(lpAETEXTRANGEW + 52, 0, DT_DWORD);
AkelPad.SendMessage(hEditWnd, 3132 /*AEM_INDEXUPDATE*/, 0, lpAETEXTRANGEW);
AkelPad.SendMessage(hEditWnd, 3132 /*AEM_INDEXUPDATE*/, 0, lpAETEXTRANGEW + 12);
if (nTxtLen = AkelPad.SendMessage(hEditWnd, 3032 /*AEM_GETTEXTRANGEW*/, 0, lpAETEXTRANGEW))
{
if (lpTxt = AkelPad.MemAlloc(nTxtLen * _TSIZE + _TSIZE))
{
AkelPad.MemCopy(lpAETEXTRANGEW + 28, lpTxt, DT_DWORD);
AkelPad.MemCopy(lpAETEXTRANGEW + 32, nTxtLen, DT_DWORD);
AkelPad.SendMessage(hEditWnd, 3032 /*AEM_GETTEXTRANGEW*/, 0, lpAETEXTRANGEW);
Txt = AkelPad.MemRead(lpTxt, _TSTR);
AkelPad.MemFree(lpTxt);
}
}
AkelPad.MemFree(lpAETEXTRANGEW);
}
return Txt;
}
But in the absence of a selection of text, it returns blank lines.
I don't know where is the error?
Posted: Tue Dec 07, 2010 9:39 pm
by Infocatcher
Fr0sT wrote:можешь добавить мой base64 кодер/декодер в свой мега-конвертер

а вообще, по-хорошему, надо бы всё это в плагин забабахать.
Добавил:
converter.js
При автоопределении направления кодирования теперь не выдается ошибок при попытке применить первое действие.
Плюс немного поигрался, вроде, object[key] быстрее string.indexOf(key). Еще раньше (?) было быстрее сделать array.push(add)/join(""), чем string += add.
И мне не нравятся гигантские строки, так что по умолчанию идет нарезка на части, можно переопределить аргументом -maxLineWidth=0.
Предупреждения о размере пока нет. По идее, его можно сразу на все алгоритмы добавить.
А чтобы забабахать в плагин, понадобится, как минимум, почитать документацию про uncodeURI() & Co.

И кто будет портировать регулярки?
[Upd]
Еще есть
http://en.wikipedia.org/wiki/Quoted-printable
И даже нечто, похожее на реализацию:
http://0xcc.net/jsescape/strutil.js (
http://0xcc.net/jsescape/)
Posted: Wed Dec 08, 2010 12:29 am
by Infocatcher
Fr0sT wrote:мой base64 кодер/декодер
Неправильно подирует вот такую строку:
В результате получается
Code: Select all
PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg=
+ случайный символ.
А должно быть
Code: Select all
PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg==
[Upd]
Или вот пример покороче:
qwertyu => cXdlcnR5dQ=M
AkelPad => QWtlbFBhZA=U
Откуда там двойное == должно получаться?
Posted: Wed Dec 08, 2010 8:42 am
by Fr0sT
Infocatcher, сейчас погляжу, там какая-то странная вещь с чтением из памяти
Posted: Wed Dec 08, 2010 8:58 am
by Instructor
KDJ
AEM_GETTEXTRANGEW with bColumnSel == TRUE will not work without selection.
Posted: Wed Dec 08, 2010 9:42 am
by Fr0sT
Infocatcher
косяк с определением границы буфера, надо вот так (ну или в условии pCurr < pBuf+bufLen исправить <= на <):
Code: Select all
var chr1 = (pCurr < pBuf+bufLen) ? AkelPad.MemRead(pCurr++, 5 /* DT_BYTE */) : 0;
var chr2 = (pCurr < pBuf+bufLen) ? AkelPad.MemRead(pCurr++, 5 /* DT_BYTE */) : 0;
var chr3 = (pCurr < pBuf+bufLen) ? AkelPad.MemRead(pCurr++, 5 /* DT_BYTE */) : 0;
Плюс немного поигрался, вроде, object[key] быстрее string.indexOf(key). Еще раньше (?) было быстрее сделать array.push(add)/join(""), чем string += add.
object[key] заменю, а с пушем/джойном специально изучал вопрос, в итоге вроде бы оказалось, что string += всё равно быстрее.
Posted: Wed Dec 08, 2010 9:48 am
by Fr0sT
Base64 encode/decode - исправлена ошибка с появлением рандомного символа после завершающего символа "="
Posted: Wed Dec 08, 2010 9:57 am
by FeyFre
Fr0sT,
Infocatcher в
zen_coding есть base64 преобразователь. Ни я ни Сергей не обидимся если вы его оттуда одолжите.
Posted: Wed Dec 08, 2010 11:38 am
by Deim0s
Fr0sT, Infocatcher,
Quoted-printable - думаю многим хотелось бы, очень не хватает.
Ещё хотелка - подсчёт хэша выделенных символов в текущей кодировке. Хотя бы по алгоритмам MD5 и SHA1.
Posted: Wed Dec 08, 2010 1:21 pm
by Fr0sT
FeyFre
да уже своё сделал, спасибо
Deim0s
читал про quoted printable, там, оказывается, всё посложнее, чем "hex код символа со знаком = впереди".
Насчёт хэша - md5 погляжу.
Posted: Wed Dec 08, 2010 6:18 pm
by Infocatcher
Fr0sT wrote:косяк с определением границы буфера, надо вот так (ну или в условии pCurr < pBuf+bufLen исправить <= на <)
Ага, вроде, нормально стало.
Fr0sT wrote:а с пушем/джойном специально изучал вопрос, в итоге вроде бы оказалось, что string += всё равно быстрее.
У меня тоже получается, что += чуточку быстрее.
Вроде, работает:
converter.js
Posted: Wed Dec 08, 2010 6:53 pm
by KDJ
Instructor wrote:KDJ
AEM_GETTEXTRANGEW with bColumnSel == TRUE will not work without selection.
Does this mean that you can not read text in columns, without its selection?
Posted: Wed Dec 08, 2010 10:21 pm
by KDJ
KDJ wrote:Instructor wrote:KDJ
AEM_GETTEXTRANGEW with bColumnSel == TRUE will not work without selection.
Does this mean that you can not read text in columns, without its selection?
Somehow I did it.
GetTextRangeColumn
Posted: Thu Dec 09, 2010 5:11 pm
by Infocatcher
converter.js
Added converter for special symbols of string literals:
ab"cd\ef <=> ab\"cd\\ef
Select string with commas to don't escape another commas inside:
"ab"cd
'ef
" <=>
"ab\"cd
'ef
"
Added -onlySelected argument.
Fixed wrong registry path for settings.
Better (?)

handling of escape sequences inside string literals.
И вопросы.
Как отловить двойной клик по radiobutton? А то я придумал только замерять время между WM_COMMAND по одной и той же кнопке. И то при этом можно «даблкликнуть» пробелом.
Как отловить нажатие Ctrl+Enter в дополнение к Enter?
И можно ли добавить всплывающие подсказки?
Posted: Fri Dec 10, 2010 4:42 pm
by Infocatcher
Зачем LinesFilter.js создает модальное окно?
Мне это не нравилось, и вот:
LinesFilter_mod.js 
Edit заменен на combobox (нагло утянуто из SearchReplace.js) с сохранением истории.
Добавлены две галочки «[строка] должна начинаться» и «[строка] должна заканчиваться».
Кнопка «Все» заменена на галочку.
Добавлена кнопка «Применить» (раз уж окно не модальное).
Особо не тестировал.
Может быть, есть смысл заменить replace/match на разбивку на строки и последующую проверку – тогда можно будет оперировать флагом начала строки, например «/(^|\s)something/».
Тогда для регулярных выражений можно просто отключать галочки, определяющие добавление «^.*» и «.*$» (и не добавлять флаги начала/окончания вообще).
converter.js
Добавлено восстановление положения окна и параметр командной строки -savePosition для отключения.
Только плохо, что не учитывается наличие панели задач (учитываются координаты DesktopWindow). Если она вдруг окажется выше/шире нашего окна, то при восстановлении окно может скрыться.
И хорошо бы
вот это исследовать. Гораздо практичнее хранить скрипты в UTF8/16.