AkelPad Forum Index AkelPad
Support forum
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Scripts discussion (3)
Goto page Previous  1, 2, 3 ... 14, 15, 16, 17, 18, 19  Next
 
Post new topic   Reply to topic    AkelPad Forum Index -> Plugins
View previous topic :: View next topic  
Author Message
KDJ



Joined: 06 Mar 2010
Posts: 1373
Location: Poland

PostPosted: Sat Aug 16, 2014 6:51 pm    Post subject: Reply with quote

Instructor
I will try to do it. Thanks for the example.
It seems to me, that if _X64, offsetof(AEMARKTEXTITEMW, pMarkText) is equal to 24, not 20.
Is there any function to check the correctness of a regular expression?
Back to top
View user's profile Send private message
Infocatcher



Joined: 06 Aug 2007
Posts: 1619

PostPosted: Sat Aug 16, 2014 7:52 pm    Post subject: Reply with quote

runScript.js
Added support for %-variables in arguments (like in ContextMenu and ToolBar plugins)
(all changes)
Back to top
View user's profile Send private message Visit poster's website
Skif_off



Joined: 20 Oct 2013
Posts: 342

PostPosted: Mon Aug 18, 2014 5:07 am    Post subject: Reply with quote

Instructor
Возможно ли добавить в OpenSaveMask.js диалог выбора файла и диалог выбора каталога для сохранения? Или хотя бы открытие. Например с ключами -OpenList=1 и -SaveDir=1. Хотел воткнуть FileDialog из InsertFile.js, только что-то не соображу, как нужно обработать параметры.
Back to top
View user's profile Send private message
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5381

PostPosted: Mon Aug 18, 2014 6:27 am    Post subject: Reply with quote

KDJ wrote:
It seems to me, that if _X64, offsetof(AEMARKTEXTITEMW, pMarkText) is equal to 24, not 20.
Corrected.

Quote:
Is there any function to check the correctness of a regular expression?

CheckPat.js
Code:
var hMainWnd=AkelPad.GetMainWnd();

WScript.Echo("" + CheckPat("(23)(.*)(89)"));

function CheckPat(pPat)
{
  var lpPatExec;
  var lpStr;
  var nErrorOffset=0;

  if (lpPatExec=AkelPad.MemAlloc(_X64?0:76 /*sizeof(PATEXEC)*/))
  {
    if (lpStr=AkelPad.MemAlloc(2 /*sizeof(wchat_t)*/))
    {
      if (lpPat=AkelPad.MemAlloc((pPat.length + 1) * 2 /*sizeof(wchat_t)*/))
      {
        AkelPad.MemCopy(lpPat, pPat, 1 /*DT_UNICODE*/);
        AkelPad.MemCopy(lpPatExec + (_X64?0:12) /*offsetof(PATEXEC, wpStr)*/, lpStr, 2 /*DT_QWORD*/);
        AkelPad.MemCopy(lpPatExec + (_X64?0:16) /*offsetof(PATEXEC, wpMaxStr)*/, lpStr, 2 /*DT_QWORD*/);
        AkelPad.MemCopy(lpPatExec + (_X64?0:20) /*offsetof(PATEXEC, wpText)*/, lpStr, 2 /*DT_QWORD*/);
        AkelPad.MemCopy(lpPatExec + (_X64?0:24) /*offsetof(PATEXEC, wpMaxText)*/, lpStr, 2 /*DT_QWORD*/);
        AkelPad.MemCopy(lpPatExec + (_X64?0:4) /*offsetof(PATEXEC, wpPat)*/, lpPat, 2 /*DT_QWORD*/);
        AkelPad.MemCopy(lpPatExec + (_X64?0:8) /*offsetof(PATEXEC, wpMaxPat)*/, lpPat + pPat.length * 2 /*sizeof(wchat_t)*/, 2 /*DT_QWORD*/);
        AkelPad.MemCopy(lpPatExec + (_X64?0:52) /*offsetof(PATEXEC, dwOptions)*/, 0x1 /*RESE_MATCHCASE*/, 3 /*DT_DWORD*/);
        AkelPad.SendMessage(hMainWnd, 1415 /*AKD_PATEXEC*/, 0, lpPatExec);
        nErrorOffset=AkelPad.MemRead(lpPatExec + (_X64?0:64) /*offsetof(PATEXEC, nErrorOffset)*/, 2 /*DT_QWORD*/);

        AkelPad.MemFree(lpPat);
      }
      AkelPad.MemFree(lpStr);
    }
    AkelPad.MemFree(lpPatExec);
  }
  return nErrorOffset;
}


Skif_off
Возможно будет удобнее так:
Пример кнопки Total Commander'а для конвертирования выделенных файлов в UTF-8
Back to top
View user's profile Send private message Send e-mail
Skif_off



Joined: 20 Oct 2013
Posts: 342

PostPosted: Mon Aug 18, 2014 10:55 am    Post subject: Reply with quote

Instructor
Нет, это не то, по сути получается, что мне нужна часть функционала плагина Sessions, создать список файлов проще и быстрее, чем ту же пачку файлов сначала открыть (да и плагин включаю только при необходимости).

В общем, беру просьбу взад, есть пара идей, к тому же, сразу не вспомнил: самый простой - %a и OpenFile() из ContextMenu, будет просто два пункта меню, а не один Smile (у меня так прикручен переименованный и немного модифицированный replaceDiacriticLetters.js от Infocatcher, существенно ускоряет поиск/замену, правда, не запустишь для всех вкладок сразу, как в случае с 4161, но пока и не требовалось)
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1373
Location: Poland

PostPosted: Mon Aug 18, 2014 7:12 pm    Post subject: Reply with quote

Instructor wrote:
CheckPat.js
Code:
var hMainWnd=AkelPad.GetMainWnd();

WScript.Echo("" + CheckPat("(23)(.*)(89)"));

function CheckPat(pPat)
{
  var lpPatExec;
  var lpStr;
  var nErrorOffset=0;

  if (lpPatExec=AkelPad.MemAlloc(_X64?0:76 /*sizeof(PATEXEC)*/))
  {
    if (lpStr=AkelPad.MemAlloc(2 /*sizeof(wchat_t)*/))
    {
      if (lpPat=AkelPad.MemAlloc((pPat.length + 1) * 2 /*sizeof(wchat_t)*/))
      {
        AkelPad.MemCopy(lpPat, pPat, 1 /*DT_UNICODE*/);
        AkelPad.MemCopy(lpPatExec + (_X64?0:12) /*offsetof(PATEXEC, wpStr)*/, lpStr, 2 /*DT_QWORD*/);
        AkelPad.MemCopy(lpPatExec + (_X64?0:16) /*offsetof(PATEXEC, wpMaxStr)*/, lpStr, 2 /*DT_QWORD*/);
        AkelPad.MemCopy(lpPatExec + (_X64?0:20) /*offsetof(PATEXEC, wpText)*/, lpStr, 2 /*DT_QWORD*/);
        AkelPad.MemCopy(lpPatExec + (_X64?0:24) /*offsetof(PATEXEC, wpMaxText)*/, lpStr, 2 /*DT_QWORD*/);
        AkelPad.MemCopy(lpPatExec + (_X64?0:4) /*offsetof(PATEXEC, wpPat)*/, lpPat, 2 /*DT_QWORD*/);
        AkelPad.MemCopy(lpPatExec + (_X64?0:8) /*offsetof(PATEXEC, wpMaxPat)*/, lpPat + pPat.length * 2 /*sizeof(wchat_t)*/, 2 /*DT_QWORD*/);
        AkelPad.MemCopy(lpPatExec + (_X64?0:52) /*offsetof(PATEXEC, dwOptions)*/, 0x1 /*RESE_MATCHCASE*/, 3 /*DT_DWORD*/);
        AkelPad.SendMessage(hMainWnd, 1415 /*AKD_PATEXEC*/, 0, lpPatExec);
        nErrorOffset=AkelPad.MemRead(lpPatExec + (_X64?0:64) /*offsetof(PATEXEC, nErrorOffset)*/, 2 /*DT_QWORD*/);

        AkelPad.MemFree(lpPat);
      }
      AkelPad.MemFree(lpStr);
    }
    AkelPad.MemFree(lpPatExec);
  }
  return nErrorOffset;
}


Thank you very much. Very usefull function.
The offset values for _X64 I calculated myself.
I think, this function should be in Scripts plugin as AkelPad method.
Back to top
View user's profile Send private message
Skif_off



Joined: 20 Oct 2013
Posts: 342

PostPosted: Mon Aug 18, 2014 9:45 pm    Post subject: Reply with quote

Infocatcher
Подскажите, пожалуйста, в какое место нужно добавить вызов скриптов после вставки текста (выделенное или весь файл)?
Получается как-то многовато

Code:
AkelPad.CallW("Scripts::Main", 1, "Multi_SR.js", `"\<p\>\n[ \t]*" "<p>" 0 1 0 16 3`)
AkelPad.CallW("Scripts::Main", 1, "Multi_SR.js", `"\n[ \t]*\</p\>" "</p>" 0 1 0 16 3`)
AkelPad.CallW("Scripts::Main", 1, "Multi_SR.js", `"\<v\>\n[ \t]*" "<v>" 0 1 0 16 3`)
AkelPad.CallW("Scripts::Main", 1, "Multi_SR.js", `"\n[ \t]*\</v\>" "</v>" 0 1 0 16 3`)
AkelPad.CallW("Scripts::Main", 1, "Multi_SR.js", `"\<subtitle\>\n[ \t]*" "<subtitle>" 0 1 0 16 3`)
AkelPad.CallW("Scripts::Main", 1, "Multi_SR.js", `"\n[ \t]*\</subtitle\>" "</subtitle>" 0 1 0 16 3`)
AkelPad.CallW("Scripts::Main", 1, "Multi_SR.js", `"\<text-author\>\n[ \t]*" "<text-author>" 0 1 0 16 3`)
AkelPad.CallW("Scripts::Main", 1, "Multi_SR.js", `"\n[ \t]*\</text-author\>" "</text-author>" 0 1 0 16 3`)
AkelPad.CallW("Scripts::Main", 1, "Multi_SR.js", `"</body><binary" "</body>\n <binary" 0 1 1 16 3`)
AkelPad.CallW("Scripts::Main", 1, "Multi_SR.js", `"\n[ \t]*\</binary\>" "</binary>" 0 1 0 16 3`)
AkelPad.CallW("Scripts::Main", 1, "Multi_SR.js", `"></FictionBook>" ">\n</FictionBook>" 0 1 1 16 3`)

, хотелось бы упростить Smile Правильно понимаю, что это происходит в операторе if в строках 5899-5971 (в разрабатываемой версии)?
Back to top
View user's profile Send private message
Infocatcher



Joined: 06 Aug 2007
Posts: 1619

PostPosted: Thu Aug 21, 2014 8:22 am    Post subject: Reply with quote

Skif_off
Там в двух местах вызов insertNoScroll() для вставки.

Я немного доработал, теперь можно сделать вот такой вспомогательный скрипт:
Code:
if(!AkelPad.Include("..\\jsBeautifier.js"))
   WScript.Quit();

var _beautifyOrig = beautify;
beautify = function(source, syntax) {
   return _beautifyOrig.apply(this, arguments)
      .replace(/<(p|subtitle)>\n[ \t]*/ig, "<$1>")
      .replace(/\n[ \t]*<\/(p|subtitle)>/ig, "</$1>");
};

handleArgs();

Только если изменения будут касаться не только пробельных символов, то сломается восстановления позиции каретки (если отсутствовало выделение и -onlySelected=false или не передается).
Back to top
View user's profile Send private message Visit poster's website
Skif_off



Joined: 20 Oct 2013
Posts: 342

PostPosted: Thu Aug 21, 2014 2:23 pm    Post subject: Reply with quote

Infocatcher
Спасибо, как-то даже неловко Smile Эта доработка не вылезет боком? Выглядит интересно.

С AkelPad.CallW после insertNoScroll() (точнее - setSyntax(syntax.value)) вроде срабатывает, только заменил "`" на "'".
Так понятнее пока: не силен в JS, в случае вспомогательного скрипта придется разбираться с .replace, ну и со строками замены ($) у меня пока пробелы.
Про ограничение: пока не могу оценить, обычно если есть <binary></binary>, то безусловно выделение до предыдущего закрывающего тэга, а в чем еще всплывет необходимость не могу предположить.
Back to top
View user's profile Send private message
Infocatcher



Joined: 06 Aug 2007
Posts: 1619

PostPosted: Mon Aug 25, 2014 6:19 am    Post subject: Reply with quote

Skif_off wrote:
Спасибо, как-то даже неловко Smile Эта доработка не вылезет боком? Выглядит интересно.
Вряд ли, подключать скрипт через AkelPad.Include() можно было уже давно, я только завернул стандартную обработку в функцию.

Да, про AkelPad.CallW/Call. Я так понимаю, все-таки лучше AkelPad.Call(), а AkelPad уже сам будет использовать юникодные строки, если система их поддерживает. Другое дело, что я сомневаюсь, что скрипт вообще запустится на Win 98 (какая там версия JScript?).

Skif_off wrote:
Про ограничение: пока не могу оценить, обычно если есть <binary></binary>, то безусловно выделение до предыдущего закрывающего тэга, а в чем еще всплывет необходимость не могу предположить.
Ну, если после вставки вызываются сторонние скрипты, то положение выделения уже на их совести.

И потом, наверное, лучше вот так (у меня иногда падало, если выставить синтаксическую тему до вставки):
Code:
insertNoScroll(...);
postProcess();
setSyntax(...);

С добавлением
Code:
function postProcess() {
   AkelPad.Call(...);
   ...
}


Или вообще вот так:
Code:
if(!AkelPad.Include("..\\jsBeautifier.js"))
   WScript.Quit();

var _insertNoScrollOrig = insertNoScroll;
insertNoScroll = function(str, selectAll, caretPos) {
   var ret = _insertNoScrollOrig.apply(this, arguments);
   AkelPad.Call("Scripts::Main", 1, "Multi_SR.js", ...);
   ...
   return ret;
};

handleArgs();
Back to top
View user's profile Send private message Visit poster's website
yozhic



Joined: 20 Jun 2011
Posts: 48
Location: Электросталь

PostPosted: Fri Aug 29, 2014 11:10 am    Post subject: Reply with quote

Infocatcher
Не могли бы прикрутить хотелку к скрипту winMergeTabs.js? Smile
Возможность прервать работу скрипта, если случайно нажал кнопку. То есть пока мигает Select Tab! в строке состояния, чтобы можно было нажать Esc (например) и остановить выполнение скрипта. Сейчас в этот момент по Esc закрывается окно Akel' я.

Добавлено:
Ааа, кажется разобрался. Повторное нажатие на кнопку останавливает скрипт...
Back to top
View user's profile Send private message
Infocatcher



Joined: 06 Aug 2007
Posts: 1619

PostPosted: Fri Aug 29, 2014 1:02 pm    Post subject: Reply with quote

yozhic wrote:
winMergeTabs.js
[...]
Повторное нажатие на кнопку останавливает скрипт...
Угу.
И я не уверен, что можно <del>малой кровью</del> малым кодом перехватить Esc.
И можно сделать индикацию нажатости у кнопки:
Code:
// Arguments:
...
//   -item="toolbar:%m:%i"                        - check toolbar button
//        ="menu:%m:%i"                           - check menu item
Back to top
View user's profile Send private message Visit poster's website
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5381

PostPosted: Fri Aug 29, 2014 2:35 pm    Post subject: Reply with quote

Infocatcher
Подсмотрено у KDJ - использовать IsMenu:

ActiveColumnSwitch.js
Code:
  if (nHandle && nItemID)
  {
    if (oSys.Call("User32::IsMenu", nHandle))
      oSys.Call("User32::CheckMenuItem", nHandle, nItemID, bCheckButton?0x8 /*MF_BYCOMMAND|MF_CHECKED*/:0x0 /*MF_BYCOMMAND|MF_UNCHECKED*/);
    else
      AkelPad.SendMessage(nHandle, 1026 /*TB_CHECKBUTTON*/, nItemID, bCheckButton);
  }
Back to top
View user's profile Send private message Send e-mail
yozhic



Joined: 20 Jun 2011
Posts: 48
Location: Электросталь

PostPosted: Fri Aug 29, 2014 4:05 pm    Post subject: Reply with quote

Infocatcher wrote:
И можно сделать индикацию нажатости у кнопки

Ага, точно, спасибо. Этот момент я «пролетел» по невнимательности.
Back to top
View user's profile Send private message
Infocatcher



Joined: 06 Aug 2007
Posts: 1619

PostPosted: Fri Aug 29, 2014 4:58 pm    Post subject: Reply with quote

Instructor wrote:
Подсмотрено у KDJ - использовать IsMenu
Да, так лучше, спасибо.
https://github.com/Infocatcher/AkelPad_scripts/commit/35f56ae08121a43f5db3732e9496dd8e710290aa

yozhic
Я тоже забыл, что -item умеют только разрабатываемые версии. Smile
Back to top
View user's profile Send private message Visit poster's website
Display posts from previous:   
Post new topic   Reply to topic    AkelPad Forum Index -> Plugins All times are GMT
Goto page Previous  1, 2, 3 ... 14, 15, 16, 17, 18, 19  Next
Page 15 of 19

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


SourceForge.net Logo Powered by phpBB © 2001, 2005 phpBB Group