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.GetSelText(2 /*\n*/);" на "AkelPad.GetSelText(/*2\n*/);" все работает.

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

Post by Instructor »

Xephon
Я про опцию "Многострочно".

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

Post by Xephon »

При отключенной опции "Многострочно" ^ соответствует началу файла, $ соответствует концу файла. При включенной - ^ соответствует началу каждой строки, $ соответствует концу каждой строки. Именно такое поведение и наблюдается с "AkelPad.GetSelText();", что я расцениваю, как "все работает". Или я чего-то не понимаю?

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

Post by Instructor »

Xephon
Хм. Может версия jscript.dll у вас более новая - у меня на WinXP 5.7.0.16599 при "AkelPad.GetSelText();" с вкл. "Многострочно","С начала" и поиске "^.+$" - выделяет с начала до конца документа.

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

Post by Xephon »

WinXP, jscript.dll 5.7.6002.22589
Раз такой глюк наблюдается, тогда не стоит ничего менять, т.к. это может навредить людям, у которых другая версия jscript.dll. Я продолжу менять скрипт вручную.

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

Post by Infocatcher »

Instructor wrote:GetNumberMembers.js
По-моему, это скорее GetNumberFlags.

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

Post by Xephon »

Instructor, я так быстро начал проверять версию jscript.dll, что на регулярное выражение почти и не посмотрел. "^.+$" - и должен выделять с начала до конца документа, ведь плюс - жадный квантификатор, а в отсутствие в тексте "\n", точку ничто не может остановить. Чтобы выделить одну строку, надо использовать "^.+?$" при включенной опции "Многострочно". При отключенной опции это выражение будет также выделять весь текст в файле.

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

Post by Xephon »

В новом SearchReplace.js проблема размеров окна осталась. Указанные в "rcMinMaxDialogRect={left:400, top:234, right:0, bottom:234};" размеры похоже не масштабируются под другие dpi. Для 120 dpi нужно, чтобы было top:292, bottom:292. Плюс перестал сохраняться размер диалога.

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

Post by Instructor »

Xephon wrote:В новом SearchReplace.js проблема размеров окна осталась.
Обновленный скрипт похоже на работе остался :)

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

Post by Instructor »

Xephon
Сделано заново, скрипт залит. Не проверял - должно работать.

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

Post by Xephon »

Instructor wrote:должно работать
Работоспособность подтверждаю.

Offline
Posts: 3
Joined: Wed Aug 03, 2011 4:56 pm

Транслитерация

Post by uavso »

Для перекодировки букв из русских в украинские и наоборот (прямая и обратная транслитерация _одним_ скриптом) попытался изменить скрипт транслитерации. Но не передается
pArraySource.length
и цикл не работает.

Что не так?

Спасибо!

Code: Select all

// Ru-Ua.js
// Convert keyboard layout Ua->Ru

//Options
var pArraySource=new Array("э","Э","Ы", "ы","Ъ","ъ","Ё","ё");
var pArrayTarget=new Array("є","Є","І", "і","Ї","ї","Ґ","ґ");

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var nSelStart;
var nSelEnd;
var pSelText;
var pResult;

if (hMainWnd)
{
  nSelStart=AkelPad.GetSelStart();
  nSelEnd=AkelPad.GetSelEnd();
  if (nSelStart == nSelEnd)
    AkelPad.SetSel(0, -1);

  pSelText=AkelPad.GetSelText();
  pResult=ConvertLayout(pSelText, pArraySource, pArrayTarget);
  AkelPad.ReplaceSel(pResult);

  if (nSelStart == nSelEnd)
    AkelPad.SetSel(0, -1);
  else
    AkelPad.SetSel(nSelStart, nSelStart + pResult.length);
}


//Functions
function ConvertLayout(pText, pArraySource, pArrayTarget)
{
  var p,s;
  var i,j;
s="";
for (j=0; j < pText.length; ++j)
{
p=pText[j];i=0;
while (i < pArraySource.length) 
{
if (p=pArraySource[i]) {p=pArrayTarget[i];i=pArraySource.length;
//s=s+"|"+parseInt(i)+pArraySource[i];
//s=s+parseint(pArraySource.length)
//вот здесь возникает ошибка //////////////////////////////////
};
i=i+1;

}
//pText[j]=p;
s=s+p;
}
s="="+s+"="+parseInt(pArraySource.length);
//ptext=parseInt(pArraySource.length);
  return s;//pText;
}

Offline
Posts: 3
Joined: Wed Aug 03, 2011 4:56 pm

Post by uavso »

конечно, для прямой и обратной перекодировки, массивы в предыдущем скрипте должны быть исправлены.
Но это не решает проблему, поскольку вообще замена правильно не идет


var pArraySource=new Array("э","Э","Ы", "ы","Ъ","ъ","Ё","ё","є","Є","І","і","Ї","ї","Ґ","ґ");
var pArrayTarget=new Array("є","Є","І", "і","Ї","ї","Ґ","ґ","э","Э","Ы","ы","Ъ","ъ","Ё","ё");


var pArraySource=new Array("э","Э","Ы", "ы","Ъ","ъ","Ё","ё","є","Є","І","і","Ї","ї","Ґ","ґ");
var pArrayTarget=new Array("є","Є","І", "і","Ї","ї","Ґ","ґ","э","Э","Ы","ы","Ъ","ъ","Ё","ё");

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

Post by Infocatcher »

Надо сохранить скрипт в UTF-8 с BOM.

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Гляньте ещё этот скрипт:

Code: Select all

/*****************************************************************************
 *  KeySubst.js  v.0.6                                                       *
 *  (C) DV, May-June 2011                                                    *
 *  Thanks to: Instructor, FeyFre                                            *
 *****************************************************************************/
/*  Examples:
     -"En->Ru,Ru->En" Call("Scripts::Main", 1, "KeySubst.js", `-to=rus,eng`)
     -"En->Uk,Uk->En" Call("Scripts::Main", 1, "KeySubst.js", `-to=ukr,eng`)
     -"En->Ru,Uk->Ru" Call("Scripts::Main", 1, "KeySubst.js", `-to=rus,rus`)
     -"En->Uk,Ru->Uk" Call("Scripts::Main", 1, "KeySubst.js", `-to=ukr,ukr`)
     -"En->En,Uk->Ru" Call("Scripts::Main", 1, "KeySubst.js", `-to=eng,rus`)
     -"En->En,Ru->Uk" Call("Scripts::Main", 1, "KeySubst.js", `-to=eng,ukr`)
 *****************************************************************************/

var alph = [
 /* eng=0 */ [ "`1234567890-=\\qwertyuiop[]asdfghjkl;\'zxcvbnm,./`",
               "~!@#$%^&*()_+|QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>?~",
               // special key combinations...
               "\u0055",
               "\u0055" ],
 /* rus=1 */ [ "ё1234567890-=\\йцукенгшщзхъфывапролджэячсмитьбю.ё",
               "Ё!\"№;%:?*()_+/ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,Ё",
               // special key combinations...
               "\u0055",
               "\u0055" ],
 /* ukr=2 */ [ "\'1234567890-=\\йцукенгшщзхїфівапролджєячсмитьбю.ё",
               "\'!\"№;%:?*()_+/ЙЦУКЕНГШЩЗХЇФІВАПРОЛДЖЄЯЧСМИТЬБЮ,Ё",
               // special key combinations...
               "ґ",
               "Ґ" ]
]; // Note: trailing 'ё' is needed for Ukrainian because of ` to ' hack.

var eng = 0;
var rus = 1;
var ukr = 2;

var default_langTo1 = rus; // rus: En->Ru
var default_langTo2 = eng; // eng: Ru->En,Uk->En
var langTo1 = -1;
var langTo2 = -1;
var argLangTo = getScriptArg("-to").toLowerCase().split(",");
if (argLangTo.length > 0)
{
  langTo1 = getLang(argLangTo[0]);
  if (argLangTo.length > 1)
  {
    langTo2 = getLang(argLangTo[1]);
  }
}
var hWndMain = AkelPad.GetMainWnd();
var hWndEdit = AkelPad.GetEditWnd();
var oSys = AkelPad.SystemFunction();

AkelPad.ScriptNoMutex();

var mutexName = "KeySubst_js_" + hWndMain + "_" + hWndEdit;
var hMutex;
if (hMutex = oSys.Call("kernel32::CreateMutex" + _TCHAR, 0, 1, mutexName))
{
  if (oSys.GetLastError() == 183 /*ERROR_ALREADY_EXISTS*/)
  {
    oSys.Call("kernel32::CloseHandle", hMutex);
    oSys.Call("user32::SendMessage" + _TCHAR, hWndEdit, 0x0100 /*WM_KEYDOWN*/, 0xC0, 0);
    WScript.Quit();
  }
}

var lpOldEditProc;
if (lpOldEditProc = AkelPad.WindowSubClass(hWndEdit, EditCallback))
{
  //Message loop
  AkelPad.WindowGetMessage();

  AkelPad.WindowUnsubClass(hWndEdit);
  oSys.Call("kernel32::CloseHandle", hMutex);
}

function EditCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 0x0102 /*WM_CHAR*/)
  {
    var ch = convertSymbolCode(hWnd, wParam, 0);
    if (ch != 0)
    {
      oSys.Call("user32::CallWindowProc" + _TCHAR, lpOldEditProc, hWnd, uMsg, ch, lParam);
      AkelPad.SendMessage(hWnd, 3377 /*AEM_UPDATECARET*/, 0, 0);
      //Skip internal CallWindowProc
      return 1;
    }
  }
  else if ( (uMsg == 0x0100 /*WM_KEYDOWN*/) ||
            (uMsg == 0x0104 /*WM_SYSKEYDOWN*/) )
  {
    var nCtrlState = oSys.Call("user32::GetKeyState", 0x11 /*VK_CONTROL: Ctrl*/);
    var nAltState = oSys.Call("user32::GetKeyState", 0x12 /*VK_MENU: Alt*/)
    var nAltGrState = oSys.Call("user32::GetKeyState", 0xA5 /*VK_RMENU: AltGr*/)

    if (wParam == 0xC0 /*VK_OEM_3: (`~)*/)
    {
      if ((lParam == 0) || ((nCtrlState & 0x80) && !(nAltState & 0x80)))
      {
        //Exit message loop
        oSys.Call("user32::PostQuitMessage", 0);
        //Skip internal CallWindowProc
        return 1;
      }
    }

    var nSet = 0;
    if (((nCtrlState & 0x80) && (nAltState & 0x80)) ||
        (nAltGrState & 0x80))
    {
      nSet = 1;
    }
    // check special key combinations...
    if (nSet != 0)
    {
      var ch = convertSymbolCode(hWnd, wParam, nSet);
      if (ch != 0)
      {
        oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 0x0102 /*WM_CHAR*/, ch, lParam);
        //Skip internal CallWindowProc
        return 1;
      }
    }
  }
  else if (uMsg == 0x0002 /*WM_DESTROY*/)
  {
    //Exit message loop
    oSys.Call("user32::PostQuitMessage", 0);
  }
}

function convertSymbolCode(hWnd, wParam, nSet)
{
  var nLangId = getEditLangId(hWnd);
  var nLangFrom = eng;
  var nLangTo = (langTo1 == -1) ? default_langTo1 : langTo1;
  if (nLangId == 1049) /* rus */
  {
    nLangFrom = rus;
    nLangTo = (langTo2 == -1) ? default_langTo2 : langTo2;
  }
  else if (nLangId == 1058) /* ukr */
  {
    nLangFrom = ukr;
    nLangTo = (langTo2 == -1) ? default_langTo2 : langTo2;
  }

  if (nLangTo != nLangFrom)
  {
    if (nSet == 0)
    {
      // characters
      var nCase = 0;
      var ch = String.fromCharCode(wParam);
      var i = alph[nLangFrom][nCase].indexOf(ch);
      if (i < 0)
      {
        nCase = 1;
        i = alph[nLangFrom][nCase].indexOf(ch);
      }
      if (i >= 0)
      {
        if (i < alph[nLangTo][nCase].length)
        {
          ch = alph[nLangTo][nCase].charCodeAt(i);
          return ch;
        }
      }
    }
    else
    {
      // codes
      var nShiftState = oSys.Call("user32::GetKeyState", 0x10 /*VK_SHIFT: Shift*/);
      var nCase = (nShiftState & 0x80) ? (2*nSet + 1) : (2*nSet);
      var i;
      for (i = 0; i < alph[nLangFrom][nCase].length; i++)
      {
        if (alph[nLangFrom][nCase].charCodeAt(i) == wParam)
        {
          var ch = alph[nLangTo][nCase].charCodeAt(i);
          if (ch != wParam)
            return ch;
        }
      }
    }
  }
  return 0;
}

function getEditLangId(hEdit)
{
  var nEditThreadId = oSys.Call("user32::GetWindowThreadProcessId", hEdit, 0);
  var nLang = oSys.Call("user32::GetKeyboardLayout", nEditThreadId);
  return (nLang & 0xFFFF);
}

function getLang(s)
{
  var lang = -1;
  if (s == "eng")
    lang = eng;
  else if (s == "rus")
    lang = rus;
  else if (s == "ukr")
    lang = ukr;
  return lang;
}

function getScriptArg(argName)
{
  var s = "";
  argName = argName.toLowerCase();
  for (var n = 0; n < WScript.Arguments.length; n++)
  {
    var t = WScript.Arguments(n);
    var a = t.split("=");
    if (a[0].toLowerCase() == argName)
    {
      s = a[1];
      break;
    }
  }
  return s;
}

Он, правда, ориентирован на подмену нажатия клавиш - но подойдёт в качестве примера работы с массивами.
Locked