Scripts collection

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

Post by KDJ »

Preview html file in WebBrowser control.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=29221#p29221
// Version: 2016-08-05
// Author: KDJ
//
// *** Preview html file in WebBrowser control ***
//
// Usage:
//   Call("Scripts::Main", 1, "HtmlView.js")             - preview of currently edited file
//   Call("Scripts::Main", 1, "HtmlView.js", "htmlFile") - preview file/url specified as an argument
// Run from command line (required registration: regsvr32.exe Scripts.dll):
//   wscript.exe HtmlView.js
//   wscript.exe HtmlView.js htmlFile
//
// Argument:
//   htmlFile - full file name with path or url
//
// Keyboard and mouse:
//   F5 - reload current file/url (refresh)
//   Alt+Left - navigate backward
//   Alt+Right - navigate forward
//   Ctrl+A - select all text
//   Ctrl+C or Ctrl+Ins - copy selected text
//   Ctrl+F - find dialog
//   Ctrl+H or RClick on status bar - history
//   Ctrl+O or LClick on status bar - "Open" input box
//   F4 or Alt+Enter- maximize/restore window
//   Alt+Del - in "Open" dialog (ComboBox list) - remove item from history list
//
// Remarks:
//   This script should be saved in Unicode format.
//   WebBrowser control displays html in IE7 mode by default (https://msdn.microsoft.com/en-us/library/ee330730%28v=vs.85%29.aspx). To change it, you should add in registry, eg:
//     [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
//     "AkelPad.exe"=dword:00002af8
//     "wscript.exe"=dword:00002af8

if (typeof AkelPad == "undefined")
{
  try
  {
    AkelPad = new ActiveXObject("AkelPad.Document");
    _PtrAdd = function(n1, n2) {return AkelPad.Global._PtrAdd(n1, n2);};
    _X64    = AkelPad.Constants._X64;
    AkelPad.ActiveXThis(this);
  }
  catch (oError)
  {
    WScript.Echo("You need to register Scripts.dll");
    WScript.Quit();
  }
}

var IDCANCEL = 2;
var IDWB     = 1000;
var IDSB     = 1001;
var hMainWnd = AkelPad.GetMainWnd();
var oSys     = AkelPad.SystemFunction();
var hInstDLL = AkelPad.GetInstanceDll();
var sClass   = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstDLL;
var hDlg;

GetLangStrings();

if (IsScriptRunning())
  WScript.Quit();

var hIconSmall = oSys.Call("User32::LoadImageW",
                   hInstDLL, //hinst
                   101,      //lpszName
                   1,        //uType=IMAGE_ICON
                   16,       //cxDesired
                   16,       //cyDesired
                   0);       //fuLoad
var hIconBig = oSys.Call("User32::LoadImageW",
                 hInstDLL, //hinst
                 101,      //lpszName
                 1,        //uType=IMAGE_ICON
                 32,       //cxDesired
                 32,       //cyDesired
                 0);       //fuLoad
var aHotKey = [[0x1 /*MOD_ALT*/, 0x25 /*VK_LEFT*/],
               [0x1 /*MOD_ALT*/, 0x27 /*VK_RIGHT*/],
               [0x1 /*MOD_ALT*/, 0x0D /*VK_RETURN*/]];

var oFSO     = new ActiveXObject("Scripting.FileSystemObject");
var hAtlLib  = oSys.Call("Kernel32::LoadLibraryW", "Atl.dll");
var sWBTitle = "Shell.Explorer.2";
var nDlgX    = 200;
var nDlgY    = 100;
var nDlgW    = 600;
var nDlgH    = 400;
var bDlgMax  = 0;
var sLastDir = "";
var nHistMax = 15;
var aHist;
var hWndWB;
var hWndSB;
var oWB;

ReadIni();

if (oSys.Call("Atl::AtlAxWinInit"))
{
  AkelPad.ScriptNoMutex(0x11 /*ULT_LOCKSENDMESSAGE|ULT_UNLOCKSCRIPTSQUEUE*/);
  AkelPad.WindowRegisterClass(sClass);

  //0x50000000 = WS_VISIBLE|WS_CHILD
  //0x50000900 = WS_VISIBLE|WS_CHILD|SBARS_TOOLTIPS|SBARS_SIZEGRIP
  //0x90CF0040 = WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_SIZEBOX|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|DS_SETFONT
  AkelPad.CreateDialog(0, sClass, sTxtDlgTitle, 0x90CF0040, nDlgX, nDlgY, nDlgW, nDlgH, 0, DlgCallback, 0x2 /*CDF_PIXELS*/, 0, 0, "", 0, 0, "|",
    //ExSt, Class,                Title,    Style,      X, Y, W, H, ID,   lParam
    0x0000, "AtlAxWin",           sWBTitle, 0x50000000, 0, 0, 0, 0, IDWB, 0, "|",
    0x0000, "msctls_statusbar32", "",       0x50000900, 0, 0, 0, 0, IDSB, 0);

  if (hDlg)
    AkelPad.WindowGetMessage(0x4 /*WGM_KEYDOWNUP*/);

  AkelPad.WindowUnregisterClass(sClass);
}

oSys.Call("Kernel32::FreeLibrary", hAtlLib);
oSys.Call("User32::DestroyIcon", hIconSmall);
oSys.Call("User32::DestroyIcon", hIconBig);

function DlgCallback(hWnd, uMsg, wParam, lParam)
{
  var i;

  if (uMsg == 272 /*WM_INITDIALOG*/)
  {
    hDlg   = hWnd;
    hWndWB = GetDlgItem(hDlg, IDWB);
    hWndSB = GetDlgItem(hDlg, IDSB);

    SendMessage(hDlg, 128 /*WM_SETICON*/, 0 /*ICON_SMALL*/, hIconSmall);
    SendMessage(hDlg, 128 /*WM_SETICON*/, 1 /*ICON_BIG*/,   hIconBig);
    oSys.Call("User32::ShowWindow", hDlg, bDlgMax ? 3 /*SW_MAXIMIZE*/ : 1 /*SW_SHOWNORMAL*/);
    ResizeDlg();
    GetWBObject();

    if (oWB && (sWBTitle = GetFile(1)))
      Navigate(sWBTitle);
    else
      PostMessage(hDlg, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 0x8000 /*WM_APP*/)
    Navigate(GetTextSB());

  else if (uMsg == 36 /*WM_GETMINMAXINFO*/)
  {
    AkelPad.MemCopy(_PtrAdd(lParam, 24), 200, 3 /*DT_DWORD*/); //ptMinTrackSize_x
    AkelPad.MemCopy(_PtrAdd(lParam, 28), 200, 3 /*DT_DWORD*/); //ptMinTrackSize_y
  }

  else if (uMsg == 3 /*WM_MOVE*/)
  {
    if (! (oSys.Call("User32::IsZoomed", hDlg) || oSys.Call("User32::IsIconic", hDlg)))
      GetDlgPos();
  }

  else if (uMsg == 5 /*WM_SIZE*/)
  {
    if (wParam == 0 /*SIZE_RESTORED*/)
      GetDlgPos();

    ResizeDlg();
  }

  else if (uMsg == 6 /*WM_ACTIVATE*/)
  {
    if (LoWord(wParam))
    {
      for (i = 0; i < aHotKey.length; ++i)
        oSys.Call("User32::RegisterHotKey", hDlg, i, aHotKey[i][0], aHotKey[i][1]);
    }
    else
    {
      for (i = 0; i < aHotKey.length; ++i)
        oSys.Call("User32::UnregisterHotKey", hDlg, i);
    }
  }

  else if (uMsg == 786 /*WM_HOTKEY*/)
  {
    switch (wParam)
    {
      case 0: //Alt+Left
        try {oWB.GoBack();}
        catch (oError) {}
        break;
      case 1: //Alt+Right
        try {oWB.GoForward();}
        catch (oError) {}
        break;
      case 2: //Alt+Enter
        oSys.Call("User32::ShowWindow", hDlg, oSys.Call("User32::IsZoomed", hDlg) ? 9 /*SW_RESTORE*/ : 3 /*SW_MAXIMIZE*/);
    }
    }

  else if (uMsg == 256 /*WM_KEYDOWN*/)
  {
    if (wParam == 0x41 /*A key*/)
    {
      if (Ctrl() && (! Shift()) && (! Alt()))
        oWB.ExecWB(17 /*OLECMDID_SELECTALL*/, 0, 0, 0);
    }
    else if ((wParam == 0x43 /*C key*/) || (wParam == 0x2D /*VK_INSERT*/))
    {
      if (Ctrl() && (! Shift()) && (! Alt()))
        oWB.ExecWB(12 /*OLECMDID_COPY*/, 0, 0, 0);
    }
    else if (wParam == 0x46 /*F key*/)
    {
      if (Ctrl() && (! Shift()) && (! Alt()))
        oWB.ExecWB(32 /*OLECMDID_FIND*/, 0, 0, 0);
    }
    else if (wParam == 0x48 /*H key*/)
    {
      if (Ctrl() && (! Shift()) && (! Alt()))
        HistoryMenu(0);
    }
    else if (wParam == 0x4F /*O key*/)
    {
      if (Ctrl() && (! Shift()) && (! Alt()))
        Navigate(GetFile(0));
    }
    else if (wParam == 0x73 /*F4*/)
    {
      if ((!Ctrl()) && (! Shift()))
        oSys.Call("User32::ShowWindow", hDlg, oSys.Call("User32::IsZoomed", hDlg) ? 9 /*SW_RESTORE*/ : 3 /*SW_MAXIMIZE*/);
    }
    else if (wParam == 0x74 /*F5*/)
    {
      if ((!Ctrl()) && (! Shift()))
        oWB.Refresh();
    }
    else if (wParam == 0x09 /*VK_TAB*/)
      SetFocusWB();
  }

  else if (uMsg == 78 /*WM_NOTIFY*/)
  {
    if (wParam == IDSB)
    {
      switch (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 16 : 8), 3 /*DT_DWORD*/)) //NMMOUSE.NMHDR.code
      {
        case -2: //NM_CLICK
          Navigate(GetFile(0));
          break;
        case -5: //NM_RCLICK
          HistoryMenu(_PtrAdd(lParam, _X64 ? 32 : 20) /*NMMOUSE.pt*/);
      }
    }
  }

  else if (uMsg == 273 /*WM_COMMAND*/)
  {
    if (LoWord(wParam) == IDCANCEL)
      PostMessage(hDlg, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 16 /*WM_CLOSE*/)
  {
    WriteIni();
    AkelPad.DisconnectObject(oWB);
    oSys.Call("User32::PostQuitMessage", 0);
    oSys.Call("User32::DestroyWindow", hDlg);
  }

  return 0;
}

function LoWord(nDwNum)
{
  return nDwNum & 0xFFFF;
}

function HiWord(nDwNum)
{
  return (nDwNum >> 16) & 0xFFFF;
}

function Ctrl()
{
  return oSys.Call("User32::GetKeyState", 0x11 /*VK_CONTROL*/) & 0x8000;
}

function Shift()
{
  return oSys.Call("User32::GetKeyState", 0x10 /*VK_SHIFT*/) & 0x8000;
}

function Alt()
{
  return oSys.Call("user32::GetKeyState", 0x12 /*VK_MENU*/) & 0x8000;
}

function SendMessage(hWnd, uMsg, wParam, lParam)
{
  return AkelPad.SendMessage(hWnd, uMsg, wParam, lParam);
}

function PostMessage(hWnd, uMsg, wParam, lParam)
{
  return oSys.Call("User32::PostMessageW", hWnd, uMsg, wParam, lParam);
}

function SendDlgItemMessage(hWnd, nID, uMsg, wParam, lParam)
{
  return oSys.Call("User32::SendDlgItemMessageW", hWnd, nID, uMsg, wParam, lParam);
}

function GetDlgItem(hWnd, nID)
{
  return oSys.Call("User32::GetDlgItem", hWnd, nID);
}

function GetDlgPos()
{
  var lpRECT = AkelPad.MemAlloc(16 /*sizeof(RECT)*/);

  oSys.Call("User32::GetWindowRect", hDlg, lpRECT);
  nDlgX = AkelPad.MemRead(_PtrAdd(lpRECT,  0), 3 /*DT_DWORD*/);
  nDlgY = AkelPad.MemRead(_PtrAdd(lpRECT,  4), 3 /*DT_DWORD*/);
  oSys.Call("User32::GetClientRect", hDlg, lpRECT);
  nDlgW = AkelPad.MemRead(_PtrAdd(lpRECT,  8), 3 /*DT_DWORD*/);
  nDlgH = AkelPad.MemRead(_PtrAdd(lpRECT, 12), 3 /*DT_DWORD*/);

  AkelPad.MemFree(lpRECT);
}

function SetFocusWB()
{
  var oDoc = oWB.Document;

  if ((typeof oDoc == "object") && (oDoc != null))
  {
    if ((typeof oDoc.focus == "object") && (oDoc.focus != null))
      oDoc.focus();
  }
}

function GetTextSB()
{
  var sText    = "";
  var nTextLen = SendMessage(hWndSB, 1036 /*SB_GETTEXTLENGTHW*/, 0, 0);
  var lpText;

  if (nTextLen)
  {
    lpText = AkelPad.MemAlloc(nTextLen * 2 + 2);
    SendMessage(hWndSB, 1037 /*SB_GETTEXTW*/, 0, lpText);
    sText = AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/);
    AkelPad.MemFree(lpText);
  }

  return sText;
}

function SetTextSB(sText)
{
  SendMessage(hWndSB, 1035 /*SB_SETTEXTW*/, 0, sText);
  SendMessage(hWndSB, 1041 /*SB_SETTIPTEXTW*/, 0, sText);
}

function ResizeDlg()
{
  var lpRECT = AkelPad.MemAlloc(16 /*sizeof(RECT)*/);
  var nW, nH, nSBH;

  oSys.Call("User32::GetClientRect", hDlg, lpRECT);
  nW = AkelPad.MemRead(_PtrAdd(lpRECT,  8), 3 /*DT_DWORD*/);
  nH = AkelPad.MemRead(_PtrAdd(lpRECT, 12), 3 /*DT_DWORD*/);

  oSys.Call("User32::GetClientRect", hWndSB, lpRECT);
  nSBH = AkelPad.MemRead(_PtrAdd(lpRECT, 12), 3 /*DT_DWORD*/);
  AkelPad.MemFree(lpRECT);

  oSys.Call("User32::SetWindowPos",
    hWndWB, 0,
    0,
    0,
    nW,
    nH - nSBH,
    0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/);

  SendMessage(hWndSB, 5 /*WM_SIZE*/, 0, 0);
}

function GetWBObject()
{
  var lppUnknown = AkelPad.MemAlloc(_X64 ? 8 : 4 /*sizeof(IUnknown**)*/);
  var lpUnknown;

  if (oSys.Call("Atl::AtlAxGetControl", hWndWB, lppUnknown) == 0 /*S_OK*/)
  {
    lpUnknown  = AkelPad.MemRead(lppUnknown, 2 /*DT_QWORD*/);
    oWB        = AkelPad.VarDispatch(lpUnknown);
    oWB.Silent = true;
    AkelPad.ConnectObject(oWB, "WB_", "{34A715A0-6587-11D0-924A-0020AFC7AC4D}" /*DIID_DWebBrowserEvents2*/);
  }

  AkelPad.MemFree(lppUnknown);
}

function Navigate(sFile)
{
  if (sFile)
  {
    if (oWB.Busy)
      oWB.Stop();

    sWBTitle = sFile;
    HistoryAdd();
    SetTextSB(sFile);
    oWB.Navigate(sFile);
  }
}

function WB_NavigateComplete2(pDisp, URL)
{
  SetFocusWB();
}

function WB_DocumentComplete(pDisp, URL)
{
  SetTextSB(URL);
  SetFocusWB();
}

function IsScriptRunning()
{
  var sFile;

  if (hDlg = oSys.Call("User32::FindWindowExW", 0, 0, sClass, 0))
  {
    if (! oSys.Call("User32::IsWindowVisible", hDlg))
      oSys.Call("User32::ShowWindow", hDlg, 8 /*SW_SHOWNA*/);
    if (oSys.Call("User32::IsIconic", hDlg))
      oSys.Call("User32::ShowWindow", hDlg, 9 /*SW_RESTORE*/);
  
    oSys.Call("User32::SetForegroundWindow", hDlg);

    if (sFile = GetFile(2))
    {
      SendMessage(GetDlgItem(hDlg, IDSB), 12 /*WM_SETTEXT*/, 0, sFile);
      SendMessage(hDlg, 0x8000 /*WM_APP*/, 0, 0);
    }
  }

  return hDlg;
}

function GetFile(nOnInit)
{
  var sFile = "";

  if (nOnInit)
  {
    if (WScript.Arguments.length)
      sFile = LRTrim(WScript.Arguments(0));
    else
      sFile = AkelPad.GetEditFile(0);
  }

  if (sFile)
  {
    if ((! WScript.Arguments.length) && AkelPad.GetEditModified(0))
    {
      switch (AkelPad.MessageBox(hDlg, sTxtDocMod, sTxtDlgTitle, 0x23 /*MB_ICONQUESTION|MB_YESNOCANCEL*/))
      {
        case 6 /*IDYES*/:
          AkelPad.SaveFile(0, sFile);
          break;
        case 2 /*IDCANCEL*/:
          sFile = "";
      }
    }
  }
  else if (nOnInit < 2)
  {
    if (nOnInit == 1)
    {
      if (aHist.length)
        sFile = aHist[0];
      else
      {
        if (hMainWnd)
          sFile = AkelPad.GetAkelDir(2 /*ADTYPE_DOCS*/) + "\\AkelHelp-Eng.htm";
        else
          sFile = "http://akelpad.sourceforge.net";
      }
    }
    else
      sFile = sWBTitle;

    sFile = InputBox(sFile);

    if (sFile)
      sFile = LRTrim(sFile);
  }

  return sFile;
}

function LRTrim(sText)
{
  return sText.replace(/^\s+|\s+$/g, "");
}

function HistoryAdd()
{
  var i;

  for (i = aHist.length - 1; i >= 0; --i)
  {
    if (aHist[i].toLowerCase() == sWBTitle.toLowerCase())
      aHist.splice(i, 1);
  }

  aHist.unshift(sWBTitle);

  if (aHist.length > nHistMax)
    aHist.length = nHistMax;
}

function HistoryMenu(lpPOINT)
{
  if (! aHist.length)
    return;

  var MF_STRING    = 0x0000;
  var MF_SEPARATOR = 0x0800;
  var nFlags = 0x01A0 /*TPM_RETURNCMD|TPM_NONOTIFY|TPM_BOTTOMALIGN*/;
  var hMenu  = oSys.Call("User32::CreatePopupMenu");
  var lpRECT;
  var nX, nY;
  var nCmd;
  var i;

  if (lpPOINT)
  {
    //menu from mouse
    oSys.Call("User32::ClientToScreen", hWndSB, lpPOINT);
    nX = AkelPad.MemRead(_PtrAdd(lpPOINT, 0), 3 /*DT_DWORD*/);
    nY = AkelPad.MemRead(_PtrAdd(lpPOINT, 4), 3 /*DT_DWORD*/);
    nFlags |= 0x0004 /*TPM_CENTERALIGN*/;
  }
  else
  {
    lpRECT = AkelPad.MemAlloc(16 /*sizeof(RECT)*/);
    oSys.Call("User32::GetWindowRect", hWndSB, lpRECT);
    nX = AkelPad.MemRead(_PtrAdd(lpRECT, 0), 3 /*DT_DWORD*/);
    nY = AkelPad.MemRead(_PtrAdd(lpRECT, 4), 3 /*DT_DWORD*/);
    AkelPad.MemFree(lpRECT);
  }

  for (i = 0; i < aHist.length; ++i)
    oSys.Call("User32::AppendMenuW", hMenu, MF_STRING, i + 1, aHist[i]);

  oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR, 0, 0);
  oSys.Call("User32::AppendMenuW", hMenu, MF_STRING, aHist.length + 1, sTxtClearHist);

  nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, nFlags, nX, nY, 0, hDlg, 0);

  oSys.Call("User32::DestroyMenu", hMenu);

  if (nCmd--)
  {
    if (nCmd == aHist.length)
      aHist.length = 0;
    else
      Navigate(aHist[nCmd]);
  }
}

function InputBox(sText)
{
  var IDSTATIC   = -1;
  var IDOK       = 1;
  var IDCOMBO    = 9000;
  var IDBROWSE   = 9001;
  var nLimitText = 2048;
  var lpText     = AkelPad.MemAlloc((nLimitText + 1) * 2);
  var hWndIB;
  var hWndCB;

  //0x50000000 = WS_VISIBLE|WS_CHILD
  //0x50010000 = WS_VISIBLE|WS_CHILD|WS_TABSTOP
  //0x50010001 = WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_DEFPUSHBUTTON
  //0x50010042 = WS_VISIBLE|WS_CHILD|WS_TABSTOP|CBS_AUTOHSCROLL|CBS_DROPDOWN
  //0x90C80040 = WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|DS_SETFONT
  AkelPad.CreateDialog(0, sClass, sTxtOpen, 0x90C80040, 0, 0, 400, 90, hDlg, InputBoxCallback, 0x3 /*CDF_PIXELS|CDF_MODAL*/, 0, 0, "", 0, 0, "|",
    //ExSt, Class,      Title,              Style,        X,  Y,   W,   H, ID,       lParam
    0x0000, "STATIC",   sTxtFileUrl,        0x50000000,  10, 10, 380,  13, IDSTATIC, 0, "|",
    0x0000, "COMBOBOX", "",                 0x50010042,  10, 26, 380, 300, IDCOMBO,  0, "|",
    0x0000, "BUTTON",   sTxtOK,             0x50010001, 130, 57,  80,  23, IDOK,     0, "|",
    0x0000, "BUTTON",   sTxtCancel,         0x50010000, 220, 57,  80,  23, IDCANCEL, 0, "|",
    0x0000, "BUTTON",   sTxtBrowse + "...", 0x50010000, 310, 57,  80,  23, IDBROWSE, 0);

  sText = AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/);
  AkelPad.MemFree(lpText);
  return sText;

  function InputBoxCallback(hWnd, uMsg, wParam, lParam)
  {
    var i;

    if (uMsg == 272 /*WM_INITDIALOG*/)
    {
      hWndIB = hWnd;
      hWndCB = GetDlgItem(hWndIB, IDCOMBO);

      SendMessage(hWndIB, 128 /*WM_SETICON*/, 0 /*ICON_SMALL*/, hIconSmall);

      SendMessage(hWndCB, 341 /*CB_SETEXTENDEDUI*/, 1, 0);
      SendMessage(hWndCB, 321 /*CB_LIMITTEXT*/, nLimitText, 0);
      SendMessage(hWndCB, 12 /*WM_SETTEXT*/, 0, sText);
      for (i = 0; i < aHist.length; ++i)
        SendMessage(hWndCB, 323 /*CB_ADDSTRING*/, 0, aHist[i]);

      InputBoxCenter();
    }

    else if (uMsg == 786 /*WM_HOTKEY*/)
    {
      if (wParam == 1)
        HistoryDelete();
    }

    else if (uMsg == 273 /*WM_COMMAND*/)
    {
      switch (LoWord(wParam))
      {
        case IDCOMBO:
          switch (HiWord(wParam))
          {
            case 7: //CBN_DROPDOWN
              oSys.Call("User32::RegisterHotKey", hWndIB, 1, 0x1 /*MOD_ALT*/, 0x2E /*VK_DELETE*/);
              break;
            case 8: //CBN_CLOSEUP
              oSys.Call("User32::UnregisterHotKey", hWndIB, 1);
          }
          break;
        case IDOK:
          SendMessage(hWndCB, 13 /*WM_GETTEXT*/, nLimitText + 1, lpText);
        case IDCANCEL:
          oSys.Call("User32::EndDialog", hWndIB, 0);
          break;
        case IDBROWSE:
          GetOpenFileName();
      }
    }

    return 0;
  }

  function InputBoxCenter()
  {
    var lpRECT1 = AkelPad.MemAlloc(16 /*sizeof(RECT)*/);
    var lpRECT2 = AkelPad.MemAlloc(16 /*sizeof(RECT)*/);
    var nX, nY;

    oSys.Call("User32::GetWindowRect", hDlg,   lpRECT1);
    oSys.Call("User32::GetWindowRect", hWndIB, lpRECT2);
    nX = (AkelPad.MemRead(_PtrAdd(lpRECT1,  0), 3 /*DT_DWORD*/) + AkelPad.MemRead(_PtrAdd(lpRECT1,  8), 3 /*DT_DWORD*/) + AkelPad.MemRead(_PtrAdd(lpRECT2,  0), 3 /*DT_DWORD*/) - AkelPad.MemRead(_PtrAdd(lpRECT2,  8), 3 /*DT_DWORD*/)) / 2;
    nY = (AkelPad.MemRead(_PtrAdd(lpRECT1,  4), 3 /*DT_DWORD*/) + AkelPad.MemRead(_PtrAdd(lpRECT1, 12), 3 /*DT_DWORD*/) + AkelPad.MemRead(_PtrAdd(lpRECT2,  4), 3 /*DT_DWORD*/) - AkelPad.MemRead(_PtrAdd(lpRECT2, 12), 3 /*DT_DWORD*/)) / 2;
    AkelPad.MemFree(lpRECT1);
    AkelPad.MemFree(lpRECT2);

    oSys.Call("User32::SetWindowPos", hWndIB, 0, nX, nY, 0, 0, 0x15 /*SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE*/);
  }

  function HistoryDelete()
  {
    var nSel = SendMessage(hWndCB, 327 /*CB_GETCURSEL*/, 0, 0);

    if (nSel >= 0)
    {
      aHist.splice(nSel, 1);
      SendMessage(hWndCB, 324 /*CB_DELETESTRING*/, nSel, 0);

      if (nSel == aHist.length)
        --nSel;

      if (nSel == -1)
        SendMessage(hWndCB, 335 /*CB_SHOWDROPDOWN*/, 0, 0);
      else
        SendMessage(hWndCB, 334 /*CB_SETCURSEL*/, nSel, 0);
    }
  }

  function GetOpenFileName()
  {
    var sFilter  = "*.htm; *.html\0*.htm;*.html\0*.*\0*.*\0\0";
    var sTitle   = sTxtBrowse.replace("&", "");
    var lpRECT   = AkelPad.MemAlloc(16 /*sizeof(RECT)*/);
    var lpCurDir = AkelPad.MemAlloc(260 * 2);
    var lpFilter = AkelPad.MemAlloc((sFilter.length + 1) * 2);
    var lpFile   = AkelPad.MemAlloc(260 * 2);
    var lpDir    = AkelPad.MemAlloc(260 * 2);
    var lpTitle  = AkelPad.MemAlloc((sTitle.length + 1) * 2);
    var nOFNSize = _X64 ? 152 : 88 /*sizeof(OPENFILENAME)*/;
    var lpOFN    = AkelPad.MemAlloc(nOFNSize);
    var nFlags   = 0x02081026 /*OFN_DONTADDTORECENT|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_ENABLEHOOK|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT*/;
    var sCurDir;
    var hWndOwn;
    var nX, nY;
    var bOpen;

    oSys.Call("Kernel32::GetCurrentDirectoryW", 260, lpCurDir);
    sCurDir = AkelPad.MemRead(lpCurDir, 1 /*DT_UNICODE*/);

    oSys.Call("User32::GetWindowRect", hWndCB, lpRECT);
    nX = AkelPad.MemRead(_PtrAdd(lpRECT,  0), 3 /*DT_DWORD*/);
    nY = AkelPad.MemRead(_PtrAdd(lpRECT, 12), 3 /*DT_DWORD*/) + 3;

    hWndOwn = oSys.Call("User32::CreateWindowExW", 0, "STATIC", 0, 0x80000000 /*WS_POPUP*/, nX, nY, 0, 0, hWndIB, 0, hInstDLL, 0);

    AkelPad.MemCopy(lpFilter, sFilter, 1 /*DT_UNICODE*/);
    AkelPad.MemCopy(lpTitle,  sTitle,  1 /*DT_UNICODE*/);
    AkelPad.MemCopy(lpDir, oFSO.FolderExists(sLastDir) ? sLastDir : sCurDir, 1 /*DT_UNICODE*/);

    AkelPad.MemCopy(_PtrAdd(lpOFN,               0), nOFNSize, 3 /*DT_DWORD*/); //lStructSize
    AkelPad.MemCopy(_PtrAdd(lpOFN, _X64 ?   8 :  4),  hWndOwn, 2 /*DT_QWORD*/); //hwndOwner
    AkelPad.MemCopy(_PtrAdd(lpOFN, _X64 ?  24 : 12), lpFilter, 2 /*DT_QWORD*/); //lpstrFilter
    AkelPad.MemCopy(_PtrAdd(lpOFN, _X64 ?  44 : 24),        1, 3 /*DT_DWORD*/); //nFilterIndex
    AkelPad.MemCopy(_PtrAdd(lpOFN, _X64 ?  48 : 28),   lpFile, 2 /*DT_QWORD*/); //lpstrFile
    AkelPad.MemCopy(_PtrAdd(lpOFN, _X64 ?  56 : 32),      260, 3 /*DT_DWORD*/); //nMaxFile
    AkelPad.MemCopy(_PtrAdd(lpOFN, _X64 ?  80 : 44),    lpDir, 2 /*DT_QWORD*/); //lpstrInitialDir
    AkelPad.MemCopy(_PtrAdd(lpOFN, _X64 ?  88 : 48),  lpTitle, 2 /*DT_QWORD*/); //lpstrTitle
    AkelPad.MemCopy(_PtrAdd(lpOFN, _X64 ?  96 : 52),   nFlags, 3 /*DT_DWORD*/); //Flags

    oSys.Call("User32::EnableWindow", hWndIB, 0);

    bOpen = oSys.Call("Comdlg32::GetOpenFileNameW", lpOFN);

    oSys.Call("User32::EnableWindow", hWndIB, 1);
    oSys.Call("User32::DestroyWindow", hWndOwn);
    oSys.Call("Kernel32::SetCurrentDirectoryW", sCurDir);

    if (bOpen)
    {
      sLastDir = oFSO.GetParentFolderName(AkelPad.MemRead(lpFile, 1 /*DT_UNICODE*/));
      SendMessage(hWndCB, 12 /*WM_SETTEXT*/, 0, lpFile);
      oSys.Call("User32::SetFocus", hWndCB);
      SendDlgItemMessage(hWndIB, IDOK,     244 /*BM_SETSTYLE*/, 1 /*BS_DRFPUSHBUTTON*/, 1)
      SendDlgItemMessage(hWndIB, IDCANCEL, 244 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1)
      SendDlgItemMessage(hWndIB, IDBROWSE, 244 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1)
    }

    AkelPad.MemFree(lpRECT);
    AkelPad.MemFree(lpCurDir);
    AkelPad.MemFree(lpFilter);
    AkelPad.MemFree(lpFile);
    AkelPad.MemFree(lpDir);
    AkelPad.MemFree(lpTitle);
    AkelPad.MemFree(lpOFN);
  }
}

function ReadIni()
{
  var sFile = WScript.ScriptFullName.replace(/js$/i, "ini");
  var oFile;

  if (oFSO.FileExists(sFile))
  {
    oFile = oFSO.OpenTextFile(sFile, 1, false, -1);

    try
    {
      eval(oFile.ReadAll());
    }
    catch (oError)
    {}

    oFile.Close();
  }

  if (! aHist)
    aHist = [];
}

function WriteIni()
{
  var oFile = oFSO.OpenTextFile(WScript.ScriptFullName.replace(/js$/i, "ini"), 2, true, -1);
  var sText =
    'nDlgX='     + nDlgX + ';\r\n' +
    'nDlgY='     + nDlgY + ';\r\n' +
    'nDlgW='     + nDlgW + ';\r\n' +
    'nDlgH='     + nDlgH + ';\r\n' +
    'bDlgMax='   + oSys.Call("User32::IsZoomed", hDlg) + ';\r\n' +
    'sLastDir="' + sLastDir.replace(/[\\"]/g, '\\$&') + '";\r\naHist=[';

  for (var i = 0; i < aHist.length; ++i)
    sText += '"' + aHist[i].replace(/[\\"]/g, '\\$&') + ((i < aHist.length - 1) ? '",' : '"');

  sText += '];\r\n';

  oFile.Write(sText);
  oFile.Close();
}

function GetLangStrings()
{
  if ((hMainWnd && (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1045)) || ((! hMainWnd) && (oSys.Call("Kernel32::GetUserDefaultLangID") == 1045))) //Polish
  {
    sTxtDlgTitle  = "Podgląd HTML";
    sTxtDocMod    = "Dokument został zmodyfikowany. Czy zapisać go przed podglądem?";
    sTxtOpen      = "Otwórz";
    sTxtFileUrl   = "Nazwa pliku lub url:";
    sTxtOK        = "OK";
    sTxtCancel    = "Anuluj";
    sTxtBrowse    = "&Przeglądaj";
    sTxtClearHist = "Wyczyść historię";
  }
  else if ((hMainWnd && (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1049)) || ((! hMainWnd) && (oSys.Call("Kernel32::GetUserDefaultLangID") == 1049))) //Russian
  {
    //translated by Skif_off
    sTxtDlgTitle  = "Просмотр HTML";
    sTxtDocMod    = "Документ был изменен. Хотите сохранить перед просмотром?";
    sTxtOpen      = "Open";
    sTxtFileUrl   = "Имя файла или url:";
    sTxtOK        = "OK";
    sTxtCancel    = "Cancel";
    sTxtBrowse    = "&Browse";
    sTxtClearHist = "Clear history";
  }
  else
  {
    sTxtDlgTitle  = "HTML view";
    sTxtDocMod    = "Document was modified. Do you want to save it before viewing?";
    sTxtOpen      = "Open";
    sTxtFileUrl   = "File name or url:";
    sTxtOK        = "OK";
    sTxtCancel    = "Cancel";
    sTxtBrowse    = "&Browse";
    sTxtClearHist = "Clear history";
  }
}

Last edited by KDJ on Fri Aug 05, 2016 9:26 pm, edited 14 times in total.

Offline
Posts: 202
Joined: Sat Mar 28, 2015 2:36 pm
Location: Russia

Post by Kley »

Swap text, words, lines.

Code: Select all

//  ============================================================================
//  Version: 2015-09-21
//  Author: Kley
//
//  *** Поменять текст местами (Swap text) ***
//
//  Arguments:
//  -word=true  запомнить/заменить слово под кареткой;
//  -undo=true  отменить выбор текста.
//
//  Usage:
//  Call("Scripts::Main", 1, "SwapText.js")
//
//  Note:
//  Скрипт работает в два клика:
//   1 - запоминается выделенный текст, строка или слово под кареткой;
//   2 - заменяется выделенный текст, строка или слово под кареткой.
//  Блочное выделение не поддерживается.
//  Замена выполняется только в текущем документе.
//  ============================================================================
//Arguments
var bWord = AkelPad.GetArgValue("word", false);
var bUndo = AkelPad.GetArgValue("undo", false);

var oSet = AkelPad.ScriptSettings();

if (bUndo)
{
  DeleteSavedParam();
  WScript.Quit();
}

var oSys = AkelPad.SystemFunction();
var hWndEdit = AkelPad.GetEditWnd();
var oSavParam = {wnd:0, min:0, max:0, txt:""};
var oCurParam = {wnd:0, min:0, max:0, txt:""};
var lpPoint64;

if (hWndEdit)
{
  if (!AkelPad.GetEditReadOnly(hWndEdit))
  {
    ReadSavedParam();
    GetCurrentParam();

    if (!oSavParam.wnd || (oSavParam.wnd != hWndEdit))
      WriteCurrentParam();
    else
    {
      if (lpPoint64 = AkelPad.MemAlloc(_X64?16:8 /*sizeof(POINT64)*/))
        SendMessage(hWndEdit, 3179 /*AEM_GETSCROLLPOS*/, 0, lpPoint64);

      SetRedraw(hWndEdit, false);
      BeginUndoAction();

      if (oCurParam.max > oSavParam.max)
      {
        if (oCurParam.min >= oSavParam.max)
        {
          ReplaceText(oSavParam.txt, oCurParam.min, oCurParam.max);
          ReplaceText(oCurParam.txt, oSavParam.min, oSavParam.max);
          AkelPad.SetSel(oCurParam.max, oCurParam.max);
        }
      }
      else if (oSavParam.min >= oCurParam.max)
      {
          ReplaceText(oCurParam.txt, oSavParam.min, oSavParam.max);
          ReplaceText(oSavParam.txt, oCurParam.min, oCurParam.max);
      }

      DeleteSavedParam();
      StopUndoAction();

      if (lpPoint64)
      {
        SendMessage(hWndEdit, 3180 /*AEM_SETSCROLLPOS*/, 0, lpPoint64);
        AkelPad.MemFree(lpPoint64);
      }
      SendMessage(hWndEdit, 3376 /*AEM_UPDATESCROLLBAR*/, 3, 0);
      SetRedraw(hWndEdit, true);
    }
  }
}

function ReadSavedParam()
{
  if (oSet.Begin("", 0x1 /*POB_READ*/))
  {
    oSavParam.wnd = oSet.Read("hwnd", 1 /*PO_DWORD*/);
    oSavParam.min = oSet.Read("min",  1 /*PO_DWORD*/);
    oSavParam.max = oSet.Read("max",  1 /*PO_DWORD*/);
    oSavParam.txt = oSet.Read("txt", 20 /*PO_BINARYSTRING*/);

    oSet.End();
  }
}

function WriteCurrentParam()
{
  if (oSet.Begin("", 0x2 /*POB_SAVE*/))
  {
    oSet.Write("hwnd", 1 /*PO_DWORD*/,  oCurParam.wnd);
    oSet.Write("min",  1 /*PO_DWORD*/,  oCurParam.min);
    oSet.Write("max",  1 /*PO_DWORD*/,  oCurParam.max);
    oSet.Write("txt",  2 /*PO_BINARY*/, oCurParam.txt);

    oSet.End();
  }
}

function DeleteSavedParam()
{
  if (oSet.Begin("", 0x6 /*POB_SAVE|POB_CLEAR*/))
    oSet.End();
}

function GetCurrentParam()
{
  if (bWord)
    GetWordUnderCaret();
  else
  {
    if (oCurParam.txt = AkelPad.GetSelText())
    {
      oCurParam.wnd = hWndEdit;
      oCurParam.min = AkelPad.GetSelStart();
      oCurParam.max = AkelPad.GetSelEnd();
    }
    else
      GetStringUnderCaret();
  }
}

function GetWordUnderCaret()
{
  var nCaretPos = AkelPad.GetSelStart();

  oCurParam.wnd = hWndEdit;
  oCurParam.min = SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK*/, 0/*WB_LEFT*/, nCaretPos);
  oCurParam.max = SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK*/, 7/*WB_RIGHTBREAK*/, oCurParam.min);

  if (oCurParam.max < nCaretPos)
  {
    oCurParam.min = SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK*/, 0/*WB_LEFT*/, nCaretPos + 1);
    oCurParam.max = SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK*/, 7/*WB_RIGHTBREAK*/, oCurParam.min);
  }
  oCurParam.txt = AkelPad.GetTextRange(oCurParam.min, oCurParam.max);
}

function GetStringUnderCaret()
{
  var nCaretPos = GetOffset(hWndEdit, 5 /*AEGI_CARETCHAR*/, -1);

  oCurParam.wnd = hWndEdit;
  oCurParam.min = GetOffset(hWndEdit, 18 /*AEGI_WRAPLINEBEGIN*/, nCaretPos);
  oCurParam.max = GetOffset(hWndEdit, 19 /*AEGI_WRAPLINEEND*/,   nCaretPos);
  oCurParam.txt = AkelPad.GetTextRange(oCurParam.min, oCurParam.max);
}

function GetOffset(hWnd, nType, nOffset)
{
  var lpIndex;

  if (lpIndex = AkelPad.MemAlloc(_X64?24:12 /*sizeof(AECHARINDEX)*/))
  {
    if (nOffset != -1)
      SendMessage(hWnd, 3137 /*AEM_RICHOFFSETTOINDEX*/, nOffset, lpIndex);
    SendMessage(hWnd, 3130 /*AEM_GETINDEX*/, nType, lpIndex);
    nOffset = SendMessage(hWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex);
    AkelPad.MemFree(lpIndex);
  }
  return nOffset;
}

function ReplaceText(pText, nStart, nEnd)
{
  AkelPad.SetSel(nStart, nEnd);
  AkelPad.ReplaceSel(pText);
}

function BeginUndoAction()
{
  SendMessage(hWndEdit, 3080 /*AEM_STOPGROUPTYPING*/, 0, 0);
  SendMessage(hWndEdit, 3081 /*AEM_BEGINUNDOACTION*/, 0, 0);
}

function StopUndoAction()
{
  SendMessage(hWndEdit, 3082 /*AEM_ENDUNDOACTION*/,   0, 0);
  SendMessage(hWndEdit, 3080 /*AEM_STOPGROUPTYPING*/, 0, 0);
}

function SetRedraw(hWnd, bRedraw)
{
  SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
  if (bRedraw) oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}

function SendMessage(hWnd, uMsg, wParam, lParam)
{
  return oSys.Call("User32::SendMessageW", hWnd, uMsg, wParam, lParam);
}

Offline
Posts: 202
Joined: Sat Mar 28, 2015 2:36 pm
Location: Russia

Post by Kley »

Create a backup of the current file.

Code: Select all

//  ============================================================================
//  Version: 2015-10-09
//  Author: Kley
//
//  Description(1033): Create a backup of the current file.
//  Description(1049): Создание резервной копии текущего файла.
//
//  Arguments:
//  -dir="c:\bak"    - папка для сохранения копий (по умолчанию: папка редактируемого файла;
//                                                        для новых файлов - папка AkelPad);
//  -file="tmp.ext"  - имя для новых файлов (по умолчанию "NewDoc");
//  -post="-copy"    - приставка добавляемая после имени файла (по умолчанию "_backup");
//                      - %%d вставить дату и время в заданном формате
//  -pref="copy-"    - приставка добавляемая перед именем файла (по умолчанию "");
//                      - %%d вставить дату и время в заданном формате
//  -dataformat=""   - описание формата смотри в InsertDate.js Shengalts Aleksander aka Instructor
//                     (http://akelpad.sourceforge.net/en/plugins.php#Scripts)
//  -stat=true       - сохранять текущее состояние документа (по умолчанию false - сохраненный или новый файл).
//
//  Usage:
//  Call("Scripts::Main", 1, "BackUpCurrentFile.js", `-post="_[%%d]" -dataformat="dd.MM.yyyy"`)
//  ============================================================================
//Arguments
var pDir  = AkelPad.GetArgValue("dir",                          "");
var pFile = AkelPad.GetArgValue("file",                   "NewDoc");
var pPost = AkelPad.GetArgValue("post",                  "_backup");
var pPref = AkelPad.GetArgValue("pref",                         "");
var pData = AkelPad.GetArgValue("dataformat", "yyyy.MM.dd-H.mm.ss");
var bStat = AkelPad.GetArgValue("stat",                      false);

var oFSO = new ActiveXObject("Scripting.FileSystemObject");
var pEditFile = AkelPad.GetEditFile(0);
var pNewFile;
var nResult = 1;

if (AkelPad.GetEditWnd())
{
  if (!pDir && pEditFile)
    pDir = AkelPad.GetFilePath(pEditFile, 1 /*CPF_DIR*/);
  else if (!pDir && !pEditFile)
    pDir = AkelPad.GetAkelDir();

  if (oFSO.FolderExists(pDir) == false)
    oFSO.CreateFolder(pDir);

  if (pEditFile)
    pFile = AkelPad.GetFilePath(pEditFile, 2 /*CPF_FILENAME*/);

  pNewFile = NextName(pDir + "\\" + pFile);

  if (pEditFile)
  {
    if (bStat)
      nResult = AkelPad.SaveFile(0, pNewFile, -1, -1, 0);
    else
    {
      oFSO.CopyFile(pEditFile, pNewFile, false);
      nResult = 0;
    }
  }
  else
    nResult = AkelPad.SaveFile(0, pNewFile, -1, -1, 0);

  if (nResult == 0)
  {
    if ((AkelPad.MessageBox(AkelPad.GetMainWnd(),
                            GetLangString(0) + "\n\n" + GetLangString(1) + " ''" +
                            AkelPad.GetFilePath(pNewFile, 2 /*CPF_FILENAME*/) + "'' ?",
                            "BackUp File", 324 /*MB_YESNO|MB_ICONINFORMATION|MB_DEFBUTTON2*/)) == 6 /*IDYES*/)
      AkelPad.OpenFile(pNewFile);
  }
  else
  {
    if (nResult != -4 /*ESD_CODEPAGEERROR*/)
      AkelPad.MessageBox(AkelPad.GetMainWnd(),
                         GetLangString(3).replace(/%d/, "" + nResult), "BackUp File", 16 /*MB_ICONERROR*/);
  }
}

function NextName(pPath)
{
  var sDir  = AkelPad.GetFilePath(pPath, 1 /*CPF_DIR*/);
  var sName = AkelPad.GetFilePath(pPath, 3 /*CPF_FILEBASENAME*/);
  var sExt  = AkelPad.GetFilePath(pPath, 4 /*CPF_FILEEXT*/);
  var i     = 0;

  pPost = pPost.replace(/%d/, "" + TimeFormat(pData));
  pPref = pPref.replace(/%d/, "" + TimeFormat(pData));

  sName = CorrectFileName(pPref + sName + pPost);
  pPath = sDir + "\\" + sName + "." + sExt;

  while (oFSO.FileExists(pPath))
    pPath = sDir + "\\" + sName + ++i + "." + sExt;

  return pPath;
}

function CorrectFileName(pFileName)
{
  pFileName = pFileName.replace(/\t+/g, " ");               //заменить табуляцию на пробел
  pFileName = pFileName.replace(/[\\\/:\*\?"{}<>\|]/g, ""); //удалить запрещенные символы
  pFileName = pFileName.replace(/(^ +)|( +$)/g, "");        //удалить пробелы по краям строк
  return pFileName;
}

//Функция из скрипта InsertDate.js (v.1.0) Shengalts Aleksander aka Instructor
//http://akelpad.sourceforge.net/en/plugins.php#Scripts
function TimeFormat(pFormat)
{
  var oSys=AkelPad.SystemFunction();
  var lpFormatBuffer;
  var lpTimeBuffer;
  var pTime="";

  if (lpFormatBuffer=AkelPad.MemAlloc(256 * _TSIZE))
  {
    AkelPad.MemCopy(lpFormatBuffer, pFormat.substr(0, 255), _TSTR);

    if (lpTimeBuffer=AkelPad.MemAlloc(256 * _TSIZE))
    {
      oSys.Call("kernel32::GetTimeFormat" + _TCHAR, 1024 /*LOCALE_USER_DEFAULT*/, 0, 0, lpFormatBuffer, lpTimeBuffer);
      oSys.Call("kernel32::GetDateFormat" + _TCHAR, 1024 /*LOCALE_USER_DEFAULT*/, 0, 0, lpTimeBuffer, lpFormatBuffer, 256);
      pTime=AkelPad.MemRead(lpFormatBuffer, _TSTR);

      AkelPad.MemFree(lpTimeBuffer);
    }
    AkelPad.MemFree(lpFormatBuffer);
  }
  return pTime;
}

function GetLangString(nStringID)
{
  var nLangID = AkelPad.GetLangId(1 /*LANGID_PRIMARY*/);

  if (nLangID == 0x19) //LANG_RUSSIAN
  {
    if (nStringID == 0) return "Резервная копия текущего файла создана.";
    if (nStringID == 1) return "Открыть файл";
    if (nStringID == 3) return "Ошибка: %d";
  }
  else
  {
    if (nStringID == 0) return "A backup copy of the current file is created.";
    if (nStringID == 1) return "Open file";
    if (nStringID == 3) return "Error: %d";
  }
}

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

Post by KDJ »

Run script/method/batch on tabs MDI.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=30006#p30006
// Version: 2015-12-14
// Author: KDJ
//
// *** Run script/method/batch on tabs MDI ***
//
// Usage:
//   Call("Scripts::Main", 1, "RunScriptOnTabs.js", `-cmd='script, method or batch file' -par='script parameters' -tab=0`)
//
// Arguments (are optional):
//   -cmd - can be:
//     - script name without path (*.js or *.vbs)
//     - single Scripts method ("AkelPad." can be ommited)
//     - batch file name; if path is ommited, file should be located in AkelPad Scripts directory
//     if -cmd is not specified, default value is batch file named as the script base name with extension .tsv (eg: RunScriptOnEachTab.tsv)
//   -par - parameters passed to the script (if cmd contains script name)
//   -tab - number:
//     0 - displays question box (default)
//     1 - run on current tab without question
//     2 - run on each tab without question
//     if -cmd contains batch file and -tab is not specified, will be used value defined in batch file
//
// Run script examples:
//   Call("Scripts::Main", 1, "RunScriptOnTabs.js", `-cmd='FontIniRestore.vbs' -tab=2`)
//   Call("Scripts::Main", 1, "RunScriptOnTabs.js", `-cmd='SelectRange.js' -par='-Range="2-15"'`)
// Run method examples:
//   Call("Scripts::Main", 1, "RunScriptOnTabs.js", `-cmd='AkelPad.SetSel(10, 200, 1 /*AESELT_COLUMNON*/)'`)
//   Call("Scripts::Main", 1, "RunScriptOnTabs.js", `-cmd='Command(4108 /*IDM_FILE_PRINT*/)'`)
// Run batch examples:
//   Call("Scripts::Main", 1, "RunScriptOnTabs.js")
//   Call("Scripts::Main", 1, "RunScriptOnTabs.js", `-cmd='RunScriptOnEachTab_batch.tsv'`)
//
// Batch file example:
//   *this is comment line
//   *file should be saves as UTF-16LE with BOM
//   *each line can contain a single script/method or tab parameter definition
//   *after script name you can specify script parameters; both values should be separated by one tab character
//   *to set tab parameter to 1: #tab=1 (see -tab argument description)
//   *setting #tab will be ignored if argument -tab has been passed to the script
//   *example, delete lines from 2 to 15 in all opened documents without question:
//   #tab=2
//   SelectRange.js	-Range="2-15"
//   ReplaceSel("")

if (! AkelPad.GetEditWnd())
  WScript.Quit();

var oFSO     = new ActiveXObject("Scripting.FileSystemObject");
var hMainWnd = AkelPad.GetMainWnd();
var sDir     = AkelPad.GetAkelDir(5 /*ADTYPE_SCRIPTS*/) + "\\";
var sCmd     = AkelPad.GetArgValue("cmd", WScript.ScriptBaseName + ".tsv").replace(/^\s+|\s+$/g, "");
var sPar     = AkelPad.GetArgValue("par", "").replace(/^\s+|\s+$/g, "");
var nTab     = AkelPad.GetArgValue("tab", nTab);
var aCmd     = [];
var sMsg     = "";
var nFrames;
var aFrame;
var nChoice;
var i, n;

if (/\.tsv$/i.test(sCmd))
{
  if (! /\\/.test(sCmd))
    sCmd = sDir + sCmd;

  if (CheckBatch(sCmd))
    sMsg = "Batch file:\n" + sCmd + "\n\n";
  else
    WScript.Quit();
}
else if (/.+\.(js|vbs)$/i.test(sCmd))
{
  if (oFSO.FileExists(sDir + sCmd))
    aCmd[0] = [true, sCmd, sPar];
  else
  {
    AkelPad.MessageBox(hMainWnd, "The script does not exists:\n" + sCmd, WScript.ScriptName, 0x10 /*MB_ICONERROR*/);
    WScript.Quit();
  }
}
else
{
  if (CheckMethod(sCmd))
    aCmd[0] = [false, (/^AkelPad\./.test(sCmd) ? "" : "AkelPad.") + sCmd];
  else
  {
    AkelPad.MessageBox(hMainWnd, "Invalid argument -cmd:\n" + sCmd, WScript.ScriptName, 0x10 /*MB_ICONERROR*/);
    WScript.Quit();
  }
}

for (n = 0; n < aCmd.length; ++n)
  sMsg += aCmd[n][1] + (aCmd[n][2] ? " " + aCmd[n][2] : "") + "\n";

nFrames = AkelPad.SendMessage(hMainWnd, 1291 /*AKD_FRAMESTATS*/, 0 /*FWS_COUNTALL*/, 0);
aFrame  = [AkelPad.SendMessage(hMainWnd, 1290 /*AKD_FRAMEFINDW*/, 1 /*FWF_CURRENT*/, 0)];

if (typeof nTab != "number")
  nTab = 0;

if ((nTab != 1) && (nTab != 2))
{
  nChoice = AkelPad.MessageBox(hMainWnd, sMsg + "\nDo you want to run?", WScript.ScriptName, 0x20 /*MB_ICONQUESTION*/, 0,
                               1001, "   On current tab   ", 0x1 /*BMB_DEFAULT*/,
                               1002, "On each tab", (nFrames > 1) ? 0 : 0x2 /*BMB_DISABLED*/,
                               2,    "Cancel", 0);

  if (nChoice != 2)
    nTab = nChoice - 1000;
  else
    WScript.Quit();
}

if ((nTab == 1) || (nFrames < 2))
  nFrames = 1;
else
{
  for (i = 1; i < nFrames; ++i)
    aFrame[i] = AkelPad.SendMessage(hMainWnd, 1290 /*AKD_FRAMEFINDW*/, 9 /*FWF_TABNEXT*/, aFrame[i - 1]);
}

AkelPad.ScriptNoMutex();

for (i = 0; i < nFrames; ++i)
{
  if (AkelPad.SendMessage(hMainWnd, 1293 /*AKD_FRAMEISVALID*/, 0, aFrame[i]))
  {
    AkelPad.SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, aFrame[i]);

    for (n = 0; n < aCmd.length; ++n)
    {
      if (aCmd[n][0])
        AkelPad.Call("Scripts::Main", 2, aCmd[n][1], aCmd[n][2]);
      else
        AkelPad.Call("Scripts::Main", 7, aCmd[n][1]);
    }
  }
}

if (AkelPad.SendMessage(hMainWnd, 1293 /*AKD_FRAMEISVALID*/, 0, aFrame[0]))
  AkelPad.SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, aFrame[0]);

function CheckBatch(sFile)
{
  var aLine;
  var aLineCmd;
  var aExec;
  var sError;
  var i;

  if (! oFSO.FileExists(sFile))
  {
    AkelPad.MessageBox(hMainWnd, "Batch file does not exists:\n" + sFile, WScript.ScriptName, 0x10 /*MB_ICONERROR*/);
    return false;
  }

  aLine = AkelPad.ReadFile(sFile, 0x10 /*OD_ADT_NOMESSAGES*/, 1200 /*UTF-16LE*/, 1 /*bBOM*/).replace(/\r\r\n|\r\n|\r/g, "\n").split("\n");

  for (i = 0; (i < aLine.length) && (! sError); ++i)
  {
    aLine[i] = aLine[i].replace(/^\s+|\s+$/g, "");

    if (aLine[i] && (aLine[i].charAt(0) != "*"))
    {
      if (aLine[i].charAt(0) == "#")
      {
        aExec = /^#\s*tab\s*=\s*(\d+)$/i.exec(aLine[i]);

        if (aExec && aExec[1] && (typeof nTab != "number"))
          nTab = parseInt(aExec[1], 10);
      }
      else
      {
        aLineCmd = aLine[i].split("\t");

        if (! aLineCmd[1])
          aLineCmd[1] = "";

        aLineCmd[0] = aLineCmd[0].replace(/^\s+|\s+$/g, "");
        aLineCmd[1] = aLineCmd[1].replace(/^\s+|\s+$/g, "");

        if (/.+\.(js|vbs)$/i.test(aLineCmd[0]))
        {
          if (oFSO.FileExists(sDir + aLineCmd[0]))
            aCmd.push([true, aLineCmd[0], aLineCmd[1]]);
          else
            sError = "Script does not exists";
        }
        else
        {
          if (CheckMethod(aLineCmd[0]))
            aCmd.push([false, (/^AkelPad\./.test(aLineCmd[0]) ? "" : "AkelPad.") + aLineCmd[0]]);
          else
            sError = "Unknown method";
        }
      }
    }
  }

  if (sError)
  {
    AkelPad.MessageBox(hMainWnd, "Error in batch file.\n\nFile:\t" + sFile + "\nLine:\t" + i + "\nText:\t" + aLineCmd[0] + "\nRemark:\t" + sError, WScript.ScriptName, 0x10 /*MB_ICONERROR*/);
    return false;
  }

  if (! aCmd.length)
  {
    AkelPad.MessageBox(hMainWnd, "Batch file does not contain any data:\n" + sFile, WScript.ScriptName, 0x10 /*MB_ICONERROR*/);
    return false;
  }

  return true;
}

function CheckMethod(sMethod)
{
  var aMethod = [
    "ActiveXThis",
    "Call",
    "CallA",
    "CallEx",
    "CallExA",
    "CallExW",
    "CallW",
    "Command",
    "ConnectObject",
    "CreateDialog",
    "Debug",
    "DebugJIT",
    "DisconnectObject",
    "Exec",
    "Font",
    "GetAkelDir",
    "GetArgLine",
    "GetArgValue",
    "GetClipboardText",
    "GetEditBOM",
    "GetEditCodePage",
    "GetEditDoc",
    "GetEditFile",
    "GetEditModified",
    "GetEditNewLine",
    "GetEditReadOnly",
    "GetEditWnd",
    "GetFilePath",
    "GetInstanceDll",
    "GetInstanceExe",
    "GetLangId",
    "GetMainWnd",
    "GetSelEnd",
    "GetSelStart",
    "GetSelText",
    "GetTextRange",
    "Include",
    "InputBox",
    "IsAkelEdit",
    "IsInclude",
    "IsMDI",
    "IsOldWindows",
    "IsPluginRunning",
    "MemAlloc",
    "MemCopy",
    "MemFree",
    "MemPtrStr",
    "MemRead",
    "MemStrPtr",
    "MessageBox",
    "OpenFile",
    "ReadFile",
    "Recode",
    "ReplaceSel",
    "SaveFile",
    "ScriptExitCode",
    "ScriptHandle",
    "ScriptNoMutex",
    "ScriptSettings().Begin",
    "ScriptSettings().Delete",
    "ScriptSettings().End",
    "ScriptSettings().Read",
    "ScriptSettings().Write",
    "SendMessage",
    "SetClipboardText",
    "SetEditWnd",
    "SetFrameInfo",
    "SetSel",
    "SystemFunction().AddParameter",
    "SystemFunction().Call",
    "SystemFunction().GetLastError",
    "SystemFunction().RegisterCallback",
    "SystemFunction().UnregisterCallback",
    "TextFind",
    "TextReplace",
    "ThreadHook",
    "ThreadUnhook",
    "VarDispatch",
    "VarType",
    "WindowGetMessage",
    "WindowNextProc",
    "WindowNoNextProc",
    "WindowRegisterClass",
    "WindowRegisterDialog",
    "WindowSubClass",
    "WindowUnregisterClass",
    "WindowUnregisterDialog",
    "WindowUnsubClass",
    "WriteFile"];

  var i;

  for (i = 0; i < aMethod.length; ++i)
  {
    if (new RegExp("^(AkelPad\\.)?" + aMethod[i] + "\\(.*\\)$").test(sMethod))
      return true;
  }

  return false;
}


Offline
Posts: 53
Joined: Wed Dec 09, 2015 6:33 pm

Post by beotiger »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=30143#p30143
// Version: 1.1 (2015-12-23)
// Author: Andrey Tzar aka beotiger
//
//
// Description(1033): Mark/unmark current word/line/selected phrase using Coder::HighLight plugin, case sensitive. Every time marker color changes.
// Description(1049): Помечает/снимает пометку с текущего слова/строки/выделенной фразы используя плагин Coder::HighLight. Учитывает регистр. Цвет маркера каждый раз новый.

/*
 	Inspired by SuperMultiMarker.vbs script by Andrey Averin
	Thanks to Andrey, Instructor, VladSh, Infocatcher, KDJ and other contributors to AkelPad

	Arguments
	 Use -clear=1 to remove all highlightings and clear file with data
		Example: Call("Scripts::Main", 1, "MarkIt.js", `-clear=1`)
	 
	 -tabs=nFlag - highlight in other tabs.
	 		nFlag: 1 - process next tab, 2 - previous tab, 3 - next and previous tabs and 4 - all tabs
	 	Note: current tab always highlights
	 	
	 	Example: remove highlightings in all tabs:
	 		Call("Scripts::Main", 1, "MarkIt.js", `-clear=1 -tabs=4`)
		Highlight next tab also: Call("Scripts::Main", 1, "MarkIt.js", `-tabs=1`)
		
	Other notes:
		Uses datafile MarkIt.ini in scripts folder. See code below.
		Possible hot keys: `Ins` for MarkIt.js script, and `Ctrl+Shift+Ins` for clear command (use in Hotkeys, ToolBar or ContextMenu plugins for example)

	RU: Написано под вдохновением от скрипта SuperMultiMarker.vbs Аверина Андрея
	Мои благодарности Андрею, Instructor, VladSh, Infocatcher, KDJ и всем поддерживающим проект AkelPad

	Аргументы
	 -clear=1 убрать все подсветки и сбросить файл данных
		Пример вызова: Call("Scripts::Main", 1, "MarkIt.js", `-clear=1`)
	 
	 -tabs=nFlag - подсветить в других вкладках
	 		nFlag: 1 - в следующей, 2 - в предыдущей, 3 - в следующей и в предыдущей и
	 				 4 - во всех вкладках
	 	Замечание: текущая вкладка всегда подсвечивается

	 	Пример: убрать подсветку во всех вкладках:
	 		Call("Scripts::Main", 1, "MarkIt.js", `-clear=1 -tabs=4`)
		Подсветить также и следующую вкладку: Call("Scripts::Main", 1, "MarkIt.js", `-tabs=1`)
			
	Другие замечания:
		Используется файл MarkIt.ini в каталоге скриптов. Подробности смотрите в коде ниже.
		Возможные горячие клавиши: `Ins` для самого MarkIt.js и `Ctrl+Shift+Ins` для команды очистки, которую можно использовать к примеру в плагинах Hotkeys, ToolBar или ContextMenu.
*/

// colors and backgrounds from SuperMultiMarker.vbs script by Averin Andrey
// цвета и фоны взяты из скрипта SuperMultiMarker.vbs Аверина Андрея
var colors = ["#000000", "#FFFFFF", "#FFFFFF", "#FFFFFF", "#FFFFFF", "#000000", 
							"#FFFF00", "#94FEFE", "#FFEFD5", "#FF00FF", "#9932CC", "#FF00FF", 
							"#FFD700", "#C0C0C0", "#66CCCC", "#6600FF", "#CCFFCC", "#00FFFF", 
							"#B8860B", "#008B8B", "#000000", "#000000", "#FFFFFF", "#000000", 
							"#000000", "#000000", "#FFFFFF", "#F0F8FF", "#FFC1C1", "#FFC1C1", 
							"#B0E2FF", "#002100", "#CDCD00", "#CFFF7C"];

var backgrounds = ["#9BFF9B", "#FFA000", "#00A000", "#A0A0FF", "#FF0000", "#FFFF00", 
									"#000000", "#000000", "#FF00FF", "#8B008B", "#ADFF2F", "#00FA9A", 
									"#00BFFF", "#2F4F4F", "#9900CC", "#99FFCC", "#3366FF", "#8B008B", 
									"#F5DEB3", "#E0FFFF", "#9BFFFF", "#FFCD9B", "#FF0000", "#BE7DFF", 
									"#88E188", "#C6C6C6", "#000000", "#B0171F", "#006400", "#A54700", 
									"#4B0082", "#CDFF00", "#000000", "#7F6A00"];

// plugin name and window descriptors - имя плагина подсветки
var CH = "Coder::HighLight",	
		hMainWnd = AkelPad.GetMainWnd(),
		hWndEdit = AkelPad.GetEditWnd(),
		// datafile name - имя файла с данными
		myIni = WScript.ScriptFullName.replace(/\.js$/i, '.ini');

// check Coder::HighLight status and turn it on
// проверка работы плагина Coder::HighLight и включение его, если не работает
if(!AkelPad.IsPluginRunning(CH))
	if(AkelPad.Call(CH) != 1 /* UD_NONUNLOAD_ACTIVE */) {
    AkelPad.MessageBox(hMainWnd, 'Could not activate `' + CH + '`.\nPlease install Coder plugin', WScript.ScriptName, 0x40 /* MB_ICONINFORMATION */);
    WScript.Quit();
	}

/* Check arguments - Проверим аргументы */

// if we should process other tabs - надо ли обрабатывать соседние вкладки
var tabs = AkelPad.GetArgValue("tabs", 0);

if(AkelPad.IsMDI() == 0)
	tabs = 0;

// parameter clear: unhighlight all and reset datafile
// если задан параметр clear, снимаем выделение и чистим файл с данными
var bUnLight = AkelPad.GetArgValue("clear", false);

setRedraw(hMainWnd, false);
setRedraw(hWndEdit, false);

if(bUnLight) {
	clearAll();
	setRedraw(hMainWnd, true);
	setRedraw(hWndEdit, true);
	WScript.Quit();
}

// for detecting word - для поиска слова
var nSelStart, nSelEnd,
		nWordBegin, nWordEnd;

// current word/phrase - текущее слово/фраза
var pWord = '';

/*
	Getting word under caret from ChmKeyword.js by Instructor 
		and CaretSelect.js by VladSh

	Получение слова под курсором или сразу за ним
	взято из ChmKeyword.js by Instructor и CaretSelect.js by VladSh
*/

// get selection - получим текущий селект
nSelStart = AkelPad.GetSelStart();
nSelEnd = AkelPad.GetSelEnd();

if(nSelStart == nSelEnd) {
	// there is no selection - нет выделения (селекта)
  nWordBegin = AkelPad.SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK*/, 0 /*WB_LEFT*/, nSelStart);
  nWordEnd = AkelPad.SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK*/, 7 /*WB_RIGHTBREAK*/, nWordBegin);

  // for cases when caret located on word start position
  // для случаев, когда курсор прямо перед словом
  if (nWordEnd < nSelStart) {
     nWordBegin = AkelPad.SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK*/, 0 /*WB_LEFT*/, nSelStart + 1);
     nWordEnd = AkelPad.SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK*/, 7 /*WB_RIGHTBREAK*/, nWordBegin);
  }
  
  // word found? - слово найдено?
  if (nWordEnd > nSelStart) {
    pWord = AkelPad.GetTextRange(nWordBegin, nWordEnd);
    AkelPad.SetSel(nWordBegin, nWordEnd);
  }
  else {
  // try to select whole line - пробуем выделить текущую строку целиком
  	selectCaretLine(hWndEdit);
  	nWordBegin = AkelPad.GetSelStart();
  	nWordEnd = AkelPad.GetSelEnd();
  }
}
else {
	nWordBegin = nSelStart;
	nWordEnd = nSelEnd;
}

// get selected text till \r char
// получим выбранный текст до первого встреченного перевода строки (\r)
pWord = truncSel(AkelPad.GetTextRange(nWordBegin, nWordEnd));

if(!pWord) {
	setRedraw(hMainWnd, true);
	setRedraw(hWndEdit, true);
	WScript.Quit();	// silently
}

// if there is no datafile create new one
// если файла с данными ещё нет, создать новый
if(!IsFileExists(myIni))
	// codepage: UTF8 without BOM, new lines in Mac-way
	// кодировка: UTF8 без BOM, перевод строк Mac-way
	AkelPad.WriteFile(myIni, '[colorIndex]\r20\r[HighLight]', -1, 65001, false); 

// read datafile in UTF8
// читаем файл с данными, кодировка UTF8 without BOM
var data = AkelPad.ReadFile(myIni, 0, 65001, false),
		// all file lines - все строки файла
		lines = data.split('\r'),
		// highlight index - индекс подсветки, должно быть целым
		Cindex = +lines[1]  % colors.length;

var	bHighlight = true,	// to highlight - стоит ли подсвечивать слово
		i;
		
if(lines.length >= 4)
	// check for word/phrase - ищем слово/фразу
	for(i = 3; i < lines.length; i++)
		if(lines[i] === pWord) {
			// delete lines[i] - есть значение, удаляем
			// wipe it out with array shift - удалим текущее значение со сдвигом массива
			lines.splice(i, 1);
			bHighlight = false;
			break;
		}

if(bHighlight) {
	// highlight and save word - подсвечиваем и сохраняем слово
	lines[lines.length] = pWord;
	AkelPad.Call(CH, 2, colors[Cindex], backgrounds[Cindex], 1, 0 /* FONTSTYLE */, -1 /* ID */, pWord /* "TEXT" */ /*, TEXTLENGTH */);
	// doHighlight(1);

	// repeat for other tabs - тж для других вкладок 
	if(tabs)
		processTabs(1);
	// next index - следующий цвет, цикл по длине массива цветов
	lines[1] = ++Cindex % colors.length;
}	
else {
	// unhighlight it - снимаем отметки текста
	AkelPad.Call(CH, 3, -2 /* удалить отметки выделенного текста */);
	// doHighlight(2);
	
	// repeat for other tabs - тж для других вкладок 
	if(tabs)
		processTabs(2);
}

// save datafile - сохраняем файл
AkelPad.WriteFile(myIni, lines.join('\r'), -1, 65001, false);
// restore original selection
// восстанавливаем оригинальный селект
AkelPad.SetSel(nSelStart, nSelEnd);

setRedraw(hMainWnd, true);

// redrawing current window for MDI mode - thanks to KDJ for remark
// AkelPad.SystemFunction().Call("User32::InvalidateRect", hWndEdit, 0, 1);
setRedraw(hWndEdit, true);

/*	**********************************************
		Auxiliary functions / Вспомогательные функции
**********************************************	*/
// cut line off till \r character
// обрежем строку до символа \r, если есть
function truncSel(text)
{
  if(text.indexOf('\r') != -1) {
  	text = text.substring(0, text.indexOf('\r'));
  	AkelPad.SetSel(nWordBegin, nWordBegin + text.length);
  }
  return text;
}

function IsFileExists(pFile)
{
  return (AkelPad.SystemFunction().Call("Kernel32::GetFileAttributes" + _TCHAR, pFile) != -1);
}

// unhighlight all and reset datafile
// снимем все пометки HighLight'ера и очистим файл с данными
function clearAll()
{
	AkelPad.Call(CH, 3);
	//doHighlight(3);

	// if we should process other tabs
	// если надо обработать ещё и вкладки
	if(tabs)
		processTabs(3);

	AkelPad.WriteFile(myIni, '[colorIndex]\r20\r[HighLight]', -1, 65001, false); 
}

// process other tabs with flag op: 1 - highlight, 2 - unhighlight, 3 - unhighlight all
// обработать соседние вкладки флагом tabs (global)
// операцией op: 1 - подсветка, 2 - снятие подсветки, 3 - снятие всех подсветок
function processTabs(op)
{
  // new and current frame - новое и текущее окно (handles) 
  var curTab,
  		origTab = AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
  		
	if(tabs & 4) {
		// all tabs - пройдёмся по всем вкладкам	
		curTab = AkelPad.Command(4316 /*IDM_WINDOW_FRAMENEXT*/);
		while(curTab != origTab) {
			doHighlight(op);	// обработаем новую вкладку
			curTab = AkelPad.Command(4316 /*IDM_WINDOW_FRAMENEXT*/);
		}
	}
	else {
		if(tabs & 1) {
			// next tab
			curTab = AkelPad.Command(4316 /*IDM_WINDOW_FRAMENEXT*/);
			if(curTab != origTab) {
				doHighlight(op);	// process new tab - обработаем новую вкладку
				// and go back - и вернемся обратно
				AkelPad.Command(4317 /*IDM_WINDOW_FRAMEPREV*/);
			}
		}
		if(tabs & 2) {
			// prev tab
			curTab = AkelPad.Command(4317 /*IDM_WINDOW_FRAMEPREV*/);
			if(curTab != origTab) {
				doHighlight(op);	// process new tab - обработаем новую вкладку
				// and go back - и вернемся обратно
				AkelPad.Command(4316 /*IDM_WINDOW_FRAMENEXT*/);
			}
		}
	}
}

// process current tab with flag op: 1 - highlight, 2 - unhighlight, 3 - unhighlight all
// подвсетить/снять подсветку текущего окна
// op: 1 - подсветка, 2 - снятие подсветки, 3 - снятие всех подсветок
function doHighlight(op)
{
	// store current selection and scroll - сохраняем селект и позицию скролла
	var nStart = AkelPad.GetSelStart(),
			nEnd = AkelPad.GetSelEnd(),
			lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/),
			hWnd = AkelPad.GetEditWnd();

	setRedraw(hWnd, false);
		
	if(lpPoint)
		AkelPad.SendMessage(hWnd, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);

	// find word/phrase and continue when found or when we should unhighlight all
	// сперва найдём вхождение (pWord) в тексте,
	// и продолжаем только если оно есть или если op = 3 (убрать всё выделение)
	if(AkelPad.TextFind(0, pWord, 
			0x00000001 | 0x00000004 | 0x00200000 /*FRF_DOWN|FRF_MATCHCASE|FRF_BEGINNING*/) >= 0
		|| op == 3)
  switch (op)
  {
    case 1:	// highlight it!
		 	AkelPad.Call(CH, 2, colors[Cindex], backgrounds[Cindex], 1, 0 /* FONTSTYLE */, -1 /* ID */, pWord /* "TEXT" */ /*, TEXTLENGTH */);
      break;
    case 2: // unhighlight it!
			AkelPad.Call(CH, 3, -2 /* удалить отметки выделенного текста */);      
      break;
    case 3:	// unhighlight all!
      AkelPad.Call(CH, 3);
      break;
  }
 
 	// restore original selection - восстанавливаем оригинальный селект
	AkelPad.SetSel(nStart, nEnd);

	// and scroll position - и позицию скролла
	if(lpPoint) {
		AkelPad.SendMessage(hWnd, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
		AkelPad.MemFree(lpPoint);
	}
	
	setRedraw(hWnd, true);
}

// enable/disable window redraw on changes
function setRedraw(hWnd, bRedraw) {
	AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
	bRedraw && AkelPad.SystemFunction().Call("user32::InvalidateRect", hWnd, 0, true);
}

function selectCaretLine(hWnd)
{
  var nCaretOffset = AkelPad.SendMessage(hWnd, 3138 /*AEM_GETRICHOFFSET*/, 5 /*AEGI_CARETCHAR*/, 0),
  		nLineStart = AkelPad.SendMessage(hWnd, 3138 /*AEM_GETRICHOFFSET*/, 18 /*AEGI_WRAPLINEBEGIN*/, nCaretOffset),
  		nLineEnd = AkelPad.SendMessage(hWnd, 3138 /*AEM_GETRICHOFFSET*/, 19 /*AEGI_WRAPLINEEND*/, nCaretOffset);

  AkelPad.SetSel(nLineStart, nLineEnd);
}


Marks/unmarks (highlights using Coder::Highlight plugin) current word/current line or selected text. Every time marker color changes through 34 vlaues. Can mark not more than one line at a time.

How it works: if there is selection, highlights it. Then tries to select and highlight current word. Highlights whole current line otherwise.

Note that you can highlight same items in other tabs simultaneously.

Помечает/снимает пометку (то есть подсветку), используя плагин Coder::Highlight, с текущего слова/строки или выделенной фразы. После каждой отметки цвет маркера меняется. Всего цветов/фонов маркера 34. Может подсвечивать не более одной строки за раз.

Принцип работы: если есть выделение, подсвечивает его, иначе пытается найти и подсветить текущее слово (под или сразу за курсором). Если слова не найдено - подсвечивает текущую строку целиком.

Также есть возможность подсвечивать одновременно и в других вкладках.
Last edited by beotiger on Wed Dec 23, 2015 9:56 am, edited 2 times in total.

Offline
Posts: 53
Joined: Wed Dec 09, 2015 6:33 pm

Post by beotiger »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=30144#p30144
// Version: 1.0 (2015-12-19)
// Author: Andrey Tzar aka beotiger
//
//
// Description(1033): Find current word/selected phrase, do not open any dialogs
// Description(1049): Ищет текущее слово/выделенную фразу без открытия диалога

/*
	Arguments:
		-dir: 0 - find forward (default), 1 - find backwards, 2- find from beginning
		-case: 0 - case insensitive (default), 1 - case sensitive
		-whole: 0 - find any (default), 1 - whole word only
		-nosound: 0 - play sound if not found (default), 1 - do not play sound
		-dialog: 0 - do not show dialog if not found (default), 1 - show dialog if not found
		
	Suggested hotkeys: F7 - FastFind forward, Shift+F7 - FastFind backwards

	Examples:
		Call("Scripts::Main", 1, "FastFind.js", `-dir=1`) - search backwards (Shift+F7 hotkey suggested)
		Call("Scripts::Main", 1, "FastFind.js", `-whole=1 -nosound=1 -dialog=1`) - search whole word only and show dialog if not found and do not play any sound

	Аргументы:
		-dir: 0 - поиск вперед (default), 1 - поиск назад, 2- поиск с начала документа
		-case: 0 - не учитывать регистр (default), 1 - учитывать регистр
		-whole: 0 - поиск вхождения (default), 1 - поиск слова целиком
		-nosound: 0 - издать звук, если не найдено (default), 1 - не издавать звук
		-dialog: 0 - не показывать диалог, если не найдено (default), 1 - показать диалог
		
	Возможные хоткеи: F7 - FastFind вперед, Shift+F7 - FastFind назад

	Примеры:
		Call("Scripts::Main", 1, "FastFind.js", `-dir=1`) - поиск назад
		Call("Scripts::Main", 1, "FastFind.js", `-whole=1 -nosound=1 -dialog=1`) - искать слово целиком, не издавать звук и показать диалог, если не найдено

*/		

// get arguments - получаем аргументы, устанавливая дефолтные значения
var nDir = AkelPad.GetArgValue('dir', 0),
		bCase = AkelPad.GetArgValue('case', 0),
		bWhole = AkelPad.GetArgValue('whole', 0),
		bNosound = AkelPad.GetArgValue('nosound', 0),
		bDialog = AkelPad.GetArgValue('dialog', 0);

var	hWndEdit = AkelPad.GetEditWnd(),
		oSet = AkelPad.ScriptSettings();	// for storing last search item 

// for detecting word - для поиска слова
var pWord, nSelStart, nSelEnd,
		nWordBegin, nWordEnd;

// get selection - получим текущий селект
nSelStart = AkelPad.GetSelStart();
nSelEnd = AkelPad.GetSelEnd();

if(nSelStart == nSelEnd) {
	// there is no selection - нет выделения (селекта)
  nWordBegin = AkelPad.SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK*/, 0 /*WB_LEFT*/, nSelStart);
  nWordEnd = AkelPad.SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK*/, 7 /*WB_RIGHTBREAK*/, nWordBegin);

  // for cases when caret located on word start position
  // для случаев, когда курсор прямо перед словом
  if (nWordEnd < nSelStart) {
     nWordBegin = AkelPad.SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK*/, 0 /*WB_LEFT*/, nSelStart + 1);
     nWordEnd = AkelPad.SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK*/, 7 /*WB_RIGHTBREAK*/, nWordBegin);
  }
  
  // word found? - слово найдено?
  if (nWordEnd > nSelStart) {
    pWord = AkelPad.GetTextRange(nWordBegin, nWordEnd);
    AkelPad.SetSel(nWordBegin, nWordEnd);
  }
}
else
	pWord = AkelPad.GetTextRange(nSelStart, nSelEnd);

// trying to get search item from settings
if(!pWord) {
	if (oSet.Begin('', 0x1 /*POB_READ*/))
	{
	  pWord = oSet.Read('SearchItem', 3 /*PO_STRING*/);
	  oSet.End();
	} 	
}

if(!pWord)
	WScript.Quit();	// silently

var flags = nDir == 1 ? 0x00100000  /*FRF_UP*/ : 
	(nDir == 2 ? 0x00000001 | 0x00200000 /*FRF_BEGINNING*/: 0x00000001 /*FRF_DOWN*/);

bCase && (flags |= 0x00000004);  /*FRF_MATCHCASE*/
bWhole && (flags |= 0x00000002);  /*FRF_WHOLEWORD*/

if(AkelPad.TextFind(0, pWord, flags) < 0) {
	// not found - не найдено
	if(!bNosound)
		playSound();
	if(bDialog)
		AkelPad.MessageBox(AkelPad.GetMainWnd(), '`' + pWord + '` not found', WScript.ScriptName, 0, 48);
}

// store search item for further searching
if (oSet.Begin('', 0x2 /*POB_SAVE*/)) {
	oSet.Write('SearchItem', 3 /*PO_STRING*/, pWord);
	oSet.End();
}

// OK, how to play some sound in WHS?
function playSound()
{
	// some constants for PlaySound function
	var SND_SYNC            = 0x00000000,  /* play synchronously (default) */
			SND_ASYNC           = 0x00000001,  /* play asynchronously */
			SND_FILENAME        = 0x00020000, /* name is file name */
			SND_ALIAS           = 0x00010000, /* name is a registry alias */
			SND_RESOURCE        = 0x00040000, /* name is resource name or atom */
			SND_ALIAS_ID	    	= 0x00100000; /* alias is a predefined ID */

	// file name of sound to play - имя звукового файла
	var pSound = 'SystemExclamation'; //'C:\\Windows\\Media\\Alarm03.wav';
	AkelPad.SystemFunction().Call("winmm::PlaySound" + _TCHAR, pSound, null, SND_ASYNC | SND_RESOURCE);
}


Selects and searches word under cursor or selected phrase without opening any dialogs. Useful for fast searching. Recommended hotkeys: F7 - FastFind forward, Shift+F7 - FastFind backwards.

Выбирает и ищет слово под курсором или выделенную фразу без открытия диалога. Полезен для быстрого поиска. Рекомендуемые хоткеи: F7 - быстрый поиск вперед, Shift+F7 - быстрый поиск назад (подробности в начале скрипта).
Last edited by beotiger on Tue Jan 12, 2016 9:37 am, edited 1 time in total.

Offline
Posts: 53
Joined: Wed Dec 09, 2015 6:33 pm

Post by beotiger »

2016-01-03 Version 1.1. updated! [RUS] Обновлено до версии 1.1!

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=30191#p30191
// Version: 1.1 (2016-01-03)
// Author: Andrey Tzar aka beotiger
//
//
// Description(1033): Convert line(s) into HTML elements
// Description(1049): Превратить строки в HTML-элементы 

/*
	Arguments:
		First argument:	tag to be inserted for every line, default: <li>
		Second argument: tag to enclose all thing, default: '' (nothing)
		
	Note. Since v1.1: preserves line paddings by first non-empty line padding and omit empty lines

	Suggested: call from ToolBar, ContextMenu or Hotkeys plugins

	Examples:
		Call("Scripts::Main", 1, "HTMLpad.js", `<li> <ol>`) - turn selected (or current) lines into `li` elements and enclose them by <ol> tag
		Call("Scripts::Main", 1, "HTMLpad.js", `<p>`) - create paragraphs

	Аргументы:
		Первый аргумент - тэг, вставляемый в начале и конце каждой строки, default: <li>
		Второй аргумент - тэг, добавляемый в начало и конце всего, по умолчанию пустая строка (ничего не вставляется)		
	Замечание: с версии 1.1 паддинги строк форматируются по паддингу первой значащей строки, пустые строки удаляются
	
	Предположительный вызов из плагинов ContextMenu, ToolBar либо Hotkeys

	Примеры:
		Call("Scripts::Main", 1, "HTMLpad.js", `<li> <ol>`) - превратить выделенные строки в элементы <li> и добавить в начало и конец списка тэг <ol>
		Call("Scripts::Main", 1, "HTMLpad.js", `<p>`) - создать параграф(ы) из выделенного текста

*/		

// tag for lines
var sBegLTag = (WScript.Arguments.length ? trim(WScript.Arguments(0)) : '<li>'),
		sEndLTag = '';

// embracing tag
var sBegTag = (WScript.Arguments.length > 1 ? trim(WScript.Arguments(1)) + '\r' : ''),
		sEndTag = '';

// if sBegLTag looks like a tag make sEndLTag closing similar tag
// RU: если sBegTag выглядит как тэг, сделаем sEndTag подбным закрывающим тэгом
if(sBegLTag) {
	if(sBegLTag.charAt(0) == '<')
		sEndLTag = '</' + sBegLTag.substring(1);
	else
		sEndLTag = sBegLTag;
}

var tab = '',	// insert tabulations if we have enclosing tag
		sCaret = '[/s]',	// caret position after inserting
		padding = 0,	// paddings
		gpadding = 0,
		bPadding = false;	// we found first padding 

// if sBegTag looks like a tag make sEndTag closing similar tag
// RU: если sBegTag выглядит как тэг, сделаем sEndTag подбным закрывающим тэгом
if(sBegTag) {
	tab = '\t';
	if(sBegTag.charAt(0) == '<')
		sEndTag = '</' + sBegTag.substring(1);
	else
		sEndTag = sBegTag;
}

var	hWndEdit = AkelPad.GetEditWnd();

// currents select, selected lines, one line,
// select's start and end and array of lines
var sSelect, sLines, sLine,
		nSelStart, nSelEnd,
		aLines = [];

// get selection - получим текущий селект
nSelStart = AkelPad.GetSelStart();
nSelEnd = AkelPad.GetSelEnd();

if(nSelStart == nSelEnd)
	sSelect = sBegTag + tab + sBegLTag + trim(selectCaretLine(hWndEdit)) + sCaret + sEndLTag + sEndTag;  
else {
	sSelect = AkelPad.GetTextRange(nSelStart, nSelEnd);
	// respect padding of first line if we have group tag only
	gpadding = sSelect.search(/\S/);
	if(sBegTag && gpadding > 0)
		gpadding = sSelect.substring(0, gpadding);
	else
		gpadding = '';

	// sSelect = trim(sSelect);

	if(sSelect) {
		sLines = sSelect.split('\r');
		for (sLine in sLines) {
			sLine = sLines[sLine];
			// respect padding for first non-empty line
			if(!bPadding && trim(sLine)) {
				padding = sLine.search(/\S/);
				if(padding > 0)
					padding = sLine.substring(0, padding);
				else
					padding = '';
				// we found first non-empty line padding
				bPadding = true;
			}
			// WScript.Echo("sLine=`" + sLine + '`' + '\npadding=' + padding);
			if(sLine = trim(sLine))
				aLines.push(padding + tab + sBegLTag + sLine + sEndLTag);
			/*else
			// respect empty lines
				aLines.push('');
			*/
		}
		sSelect = gpadding + sBegTag + aLines.join('\r') + '\r' + gpadding + sEndTag + sCaret;
	}
	else
		sSelect = sBegTag + tab + sBegLTag + trim(selectCaretLine(hWndEdit)) + sCaret + sEndLTag + sEndTag;  
}

// fix our job
AkelPad.SendMessage(hWndEdit, 3081 /*AEM_BEGINUNDOACTION*/, 0, 0);
AkelPad.SetSel(nSelStart, nSelEnd);
AkelPad.ReplaceSel(sSelect);

// cannot replace - find and replace ourselves?
AkelPad.TextFind(hWndEdit, sCaret, 0x00100000 /*FRF_UP*/);
AkelPad.ReplaceSel('');
AkelPad.SendMessage(hWndEdit, 3082 /*AEM_ENDUNDOACTION*/, 0, 0);

function selectCaretLine(hWnd)
{
  var nCaretOffset = AkelPad.SendMessage(hWnd, 3138 /*AEM_GETRICHOFFSET*/, 5 /*AEGI_CARETCHAR*/, 0),
        nLineStart = AkelPad.SendMessage(hWnd, 3138 /*AEM_GETRICHOFFSET*/, 18 /*AEGI_WRAPLINEBEGIN*/, nCaretOffset),
        nLineEnd = AkelPad.SendMessage(hWnd, 3138 /*AEM_GETRICHOFFSET*/, 19 /*AEGI_WRAPLINEEND*/, nCaretOffset);

  AkelPad.SetSel(nLineStart, nLineEnd);
}

// trim spaces from beginning and end of a string
// удалим пробелы с начала и конца строки
function trim(pStr)
{
  return (typeof pStr == 'string' && pStr.length) ? 
  	pStr.replace(/^\s+/, '').replace(/\s+$/, '') : '';
}


Convert line(s) into HTML elements - select several lines and call the script to turn them into `li` elements. First argument: tag to be inserted for every line, default: <li>. Second argument: tag to enclose all thing, default: '' (nothing). Usage is inside the script.

Превратить строки в HTML-элементы (по умолчанию в <li>). Элементы задаются в аргументах, первый аргумент - элемент для каждой строки, второй аргумент - родительский элемент, добавляемый в начале и конце всего. Подробнее смотрите внутри скрипта.
Last edited by beotiger on Sun Jan 03, 2016 3:34 am, edited 3 times in total.

Offline
Posts: 53
Joined: Wed Dec 09, 2015 6:33 pm

Post by beotiger »

2016-01-03 Version 1.1. updated! [RUS] Обновлено до версии 1.1!

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=30192#p30192
// Version: 1.1 (2016-01-03) fixed undo
// Author: Andrey Tzar aka beotiger
//
//
// Description(1033): Convert line(s) into table tr td elements
// Description(1049): Превратить строки в элементы table tr td

/*

	Notes: table rows separated by new lines, table columns separated by tabs (\t char)
		First row of a table has `th` elements, other rows - `td` elements
	
	Замечания:
		Строки таблицы разделяются переводами строк, столбцы - символами табуляци (\t)
		Первая строка таблицы состоит из элементов `th`, остальные строки - из элементов `td`

	TODO: add colspan if columns count do not match?

*/

// embracing tag - охватывающий тэг
var sBegTag = '<table>\n',
		sEndTag = '\n</table>';

var sCaret = '[/s]';	// caret position after inserting

var	hWndEdit = AkelPad.GetEditWnd();

// currents select, selected lines, one line,
// select's start and end, array of lines and if first line
var sSelect, sLines, sLine,
		nSelStart, nSelEnd,
		aLines = [], bFirst;

// get selection - получим текущий селект
nSelStart = AkelPad.GetSelStart();
nSelEnd = AkelPad.GetSelEnd();

if(nSelStart == nSelEnd)
	sSelect = sBegTag + '\t<tr><th>' + trim(selectCaretLine(hWndEdit)) + sCaret + '</th></tr>' + sEndTag;  
else {
	sSelect = trim(AkelPad.GetTextRange(nSelStart, nSelEnd));

	if(sSelect) {
		sLines = sSelect.split('\r');
		for (sLine in sLines) {
			bFirst = (sLine == 0);
			sLine = trim(sLines[sLine]);
			if(sLine) 
				aLines.push('\t<tr>' + tRow(sLine, bFirst) + '</tr>');
		}
		sSelect = sBegTag + aLines.join('\r') + sEndTag + sCaret;
	}
	else
		sSelect = sBegTag + '\t<tr><th>' + trim(selectCaretLine(hWndEdit)) + sCaret + '</th></tr>' + sEndTag;  
}

AkelPad.SendMessage(hWndEdit, 3081 /*AEM_BEGINUNDOACTION*/, 0, 0);
// fix our job
AkelPad.SetSel(nSelStart, nSelEnd);
AkelPad.ReplaceSel(sSelect);

// cannot replace - find and replace ourselves?
AkelPad.TextFind(hWndEdit, sCaret, 0x00100000 /*FRF_UP*/);
AkelPad.ReplaceSel('');
AkelPad.SendMessage(hWndEdit, 3082 /*AEM_ENDUNDOACTION*/, 0, 0);

// split sLine into table data elements (td or th, if bFirst) by tab characters
function tRow(sLine, bFirst)
{
 var	aTD = sLine.split('\t'),
 			s = '',
 			tag = (bFirst ? 'th' : 'td'),
 			td;

 for (td in aTD) {
 	td = trim(aTD[td]);
 	if(td)
 		s += '<' + tag + '>' + td + '</' + tag + '>';
 }

 return (s ? s : '<' + tag + '></' + tag + '>'); 
}

function selectCaretLine(hWnd)
{
  var nCaretOffset = AkelPad.SendMessage(hWnd, 3138 /*AEM_GETRICHOFFSET*/, 5 /*AEGI_CARETCHAR*/, 0),
        nLineStart = AkelPad.SendMessage(hWnd, 3138 /*AEM_GETRICHOFFSET*/, 18 /*AEGI_WRAPLINEBEGIN*/, nCaretOffset),
        nLineEnd = AkelPad.SendMessage(hWnd, 3138 /*AEM_GETRICHOFFSET*/, 19 /*AEGI_WRAPLINEEND*/, nCaretOffset);

  AkelPad.SetSel(nLineStart, nLineEnd);
}

// trim spaces from beginning and end of a string
// удалим пробелы с начала и конца строки
function trim(pStr)
{
  return (typeof pStr == 'string' && pStr.length) ? 
  	pStr.replace(/^\s+/, '').replace(/\s+$/, '') : '';
}


Convert line(s) of text into table tr th/td elements. Table rows separated by new lines, table columns separated by tabs (\t char). First row of table has `th` elements, other rows - `td` elements.

Превратить строки текста в элементы таблицы tr th/td. Строки таблицы разделяются переводами строк, столбцы - символами табуляци (\t). Первая строка таблицы состоит из элементов `th`, остальные строки - из элементов `td`.

Offline
Posts: 53
Joined: Wed Dec 09, 2015 6:33 pm

Post by beotiger »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=30266#p30266
// Version: 1.2 (2016-01-07)
// Author: Andrey Tzar aka beotiger
//
//
// Description(1033): Full wrapper of Emmet (ex. Zen Coding) http://emmet.io
// Description(1049): Обёртка над Emmet (бывший Zen Coding) http://emmet.io

/*
	Full wrapper of Emmet (ex. Zen Coding) http://emmet.io
	for AkelPad text editor	by beotiger http://beotiger.com
	Emmet toolkit by Sergey Chikuyonok http://chikuyonok.ru
	
	My special thanks to FeyFre for his support and suggestions
	
	Download `AkelEmmet.zip` from http://beotiger.com/download/AkelEmmet
	See AkelEmmet_readme.txt for installation and using instructions inside this zip.
	
	Скачайте `AkelEmmet.zip` отсюда: http://beotiger.com/download/AkelEmmet
	Смотрите инструкции по установке и настройке в файле AkelEmmet_readme_ru.txt внутри архива.
	
	Выражаю особую благодарность FeyFre за его поддержку и замечания
*/

// absolute path where Emmet stuff is
var EMMET_DIR = AkelPad.GetAkelDir(1) + '\\Plugs\\Scripts\\Include\\Emmet\\';
// path for include Emmet's stuff through AkelPad.Include method
var EMMET_INC = 'Emmet\\';

// Emmet actions
var EMMET_ACTIONS = [
			'expand_abbreviation', 'match_pair_outward', 'match_pair_inward', 'wrap_with_abbreviation', // 3
			'next_edit_point', 'prev_edit_point', 'merge_lines', 'remove_tag',	// 7
			'split_join_tag', 'toggle_comment', 'evaluate_math_expression',	// 10
			'increment_number_by_1', 'decrement_number_by_1', 'increment_number_by_01',	// 13
			'decrement_number_by_01', 'increment_number_by_10', 'decrement_number_by_10',	// 16
			'select_next_item', 'select_previous_item', 'reflect_css_value',	// 19
			'update_image_size', 'encode_decode_data_url'];

// define `global` object variable for AkelPad Scripts engine
// install Log plugin to see possible Emmet logs
var global = {
	console: {
		log: function()
		{
			// we can not use arguments.join here
			var i;
			for(i = 0; i < arguments.length; i++)
		 		if(AkelPad.Call('Log::Output', 4, arguments[i] + '\n') < 0)
		 			break;
		}
	}
}

AkelPad.Include(EMMET_INC + 'emmet-app.min.js');
AkelPad.Include(EMMET_INC + 'file.min.js');
AkelPad.Include(EMMET_INC + 'editor.min.js');

/**
 * Autoexecutor
 * @param {Function} require
 * @param {Underscore} _
 */
emmet.exec(function(require, _) {
	try {
		// Load snippets
		var snippets = AkelPad.ReadFile(EMMET_DIR + 'snippets.json') || '{}';
		require('bootstrap').loadSystemSnippets(snippets);
		
		// Load extensions
		// Note: extensions are .js or .json files in `emmet\ext` dir
		var
		 extPath = EMMET_DIR + 'ext\\',
		 extFiles = enumerateDir(extPath + '*.js*');

		 // add dir name to file names so that they have absolute paths
			extFiles = _.map(extFiles, function(f) { return extPath + f;	});
			require('bootstrap').loadExtensions(extFiles);
		}
	catch(e) {
		WScript.Echo('Error: ' + e);
	}
	
});

var action = AkelPad.GetArgValue('action', '0');
var i, len = EMMET_ACTIONS.length;

// try to run Emmet action by number first
// if it fails try to run Emmet action by its name
if(action == +action && action >= 0 && action < len)
	runEmmetAction(EMMET_ACTIONS[action]);
else
	for(i = 0; i < len; i++)
		if(EMMET_ACTIONS[i] == action) {
			runEmmetAction(action);
			break;
		}

/**
 * Runs Emmet action
 * @param {String} name Action name
 * @author Sergey Chikuyonok (serge.che@gmail.com)
 * @link http://chikuyonok.ru
 */
function runEmmetAction(name)
{
	var ctx = AkelPad.GetEditWnd();
	try
	{
		editorProxy.setContext(ctx);
		var args = [editorProxy];
		if (arguments.length > 1)
			args = args.concat(Array.prototype.slice.call(arguments, 1));
		return emmet.require('actions').run(name, args);
	}
	catch(e)
	{
		AkelPad.MessageBox(ctx, 'Error while running Emmet action: ' + e,
							WScript.ScriptName, 64 /*MB_ICONINFORMATION*/);
	}
	finally	{	}
}

/**
 * Enumarate directory and return its file list
 * @param {String} mask Directory path and mask for files to be listed
 * @return {Array} List of files
 * @author Instructor (original code from OpenSaveMask.js)
 * @author beotiger
 */
function enumerateDir(mask)
{
  var
  	oSys = AkelPad.SystemFunction(), 
  	lpFindData = AkelPad.MemAlloc(592 /*sizeof(WIN32_FIND_DATAW)*/),
  	hSearch, pFileName,	dwAttributes;

	var fileList = [];	// array of filenames

  //Enumerate directory
  if ((hSearch = oSys.Call('kernel32::FindFirstFile' + _TCHAR, mask, lpFindData)) != -1) {
    do {
      pFileName = AkelPad.MemRead(_PtrAdd(lpFindData, 44) /*offsetof(WIN32_FIND_DATAW, cFileName)*/, _TSTR);
      if (pFileName == '.' || pFileName == '..') continue;
      dwAttributes = AkelPad.MemRead(_PtrAdd(lpFindData, 0) /*offsetof(WIN32_FIND_DATAW, dwAttributes)*/, 3 /*DT_DWORD*/);
      if (!(dwAttributes & 0x10 /*FILE_ATTRIBUTE_DIRECTORY*/))
      	fileList.push(pFileName);
    }
    while (oSys.Call('kernel32::FindNextFile' + _TCHAR, hSearch, lpFindData));

    oSys.Call('kernel32::FindClose', hSearch);
  }
	return fileList;
}


Full wrapper of Emmet (ex. Zen Coding) http://emmet.io
Download `AkelEmmet.zip` from http://beotiger.com/download/AkelEmmet
See AkelEmmet_readme.txt for installation and using instructions inside this zip.

Обёртка над Emmet (бывший Zen Coding) http://emmet.io
Скачайте `AkelEmmet.zip` отсюда: http://beotiger.com/download/AkelEmmet
Смотрите инструкции по установке и настройке в файле AkelEmmet_readme_ru.txt внутри архива.

Offline
Posts: 202
Joined: Sat Mar 28, 2015 2:36 pm
Location: Russia

Post by Kley »

Выравнивание выделенного текста на колонки.
Alignment the selected text on the columns.

Code: Select all

//  ============================================================================
//  Version: 2016-01-09
//  Author: Kley
//
//  Description(1033): Alignment the selected text on the columns.
//  Description(1049): Выравнивание выделенного текста на колонки.
//
//  Arguments:
//  -Delimiter="\t"     -разделитель колонок - символ(ы) в тексте
//                         (по умолчанию "" - показать окно диалога);
//  -LeftSpace=1        -добавить отступ перед разделителем (по умолчанию 0);
//  -RightSpace=1       -добавить отступ после разделителя (по умолчанию 0);
//  -AlignDelim=1       -выровнять разделитель в колонку (по умолчанию 0);
//  -ReplaceDelim=1     -заменить разделитель (по умолчанию 0);
//  -NewDelimiter="|"   -новый разделитель колонок (по умолчанию "")
//                         (игнорируется, если -ReplaceDelim=0);
//  -OnlyFirstDelim=1   -обработать только первый разделитель (по умолчанию 0);
//  -RightAlign=1       -выровнять колонки по правому краю (по умолчанию 0);
//  -SkipFirstColumn=1  -не трогать первую колонку (по умолчанию 0);
//                         (игнорируется, если -RightAlign=0);
//  -LeftIndent=1       -выровнять текст по первой строке (по умолчанию 0).
//  -SpaceToTab=1       -выровнять с заменой пробелов табуляцией (по умолчанию 0).
//                         (игнорируется, если -LeftIndent=0);
//                         (игнорируется, если -SkipFirstColumn=0);
//
//  Usage:
//  Call("Scripts::Main", 1, "AlignColumns.js")
//
//  Note:
//  В выделенном тексте обрабатываются только те строки, которые имеют разделитель.
//  -LeftSpace=1 и -RightSpace=1 для удобства. Можно использовать, например:
//  -Delimiter="," -NewDelimiter=" , ". При включенном -ReplaceDelim=1.
//  ============================================================================
// Arguments
var pDelimiter = AkelPad.GetArgValue("Delimiter", "");
var bLeftSpace = AkelPad.GetArgValue("LeftSpace", 0);
var bRightSpace = AkelPad.GetArgValue("RightSpace", 0);
var bAlignDelim = AkelPad.GetArgValue("AlignDelim", 0);
var bReplaceDelim = AkelPad.GetArgValue("ReplaceDelim", 0);
var pNewDelimiter = AkelPad.GetArgValue("NewDelimiter", "");
var bOnlyFirstDelim = AkelPad.GetArgValue("OnlyFirstDelim", 0);
var bRightAlign = AkelPad.GetArgValue("RightAlign", 0);
var bSkipFirstColumn = AkelPad.GetArgValue("SkipFirstColumn", 0);
var bLeftIndent = AkelPad.GetArgValue("LeftIndent", 0);
var bSpaceToTab = AkelPad.GetArgValue("SpaceToTab", 0);

// Variables
var oSys = AkelPad.SystemFunction();
var hMainWnd = AkelPad.GetMainWnd();
var hWndEdit = AkelPad.GetEditWnd();
var aLines;

if (!hWndEdit) WScript.Quit();

var nTabStop = AkelPad.SendMessage(hWndEdit, 3239 /*AEM_GETTABSTOP*/, 0, 0);

// Without GUI
if (pDelimiter)
{
  SetAlignColumns();
  WScript.Quit();
}

// GUI
var pScriptName = WScript.ScriptName;
var pClassName = "AkelPad::Scripts::" + pScriptName + "::" +
                 oSys.Call("kernel32::GetCurrentProcessId");
var hDlg = 0;

var ID_GRP_DELIMITER       = 1000;
var ID_EDT_DELIMITER       = 1001;
var ID_CHK_LSPACEDELIM     = 1002;
var ID_CHK_RSPACEDELIM     = 1003;
var ID_CHK_ALIGNDELIM      = 1004;
var ID_CHK_ONLIFIRSTDELIM  = 1005;
var ID_CHK_REPLACEDELIM    = 1006;
var ID_EDT_REPLACEDELIM    = 1007;
var ID_CHK_LEFTINDENT      = 1008;
var ID_CHK_LEFTINDENTTAB   = 1009;
var ID_CHK_ALIGNRIGHT      = 1010;
var ID_CHK_SKIPFIRSTCOLUMN = 1011;
var ID_OK                  = 1012;
var ID_CANCEL              = 1013;

ReadIni();

if (AkelPad.WindowRegisterClass(pClassName))
{
  //0x90CA0040=WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|DS_SETFONT
  //0x50000107=WS_VISIBLE|WS_CHILD|BS_GROUPBOX|BS_LEFT
  //0x50010000=WS_VISIBLE|WS_CHILD|WS_TABSTOP
  //0x50010001=WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_DEFPUSHBUTTON
  //0x50010003=WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX
  //0x50010080=WS_VISIBLE|WS_CHILD|WS_DISABLED|WS_TABSTOP|ES_AUTOHSCROLL
  AkelPad.CreateDialog(
    0,              //dwExStyle
    pClassName,     //lpClassName
    pScriptName,    //lpWindowName
    0x90CA0040,     //dwStyle
    0,              //x
    0,              //y
    280,            //Width
    330,            //Height
    hMainWnd,       //hWndParent
    DialogCallback, //callback function
    0x2,            //nFlags=CDF_PIXELS
    0,              //hMenu
    0,              //hInstance=default
    "",             //pFaceName=default
    1,              //nFontStyle=regular font
    0,              //nPointSize=default
  "|",
  //ExSt,  Class,    Title,             Style,        X,   Y,   W,   H, ID,                     lParam,
    0,     "BUTTON", GetLangString(0),  0x50000107,  14,  10, 251, 188, ID_GRP_DELIMITER,       0, "|",
    0x200, "EDIT",   "",                0x50010080,  26,  34, 224,  20, ID_EDT_DELIMITER,       0, "|",
    0,     "BUTTON", GetLangString(1),  0x50010003,  26,  64, 200,  14, ID_CHK_LSPACEDELIM,     0, "|",
    0,     "BUTTON", GetLangString(2),  0x50010003,  26,  84, 200,  14, ID_CHK_RSPACEDELIM,     0, "|",
    0,     "BUTTON", GetLangString(3),  0x50010003,  26, 105, 200,  14, ID_CHK_ALIGNDELIM,      0, "|",
    0,     "BUTTON", GetLangString(9),  0x50010003,  26, 126, 200,  14, ID_CHK_ONLIFIRSTDELIM,  0, "|",
    0,     "BUTTON", GetLangString(4),  0x50010003,  26, 148, 200,  14, ID_CHK_REPLACEDELIM,    0, "|",
    0x200, "EDIT",   "",                0x50010080,  26, 170, 224,  20, ID_EDT_REPLACEDELIM,    0, "|",
    0,     "BUTTON", GetLangString(5),  0x50010003,  14, 208, 200,  14, ID_CHK_LEFTINDENT,      0, "|",
    0,     "BUTTON", GetLangString(10), 0x50010003,  32, 228, 200,  14, ID_CHK_LEFTINDENTTAB,   0, "|",
    0,     "BUTTON", GetLangString(6),  0x50010003,  14, 248, 200,  14, ID_CHK_ALIGNRIGHT,      0, "|",
    0,     "BUTTON", GetLangString(7),  0x50010003,  32, 268, 200,  14, ID_CHK_SKIPFIRSTCOLUMN, 0, "|",
    0,     "BUTTON", "OK",              0x50010001, 110, 298,  75,  23, ID_OK,                  0, "|",
    0,     "BUTTON", GetLangString(8),  0x50010000, 190, 298,  75,  23, ID_CANCEL,              0, "|"
  );

  if (hDlg)
  {
    AkelPad.ScriptNoMutex();
    AkelPad.WindowGetMessage(0x4 /*WGM_KEYDOWNUP*/);
  }
  AkelPad.WindowUnregisterClass(pClassName);
}
else
{
  if (hDlg = oSys.Call("user32::FindWindowEx"+_TCHAR, 0, 0, pClassName, 0))
  {
    if (oSys.Call("user32::IsIconic", hDlg))
      oSys.Call("user32::ShowWindow", hDlg, 0x9 /*SW_RESTORE*/);
    AkelPad.SendMessage(hDlg, 0x7 /*WM_SETFOCUS*/, 0, 0);
  }
}

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  switch (uMsg)
  {
    case 0x110 /*WM_INITDIALOG*/:
        hDlg = hWnd;

        //Center dialog
        CenterWindow(hMainWnd, hWnd);

        SetDlgItemText(ID_EDT_DELIMITER, pDelimiter);
        SetDlgItemText(ID_EDT_REPLACEDELIM, pNewDelimiter);

        //Check the buttons state
        SendDlgItemMessage(ID_CHK_REPLACEDELIM,    241 /*BM_SETCHECK*/, bReplaceDelim,    0);
        SendDlgItemMessage(ID_CHK_LSPACEDELIM,     241 /*BM_SETCHECK*/, bLeftSpace,       0);
        SendDlgItemMessage(ID_CHK_RSPACEDELIM,     241 /*BM_SETCHECK*/, bRightSpace,      0);
        SendDlgItemMessage(ID_CHK_ALIGNRIGHT,      241 /*BM_SETCHECK*/, bRightAlign,      0);
        SendDlgItemMessage(ID_CHK_ALIGNDELIM,      241 /*BM_SETCHECK*/, bAlignDelim,      0);
        SendDlgItemMessage(ID_CHK_LEFTINDENT,      241 /*BM_SETCHECK*/, bLeftIndent,      0);
        SendDlgItemMessage(ID_CHK_LEFTINDENTTAB,   241 /*BM_SETCHECK*/, bSpaceToTab,      0);
        SendDlgItemMessage(ID_CHK_SKIPFIRSTCOLUMN, 241 /*BM_SETCHECK*/, bSkipFirstColumn, 0);
        SendDlgItemMessage(ID_CHK_ONLIFIRSTDELIM,  241 /*BM_SETCHECK*/, bOnlyFirstDelim,  0);

        oSys.Call("user32::EnableWindow", GetDlgItem(ID_CHK_SKIPFIRSTCOLUMN), bRightAlign);
        oSys.Call("user32::EnableWindow", GetDlgItem(ID_CHK_LEFTINDENTTAB), bLeftIndent);
        break;

    case 0x111 /*WM_COMMAND*/:
        var nID   = (wParam & 0xffff);
        var nCode = ((wParam >> 16) & 0xffff);

        if (nID == ID_EDT_DELIMITER)
        {
          if (nCode == 0x100 /*EN_SETFOCUS*/)
            PostMessage(lParam, 177 /*EM_SETSEL*/, 0, -1);
          else if (nCode == 0x300 /*EN_CHANGE*/)
            oSys.Call("user32::EnableWindow", GetDlgItem(ID_OK), GetDlgItemTextLen(ID_EDT_DELIMITER));
        }
        else if (nID == ID_EDT_REPLACEDELIM)
        {
          if (nCode == 0x100 /*EN_SETFOCUS*/)
            PostMessage(lParam, 177 /*EM_SETSEL*/, 0, -1);
        }
        else if (nID == ID_CHK_LSPACEDELIM)
          bLeftSpace = SendDlgItemMessage(ID_CHK_LSPACEDELIM, 240 /*BM_GETCHECK*/, 0, 0);

        else if (nID == ID_CHK_RSPACEDELIM)
          bRightSpace = SendDlgItemMessage(ID_CHK_RSPACEDELIM, 240 /*BM_GETCHECK*/, 0, 0);

        else if (nID == ID_CHK_REPLACEDELIM)
          bReplaceDelim = SendDlgItemMessage(ID_CHK_REPLACEDELIM, 240 /*BM_GETCHECK*/, 0, 0);

        else if (nID == ID_CHK_ALIGNDELIM)
          bAlignDelim = SendDlgItemMessage(ID_CHK_ALIGNDELIM, 240 /*BM_GETCHECK*/, 0, 0);

        else if (nID == ID_CHK_ONLIFIRSTDELIM)
          bOnlyFirstDelim = SendDlgItemMessage(ID_CHK_ONLIFIRSTDELIM, 240 /*BM_GETCHECK*/, 0, 0);

        else if (nID == ID_CHK_ALIGNRIGHT      ||
                 nID == ID_CHK_SKIPFIRSTCOLUMN ||
                 nID == ID_CHK_LEFTINDENT)
          EnableWindow(nID);

        else if (nID == ID_CHK_LEFTINDENTTAB)
          bSpaceToTab = SendDlgItemMessage(ID_CHK_LEFTINDENTTAB, 240 /*BM_GETCHECK*/, 0, 0);

        else if (nID == ID_OK)
        {
          pDelimiter = GetDlgItemText(ID_EDT_DELIMITER);
          pNewDelimiter = GetDlgItemText(ID_EDT_REPLACEDELIM);

          oSys.Call("user32::EnableWindow", lParam, false);
          oSys.Call("User32::SetFocus", GetDlgItem(ID_EDT_DELIMITER));
          SetAlignColumns();
          oSys.Call("user32::EnableWindow", lParam, true);
        }
        else if ((nID == ID_CANCEL) || (nID == 2 /*IDCANCEL*/))
          PostMessage(hDlg, 0x10 /*WM_CLOSE*/, 0, 0);
        break;

    case 0x10 /*WM_CLOSE*/:
        WriteIni();
        oSys.Call("user32::DestroyWindow", hWnd); //Destroy dialog
        break;

    case 0x2 /*WM_DESTROY*/:
        oSys.Call("user32::PostQuitMessage", 0);  //Exit message loop
  }
  return 0;
}

function EnableWindow(nID)
{
  if (nID == ID_CHK_LEFTINDENT)
  {
    if (bLeftIndent = SendDlgItemMessage(ID_CHK_LEFTINDENT, 240 /*BM_GETCHECK*/, 0, 0))
    {
      if (bSkipFirstColumn || !bRightAlign)
      {
        oSys.Call("user32::EnableWindow", GetDlgItem(ID_CHK_LEFTINDENTTAB), true);
        bSpaceToTab = SendDlgItemMessage(ID_CHK_LEFTINDENTTAB, 240 /*BM_GETCHECK*/, 0, 0);
      }
      else
      {
        oSys.Call("user32::EnableWindow", GetDlgItem(ID_CHK_LEFTINDENTTAB), false);
        bSpaceToTab = false;
      }
    }
    else
    {
      oSys.Call("user32::EnableWindow", GetDlgItem(ID_CHK_LEFTINDENTTAB), false);
      bSpaceToTab = false;
    }
  }
  else if (nID == ID_CHK_ALIGNRIGHT)
  {
    if (bRightAlign = SendDlgItemMessage(ID_CHK_ALIGNRIGHT, 240 /*BM_GETCHECK*/, 0, 0))
    {
      oSys.Call("user32::EnableWindow", GetDlgItem(ID_CHK_SKIPFIRSTCOLUMN), true);

      if (bSkipFirstColumn = SendDlgItemMessage(ID_CHK_SKIPFIRSTCOLUMN, 240 /*BM_GETCHECK*/, 0, 0))
      {
        oSys.Call("user32::EnableWindow", GetDlgItem(ID_CHK_LEFTINDENTTAB), bLeftIndent);
        if (bLeftIndent)
          bSpaceToTab = SendDlgItemMessage(ID_CHK_LEFTINDENTTAB, 240 /*BM_GETCHECK*/, 0, 0);
      }
      else
      {
        oSys.Call("user32::EnableWindow", GetDlgItem(ID_CHK_LEFTINDENTTAB), false);
        bSpaceToTab = false;
      }
    }
    else
    {
      oSys.Call("user32::EnableWindow", GetDlgItem(ID_CHK_SKIPFIRSTCOLUMN), false);
      oSys.Call("user32::EnableWindow", GetDlgItem(ID_CHK_LEFTINDENTTAB), bLeftIndent);
      bSkipFirstColumn = false;
      if (bLeftIndent)
        bSpaceToTab = SendDlgItemMessage(ID_CHK_LEFTINDENTTAB, 240 /*BM_GETCHECK*/, 0, 0);
    }
  }
  else if (nID == ID_CHK_SKIPFIRSTCOLUMN)
  {
    if (bSkipFirstColumn = SendDlgItemMessage(ID_CHK_SKIPFIRSTCOLUMN, 240 /*BM_GETCHECK*/, 0, 0))
    {
      oSys.Call("user32::EnableWindow", GetDlgItem(ID_CHK_LEFTINDENTTAB), bLeftIndent);
      if (bLeftIndent)
        bSpaceToTab = SendDlgItemMessage(ID_CHK_LEFTINDENTTAB, 240 /*BM_GETCHECK*/, 0, 0);
    }
    else
    {
      oSys.Call("user32::EnableWindow", GetDlgItem(ID_CHK_LEFTINDENTTAB), false);
      bSpaceToTab = false;
    }
  }
}

function CenterWindow(hWndParent, hWnd)
{
  var lpRect;
  var rcWndParent = [];
  var rcWnd = [];
  var X;
  var Y;

  if (lpRect = AkelPad.MemAlloc(16)) //sizeof(RECT)
  {
    if (!hWndParent)
      hWndParent = oSys.Call("user32::GetDesktopWindow");

    oSys.Call("user32::GetWindowRect", hWndParent, lpRect);
    RectToArray(lpRect, rcWndParent);

    oSys.Call("user32::GetWindowRect", hWnd, lpRect);
    RectToArray(lpRect, rcWnd);

    //Center window
    X = rcWndParent.left + ((rcWndParent.right - rcWndParent.left) / 2 - (rcWnd.right - rcWnd.left) / 2);
    Y = rcWndParent.top + ((rcWndParent.bottom - rcWndParent.top) / 2 - (rcWnd.bottom - rcWnd.top) / 2);

    oSys.Call("user32::SetWindowPos", hWnd, 0, X, Y, 0, 0, 0x15 /*SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE*/);

    AkelPad.MemFree(lpRect);
  }
}

function RectToArray(lpRect, rcRect)
{
  rcRect.left   = AkelPad.MemRead(_PtrAdd(lpRect,  0) /*offsetof(RECT, left)*/,   3 /*DT_DWORD*/);
  rcRect.top    = AkelPad.MemRead(_PtrAdd(lpRect,  4) /*offsetof(RECT, top)*/,    3 /*DT_DWORD*/);
  rcRect.right  = AkelPad.MemRead(_PtrAdd(lpRect,  8) /*offsetof(RECT, right)*/,  3 /*DT_DWORD*/);
  rcRect.bottom = AkelPad.MemRead(_PtrAdd(lpRect, 12) /*offsetof(RECT, bottom)*/, 3 /*DT_DWORD*/);
  return rcRect;
}

function GetDlgItem(nID)
{
  return oSys.Call("User32::GetDlgItem", hDlg, nID);
}

function SetDlgItemText(nID, pText)
{
  oSys.Call("User32::SetDlgItemTextW", hDlg, nID, pText);
}

function GetDlgItemText(nID)
{
  var nTextLen;
  var lpBuffer;
  var pText = "";

  if (nTextLen = GetDlgItemTextLen(nID))
  {
    lpBuffer = AkelPad.MemAlloc(nTextLen * 2 + 2);
    oSys.Call("User32::GetDlgItemTextW", hDlg, nID, lpBuffer, nTextLen + 1);
    pText = AkelPad.MemRead(lpBuffer, 1 /*DT_UNICODE*/);
    AkelPad.MemFree(lpBuffer);
  }
  return pText;
}

function GetDlgItemTextLen(nID)
{
  return SendDlgItemMessage(nID, 14 /*WM_GETTEXTLENGTH*/, 0, 0);
}

function SendDlgItemMessage(nID, uMsg, wParam, lParam)
{
  return oSys.Call("User32::SendDlgItemMessageW", hDlg, nID, uMsg, wParam, lParam);
}

function PostMessage(hWnd, uMsg, wParam, lParam)
{
  return oSys.Call("User32::PostMessage" + _TCHAR, hWnd, uMsg, wParam, lParam);
}

function SetAlignColumns()
{
  var pSelText = AkelPad.GetSelText();
  var pLSpace = (bLeftSpace)  ? " " : "";
  var pRSpace = (bRightSpace) ? " " : "";
  var aMaxColumns = [];
  var pOutDelimiter;
  var regexpDelim;
  var aLineColumns;
  var pLeftIndent;
  var i, n;

  if (AkelPad.GetEditReadOnly(0)) return;

  if (pSelText)
  {
    if ((aLines = pSelText.split("\r")).length > 1)
    {
      pDelimiter = pDelimiter.replace(/\\t/g, "\t");
      pNewDelimiter = pNewDelimiter.replace(/\\t/g, "\t");
      pOutDelimiter = (bReplaceDelim) ? pLSpace + pNewDelimiter + pRSpace
                                      : pLSpace + pDelimiter    + pRSpace;

      regexpDelim = new RegExp(pDelimiter.replace(/([\(\)\[\]\\\.\^\$\|\?\+\*])/g, "\\$1"));

      for (var i = 0; i < aLines.length; ++i)
      {
        if (regexpDelim.test(aLines[i]))
        {
          if (bLeftIndent)
          {
            if (pLeftIndent === undefined)
            {
              /(^[ \t]+)/g.test(aLines[i]);
              pLeftIndent = RegExp.$1;

              if (bSpaceToTab)
                pLeftIndent = ReplaceSpace(pLeftIndent);
              else
                pLeftIndent = ReplaceTab(pLeftIndent);

              aLines[i] = aLines[i].replace(/(^[ \t]*)/g, pLeftIndent);
            }
            else
              aLines[i] = aLines[i].replace(/(^[ \t]*)/g, pLeftIndent);
          }
          else
          {
            if (/(^[ \t]+)/g.test(aLines[i]))
            {
              pLeftIndent = RegExp.$1;
              if (/\t/.test(pLeftIndent))
              {
                pLeftIndent = ReplaceTab(pLeftIndent);
                aLines[i] = aLines[i].replace(/(^[ \t]*)/g, pLeftIndent);
              }
            }
          }

          if (bOnlyFirstDelim)
          {
            aLines[i] = aLines[i].replace(regexpDelim, "\0");
            aLineColumns = aLines[i].split("\0");
          }
          else
            aLineColumns = aLines[i].split(pDelimiter);

          for (var n = 0; n < aLineColumns.length; ++n)
          {
            if (n > 0)
              aLineColumns[n] = aLineColumns[n].replace(/(^[ \t]+|[ \t]+$)/g, "");
            else
              aLineColumns[n] = aLineColumns[n].replace(/[ \t]+$/g, "");

            if (aMaxColumns[n] !== undefined)
            {
              if (aLineColumns[n].length > aMaxColumns[n])
                aMaxColumns[n] = aLineColumns[n].length;
            }
            else
              aMaxColumns[n] = aLineColumns[n].length;
          }
          aLines[i] = aLineColumns.join(pDelimiter);
        }
      }

      if (aMaxColumns.length > 1)
      {
        for (i = 0; i < aLines.length; ++i)
        {
          if (regexpDelim.test(aLines[i]))
          {
            if (bOnlyFirstDelim)
            {
              aLines[i] = aLines[i].replace(regexpDelim, "\0");
              aLineColumns = aLines[i].split("\0");
            }
            else
              aLineColumns = aLines[i].split(pDelimiter);

            if (bRightAlign)
            {
              if (bSkipFirstColumn)
              {
                if (bAlignDelim)
                {
                  for (n = 0; n < aLineColumns.length; ++n)
                  {
                    if (n > 0)
                      aLineColumns[n]  = StringChr(aMaxColumns[n] - aLineColumns[n].length, " ") + aLineColumns[n];
                    else
                      aLineColumns[n] += StringChr(aMaxColumns[n] - aLineColumns[n].length, " ");
                  }
                }
                else
                {
                  for (n = 1; n < aLineColumns.length; ++n)
                  {
                    if (n > 1)
                      aLineColumns[n] = StringChr(aMaxColumns[n] - aLineColumns[n].length, " ") + aLineColumns[n];
                    else
                      aLineColumns[n] = StringChr((aMaxColumns[n - 1] - aLineColumns[n - 1].length) +
                                                (aMaxColumns[n] - aLineColumns[n].length), " ") + aLineColumns[n];
                  }
                }
              }
              else
              {
                for (n = 0; n < aLineColumns.length; ++n)
                {
                  if (bSpaceToTab && bSkipFirstColumn && n == 0)
                  {
                    pLeftIndent = StringChr(aMaxColumns[n] - aLineColumns[n].length, " ");
                    pLeftIndent = ReplaceSpace(pLeftIndent);
                    aLineColumns[n] = pLeftIndent + aLineColumns[n];
                  }
                  else
                    aLineColumns[n] = StringChr(aMaxColumns[n] - aLineColumns[n].length, " ") + aLineColumns[n];
                }
              }
            }
            else
            {
              if (bAlignDelim)
              {
                for (n = 0; n < aLineColumns.length - 1; ++n)
                  aLineColumns[n] += StringChr(aMaxColumns[n] - aLineColumns[n].length, " ");
              }
              else
              {
                for (n = aLineColumns.length - 1; n > 0; --n)
                  aLineColumns[n] = StringChr(aMaxColumns[n - 1] - aLineColumns[n - 1].length, " ") + aLineColumns[n];
              }
            }
            aLines[i] = aLineColumns.join(pOutDelimiter);
          }
        }
        AkelPad.ReplaceSel(aLines.join("\n"), -2 /*RST_SELECTRESTORESCROLL*/);
      }
    }
  }
}

//pText должен содержать только символы табуляций и/или пробелов
function ReplaceTab(pText)
{
  var nColumn = 0;
  var sResult = "";
  var pSpaces;
  var a, b;

  for (a = 0, b = 0; b < pText.length; ++b)
  {
    if (pText.charAt(b) == '\t')
    {
      nSpaceCount = nTabStop - nColumn % nTabStop;
      nColumn += nSpaceCount;
      for (pSpaces = ""; nSpaceCount; --nSpaceCount)
        pSpaces = pSpaces + " ";
      sResult += pText.substr(a, b - a) + pSpaces;
      a = b + 1;
    }
    else
      ++nColumn;
  }
  sResult += pText.substr(a, b - a);
  return sResult;
}

function ReplaceSpace(str)
{
  for (var nSpaceCount = nTabStop; nSpaceCount >= 1; nSpaceCount--)
    str = str.replace(new RegExp(' {' + nSpaceCount + '}', "g"), "\t");
  return str;
}

function StringChr(nLen, sChr)
{
  var str = "";

  while (str.length < nLen)
    str += sChr;

  return str;
}

function ReadIni()
{
  var oSet = AkelPad.ScriptSettings();

  if (oSet.Begin("", 0x1 /*POB_READ*/))
  {
    pDelimiter       = oSet.Read("Delimiter",       3 /*PO_STRING*/, "\t");
    bReplaceDelim    = oSet.Read("ReplaceDelim",    1 /*PO_DWORD*/,     0);
    pNewDelimiter    = oSet.Read("NewDelimiter",    3 /*PO_STRING*/,   "");
    bRightAlign      = oSet.Read("RightAlign",      1 /*PO_DWORD*/,     0);
    bLeftSpace       = oSet.Read("LeftSpace",       1 /*PO_DWORD*/,     0);
    bRightSpace      = oSet.Read("RightSpace",      1 /*PO_DWORD*/,     0);
    bAlignDelim      = oSet.Read("AlignDelim",      1 /*PO_DWORD*/,     0);
    bLeftIndent      = oSet.Read("LeftIndent",      1 /*PO_DWORD*/,     0);
    bSpaceToTab      = oSet.Read("SpaceToTab",      1 /*PO_DWORD*/,     0);
    bSkipFirstColumn = oSet.Read("SkipFirstColumn", 1 /*PO_DWORD*/,     0);
    bOnlyFirstDelim  = oSet.Read("OnlyFirstDelim",  1 /*PO_DWORD*/,     0);
    oSet.End();
  }
}

function WriteIni()
{
  var oSet = AkelPad.ScriptSettings();

  if (oSet.Begin("", 0x2 /*POB_SAVE*/))
  {
    oSet.Write("Delimiter",       3 /*PO_STRING*/, pDelimiter.replace(/\t/g,    "\\t"));
    oSet.Write("ReplaceDelim",    1 /*PO_DWORD*/,  bReplaceDelim);
    oSet.Write("NewDelimiter",    3 /*PO_STRING*/, pNewDelimiter.replace(/\t/g, "\\t"));
    oSet.Write("RightAlign",      1 /*PO_DWORD*/,  bRightAlign);
    oSet.Write("LeftSpace",       1 /*PO_DWORD*/,  bLeftSpace);
    oSet.Write("RightSpace",      1 /*PO_DWORD*/,  bRightSpace);
    oSet.Write("AlignDelim",      1 /*PO_DWORD*/,  bAlignDelim);
    oSet.Write("LeftIndent",      1 /*PO_DWORD*/,  bLeftIndent);
    oSet.Write("SpaceToTab",      1 /*PO_DWORD*/,  bSpaceToTab);
    oSet.Write("SkipFirstColumn", 1 /*PO_DWORD*/,  bSkipFirstColumn);
    oSet.Write("OnlyFirstDelim",  1 /*PO_DWORD*/,  bOnlyFirstDelim);
    oSet.End();
  }
}

function GetLangString(nStringID)
{
  var nLangID=AkelPad.GetLangId(1 /*LANGID_PRIMARY*/);

  if (nLangID == 0x19) //LANG_RUSSIAN
  {
    if (nStringID == 0)
      return "Разделитель";
    if (nStringID == 1)
      return "Добавить пробел слева";
    if (nStringID == 2)
      return "Добавить пробел справа";
    if (nStringID == 3)
      return "Выровнять в колонку";
    if (nStringID == 4)
      return "Заменить на:";
    if (nStringID == 5)
      return "Отступ по первой строке";
    if (nStringID == 6)
      return "Выровнять текст справа";
    if (nStringID == 7)
      return "Не трогать первую колонку";
    if (nStringID == 8)
      return "Отмена";
    if (nStringID == 9)
      return "Только первый";
    if (nStringID == 10)
      return "Выравнивать табуляцией";
  }
  else
  {
    if (nStringID == 0)
      return "Delimiter";
    if (nStringID == 1)
      return "Add a space to the left";
    if (nStringID == 2)
      return "Add a space to the right";
    if (nStringID == 3)
      return "Align in the column";
    if (nStringID == 4)
      return "Replace on:";
    if (nStringID == 5)
      return "Indent the first line";
    if (nStringID == 6)
      return "Text to right aligned";
    if (nStringID == 7)
      return "Don't touch first column";
    if (nStringID == 8)
      return "Cancel";
    if (nStringID == 9)
      return "Only the first";
    if (nStringID == 10)
      return "A Tab instead of a Space";
  }
  return "";
}

Offline
Posts: 53
Joined: Wed Dec 09, 2015 6:33 pm

Post by beotiger »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=30344#p30344
// Version: 1.0 (2016-01-15)
// Author: Andrey Tzar aka beotiger
//
//
// Description(1033): Minify current JavaScript file or selection
// Description(1049): Минимизировать текущий JavaScript файл или выбранный текст

/*
	Argument:
		First argument:	'new' or 'nonew' - if we should use new file for minified result or not
		Default is: we use new file if whole file are to be minimized,
			but if we minify selection we do it on the place
		
	Example:
		Call("Scripts::Main", 1, "JsMin.js", `new`) - minify in new file always 

	Аргумент:
		Первый аргумент - 'new' - всегда использовать новый файл для выдачи результата, 'nonew' - использовать только текущий файл
		Поведение по умолчанию: если есть выбранный текст, мы минизируем его на месте, иначе минизируем весь текст в новый файл

	Пример:
		Call("Scripts::Main", 1, "JsMin.js", `nonew`) - минимизировать всегда в текущем файле 

*/

// check if we use this script out of AkelPad editor's environment
if (typeof AkelPad == "undefined")
{
  try
  {
    AkelPad = new ActiveXObject("AkelPad.Document");
    _PtrAdd = function(n1, n2) {return AkelPad.Global._PtrAdd(n1, n2);};
    _X64    = AkelPad.Constants._X64;
    AkelPad.ActiveXThis(this);
  }
  catch (oError)
  {
    WScript.Echo("You need to register Scripts.dll");
    WScript.Quit();
  }
}

// end of file
var EOF = '\0'; // Ctrl^Z in MS DOS

/// if we should use new file
var option = (WScript.Arguments.length ? trim(WScript.Arguments(0)) : '');
if(option != 'new' && option != 'nonew')
	option = 'default';

var bSelected = true;	// if we have selection

var nSelStart = AkelPad.GetSelStart(),
		nSelEnd = AkelPad.GetSelEnd();
		 
if(nSelStart == nSelEnd) {
	AkelPad.SetSel(0, -1);	// whole document
	bSelected = false;
}

// get selected text with keeping new lines origin
var inputBuf = trim(AkelPad.GetSelText(0)),
		outputBuf = '',
		maxIndex = inputBuf.length,	// length of text
		iIndex = 0;	// current input index

if(maxIndex == 0)
	error("No data to proceed");

// let it do it
jsmin();

if(!outputBuf)
	error("No data have been proceeded");

// guess if we should use new file
var bNew = /*AkelPad.IsMDI() && */(option == 'new' || (option == 'default' && !bSelected));

if(bNew) {
	// restore original selection
	AkelPad.SetSel(nSelStart, nSelEnd);
	AkelPad.SendMessage(AkelPad.GetMainWnd(), 273 /*WM_COMMAND*/, 4101 /*IDM_FILE_NEW)*/, 1);
}

AkelPad.ReplaceSel(trim(outputBuf));

// trim spaces from beginning and end of a string
function trim(pStr)
{
  return (typeof pStr == 'string' && pStr.length) ? 
  	pStr.replace(/^\s+|\s+$/, '') : '';
}

// error handling
function error(s)
{
		AkelPad.MessageBox(AkelPad.GetMainWnd(), s, WScript.ScriptName, 0x48);
		WScript.Quit();	
}

// get one char from inputBuf
function getc()
{
  if(iIndex < maxIndex)
  	return inputBuf.charAt(iIndex++);
  return EOF;
}

// put one char to outputBuf
function putc(c)
{
  outputBuf += c;
}

/*
	Below is the code of Douglas Crockford from jsmin.c file
	rewriten in JavaScript almost as is
	from https://github.com/douglascrockford/JSMin/blob/master/jsmin.c
*/

/* jsmin.c
   2013-03-29

Copyright (c) 2002 Douglas Crockford  (www.crockford.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

The Software shall be used for Good, not Evil.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/

/*
	Translated to JavaScript by beotiger 2015-12-21
	from https://github.com/douglascrockford/JSMin/blob/master/jsmin.c
*/

var   theA,
			theB,
			theLookahead = EOF,
			theX = EOF,
			theY = EOF;

/* 
		isAlphanum -- return true if the character is a letter, digit, underscore,
        dollar sign, or non-ASCII character.
*/

function isAlphanum(c)
{
    return ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') ||
        (c >= 'A' && c <= 'Z') || c == '_' || c == '$' || c == '\\' ||
        c > 126);
}

/* 
		get -- return the next character from stdin. Watch out for lookahead. If
        the character is a control character, translate it to a space or
        linefeed.
*/

function get()
{
    var c = theLookahead;
    theLookahead = EOF;
    if (c == EOF) {
        c = getc();
    }
    if (c >= ' ' || c == '\n' || c == EOF) {
        return c;
    }
    if (c == '\r') {
        return '\n';
    }
    return ' ';
}

/* 
	peek -- get the next character without getting it.
*/

function peek()
{
    theLookahead = get();
    return theLookahead;
}

/*
		next -- get the next character, excluding comments. peek() is used to see
        if a '/' is followed by a '/' or '*'.
*/

function next()
{
    var c = get();
    if (c == '/') {
        switch (peek()) {
        case '/':
            for (;;) {
                c = get();
                if (c <= '\n') {
                    break;
                }
            }
            break;
        case '*':
            get();
            while (c != ' ') {
                switch (get()) {
                case '*':
                    if (peek() == '/') {
                        get();
                        c = ' ';
                    }
                    break;
                case EOF:
                    error("Unterminated comment.");
                }
            }
            break;
        }
    }
    theY = theX;
    theX = c;
    return c;
}


/* 
	action -- do something! What you do is determined by the argument:
        1   Output A. Copy B to A. Get the next B.
        2   Copy B to A. Get the next B. (Delete A).
        3   Get the next B. (Delete B).
   action treats a string as a single character. Wow!
   action recognizes a regular expression if it is preceded by ( or , or =.
*/

function action(d)
{
    switch (d) {
    case 1:
        putc(theA);
        if (
            (theY == '\n' || theY == ' ') &&
            (theA == '+' || theA == '-' || theA == '*' || theA == '/') &&
            (theB == '+' || theB == '-' || theB == '*' || theB == '/')
        ) {
            putc(theY);
        }
    case 2:
        theA = theB;
        if (theA == '\'' || theA == '"' || theA == '`') {
            for (;;) {
                putc(theA);
                theA = get();
                if (theA == theB) {
                    break;
                }
                if (theA == '\\') {
                    putc(theA);
                    theA = get();
                }
                if (theA == EOF) {
                    error("Unterminated string literal.");
                }
            }
        }
    case 3:
        theB = next();
        if (theB == '/' && (
            theA == '(' || theA == ',' || theA == '=' || theA == ':' ||
            theA == '[' || theA == '!' || theA == '&' || theA == '|' ||
            theA == '?' || theA == '+' || theA == '-' || theA == '~' ||
            theA == '*' || theA == '/' || theA == '{' || theA == '\n'
        )) {
            putc(theA);
            if (theA == '/' || theA == '*') {
                putc(' ');
            }
            putc(theB);
            for (;;) {
                theA = get();
                if (theA == '[') {
                    for (;;) {
                        putc(theA);
                        theA = get();
                        if (theA == ']') {
                            break;
                        }
                        if (theA == '\\') {
                            putc(theA);
                            theA = get();
                        }
                        if (theA == EOF) {
                            error("Unterminated set in Regular Expression literal.");
                        }
                    }
                } else if (theA == '/') {
                    switch (peek()) {
                    case '/':
                    case '*':
                        error("Unterminated set in Regular Expression literal.");
                    }
                    break;
                } else if (theA =='\\') {
                    putc(theA);
                    theA = get();
                }
                if (theA == EOF) {
                    error("Unterminated Regular Expression literal.");
                }
                putc(theA);
            }
            theB = next();
        }
    }
}


/*
		jsmin -- Copy the input to the output, deleting the characters which are
        insignificant to JavaScript. Comments will be removed. Tabs will be
        replaced with spaces. Carriage returns will be replaced with linefeeds.
        Most spaces and linefeeds will be removed.
*/

function jsmin()
{
    if (peek() == 0xEF) {
        get();
        get();
        get();
    }
    theA = '\n';
    action(3);
    while (theA != EOF) {
        switch (theA) {
        case ' ':
            action(isAlphanum(theB) ? 1 : 2);
            break;
        case '\n':
            switch (theB) {
            case '{':
            case '[':
            case '(':
            case '+':
            case '-':
            case '!':
            case '~':
                action(1);
                break;
            case ' ':
                action(3);
                break;
            default:
                action(isAlphanum(theB) ? 1 : 2);
            }
            break;
        default:
            switch (theB) {
            case ' ':
                action(isAlphanum(theA) ? 1 : 3);
                break;
            case '\n':
                switch (theA) {
                case '}':
                case ']':
                case ')':
                case '+':
                case '-':
                case '"':
                case '\'':
                case '`':
                    action(1);
                    break;
                default:
                    action(isAlphanum(theA) ? 1 : 3);
                }
                break;
            default:
                action(1);
                break;
            }
        }
    }
}


Minify current JavaScript file or selection using classic Douglas Crockford' algorithm.

Минимизировать текущий JavaScript файл или выбранный текст используя классический алгоритм Дугласа Крокфорда.

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

Post by KDJ »

Sort lines containing integers.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=30423#p30423
// Version: 2018-12-06a
// Author: KDJ
//
// *** Sort lines containing integers ***
//
// Usage:
//   Call("Scripts::Main", 1, "SortLinesWithIntegers.js", "-ascending=true -matchCase=false -matchLocale=false -msgBefore=true -msgAfter=true")
//
// Arguments (are optional):
//   -ascending   - sort ascending (default: true)
//   -matchCase   - match case (default: false)
//   -matchLocale - match locale, alphabetically (default: false)
//   -msgBefore   - show message box before sorting (default: true)
//   -msgAfter    - show message box after sorting (default: true)

var hMainWnd     = AkelPad.GetMainWnd();
var hEditWnd     = AkelPad.GetEditWnd();
var oSys         = AkelPad.SystemFunction();
var bAscending   = AkelPad.GetArgValue("ascending", true);
var bMatchCase   = AkelPad.GetArgValue("matchCase", false);
var bMatchLocale = AkelPad.GetArgValue("matchLocale", false);
var bMsgBefore   = AkelPad.GetArgValue("msgBefore", true);
var bMsgAfter    = AkelPad.GetArgValue("msgAfter", true);
var aLine;

if (hEditWnd && (! AkelPad.GetEditReadOnly(0)))
{
  GetLines();

  if (aLine.length)
  {
    if (bMsgBefore)
    {
      if (AkelPad.MessageBox(hMainWnd, "Do you want to sort selected lines?" + "\n\n   - ascending:\t" + bAscending + "\n   - match case:\t" + bMatchCase + "\n   - match locale:\t" + bMatchLocale, WScript.ScriptName, 0x21 /*MB_ICONQUESTION|MB_OKCANCEL*/) != 1 /*IDOK*/)
        WScript.Quit();
    }

    aLine.sort(SortFunc);
    AkelPad.ReplaceSel(aLine.join("\r"), -1 /*RST_SELECT*/);

    if (bMsgAfter)
      AkelPad.MessageBox(hMainWnd, "Lines have been sorted.", WScript.ScriptName, 0x40 /*MB_ICONINFORMATION*/);
  }
}

function SortFunc(s1, s2)
{
  //without this assignment, in replace method error occurs
  var sL1 = s1;
  var sL2 = s2;

  var aMatch;
  var nLen;
  var i;

  if (aMatch = (sL1 + " " + sL2).match(/\d+/g))
  {
    nLen = 1;

    for (i = 0; i < aMatch.length; ++i)
      nLen = Math.max(nLen, aMatch[i].length);

    sL1 = sL1.replace(/\d+/g, ReplaceFunc);
    sL2 = sL2.replace(/\d+/g, ReplaceFunc);
  }

  if (bMatchLocale)
    return oSys.Call("Kernel32::lstrcmp" + (bMatchCase ? "W" : "iW"), sL1, sL2);

  if (! bMatchCase)
  {
    sL1 = sL1.toLowerCase();
    sL2 = sL2.toLowerCase();
  }

  if (bAscending)
  {
    if (sL1 < sL2)
      return -1;
    if (sL1 > sL2)
      return 1;
  }
  else
  {
    if (sL1 > sL2)
      return -1;
    if (sL1 < sL2)
      return 1;
  }

  return 0;

  function ReplaceFunc(sNum)
  {
    while (sNum.length < nLen)
      sNum = "0" + sNum;

    return sNum;
  }
}

function GetLines()
{
  var nSel1 = AkelPad.GetSelStart();
  var nSel2 = AkelPad.GetSelEnd();

  if (nSel1 == nSel2)
  {
    nSel1 = 0;
    nSel2 = -1;
  }
  else
  {
    nSel1 = AkelPad.SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 18 /*AEGI_WRAPLINEBEGIN*/, nSel1);
    nSel2 = AkelPad.SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 19 /*AEGI_WRAPLINEEND*/, nSel2);
  }

  AkelPad.SetSel(nSel1, nSel2);
  aLine = AkelPad.GetSelText().split("\r");

  if (aLine.length == 1)
    aLine.shift();
}

Last edited by KDJ on Thu Dec 06, 2018 6:18 pm, edited 2 times in total.

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

Post by KDJ »

Prevents overwrite selection.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=30468#p30468
// Version: 2016-02-01
// Author: KDJ
//
// *** Prevents overwrite selection ***
// 
// Usage:
//   Call("Scripts::Main", 1, "NoOverwriteSelection.js", "-msg=true")
// 
// Argument (optional):
//   -msg - if false, message box is not displayed (default is true)
//
// Remarks:
//   After first call, the script resides in the memory. Second script call, closes it.
//   If the script is running, you can not overwrite selection. Can delete selection (DEL key or Menu->Edit->Delete).
//   For autostart, in AkelPad.ini or registry CmdLineBegin/CmdLineEnd key, need to add eg:
//     /Call("Scripts::Main", 1, "NoOverwriteSelection.js", "-msg=false")

var bMsg     = AkelPad.GetArgValue("msg", true);
var hMainWnd = AkelPad.GetMainWnd();
var hScript  = AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/);
var hSubClassMain;
var hSubClassEdit;

if (hScript && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/))
{
  //script already is running, close it
  AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);

  if (bMsg)
    AkelPad.MessageBox(hMainWnd, "Prevention of overwrite selection is turned off.", WScript.ScriptName, 0x40 /*MB_ICONINFORMATION*/);
}
else if (hSubClassMain = AkelPad.WindowSubClass(1 /*WSC_MAINPROC*/, MainCallback, 273 /*WM_COMMAND*/))
{
  if (hSubClassEdit = AkelPad.WindowSubClass(2 /*WSC_EDITPROC*/, EditCallback, 256 /*WM_KEYDOWN*/, 258 /*WM_CHAR*/))
  {
    if (bMsg)
      AkelPad.MessageBox(hMainWnd, "Prevention of overwrite selection is turned on.", WScript.ScriptName, 0x40 /*MB_ICONINFORMATION*/);

    AkelPad.ScriptNoMutex();
    AkelPad.WindowGetMessage();
    AkelPad.WindowUnsubClass(2 /*WSC_EDITPROC*/);
  }

  AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
}

function MainCallback(hWnd, uMsg, wParam, lParam)
{
  var nCmd;

  if (uMsg == 273 /*WM_COMMAND*/)
  {
    nCmd = wParam & 0xFFFF;

    if ((nCmd == 4153 /*IDM_EDIT_CUT*/) ||
        (nCmd == 4155 /*IDM_EDIT_PASTE*/) ||
        (nCmd >= 4164 /*IDM_EDIT_INSERT_TAB*/) && (nCmd <= 4173 /*IDM_EDIT_DELETE_FIRST_CHAR_MENU*/) ||
        (nCmd >= 4175 /*IDM_EDIT_UPPERCASE*/)  && (nCmd <= 4180 /*IDM_EDIT_LOOPCASE*/) ||
        (nCmd == 4183 /*IDM_EDIT_INSERTDATE*/) ||
        (nCmd >= 4191 /*IDM_EDIT_PASTEANSI*/)  && (nCmd <= 4196 /*IDM_EDIT_AUTOINDENT*/))
    {
      if (AkelPad.GetSelStart() != AkelPad.GetSelEnd())
        AkelPad.WindowNoNextProc(hSubClassMain);
    }
  }

  return 0;
}

function EditCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 256 /*WM_KEYDOWN*/)
  {
    if (wParam == 0x08 /*VK_BACK*/)
    {
      if (AkelPad.GetSelStart() != AkelPad.GetSelEnd())
        AkelPad.WindowNoNextProc(hSubClassEdit);
    }
  }
  else if (uMsg == 258 /*WM_CHAR*/)
  {
    if (AkelPad.GetSelStart() != AkelPad.GetSelEnd())
      AkelPad.WindowNoNextProc(hSubClassEdit);
  }

  return 0;
}


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

Post by KDJ »

Replace text in edit window.
This is library script, should be saved in ...\AkelPad\AkelFiles\Plugs\Scripts\Include\TextReplace.js.
Contains function: TextReplace().
It works similarly to "replace" method in JScript, but uses syntax of AkelPad regular expressions.

Code: Select all

/*
http://akelpad.sourceforge.net/forum/viewtopic.php?p=30653#p30653
Version: 2016-05-02
Author: KDJ

*** Replace text in edit window ***

TextReplace_function.js is library script, should be saved in ...\AkelPad\AkelFiles\Plugs\Scripts\Include\TextReplace.js.
Contains function: TextReplace().
It works similarly to "replace" method in JScript, but uses syntax of AkelPad regular expressions.

Usage in script:
  if (AkelPad.Include("TextReplace_function.js"))
    TextReplace(sFindIt, ReplaceWith[, sFlags[, nRangeStart[, nRangeEnd]]]);

Usage in menu or toolbar:
  Call("Scripts::Main", 1, "EvalCmd.js", `if (AkelPad.Include("TextReplace_function.js")) TextReplace(sFindIt, ReplaceWith[, sFlags[, nRangeStart[, nRangeEnd]]]);`)

-----------------------------------------------------------------------
TextReplace(sFindIt, ReplaceWith[, sFlags[, nRangeStart[, nRangeEnd]]])
-----------------------------------------------------------------------
Arguments
  sFindIt
    Text to find. Can be pattern of AkelPad regular expression.
  ReplaceWith
    Can be:
     - text to replace with,
     - JScript function that should return this text,
     - string as function body (required "f" flag).
    To ReplaceWith function is passed one argument - array aArg[s0, s1, s2, ..., sN, n0, n1, n2, n3]:
      s0 - entire matched text,
      s1 - first captured substring in parentheses (if "r" flag is used),
      s2 - second captured substring,
      sN - last captured substring,
      n0 - total number of sFindIt occurences in search range,
      n1 - current sFindIt occurence (from 1 to n0),
      n2 - offset of first character matched text,
      n3 - offset of last character matched text + 1.
      N is the number of left capturing parentheses in sFindIt.
      If "r" flag is not used, N==0 and items s1, s2, ..., sN does not occur (aArg[s0, n0, n1, n2, n3]).
      Length of aArg array is equal to N+5.
    If ReplaceWith is string as function body, in function body you can use arguments[0] to get aArg array or predefined variables _s0, _s1, ..., _n0, _n1, _n2, _n3:
      _s0 == s0,
      _s1 == s1,
      ...
      _sN == sN,
      _n0 == n0,
      _n1 == n1.
      _n2 == n2.
      _n3 == n3.
  sFlags
    May be combination of the following:
    "f" - ReplaceWith argument is string as function body,
    "g" - global search - replace all occurrences of sFindIt in search range, if not set, only first occurence will be replaced,
    "i" - ignore case,
    "r" - search with regular expressions,
    "n" - dot in regular expression specifies any character except new line "\n",
    "w" - whole word.
    Default is "".
  nRangeStart
    Index (offset) of first char in search range or predefined value of range.
    Default is 0 - first char in document.
    Can be used predefined values for range (in this case nRangeEnd argument is ignored):
    -1 - from first char to caret char,
    -2 - from caret char to last char,
    -3 - from first sel char to last sel char,
  nRangeEnd
    Index of last char in search range.
    Default is -1 - last char in document.

Return value
  Number - count of changes.
  Or if an error occurred:
    -10 - there is no edit window,
    -11 - invalid argument sFindIt (not string or empty string),
    -12 - invalid argument ReplaceWith (not string and not function),
    -13 - error in ReplaceWith function body passed as string - can not create function,
    -14 - ReplaceWith function doesn't return a string.
    If there is syntax error in regular expression (sFindIt), the return value is (–100 - PatternOffset).
    If run time error occurs while execution of ReplaceWith function, the return value is Error object.

---------------------------------------------------------------------------------------
Example 1 - single replace date in format "yyyy-mm-dd" with date in format "dd-mm-yyyy"
---------------------------------------------------------------------------------------
if (AkelPad.Include("TextReplace_function.js"))
  TextReplace("\\b(\\d{4})-(\\d{2})-(\\d{2})\\b", "\\3-\\2-\\1", "r");

-------------------------------------------------------------------
Example 2 - replace all hex values (0x0 - 0xFFFFFFFF) with decimals
-------------------------------------------------------------------
if (AkelPad.Include("TextReplace_function.js"))
  TextReplace("\\b0x[\\dA-F]{1,8}\\b", function(a) {return parseInt(a[0]).toString();}, "gir");

or (ReplaceWith is string as function body):

if (AkelPad.Include("TextReplace_function.js"))
  TextReplace("\\b0x[\dA-F]{1,8}\\b", "return parseInt(arguments[0][0]).toString();", "fgir");

or:

if (AkelPad.Include("TextReplace_function.js"))
  TextReplace("\\b0x[\dA-F]{1,8}\\b", "return parseInt(_s0).toString();", "fgir");

------------------------------------------------------------------
Example 3 - insert counter at the beginning of all non-empty lines
------------------------------------------------------------------
if (AkelPad.Include("TextReplace_function.js"))
  WScript.Echo("Count of changes: " + TextReplace("^[ \\t]*([^ \\t\\n]++[ \\t]*)++$", ReplaceFunc, "gr"));

function ReplaceFunc(a)
{
  var sCount = a[a.length - 3].toString();
  var nLen   = a[a.length - 4].toString().length;

  while (sCount.length < nLen)
    sCount = "0" + sCount;

  return sCount + ": " + a[0];
}
*/

function TextReplace(sFindIt, ReplaceWith, sFlags, nRange1, nRange2)
{
  var hMainWnd = AkelPad.GetMainWnd();
  var hEditWnd = AkelPad.GetEditWnd();
  var nOffset1;
  var nOffset2;
  var nOffset3;
  var nOffset4;
  var nSel1;
  var nAEFR;
  var nFRF;
  var lpWhat;
  var lpFind;
  var lpIndex1;
  var lpIndex2;
  var lpIndex3;
  var lpIndex4;
  var bBatch;
  var nTextLen;
  var nRLen;
  var nCount;
  var nCountAll;
  var nErrOffset;
  var bWholeDoc;
  var sWith;
  var lpCaret;
  var lpSelect;
  var lpPoint64;
  var aArg;
  var nRESE;
  var lpDelim;
  var lpPat;
  var lpPatExec;
  var nMaxDelim;

  if (! hEditWnd)
    return -10;
  if ((typeof sFindIt != "string") || (sFindIt == ""))
    return -11;
  if ((typeof ReplaceWith != "string") && (typeof ReplaceWith != "function"))
    return -12;

  if (typeof sFlags != "string")
    sFlags = "";

  sFlags = sFlags.toLowerCase();

  if ((typeof ReplaceWith == "string") && ReplaceWith.length && (sFlags.indexOf("f") > -1))
  {
    try
    {
      ReplaceWith = 'var _arg={}, _i;\n' +
                    'for (_i=0; _i<arguments[0].length - 2; ++_i) _arg["_s" + _i]=arguments[0][_i];\n' +
                    '_arg._n0=arguments[0][arguments[0].length-4];\n' +
                    '_arg._n1=arguments[0][arguments[0].length-3];\n' +
                    '_arg._n2=arguments[0][arguments[0].length-2];\n' +
                    '_arg._n3=arguments[0][arguments[0].length-1];\n' +
                    'with (_arg) {' + ReplaceWith + '}';
      ReplaceWith = new Function(ReplaceWith);
    }
    catch (oError)
    {
      return -13;
    }
  }

  bBatch   = sFlags.indexOf("b") > -1;
  nTextLen = AkelPad.SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 2 /*AEGI_LASTCHAR*/, 0);

  if (typeof nRange1 == "number")
    nRange1 = Math.round(nRange1);
  else
    nRange1 = 0;

  if (nRange1 == -1)
  {
    nOffset1 = 0;
    nOffset2 = AkelPad.SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 5 /*AEGI_CARETCHAR*/, 0);
  }
  else if (nRange1 == -2)
  {
    nOffset1 = AkelPad.SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 5 /*AEGI_CARETCHAR*/, 0);
    nOffset2 = nTextLen;
  }
  else if (nRange1 <= -3)
  {
    nOffset1 = AkelPad.SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 3 /*AEGI_FIRSTSELCHAR*/, 0);
    nOffset2 = AkelPad.SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 4 /*AEGI_LASTSELCHAR*/, 0);
  }
  else
  {
    if (typeof nRange2 == "number")
      nRange2 = Math.round(nRange2);
    else
      nRange2 = -1;

    nOffset1 = nRange1;

    if (nRange2 < 0)
      nOffset2 = nTextLen;
    else
      nOffset2 = nRange2;
  }

  nAEFR = 0x00000001 /*AEFR_DOWN*/;
  nFRF  = 0x00000001 /*FRF_DOWN*/;
  if (sFlags.indexOf("i") == -1)
  {
    nAEFR |= 0x00000004 /*AEFR_MATCHCASE*/;
    nFRF  |= 0x00000004 /*FRF_MATCHCASE*/;
  }
  if (sFlags.indexOf("n") > -1)
  {
    nAEFR |= 0x00100000 /*AEFR_REGEXPNONEWLINEDOT*/;
    nFRF  |= 0x00040000 /*FRF_REGEXPNONEWLINEDOT*/;
  }
  if (sFlags.indexOf("r") > -1)
  {
    nAEFR  |= 0x00080000 /*AEFR_REGEXP*/;
    nFRF   |= 0x00080000 /*FRF_REGEXP*/;
    sFindIt = sFindIt.replace(/[\n\r]/g, "\\n");
  }
  else
    sFindIt = sFindIt.replace(/\n/g, "\r");

  if (sFlags.indexOf("w") > -1)
  {
    nAEFR |= 0x00000002 /*AEFR_WHOLEWORD*/;
    nFRF  |= 0x00000002 /*FRF_WHOLEWORD*/;
  }

  if (! bBatch)
  {
    lpCaret   = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
    lpSelect  = AkelPad.MemAlloc(_X64 ? 56 : 32 /*sizeof(AESELECTION)*/);
    lpPoint64 = AkelPad.MemAlloc(_X64 ? 16 :  8 /*sizeof(POINT64)*/);
    AkelPad.SendMessage(hEditWnd, 3125 /*AEM_GETSEL*/, lpCaret, lpSelect);
    AkelPad.SendMessage(hEditWnd, 3179 /*AEM_GETSCROLLPOS*/, 0, lpPoint64);
    AkelPad.SendMessage(hEditWnd, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, 1);
    AkelPad.SendMessage(hMainWnd, 11 /*WM_SETREDRAW*/, 0, 0);
    AkelPad.SendMessage(hEditWnd, 11 /*WM_SETREDRAW*/, 0, 0);
  }

  lpWhat = AkelPad.MemAlloc((sFindIt.length + 1) * 2);
  lpFind = AkelPad.MemAlloc(_X64 ? 136 : 68 /*sizeof(AEFINDTEXTW)*/);
  AkelPad.MemCopy(lpWhat, sFindIt, 1 /*DT_UNICODE*/);
  AkelPad.MemCopy(lpFind /*dwFlags*/, nAEFR, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpFind, _X64 ?  8 :  4) /**pText*/, lpWhat, 2 /*DT_QWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpFind, _X64 ? 16 :  8) /*dwTextLen*/, sFindIt.length, 2 /*DT_QWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpFind, _X64 ? 24 : 12) /*nNewLine*/, 5 /*AELB_R*/, 3 /*DT_DWORD*/);
  lpIndex1  = _PtrAdd(lpFind, _X64 ?  32 : 16);
  lpIndex2  = _PtrAdd(lpFind, _X64 ?  56 : 28);
  lpIndex3  = _PtrAdd(lpFind, _X64 ?  80 : 40);
  lpIndex4  = _PtrAdd(lpFind, _X64 ? 104 : 52);
  nCount    = 0;
  bWholeDoc = (nRange1 == 0) && (nRange2 < 0);

  AkelPad.SendMessage(hEditWnd, 3137 /*AEM_RICHOFFSETTOINDEX*/, nOffset1, lpIndex1);
  AkelPad.SendMessage(hEditWnd, 3137 /*AEM_RICHOFFSETTOINDEX*/, nOffset2, lpIndex2);

  if (typeof ReplaceWith == "string")
  {
    if ((sFlags.indexOf("g") > -1))
    {
      if (bWholeDoc)
        nFRF |= 0x00200000 /*FRF_BEGINNING*/;
      else
      {
        nFRF |= 0x00400000 /*FRF_SELECTION*/;
        AkelPad.SetSel(nOffset1, nOffset2);
      }

      nCount = AkelPad.TextReplace(hEditWnd, sFindIt, ReplaceWith, nFRF, 1);
    }
    else if (AkelPad.SendMessage(hEditWnd, 3041 /*AEM_FINDTEXTW*/, 0, lpFind))
    {
      ++nCount;
      nOffset3 = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex3);
      nOffset4 = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex4);
      AkelPad.SetSel(nOffset3, nOffset4);
      AkelPad.TextReplace(hEditWnd, sFindIt, ReplaceWith, nFRF |= 0x00400000 /*FRF_SELECTION*/, 0);

      nRLen    = AkelPad.SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 2 /*AEGI_LASTCHAR*/, 0) - nTextLen;
      nOffset1 = nOffset4 + nRLen;

      if (bWholeDoc)
        nOffset2 = nOffset1;
      else
        nOffset2 += nRLen;

      AkelPad.SetSel(nOffset2, nOffset1);
    }
  }
  else if (AkelPad.SendMessage(hEditWnd, 3041 /*AEM_FINDTEXTW*/, 0, lpFind))
  {
    aArg      = [];
    nRESE     = 0x0002 /*RESE_MULTILINE*/;
    lpDelim   = AkelPad.MemAlloc(128 /*WORD_DELIMITERS_SIZE*/ * 2);
    lpPat     = AkelPad.MemAlloc((sFindIt.length + 1) * 2);
    lpPatExec = AkelPad.MemAlloc(_X64? 216 : 108 /*PATEXEC*/);
    nMaxDelim = AkelPad.SendMessage(hEditWnd, 3243 /*AEM_GETWORDDELIMITERS*/, 128 /*WORD_DELIMITERS_SIZE*/, lpDelim) - 2;

    if (sFlags.indexOf("i") == -1)
      nRESE |= 0x0001 /*RESE_MATCHCASE*/;
    if (sFlags.indexOf("n") > -1)
      nRESE |= 0x0008 /*RESE_NONEWLINEDOT*/;
    if (sFlags.indexOf("w") > -1)
      nRESE |= 0x0004 /*RESE_WHOLEWORD*/;

    AkelPad.MemCopy(lpPat, sFindIt, 1 /*DT_UNICODE*/);
    AkelPad.MemCopy(lpPatExec /*PATEXEC.dwOptions*/, nRESE | 0x1000 /*RESE_GLOBAL*/, 3 /*DT_DWORD*/); //for GetCounAll()
    AkelPad.MemCopy(_PtrAdd(lpPatExec, _X64 ?   8 :  4) /*PATEXEC.wpDelim*/, nMaxDelim ? lpDelim : 0, 2 /*DT_QWORD*/);
    AkelPad.MemCopy(_PtrAdd(lpPatExec, _X64 ?  16 :  8) /*PATEXEC.wpMaxDelim*/, _PtrAdd(lpDelim, nMaxDelim * 2), 2 /*DT_QWORD*/);

    ++nCount;
    nCountAll = GetCounAll();
    nSel1     = nOffset1;
    nOffset3  = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex3);
    nOffset4  = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex4);
    AkelPad.SetSel(nOffset3, nOffset4);

    AkelPad.MemCopy(lpPatExec /*PATEXEC.dwOptions*/, nRESE | 0x2000 /*RESE_ISMATCH*/, 3 /*DT_DWORD*/); //for GetWithText()
    AkelPad.MemCopy(_PtrAdd(lpPatExec, _X64 ? 112 : 56) /*PATEXEC.wpPat*/, lpPat, 2 /*DT_QWORD*/);
    AkelPad.MemCopy(_PtrAdd(lpPatExec, _X64 ? 120 : 60) /*PATEXEC.wpMaxPat*/, _PtrAdd(lpPat, sFindIt.length * 2), 2 /*DT_QWORD*/);

    if (typeof (sWith = GetWithText()) != "string")
      nCount = -14;
    else
    {
      if (! bBatch)
      {
        AkelPad.SendMessage(hEditWnd, 3080 /*AEM_STOPGROUPTYPING*/, 0, 0);
        AkelPad.SendMessage(hEditWnd, 3081 /*AEM_BEGINUNDOACTION*/, 0, 0);
      }

      AkelPad.ReplaceSel(sWith);

      nOffset1 = AkelPad.SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 5 /*AEGI_CARETCHAR*/, 0);
      nOffset2 -= nTextLen - (nTextLen = AkelPad.SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 2 /*AEGI_LASTCHAR*/, 0));

      if (sFlags.indexOf("g") > -1)
      {
        AkelPad.SendMessage(hEditWnd, 3137 /*AEM_RICHOFFSETTOINDEX*/, nOffset1, lpIndex1);
        AkelPad.SendMessage(hEditWnd, 3137 /*AEM_RICHOFFSETTOINDEX*/, nOffset2, lpIndex2);

        while (AkelPad.SendMessage(hEditWnd, 3041 /*AEM_FINDTEXTW*/, 0, lpFind))
        {
          ++nCount;
          nOffset3 = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex3);
          nOffset4 = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex4);
          AkelPad.SetSel(nOffset3, nOffset4);

          if (typeof (sWith = GetWithText()) != "string")
          {
            nCount = -15;
            break;
          }

          AkelPad.ReplaceSel(sWith);

          nOffset1 = AkelPad.SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 5 /*AEGI_CARETCHAR*/, 0);
          nOffset2 -= nTextLen - (nTextLen = AkelPad.SendMessage(hEditWnd, 3138 /*AEM_GETRICHOFFSET*/, 2 /*AEGI_LASTCHAR*/, 0));

          AkelPad.SendMessage(hEditWnd, 3137 /*AEM_RICHOFFSETTOINDEX*/, nOffset1, lpIndex1);
          AkelPad.SendMessage(hEditWnd, 3137 /*AEM_RICHOFFSETTOINDEX*/, nOffset2, lpIndex2);
        }
      }

      if (! bBatch)
      {
        AkelPad.SendMessage(hEditWnd, 3082 /*AEM_ENDUNDOACTION*/, 0, 0);
        AkelPad.SendMessage(hEditWnd, 3080 /*AEM_STOPGROUPTYPING*/, 0, 0);
      }
    }

    AkelPad.MemFree(lpDelim);
    AkelPad.MemFree(lpPat);
    AkelPad.MemFree(lpPatExec);
  }

  if (! bBatch)
  {
    AkelPad.SendMessage(hEditWnd, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, 0);
    AkelPad.SendMessage(hEditWnd, 3376 /*AEM_UPDATESCROLLBAR*/, 3 /*SB_BOTH*/, 0);
  }

  if (nCount > 0)
  {
    if (typeof ReplaceWith == "function")
    {
      if (! bWholeDoc)
      {
        if (sFlags.indexOf("g") > -1)
          AkelPad.SetSel(nSel1, nOffset2);
        else
          AkelPad.SetSel(nOffset2, nOffset1);
      }

      if (! bBatch)
        AkelPad.SendMessage(hEditWnd, 3183 /*AEM_SCROLLTOPOINT*/, 0, 0 /*scroll to caret*/);
    }
  }
  else
  {
    if (nErrOffset = AkelPad.MemRead(_PtrAdd(lpFind, _X64 ? 128 : 64) /*nCompileErrorOffset*/, 2 /*DT_QWORD*/))
      nCount = -100 - nErrOffset;
    else if (nCount == -15)
    {
      nCount = -14;
      AkelPad.SendMessage(hEditWnd, 3077 /*AEM_UNDO*/, 0, 0);
    }

    if (sWith instanceof Error)
      nCount = sWith;

    if (! bBatch)
    {
      AkelPad.SendMessage(hEditWnd, 3132 /*AEM_INDEXUPDATE*/, 0, lpCaret);
      AkelPad.SendMessage(hEditWnd, 3132 /*AEM_INDEXUPDATE*/, 0, lpSelect);
      AkelPad.SendMessage(hEditWnd, 3132 /*AEM_INDEXUPDATE*/, 0, _PtrAdd(lpSelect, _X64 ? 24 : 12));
      AkelPad.SendMessage(hEditWnd, 3126 /*AEM_SETSEL*/, lpCaret, lpSelect);
      AkelPad.SendMessage(hEditWnd, 3180 /*AEM_SETSCROLLPOS*/, 0, lpPoint64);
    }
  }

  if (! bBatch)
  {
    AkelPad.SendMessage(hMainWnd, 11 /*WM_SETREDRAW*/, 1, 0);
    AkelPad.SendMessage(hEditWnd, 11 /*WM_SETREDRAW*/, 1, 0);
    AkelPad.SystemFunction().Call("User32::InvalidateRect", hMainWnd, 0, 1);
    AkelPad.SystemFunction().Call("User32::InvalidateRect", hEditWnd, 0, 1);
    AkelPad.MemFree(lpCaret);
    AkelPad.MemFree(lpSelect);
    AkelPad.MemFree(lpPoint64);
  }

  AkelPad.MemFree(lpWhat);
  AkelPad.MemFree(lpFind);

  return nCount;

  function GetCounAll()
  {
    var sWhat = (sFlags.indexOf("r") == -1) ? sFindIt.replace(/[\\\/.^$+*?|()\[\]{}]/g, "\\$&").replace(/\r/g, "\\n") : sFindIt;
    var lpPat = AkelPad.MemAlloc((sWhat.length + 1) * 2);
    var nC;

    AkelPad.MemCopy(lpPat, sWhat, 1 /*DT_UNICODE*/);
    AkelPad.MemCopy(_PtrAdd(lpPatExec, _X64 ? 112 : 56) /*PATEXEC.wpPat*/, lpPat, 2 /*DT_QWORD*/);
    AkelPad.MemCopy(_PtrAdd(lpPatExec, _X64 ? 120 : 60) /*PATEXEC.wpMaxPat*/, _PtrAdd(lpPat, sWhat.length * 2), 2 /*DT_QWORD*/);

    AkelPad.SendMessage(hEditWnd, 3137 /*AEM_RICHOFFSETTOINDEX*/, nOffset1, _PtrAdd(lpPatExec, _X64 ?  56 : 28) /*PATEXEC.ciRange*/);
    AkelPad.SendMessage(hEditWnd, 3137 /*AEM_RICHOFFSETTOINDEX*/, nOffset2, _PtrAdd(lpPatExec, _X64 ?  80 : 40) /*PATEXEC.ciMaxRange*/);
    AkelPad.SendMessage(hEditWnd, 3137 /*AEM_RICHOFFSETTOINDEX*/, nOffset1, _PtrAdd(lpPatExec, _X64 ? 144 : 72) /*PATEXEC.ciStr*/);
    AkelPad.SendMessage(hEditWnd, 3137 /*AEM_RICHOFFSETTOINDEX*/, nOffset2, _PtrAdd(lpPatExec, _X64 ? 168 : 84) /*PATEXEC.ciMaxStr*/);

    nC = AkelPad.SendMessage(hMainWnd, 1415 /*AKD_PATEXEC*/, 0, lpPatExec);

    AkelPad.SendMessage(hMainWnd, 1423 /*AKD_PATFREE*/, 0, lpPatExec);
    AkelPad.MemFree(lpPat);

    return nC;
  }

  function GetWithText()
  {
    var lpREGroup;
    var nIndex;
    var sText;

    aArg.length = 0;

    if (sFlags.indexOf("r") > -1)
    {
      AkelPad.MemCopy(_PtrAdd(lpPatExec, _X64 ? 104 : 52) /*PATEXEC.lpREGroupStack*/, 0, 2 /*DT_QWORD*/);
      AkelPad.SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, 3 /*AEGI_FIRSTSELCHAR*/, _PtrAdd(lpPatExec, _X64 ?  56 : 28) /*PATEXEC.ciRange*/);
      AkelPad.SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, 4 /*AEGI_LASTSELCHAR*/,  _PtrAdd(lpPatExec, _X64 ?  80 : 40) /*PATEXEC.ciMaxRange*/);
      AkelPad.SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, 3 /*AEGI_FIRSTSELCHAR*/, _PtrAdd(lpPatExec, _X64 ? 144 : 72) /*PATEXEC.ciStr*/);
      AkelPad.SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, 4 /*AEGI_LASTSELCHAR*/,  _PtrAdd(lpPatExec, _X64 ? 168 : 84) /*PATEXEC.ciMaxStr*/);
      AkelPad.SendMessage(hMainWnd, 1415 /*AKD_PATEXEC*/, 0, lpPatExec);

      lpREGroup = AkelPad.MemRead(AkelPad.MemRead(_PtrAdd(lpPatExec, _X64 ? 104 : 52 /*PATEXEC.lpREGroupStack*/), 2 /*DT_QWORD*/) /*REGROUP.first*/, 2 /*DT_QWORD*/);

      do
      {
        nIndex = AkelPad.MemRead(_PtrAdd(lpREGroup, _X64 ? 172 : 96 /*REGROUP.nIndex*/), 3 /*DT_DWORD*/);

        if (nIndex > -1)
          aArg[nIndex] = AkelPad.GetTextRange(AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, _PtrAdd(lpREGroup, _X64 ?  96 : 48) /*REGROUP.ciStrStart*/), AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, _PtrAdd(lpREGroup, _X64 ? 120 : 60) /*REGROUP.ciStrEnd*/));
      }
      while (lpREGroup = AkelPad.SendMessage(hMainWnd, 1420 /*AKD_PATNEXTGROUP*/, lpREGroup, 0))

      AkelPad.SendMessage(hMainWnd, 1423 /*AKD_PATFREE*/, 0, lpPatExec);
    }
    else
      aArg[0] = AkelPad.GetSelText();

    aArg.push(nCountAll, nCount, nOffset3, nOffset4);

    try
    {
      sText = ReplaceWith(aArg);
    }
    catch (oError)
    {
      sText = oError;
    }

    return sText;
  }
}

Last edited by KDJ on Mon May 02, 2016 7:54 pm, edited 9 times in total.

Offline
Posts: 202
Joined: Sat Mar 28, 2015 2:36 pm
Location: Russia

Post by Kley »

Convert numeric and color values between themselves.

Code: Select all

//  ============================================================================
//  http://akelpad.sourceforge.net/forum/viewtopic.php?p=30665#p30665
//  Version: 2016-03-22
//  Author: Kley
//
//  *** Преобразование числовых и цветовых значений между собой ***
//
//  Arguments:
//  Ручные установки (Manual settings) в ConvertNumColorValue.ini:
//    UserColors - список цветов пользователя.
//      Пример:
//      UserColors=Red,#FF0000;Green,#008000;Blue,#0000FF
//    AddUserColors - имеет следующие значения:
//      0 - список UserColors игнорируется (по умолчанию);
//      1 - добавить список UserColors к списку скрипта;
//      2 - загрузить только список UserColors.
//
//  Usage:
//  "Convert numeric and color values between themselves"
//  Call("Scripts::Main", 1, "ConvertNumColorValue.js")
//
//  Note:
//   Автозахват выделенного текста в AkelPad - см. меню окна.
//   Выделенный текст считается цифрой:
//     dec - 838383;
//     hex - #838383, #FF00FF, FF00FF, 0x100, 0101, ${HighLight_UrlColor};
//     RGB - 131,131,131;  255 0 255;  255,000 .255;
//      -n = n.
//
//  F2 - получить цвет под курсором;
//  F3 - вызов диалога "Color".
//  ============================================================================
var IDC_EDTHEX = 1001;
var IDC_EDTDEC = 1002;
var IDC_EDTOCT = 1003;
var IDC_EDTBIN = 1004;
var IDC_EDTRGB = 1005;
var IDC_BTNIMG = 1006;
var IDC_CBOIMG = 1007;
var IDC_BTNOK  = 1008;

var IDM_SYSDLGCOLOR = 2001;
var IDM_SYSGETCOLOR = 2002;
var IDM_SYSCAPTURE  = 2003;
var IDM_SYSONTOP    = 2004;

var MF_SEPARATOR = 0x0800;
var MF_GRAYED    = 0x0001;
var MF_STRING    = 0x0000;
var MF_POPUP     = 0x0010;

var hMainWnd = AkelPad.GetMainWnd();
var oSys = AkelPad.SystemFunction();
var pScriptName = WScript.ScriptName;
var pClassName =
    "AkelPad::Scripts::" + pScriptName + "::" +
    oSys.Call("kernel32::GetCurrentProcessId");
var hWndParent;
var hWndDialog;
var oDlgPos = {
    "left": 100,
    "top": 100
};
var hIcon;
var hFocus;
var hSysMenu;
var bCapture = false;
var bWinOnTop = false;
var bCloseDlg;
var aSubClass = [];

var pCurHex = "";
var nMaxCharWidth = 0;
var nMaxCharHeight = 0;
var nItemHeight;
var nItemLeft;
var nGap = 2;
var aColorName = [];
var pUserColors = "";
var nAddUserColors;
var aUserColorName = [];

ReadIni();

switch (nAddUserColors)
{
  case 1:
    aColorName = GetColorsList();
    aColorName = aColorName.concat(aUserColorName);
    break;
  case 2:
    aColorName = aUserColorName;
    break;
  default:
    aColorName = GetColorsList();
    break;
}

while (!bCloseDlg)
{
  bCloseDlg = true;
  hFocus = 0;
  hWndParent = bWinOnTop ? 0 : hMainWnd;

  if (AkelPad.WindowRegisterClass(pClassName))
  {
    //Create dialog
    //0x90CA0040=WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|DS_SETFONT
    //0x50810088=WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER|ES_AUTOHSCROLL|ES_UPPERCASE
    //0x50810080=WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER|ES_AUTOHSCROLL
    //0x5081000B=WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER|BS_OWNERDRAW
    //0x50010000=WS_CHILD|WS_VISIBLE|WS_TABSTOP
    //0x50000000=WS_CHILD|WS_VISIBLE
    //0x50210213=WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_VSCROLL|CBS_DROPDOWNLIST|CBS_OWNERDRAWFIXED|CBS_HASSTRINGS
    AkelPad.CreateDialog(
      0,              //dwExStyle
      pClassName,     //lpClassName
      pScriptName,    //lpWindowName
      0x90CA0040,     //dwStyle
      oDlgPos.left,   //x
      oDlgPos.top,    //y
      280,            //Width
      182,            //Height
      hWndParent,     //hWndParent=hMainWnd
      DialogCallback, //callback function
      0x2,            //CDF_PIXELS
      0,              //hMenu
      0,              //hInstance
      "",             //pFaceName
      1,              //nFontStyle=regular font
      0,              //nPointSize
    "|",
    //ExSt,  Class,     Title,    Style,        X,   Y,   W,  H, ID,         lParam
      0x00, "EDIT",     "",       0x50810088,  67,  10, 200, 20, IDC_EDTHEX, 0, "|",
      0x00, "EDIT",     "",       0x50810080,  67,  38, 200, 20, IDC_EDTDEC, 0, "|",
      0x00, "EDIT",     "",       0x50810080,  67,  65, 200, 20, IDC_EDTOCT, 0, "|",
      0x00, "EDIT",     "",       0x50810080,  67,  93, 200, 20, IDC_EDTBIN, 0, "|",
      0x00, "EDIT",     "",       0x50810080,  67, 122, 111, 20, IDC_EDTRGB, 0, "|",
      0x00, "BUTTON",   "",       0x5081000B, 192, 122,  75, 20, IDC_BTNIMG, 0, "|",
      0x00, "COMBOBOX", "",       0x50210213,  67, 150, 111, 20, IDC_CBOIMG, 0, "|",
      0x00, "BUTTON",   "Cancel", 0x50010000, 192, 150,  75, 23, IDC_BTNOK,  0, "|",
      0x00, "STATIC",   "Hex",    0x50000000,  10,  14,  30, 16,         -1, 0, "|",
      0x00, "STATIC",   "Dec",    0x50000000,  10,  42,  36, 16,         -1, 0, "|",
      0x00, "STATIC",   "Oct",    0x50000000,  10,  70,  36, 16,         -1, 0, "|",
      0x00, "STATIC",   "Bin",    0x50000000,  10,  98,  36, 16,         -1, 0, "|",
      0x00, "STATIC",   "RGB",    0x50000000,  10, 126,  30, 16,         -1, 0, "|"
    );

    if (hWndDialog)
    {
      AkelPad.ScriptNoMutex();
      AkelPad.WindowGetMessage(0x4 /*WGM_KEYDOWNUP*/);
    }
    AkelPad.WindowUnregisterClass(pClassName);
    SetForegroundWindow(hMainWnd);
  }
  else if (hWndDialog = oSys.Call("user32::FindWindowEx" + _TCHAR, 0, 0, pClassName, 0))
  {
    SetForegroundWindow(hWndDialog);
    PostMessage(hWndDialog, 1025 /*AKDLG_PUTFIND*/, false, 0);
  }
}

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  var nID;
  var nCode;
  var i;

  switch (uMsg)
  {
    case 0x110: //WM_INITDIALOG
        hWndDialog = hWnd;

        aSubClass[IDC_EDTHEX] =
          AkelPad.WindowSubClass(GetDlgItem(IDC_EDTHEX), EditCallback, 0x007B /*WM_CONTEXTMENU*/, 258 /*WM_CHAR*/);
        aSubClass[IDC_EDTDEC] =
          AkelPad.WindowSubClass(GetDlgItem(IDC_EDTDEC), EditCallback, 0x007B /*WM_CONTEXTMENU*/, 258 /*WM_CHAR*/);
        aSubClass[IDC_EDTOCT] =
          AkelPad.WindowSubClass(GetDlgItem(IDC_EDTOCT), EditCallback, 0x007B /*WM_CONTEXTMENU*/, 258 /*WM_CHAR*/);
        aSubClass[IDC_EDTBIN] =
          AkelPad.WindowSubClass(GetDlgItem(IDC_EDTBIN), EditCallback, 0x007B /*WM_CONTEXTMENU*/, 258 /*WM_CHAR*/);
        aSubClass[IDC_EDTRGB] =
          AkelPad.WindowSubClass(GetDlgItem(IDC_EDTRGB), EditCallback, 0x007B /*WM_CONTEXTMENU*/, 258 /*WM_CHAR*/);

        //set STYLE and EXSTYLE in controls
        var hWndBtnImg = GetDlgItem(IDC_BTNIMG);
        oSys.Call("User32::SetWindowLongW", hWndBtnImg, -16 /*GWL_STYLE*/, 0x5081000B);
        oSys.Call("User32::SetWindowLongW", hWndBtnImg, -20 /*GWL_EXSTYLE*/, 0);
        oSys.Call("User32::SetWindowPos", hWndBtnImg, 0, 0, 0, 0, 0,
          0x37 /*SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE*/);

        //Combobox Font
        SetWindowFont(GetDlgItem(IDC_CBOIMG));
        GetMaxCharSize(GetDlgItem(IDC_CBOIMG), SendDlgItemMessage(IDC_CBOIMG, 0x31 /*WM_GETFONT*/, 0, 0));

        nItemHeight = nMaxCharHeight + 2 /*nLineGap*/;
        i = SendDlgItemMessage(IDC_CBOIMG, 0x0154 /*CB_GETITEMHEIGHT*/, 0, 0);
        if (nItemHeight < i)
          nItemHeight = i;
        else
          SendDlgItemMessage(IDC_CBOIMG, 0x0153 /*CB_SETITEMHEIGHT*/, 0, nItemHeight);

        nItemLeft = nItemHeight * nGap;

        for (i = 0; i < aColorName.length; ++i)
          SendDlgItemMessage(IDC_CBOIMG, 323 /*CB_ADDSTRING*/, 0, aColorName[i][0]);

        SendDlgItemMessage(IDC_CBOIMG, 352 /*CB_SETDROPPEDWIDTH*/, nMaxCharWidth + nItemLeft * 2, 0);
        SendDlgItemMessage(IDC_CBOIMG, 334 /*CB_SETCURSEL*/, 0, 0);

        hIcon = SetDlgIcon();
        GetSysMenu(hWnd);
        SetDialogPos(hWnd);
        if (bWinOnTop)
          oSys.Call("User32::SetWindowPos",
            hWndDialog, -1 /*HWND_TOPMOST*/, 0, 0, 0, 0,
            0x43 /*SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW*/);
        break;

    case 0x401: //AKDLG_PUTFIND
        oSys.Call("User32::SetFocus", GetDlgItem(IDC_EDTHEX));
        SetDlgItemText(IDC_EDTHEX, GetSelNumber());
        break;

    case 0x006: //WM_ACTIVATE
        if (!wParam)
          hFocus = oSys.Call("User32::GetFocus");
        break;

    case 0x007: //WM_SETFOCUS
        if (!hFocus)
        {
          oSys.Call("User32::SetFocus", GetDlgItem(IDC_EDTHEX));
          if (pCurHex)
            SetDlgItemText(IDC_EDTHEX, pCurHex);
          else
            SetDlgItemText(IDC_EDTHEX, GetSelNumber());
        }
        else
          oSys.Call("User32::SetFocus", hFocus);
        break;

    case 0x02B: //WM_DRAWITEM
        if (wParam == IDC_CBOIMG)
        {
          DrawItemCB(lParam);
          return 1;
        }
        else if (wParam == IDC_BTNIMG)
        {
          DrawColorButton(lParam /*DRAWITEMSTRUCT*/);
          return 1;
        }
        break;

    case 0x003: //WM_MOVE
        if (!(oSys.Call("User32::IsZoomed", hWnd) ||
              oSys.Call("User32::IsIconic", hWnd)) )
          oDlgPos = GetWindowPos(hWnd);
        break;

    case 0x100: //WM_KEYDOWN
        nID = oSys.Call("User32::GetDlgCtrlID",
                oSys.Call("User32::GetFocus"));

        if (wParam == 0x00D /*VK_RETURN*/)
        {
          if (nID == IDC_BTNIMG)
            PostMessage(hWndDialog, 0x111 /*WM_COMMAND*/, IDC_BTNIMG, 0);
          else
          {
            if (nID != IDC_CBOIMG)
              PostMessage(hWndDialog, 0x111 /*WM_COMMAND*/, IDC_BTNOK, 0);
          }
        }
        else if (wParam == 0x72 /*F3 key*/)
        {
          if ((!Ctrl()) && (!Alt()) && (!Shift()))
            PostMessage(hWndDialog, 0x111 /*WM_COMMAND*/, IDC_BTNIMG, 0);
        }
        else if (wParam == 0x71 /*F2 key*/)
        {
          if (!Ctrl() && !Alt() && !Shift())
          {
            oSys.Call("User32::SetFocus", GetDlgItem(IDC_EDTHEX));
            SetDlgItemText(IDC_EDTHEX, PixelColorCapture());
          }
        }
        break;

    case 0x116: //WM_INITMENU
        InitSysMenu(wParam);
        break;

    case 0x112: //WM_SYSCOMMAND
        if ( (LOWORD(wParam) == IDM_SYSGETCOLOR) ||
             (LOWORD(wParam) == IDM_SYSDLGCOLOR) ||
             (LOWORD(wParam) == IDM_SYSCAPTURE)  ||
             (LOWORD(wParam) == IDM_SYSONTOP) )
          SysMenuCommand(LOWORD(wParam));
        break;

    case 0x111: //WM_COMMAND
        nID   = LOWORD(wParam);
        nCode = HIWORD(wParam);

        if (nID == IDC_BTNIMG)
          ChooseColor();

        else if ( (nID == IDC_EDTHEX) ||
                  (nID == IDC_EDTDEC) ||
                  (nID == IDC_EDTOCT) ||
                  (nID == IDC_EDTBIN) ||
                  (nID == IDC_EDTRGB) )
        {
          if (nCode == 0x100 /*EN_SETFOCUS*/)
            SendMessage(lParam, 0xB1 /*EM_SETSEL*/, 0, -1);
          else if (nCode == 0x300 /*EN_CHANGE*/)
          {
            if (oSys.Call("User32::GetFocus") == lParam)
              ChangeControlEdit(nID);
          }
        }
        else if (nID == IDC_CBOIMG)
        {
          if (nCode == 1 /*CBN_SELCHANGE*/)
            ChangeControlEdit(nID);
        }
        else if ((nID == IDC_BTNOK) || (nID == 2 /*IDCANCEL*/))
          PostMessage(hWndDialog, 0x10 /*WM_CLOSE*/, nID, 0);
        break;

    case 0x010: //WM_CLOSE
        if (bCloseDlg)
        {
            pCurHex = "";
            if (bCapture)
              AkelPad.WindowUnsubClass(2 /*WSC_EDITPROC*/);
        }
        else
          pCurHex = GetDlgItemText(IDC_EDTHEX);
        WriteIni();
        AkelPad.WindowUnsubClass(GetDlgItem(IDC_EDTHEX));
        AkelPad.WindowUnsubClass(GetDlgItem(IDC_EDTDEC));
        AkelPad.WindowUnsubClass(GetDlgItem(IDC_EDTOCT));
        AkelPad.WindowUnsubClass(GetDlgItem(IDC_EDTBIN));
        AkelPad.WindowUnsubClass(GetDlgItem(IDC_EDTRGB));
        if (hIcon)
          oSys.Call("user32::DestroyIcon", hIcon);
        oSys.Call("user32::DestroyWindow", hWnd); //Destroy dialog
        break;

    case 0x002: //WM_DESTROY
        oSys.Call("user32::PostQuitMessage", 0);  //Exit message loop
        break;
  }
  return 0;
}

function EditCallback(hWnd, uMsg, wParam, lParam)
{
  var nID = oSys.Call("User32::GetDlgCtrlID", hWnd);

  if (uMsg == 123 /*WM_CONTEXTMENU*/)
  {
    oSys.Call("User32::SetFocus", wParam); //hWnd
    ContextMenuEdit(nID, LOWORD(lParam), HIWORD(lParam));
    AkelPad.WindowNoNextProc(aSubClass[nID]);
  }
  else if (uMsg == 258 /*WM_CHAR*/)
  {
    if (wParam == 1)
    {
      SendMessage(hWnd, 0xB1 /*EM_SETSEL*/, 0, -1);
      AkelPad.WindowNoNextProc(aSubClass[nID]);
    }
  }
  return 0;
}

function AkelEditCallback(hWnd, uMsg, wParam, lParam)
{
  if (SendMessage(hWnd, 1090 /*EM_SELECTIONTYPE*/, 0, 0) != 0x0 /*SEL_EMPTY*/)
  {
    if (uMsg == 514 /*WM_LBUTTONUP*/)
    {
      if (SendMessage(hWnd, 3199 /*AEM_GETMOUSESTATE*/, 1 /*AEMS_CAPTURE*/, 0) & 0x1 /*AEMSC_MOUSEMOVE*/)
      {
        SetDlgItemText(IDC_EDTHEX, GetSelNumber());
        ChangeControlEdit(IDC_EDTHEX);
      }
    }
    else if (uMsg == 257 /*WM_KEYUP*/)
    {
      if ( (wParam >= 0x21 /*VK_PRIOR*/) &&
           (wParam <= 0x28 /*VK_DOWN*/) )
      {
        SetDlgItemText(IDC_EDTHEX, GetSelNumber());
        ChangeControlEdit(IDC_EDTHEX);
      }
    }
  }
  return 0;
}

function GetDlgItem(nID)
{
  return oSys.Call("User32::GetDlgItem", hWndDialog, nID);
}

function GetDlgItemText(nID)
{
  var nTextLen;
  var lpBuffer;
  var pText = "";

  if (nTextLen = GetDlgItemTextLen(nID))
  {
    lpBuffer = AkelPad.MemAlloc(nTextLen * 2 + 2);
    oSys.Call("User32::GetDlgItemTextW", hWndDialog, nID, lpBuffer, nTextLen + 1);
    pText = AkelPad.MemRead(lpBuffer, 1 /*DT_UNICODE*/);
    AkelPad.MemFree(lpBuffer);
  }
  return pText;
}

function GetDlgItemTextLen(nID)
{
  return SendDlgItemMessage(nID, 14 /*WM_GETTEXTLENGTH*/, 0, 0);
}

function SetDlgItemText(nID, pText)
{
  oSys.Call("User32::SetDlgItemTextW", hWndDialog, nID, pText);
}

function SendDlgItemMessage(nID, uMsg, wParam, lParam)
{
  return oSys.Call("User32::SendDlgItemMessageW", hWndDialog, nID, uMsg, wParam, lParam);
}

function SendMessage(hWnd, uMsg, wParam, lParam)
{
  return oSys.Call("User32::SendMessage" + _TCHAR, hWnd, uMsg, wParam, lParam);
}

function PostMessage(hWnd, uMsg, wParam, lParam)
{
  return oSys.Call("User32::PostMessage" + _TCHAR, hWnd, uMsg, wParam, lParam);
}

function LOWORD(dwNumber)
{
  return (dwNumber & 0xffff);
}

function HIWORD(dwNumber)
{
  return (dwNumber >> 16);
}

function Ctrl()
{
  return oSys.Call("User32::GetKeyState", 0x11 /*VK_CONTROL*/) & 0x8000;
}

function Shift()
{
  return oSys.Call("User32::GetKeyState", 0x10 /*VK_SHIFT*/) & 0x8000;
}

function Alt()
{
  return oSys.Call("user32::GetKeyState", 0x12 /*VK_MENU*/) & 0x8000;
}

function SetForegroundWindow(hWnd)
{
  if (!oSys.Call("User32::IsWindowVisible", hWnd))
    oSys.Call("User32::ShowWindow", hWnd, 8 /*SW_SHOWNA*/);
  if (oSys.Call("User32::IsIconic", hWnd))
    oSys.Call("User32::ShowWindow", hWnd, 9 /*SW_RESTORE*/);

  oSys.Call("User32::SetForegroundWindow", hWnd);
}

function GetMaxCharSize(hWnd, hFont)
{
  var lpSize;
  var hDC;
  var nCharWidth;
  var nCharHeight;

  if (lpSize = AkelPad.MemAlloc(8 /*sizeof(SIZE)*/))
  {
    if (hDC = oSys.Call("user32::GetDC", hWnd))
    {
      oSys.Call("gdi32::SelectObject", hDC, hFont);

      for (var i = 0; i < aColorName.length; ++i)
      {
        if (oSys.Call("gdi32::GetTextExtentPoint32" + _TCHAR, hDC, aColorName[i][0], aColorName[i][0].length, lpSize))
        {
          nCharWidth = AkelPad.MemRead(_PtrAdd(lpSize, 0) /*offsetof(SIZE, cx)*/, 3 /*DT_DWORD*/);
          nCharHeight = AkelPad.MemRead(_PtrAdd(lpSize, 4) /*offsetof(SIZE, cy)*/, 3 /*DT_DWORD*/);
          if (nCharWidth > nMaxCharWidth) nMaxCharWidth = nCharWidth;
          if (nCharHeight > nMaxCharHeight) nMaxCharHeight = nCharHeight;
        }
      }
      oSys.Call("user32::ReleaseDC", hWnd, hDC);
    }
    AkelPad.MemFree(lpSize);
  }
}

function DrawItemCB(lParam)
{
  var hDC;
  var nItemID;
  var nItemState;
  var lpItem;
  var rcItem = [];
  var crText;
  var crBk;
  var hBrushBk;
  var nModeBkOld;
  var lpRECT;

  hDC = AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 32 : 24) /*offsetof(DRAWITEMSTRUCT, hDC)*/, 2 /*DT_QWORD*/);
  nItemID = AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 8 : 8) /*offsetof(DRAWITEMSTRUCT, itemID)*/, 3 /*DT_DWORD*/);
  nItemState = AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 16 : 16) /*offsetof(DRAWITEMSTRUCT, itemState)*/, 3 /*DT_DWORD*/);
  lpItem = _PtrAdd(lParam, _X64 ? 40 : 28) /*offsetof(DRAWITEMSTRUCT, rcItem)*/;
  RectToArray(lpItem, rcItem);

  //Set background
  if (nItemState & 0x1 /*ODS_SELECTED*/)
  {
    crText = oSys.Call("user32::GetSysColor", 14 /*COLOR_HIGHLIGHTTEXT*/);
    crBk = oSys.Call("user32::GetSysColor", 13 /*COLOR_HIGHLIGHT*/);
    hBrushBk = oSys.Call("user32::GetSysColorBrush", 13 /*COLOR_HIGHLIGHT*/);
  }
  else
  {
    crText = oSys.Call("user32::GetSysColor", 8 /*COLOR_WINDOWTEXT*/);
    crBk = oSys.Call("user32::GetSysColor", 5 /*COLOR_WINDOW*/);
    hBrushBk = oSys.Call("user32::GetSysColorBrush", 5 /*COLOR_WINDOW*/);
  }

  AkelPad.MemCopy(_PtrAdd(lpItem, 0), nItemLeft, 3 /*DT_DWORD*/);

  oSys.Call("user32::FillRect", hDC, lpItem, hBrushBk);
  nModeBkOld = oSys.Call("gdi32::SetBkMode", hDC, 1 /*TRANSPARENT*/);

  //Draw text
  oSys.Call("gdi32::SetTextColor", hDC, crText);
  oSys.Call("gdi32::SetBkColor", hDC, crBk);
  oSys.Call("gdi32::TextOut" + _TCHAR,
    hDC,
    nItemLeft,
    rcItem.top + nItemHeight / 2 - nMaxCharHeight / 2,
    aColorName[nItemID][0],
    aColorName[nItemID][0].length
  );

  oSys.Call("gdi32::SetBkMode", hDC, nModeBkOld);

  //Draw a colored rectangle
  lpRECT = AkelPad.MemAlloc(16 /*sizeof(RECT)*/);

  AkelPad.MemCopy(_PtrAdd(lpRECT, 0), nGap, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpRECT, 4), rcItem.top + nGap, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpRECT, 8), nItemLeft - nGap * 2, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(_PtrAdd(lpRECT, 12), rcItem.bottom - nGap, 3 /*DT_DWORD*/);

  hBrushBk = oSys.Call("Gdi32::CreateSolidBrush", HexReverseCB(aColorName[nItemID][1]));
  oSys.Call("User32::FillRect", hDC, lpRECT, hBrushBk);
  oSys.Call("Gdi32::DeleteObject", hBrushBk);

  AkelPad.MemFree(lpRECT);

  function RectToArray(lpRect, rcRect)
  {
    rcRect.left = AkelPad.MemRead(_PtrAdd(lpRect, 0) /*offsetof(RECT, left)*/, 3 /*DT_DWORD*/);
    rcRect.top = AkelPad.MemRead(_PtrAdd(lpRect, 4) /*offsetof(RECT, top)*/, 3 /*DT_DWORD*/);
    rcRect.right = AkelPad.MemRead(_PtrAdd(lpRect, 8) /*offsetof(RECT, right)*/, 3 /*DT_DWORD*/);
    rcRect.bottom = AkelPad.MemRead(_PtrAdd(lpRect, 12) /*offsetof(RECT, bottom)*/, 3 /*DT_DWORD*/);
    return rcRect;
  }

  function HexReverseCB(sHex)
  {
    sHex = sHex.toString(16);
    if (/0x|#/i.test(sHex))
      sHex = sHex.replace(/(0x|#)/gi, "");

    if (/^[\da-f]{6}$/i.test(sHex))
      return Number("0x" + sHex.substr(4, 2) +
        sHex.substr(2, 2) +
        sHex.substr(0, 2));
    return 0;
  }
}

function DrawColorButton(lpDRAWITEMSTRUCT)
{
  var hDC = AkelPad.MemRead(_PtrAdd(lpDRAWITEMSTRUCT, _X64?32:24) /*offsetof(DRAWITEMSTRUCT, hDC)*/, 2 /*DT_QWORD*/);
  var lpRect = _PtrAdd(lpDRAWITEMSTRUCT, _X64?40:28) /*offsetof(DRAWITEMSTRUCT, rcItem)*/;
  var hBrush = oSys.Call("Gdi32::CreateSolidBrush", HexReverse(GetDlgItemText(IDC_EDTHEX)));

  oSys.Call("User32::FillRect", hDC, lpRect, hBrush);

  if (oSys.Call("User32::GetFocus") == GetDlgItem(IDC_BTNIMG))
    oSys.Call("User32::DrawFocusRect", hDC, lpRect);

  oSys.Call("Gdi32::DeleteObject", hBrush);
}

function ChangeControlEdit(nID)
{
  var pHex;

  if (nID == IDC_CBOIMG)
  {
    pHex = aColorName[
             SendDlgItemMessage(IDC_CBOIMG, 327 /*CB_GETCURSEL*/, 0, 0)
           ][1];

    if (pHex != "0")
      pHex = pHex.slice(1); // #000000 --> 000000
  }
  else
  {
    pHex = GetDlgItemText(nID);

    if (nID != IDC_EDTHEX)
      pHex = ConvertToHex(pHex, nID);
  }

  if ( nID != IDC_EDTHEX ) SetDlgItemText(IDC_EDTHEX,          pHex );
  if ( nID != IDC_EDTDEC ) SetDlgItemText(IDC_EDTDEC, HexToDec(pHex));
  if ( nID != IDC_EDTOCT ) SetDlgItemText(IDC_EDTOCT, HexToOct(pHex));
  if ( nID != IDC_EDTBIN ) SetDlgItemText(IDC_EDTBIN, HexToBin(pHex));
  if ( nID != IDC_EDTRGB ) SetDlgItemText(IDC_EDTRGB, HexToRGB(pHex));

  if (nID != IDC_CBOIMG)
  {
    pHex = pHex.toUpperCase();

    SendDlgItemMessage(IDC_CBOIMG, 334 /*CB_SETCURSEL*/, 0, 0);

    for (var i = 0; i < aColorName.length; ++i)
    {
      if (pHex == aColorName[i][1].slice(1))
      {
        SendDlgItemMessage(IDC_CBOIMG, 334 /*CB_SETCURSEL*/, i, 0);
        break;
      }
    }
  }
  oSys.Call("User32::InvalidateRect", GetDlgItem(IDC_BTNIMG), 0, true);
}

function GetSelNumber()
{
  var hWndEdit = AkelPad.GetEditWnd();
  var aWordPos;
  var pNum;

  if (hWndEdit)
  {
    var pSelText = AkelPad.GetSelText();
    var nSelStart = AkelPad.GetSelStart();

    if (!pSelText)
    {
      if (aWordPos = GetWordUnderCaret(hWndEdit))
      {
        pSelText = AkelPad.GetTextRange(aWordPos.min, aWordPos.max);
        nSelStart = aWordPos.min;
      }
    }

    if (pSelText)
    {
      if (pSelText = pSelText.replace(/(^[ \t\+-]+)|([ \t]+$)/mg, ""))
      {
        if (AkelPad.GetTextRange(nSelStart - 1, nSelStart) == "#")
          pSelText = "#" + pSelText;

        if (pNum = GetCoderVariableValue(0, 0, pSelText.replace(/[\$\{\}]+/g,"")))
          return pNum.replace(/#/i,""); //return hex

        for (var i = 0; i < aColorName.length; ++i)
        {
          if ((aColorName[i][0].toLowerCase() == pSelText.toLowerCase()) ||
              (aColorName[i][0].toLowerCase() == pSelText.toLowerCase().replace(/[ \t]+/g, "")))
          {
            pSelText = aColorName[i][1];
            break;
          }
        }

        if (/0x|#/i.test(pSelText))
        {
          pNum = pSelText.replace(/(0x|#)/gi,"");

          if ((RegExp.$1 == "#") && (pNum.length == 3))
            pNum = pNum.replace(/./g, "$&$&");

          if (HexToDec(pNum))
            return pNum;
        }

        if (parseInt(pSelText, 10).toString() === pSelText)
          return ConvertToHex(pSelText, IDC_EDTDEC);

        if (pNum = ConvertToHex(pSelText, IDC_EDTRGB))
          return pNum;

        if (HexToDec(pSelText))
          return pSelText;
      }
    }
  }
  return "";
}

function GetWordUnderCaret(hWndEdit)
{
  var nCaretPos = AkelPad.GetSelStart();
  var crInfo = [];

  crInfo.min = SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK */, 0 /*WB_LEFT*/, nCaretPos);
  crInfo.max = SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK */, 7 /*WB_RIGHTBREAK*/, crInfo.min);

  if (crInfo.max < nCaretPos)
  {
    crInfo.min = SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK*/, 0 /*WB_LEFT*/, nCaretPos + 1);
    crInfo.max = SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK*/, 7 /*WB_RIGHTBREAK*/, crInfo.min);
  }

  if (crInfo.max >= nCaretPos)
    return crInfo;
}


ConvertNumColorValue part2.js
Last edited by Kley on Tue Mar 22, 2016 6:18 pm, edited 6 times in total.
Post Reply