Scripts discussion (1)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post 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?
Last edited by KDJ on Tue Dec 07, 2010 9:43 pm, edited 1 time in total.

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

Post by Infocatcher »

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

А чтобы забабахать в плагин, понадобится, как минимум, почитать документацию про uncodeURI() & Co. :) И кто будет портировать регулярки? :D


[Upd]
Еще есть http://en.wikipedia.org/wiki/Quoted-printable
И даже нечто, похожее на реализацию: http://0xcc.net/jsescape/strutil.js (http://0xcc.net/jsescape/)

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

Post by Infocatcher »

Fr0sT wrote:мой base64 кодер/декодер
Неправильно подирует вот такую строку:

Code: Select all

<script type="text/javascript">
В результате получается

Code: Select all

PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg=
+ случайный символ.
А должно быть

Code: Select all

PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg==
[Upd]
Или вот пример покороче:
qwertyu => cXdlcnR5dQ=M
AkelPad => QWtlbFBhZA=U

Откуда там двойное == должно получаться?

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

Post by Fr0sT »

Infocatcher, сейчас погляжу, там какая-то странная вещь с чтением из памяти

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

Post by Instructor »

KDJ
AEM_GETTEXTRANGEW with bColumnSel == TRUE will not work without selection.

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

Post 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 += всё равно быстрее.

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

Post by Fr0sT »

Base64 encode/decode - исправлена ошибка с появлением рандомного символа после завершающего символа "="

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Fr0sT, Infocatcher в zen_coding есть base64 преобразователь. Ни я ни Сергей не обидимся если вы его оттуда одолжите.

Offline
Posts: 139
Joined: Fri Feb 12, 2010 11:33 am

Post by Deim0s »

Fr0sT, Infocatcher,
Quoted-printable - думаю многим хотелось бы, очень не хватает.
Ещё хотелка - подсчёт хэша выделенных символов в текущей кодировке. Хотя бы по алгоритмам MD5 и SHA1.

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

Post by Fr0sT »

FeyFre
да уже своё сделал, спасибо :)
Deim0s
читал про quoted printable, там, оказывается, всё посложнее, чем "hex код символа со знаком = впереди".
Насчёт хэша - md5 погляжу.

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

Post by Infocatcher »

Fr0sT wrote:косяк с определением границы буфера, надо вот так (ну или в условии pCurr < pBuf+bufLen исправить <= на <)
Ага, вроде, нормально стало.
Fr0sT wrote:а с пушем/джойном специально изучал вопрос, в итоге вроде бы оказалось, что string += всё равно быстрее.
У меня тоже получается, что += чуточку быстрее.

Вроде, работает: converter.js

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

Post 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?

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

Post 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

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

Post 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 (?) :D handling of escape sequences inside string literals.


И вопросы.
Как отловить двойной клик по radiobutton? А то я придумал только замерять время между WM_COMMAND по одной и той же кнопке. И то при этом можно «даблкликнуть» пробелом.
Как отловить нажатие Ctrl+Enter в дополнение к Enter?
И можно ли добавить всплывающие подсказки?

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

Post by Infocatcher »

Зачем LinesFilter.js создает модальное окно?

Мне это не нравилось, и вот: LinesFilter_mod.js :D
Edit заменен на combobox (нагло утянуто из SearchReplace.js) с сохранением истории.
Добавлены две галочки «[строка] должна начинаться» и «[строка] должна заканчиваться».
Кнопка «Все» заменена на галочку.
Добавлена кнопка «Применить» (раз уж окно не модальное).
Особо не тестировал. :P

Может быть, есть смысл заменить replace/match на разбивку на строки и последующую проверку – тогда можно будет оперировать флагом начала строки, например «/(^|\s)something/».
Тогда для регулярных выражений можно просто отключать галочки, определяющие добавление «^.*» и «.*$» (и не добавлять флаги начала/окончания вообще).


converter.js
Добавлено восстановление положения окна и параметр командной строки -savePosition для отключения.
Только плохо, что не учитывается наличие панели задач (учитываются координаты DesktopWindow). Если она вдруг окажется выше/шире нашего окна, то при восстановлении окно может скрыться.


И хорошо бы вот это исследовать. Гораздо практичнее хранить скрипты в UTF8/16.
Locked