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

Scripts collection
Goto page Previous  1, 2, 3, 4, 5, 6 ... 16, 17, 18  Next
 
Post new topic   Reply to topic    AkelPad Forum Index -> Plugins
View previous topic :: View next topic  
Author Message
Infocatcher



Joined: 06 Aug 2007
Posts: 1564

PostPosted: Thu Jun 24, 2010 4:02 pm    Post subject: Reply with quote

convertEscapes.js
Code:
// (c) Infocatcher 2010
// version 0.1.6 - 2010-12-09

//===================
// Convert JavaScript escape sequences like "\u00a9" or "\xa9" ((c) symbol)

// Arguments:
//   -mode=0  - (default) auto encode or decode
//   -mode=1  - encode
//   -mode=2  - decode

// Usage:
//   Call("Scripts::Main", 1, "convertEscapes.js", "-mode=0")
//===================

function _localize(s) {
   var strings = {
      "Nothing to recode!": {
         ru: "Нечего перекодировать!"
      }
   };
   var lng;
   switch(AkelPad.SystemFunction().Call("kernel32::GetUserDefaultLangID") & 0x3ff /*PRIMARYLANGID*/) {
      case 0x19: lng = "ru"; break;
      default:   lng = "en";
   }
   _localize = function(s) {
      return strings[s] && strings[s][lng] || s;
   };
   return _localize(s);
}

// Read arguments:
var args = {};
for(var i = 0, argsCount = WScript.Arguments.length; i < argsCount; i++)
   if(/^-(\w+)(=(.+))?$/i.test(WScript.Arguments(i)))
      args[RegExp.$1.toLowerCase()] = RegExp.$3 ? eval(RegExp.$3) : true;
function getArg(argName, defaultVal) {
   return typeof args[argName] == "undefined" // argName in args
      ? defaultVal
      : args[argName];
}

var MODE_AUTO   = 0;
var MODE_ENCODE = 1;
var MODE_DECODE = 2;

var mode = getArg("mode", MODE_AUTO);
var auto   = mode == MODE_AUTO;
var encode = mode == MODE_ENCODE;
var decode = mode == MODE_DECODE;


//var AkelPad = new ActiveXObject("AkelPad.document");
var hMainWnd = AkelPad.GetMainWnd();
var hWndEdit = AkelPad.GetEditWnd();
var oSys = AkelPad.SystemFunction();

if(hMainWnd && !AkelPad.GetEditReadOnly(hWndEdit))
   convertEscapes();

function convertEscapes() {
   var text = AkelPad.GetSelText();
   var selectAll = false;
   if(!text) {
      text = getAllText();
      selectAll = true;
   }

   var res;
   if(encode || auto) {
      res = encodeEscapes(text);
      if(auto)
         decode = res == text; // Can't encode
   }
   if(decode) {
      res = decodeEscapes(text);
      if(res == null) // Decode error
         return;
   }
   if(res == text) {
      AkelPad.MessageBox(hMainWnd, _localize("Nothing to recode!"), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
      return;
   }

   insertNoScroll(res, selectAll);
}

function encodeEscapes(str) {
   return str.replace(
      /[^!-~ \t\n\r]/ig,
      function(s) {
         var hex = s.charCodeAt(0).toString(16);
         return "\\u" + "0000".substr(hex.length) + hex;
      }
   );
}
function decodeEscapes(str) {
   // Keep some escaped chars inside string literals
   // "ab\ncd" => "ab\\ncd" => eval() => "ab\ncd"
   var doubleEscape = function(s) {
      return s.replace(
         /(\\+)([nrt'"])?/g,
         function(s, bs, chr) {
            if(bs.length % 2 == 0 || chr) // \ => \\ (*2)
               return new Array(bs.length + 1).join("\\") + s;
            // \\\ => \\ + \ => (\\)*2 + \
            return new Array(Math.floor(bs.length/2)*2 + 1).join("\\") + s;
         }
      );
   };
   str = str // Single RegExp like /("|')(?:\\\1|[^\1])*\1/g fail
      .replace(/"(?:\\"|[^"\n\r])*"/g, doubleEscape)
      .replace(/'(?:\\'|[^'\n\r])*'/g, doubleEscape);

   try {
      // Stupid, but sample :D
      str = eval(
         '"' +
         str // Make valid string
            .replace(
               /(\\*)["']/g,
               function(s, bs) {
                  return bs.length % 2 == 0
                     ? "\\" + s
                     : s;
               }
            )
            .replace(/\n/g, "\\n")
            .replace(/\r/g, "\\r")
            .replace(/\u2028/g, "\\u2028")
            .replace(/\u2029/g, "\\u2029") +
         '"'
      );
   }
   catch(e) {
      AkelPad.MessageBox(hMainWnd, e.name + '\neval("string") fail\n' + e.message, WScript.ScriptName, 16 /*MB_ICONERROR*/);
      return null;
   }

   return str;
}

function getAllText() {
   if(typeof AkelPad.GetTextRange != "undefined")
      return AkelPad.GetTextRange(0, -1);
   var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
   if(!lpPoint)
      return "";
   setRedraw(hWndEdit, false);
   AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);

   var columnSel = AkelPad.SendMessage(hWndEdit, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0);
   var ss = AkelPad.GetSelStart();
   var se = AkelPad.GetSelEnd();

   AkelPad.SetSel(0, -1);
   var str = AkelPad.GetSelText();

   AkelPad.SetSel(ss, se);
   columnSel && AkelPad.SendMessage(hWndEdit, 3128 /*AEM_UPDATESEL*/, 0x1 /*AESELT_COLUMNON*/, 0);

   AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
   AkelPad.MemFree(lpPoint);
   setRedraw(hWndEdit, true);
   return str;
}
function insertNoScroll(str, selectAll) {
   var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
   if(!lpPoint)
      return;
   setRedraw(hWndEdit, false);
   AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);

   selectAll && AkelPad.SetSel(0, -1);
   //var ss = AkelPad.GetSelStart();
   AkelPad.ReplaceSel(str, true);
   //if(ss != AkelPad.GetSelStart())
   //   AkelPad.SetSel(ss, ss + str.length);

   AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
   setRedraw(hWndEdit, true);
   AkelPad.MemFree(lpPoint);
}
function setRedraw(hWnd, bRedraw) {
   AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
   bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}
<download> (see converter.js)

Converts JavaScript escape sequences like "\u00a9" or "\xa9" («©» symbol)
Example: before, after (or vice versa Smile).

Version 0.1.5 - 2010-12-06
[x] Fixed insertNoScroll() function.

Version 0.1.4 - 2010-11-25
[*] Improved logic of text operations.

Version 0.1.3 - 2010-11-23
[*] New localization method.

Old changelog

Version 0.1.2 - 2010-11-22
[+] Added localization.

Version 0.1.1 - 2010-11-16
[*] Improved handling of «\» character inside string literals («var someStr = "\\n - \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0440\u043e\u043a\u0438";» => «var someStr = "\\n - перевод строки";»).


Last edited by Infocatcher on Fri May 11, 2012 6:19 pm; edited 9 times in total
Back to top
View user's profile Send private message
se7h



Joined: 28 Sep 2009
Posts: 764
Location: Minsk, Belarus

PostPosted: Wed Jun 30, 2010 8:40 am    Post subject: Reply with quote

Process current file in HTML TiDy

Tidy reads HTML, XHTML and XML files and writes cleaned up markup. For HTML variants, it detects and corrects many common coding errors and strives to produce visually equivalent markup that is both W3C compliant and works on most browsers. A common use of Tidy is to convert plain HTML to XHTML. For generic XML files, Tidy is limited to correcting basic well-formedness errors and pretty printing.

tidy.exe put in AkelPad\AkelFiles\Tools\HTMLTidy\

Tidy documentation

HTMLTidy.js
Code:
/// Process current file in HTML TiDy
// Version 1.11
//
// Usage:
// Call("Scripts::Main", 1, "HTMLTidy.js", "config_name")
//
// Support ShowMenuEx.js if you do not specify a flags in argument:
// Call("Scripts::Main", 1, "HTMLTidy.js")
//
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=7814#7814

var WshShell = new ActiveXObject("WScript.shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");

var pToolPath = AkelPad.GetAkelDir() + "\\AkelFiles\\Tools\\HTMLTidy\\tidy.exe";
var pConfigPath = AkelPad.GetAkelDir() + "\\AkelFiles\\Tools\\HTMLTidy\\";

if(WScript.Arguments.length) {
    pConfigPath += WScript.Arguments(0);
} else {
    if (! AkelPad.Include("ShowMenuEx.js")) WScript.Quit();
    var pCfgFile = getSelectedMenuItem(POS_CURSOR, "", 0);

    if(pCfgFile == "") {
        WScript.Quit();
    }

    pConfigPath += pCfgFile;
}

var hEditWnd = AkelPad.GetEditWnd();
var pTmpFile;

if(pTmpFile = CreateTempFile()) {
    AkelPad.SaveFile(hEditWnd, pTmpFile, 1200 /*UTF-16LE*/, true, false);
    pToolPath = correctCommandLine(pToolPath);
    pConfigPath = correctCommandLine(pConfigPath);
    pTmpFile = correctCommandLine(pTmpFile);
   
    WshShell.Run("%COMSPEC% /c " + "\"" + pToolPath + " -config " + pConfigPath + " -m -utf16le " + pTmpFile + "\"", 0, true);

    pText = AkelPad.ReadFile(pTmpFile);
    setRedraw(hEditWnd, false);
    AkelPad.SetSel(0, -1);
    AkelPad.ReplaceSel(pText);
    setRedraw(hEditWnd, true);
    fso.DeleteFile(pTmpFile);
}


//Functions
function CreateTempFile() {
    var oTmpFolder;
    var oTmpFile;
    var pTmpName;

    if(oTmpFolder = fso.GetSpecialFolder(2 /*TemporaryFolder*/)) {
        pTmpName = fso.GetTempName();

        if(oTmpFile = oTmpFolder.CreateTextFile(pTmpName)) {
            oTmpFile.Close();
        }

        return (oTmpFolder.Path + "\\" + pTmpName);
    }

    return "";
}

function correctCommandLine(pPath) {
    if(pPath.search( / /) != -1) {
        return "\"" + pPath + "\"";
    } else {
        return pPath;
    }
}

function setRedraw(hWnd, bRedraw) {
   var oSys = AkelPad.SystemFunction();
   AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
   bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}
(v1.11 - 30.03.2012)

Usage
Code:
Call("Scripts::Main", 1, "HTMLTidy.js", "reformat.cfg")


Argument - file name of config file in AkelPad\AkelFiles\Tools\HTMLTidy\

reformat.cfg (example)
Code:
indent-attributes: yes
indent: yes
indent-spaces: 4
markup: yes
output-xhtml: yes
quiet: yes
wrap: 0
wrap-asp: yes
wrap-attributes: yes
wrap-jste: yes
wrap-php: yes
numeric-entities: yes
show-errors: 0
tab-size: 4


Support ShowMenuEx.js if you do not specify a file name in argument

Example HTMLTidy.param for ShowMenuEx.js

Code:
reformat.cfg = Reformat
custom.cfg = Custom


________________________

Process current file in AStyle

Artistic Style is a source code indenter, formatter, and beautifier for the C, C++, C# and Java programming languages.

AStyle.exe put in AkelPad\AkelFiles\Tools\AStyle\

AStyle documentation

AStyle.js
Code:
/// Process current file in AStyle
// v1.11
//
// Usage:
// Call("Scripts::Main", 1, "AStyle.js", "`flags`")
//
// Or support ShowMenuEx.js if you do not specify a flags in argument:
// Call("Scripts::Main", 1, "AStyle.js")
//
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=7814#7814

var WshShell = new ActiveXObject("WScript.shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");
var pToolPath = AkelPad.GetAkelDir() + "\\AkelFiles\\Tools\\AStyle\\AStyle.exe";

var pToolFlags = "";

if(WScript.Arguments.length) {
    pToolFlags = WScript.Arguments(0);
} else if(pToolFlags == "") {
    if (! AkelPad.Include("ShowMenuEx.js")) WScript.Quit();
    var pFlags = getSelectedMenuItem(POS_CURSOR, "", 0);

    if(pFlags == "") {
        WScript.Quit();
    }

    pToolFlags = pFlags;
}

var hEditWnd = AkelPad.GetEditWnd();
var pTmpFile;
var pText;

if(pTmpFile = CreateTempFile()) {
    AkelPad.SaveFile(hEditWnd, pTmpFile, 65001 /*UTF-8*/, true, false);

    pToolPath = correctCommandLine(pToolPath);
    pTmpFile = correctCommandLine(pTmpFile);

    WshShell.Run("%COMSPEC% /c " + pToolPath + " " + pToolFlags + " " + pTmpFile, 0, true);
    pText = AkelPad.ReadFile(pTmpFile);

    setRedraw(hEditWnd, false);
    AkelPad.SetSel(0, -1);
    AkelPad.ReplaceSel(pText);
    setRedraw(hEditWnd, true);

    fso.DeleteFile(pTmpFile);
}


//Functions
function CreateTempFile() {
    var oTmpFolder;
    var oTmpFile;
    var pTmpName;

    if(oTmpFolder = fso.GetSpecialFolder(2 /*TemporaryFolder*/)) {
        pTmpName = fso.GetTempName();

        if(oTmpFile = oTmpFolder.CreateTextFile(pTmpName)) {
            oTmpFile.Close();
        }

        return (oTmpFolder.Path + "\\" + pTmpName);
    }

    return "";
}

function correctCommandLine(pPath) {
    if(pPath.search( / /) != -1) {
        return "\"" + pPath + "\"";
    } else {
        return pPath;
    }
}

function setRedraw(hWnd, bRedraw) {
   var oSys = AkelPad.SystemFunction();
   AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
   bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}
(v1.11 - 30.03.2012)

Usage
Code:
Call("Scripts::Main", 1, "AStyle.js", "`flags`")


AStyle.param (example)
Code:
-aCfjKm0Nps4SUwxY = Custom
-A1 = Allman Style


________________________

Process current file in CSSTidy

CSSTidy is an opensource CSS parser and optimiser.

csstidy.exe put in AkelPad\AkelFiles\Tools\CSSTidy\

CSSTidy documentation

CSSTidy.js
Code:
/// Process current file in CSSTidy
// v1.11
//
// Usage:
// Call("Scripts::Main", 1, "CSSTidy.js", "`flags`")
//
// Or support ShowMenuEx.js if you do not specify a flags in argument:
// Call("Scripts::Main", 1, "CSSTidy.js")
//
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=7814#7814

var WshShell = new ActiveXObject("WScript.shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");

var pToolPath = AkelPad.GetAkelDir() + "\\AkelFiles\\Tools\\CSSTidy\\csstidy.exe";

var pToolFlags = "";

if(WScript.Arguments.length) {
    pToolFlags = WScript.Arguments(0);
} else if(pToolFlags == "") {
    if (! AkelPad.Include("ShowMenuEx.js")) WScript.Quit();
    var pFlags = getSelectedMenuItem(POS_CURSOR, "", 0);

    if(pFlags == "") {
        WScript.Quit();
    }

    pToolFlags = pFlags;
}

var hEditWnd = AkelPad.GetEditWnd();
var pTmpFile1;
var pTmpFile2;
var pText;

if(pTmpFile1 = CreateTempFile()) {
    if(pTmpFile2 = CreateTempFile()) {
        AkelPad.SaveFile(hEditWnd, pTmpFile1, 65001 /*UTF-8*/, true, false);
        pToolPath = correctCommandLine(pToolPath);
        pTmpFile1 = correctCommandLine(pTmpFile1);
        WshShell.Run("%COMSPEC% /c " + pToolPath + " " + pTmpFile1 + " " + pToolFlags + " " + pTmpFile2, 0, true);
        pText = AkelPad.ReadFile(pTmpFile2);

        setRedraw(hEditWnd, false);
        AkelPad.SetSel(0, -1);
        AkelPad.ReplaceSel(pText);
        setRedraw(hEditWnd, true);

        fso.DeleteFile(pTmpFile2);
    }

    fso.DeleteFile(pTmpFile1);
}


//Functions
function CreateTempFile() {
    var oTmpFolder;
    var oTmpFile;
    var pTmpName;

    if(oTmpFolder = fso.GetSpecialFolder(2 /*TemporaryFolder*/)) {
        pTmpName = fso.GetTempName();

        if(oTmpFile = oTmpFolder.CreateTextFile(pTmpName)) {
            oTmpFile.Close();
        }

        return (oTmpFolder.Path + "\\" + pTmpName);
    }

    return "";
}

function correctCommandLine(pPath) {
    if(pPath.search( / /) != -1) {
        return "\"" + pPath + "\"";
    } else {
        return pPath;
    }
}

function setRedraw(hWnd, bRedraw) {
   var oSys = AkelPad.SystemFunction();
   AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
   bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}
(v1.11 - 30.03.2012)

Usage
Code:
Call("Scripts::Main", 1, "CSSTidy.js", "`flags`")


________________________

Process current file in phpCodeBeautifier

phpCodeBeautifier is a tool which avoid you of spending hours on reformating PHP-code to suit your own way of presenting it.

phpCB.exe put in AkelPad\AkelFiles\Tools\phpCB\

phpCB documentation

phpCB.js
Code:
/// Process current file in phpCB
// v1.11
//
// Usage:
// Call("Scripts::Main", 1, "phpCB.js", "`flags`")
//
// Or support ShowMenuEx.js if you do not specify a flags in argument:
// Call("Scripts::Main", 1, "phpCB.js")
//
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=7814#7814

var WshShell = new ActiveXObject("WScript.shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");

var pToolPath = AkelPad.GetAkelDir() + "\\AkelFiles\\Tools\\phpCB\\phpCB.exe";

var pToolFlags = "";

if(WScript.Arguments.length) {
    pToolFlags = WScript.Arguments(0);
} else if(pToolFlags == "") {
    if (! AkelPad.Include("ShowMenuEx.js")) WScript.Quit();
    var pFlags = getSelectedMenuItem(POS_CURSOR, "", 0);

    if(pFlags == "") {
        WScript.Quit();
    }

    pToolFlags = pFlags;
}

var hEditWnd = AkelPad.GetEditWnd();
var pTmpFile1;
var pTmpFile2;
var pText;

if(pTmpFile1 = CreateTempFile()) {
    if(pTmpFile2 = CreateTempFile()) {
        AkelPad.SaveFile(hEditWnd, pTmpFile1, 65001 /*UTF-8*/, true, false);

        pToolPath = correctCommandLine(pToolPath);
        pTmpFile1 = correctCommandLine(pTmpFile1);

        WshShell.Run("%COMSPEC% /c " + pToolPath + " " + pToolFlags + " " + pTmpFile1 + ">" + pTmpFile2, 0, true);

        pText = AkelPad.ReadFile(pTmpFile2);

        setRedraw(hEditWnd, false);
        AkelPad.SetSel(0, -1);
        AkelPad.ReplaceSel(pText);
        setRedraw(hEditWnd, true);

        fso.DeleteFile(pTmpFile2);
    }

    fso.DeleteFile(pTmpFile1);
}


//Functions
function CreateTempFile() {
    var oTmpFolder;
    var oTmpFile;
    var pTmpName;

    if(oTmpFolder = fso.GetSpecialFolder(2 /*TemporaryFolder*/)) {
        pTmpName = fso.GetTempName();

        if(oTmpFile = oTmpFolder.CreateTextFile(pTmpName)) {
            oTmpFile.Close();
        }

        return (oTmpFolder.Path + "\\" + pTmpName);
    }

    return "";
}

function correctCommandLine(pPath) {
    if(pPath.search( / /) != -1) {
        return "\"" + pPath + "\"";
    } else {
        return pPath;
    }
}

function setRedraw(hWnd, bRedraw) {
   var oSys = AkelPad.SystemFunction();
   AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
   bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}
(v1.11 - 30.03.2012)

Usage
Code:
Call("Scripts::Main", 1, "phpCB.js", "`flags`")

________________
Based on ExecTool.js


Last edited by se7h on Fri Mar 30, 2012 8:04 pm; edited 7 times in total
Back to top
View user's profile Send private message
VladSh



Joined: 29 Nov 2006
Posts: 2584
Location: Киев, Русь

PostPosted: Thu Jul 08, 2010 11:56 am    Post subject: Reply with quote

SpacesToTabs.js
Code:
///Convert space to tabulation
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=7947#7947
// Version: 3.1 (2012.09.12) - добален функционал + некоторые идеи взяты из соответствующего скрипта от F.Phoenix (2012-08-18a)
//
// Arguments:
//      lead:
//         • 0 - processing of all text (used for vertical text blocks)
//         • [1] - processing of lead spaces only (used for scripts)
//      bSpaces - definition of count of spaces in block:
//         • [0] - from program settings
//         • -1 - InputBox
//         • > 0 - count of spaces to be replaced by a tab
//      oActn - what to do with other (the residual) single-spaces:
//         • [0] (or without this argument) - do nothing, to limit the processing of block spaces only (used for scripts)
//         • 1 - replace single-spaces
//         • -1 - remove single-spaces (can also be used for scripts)
//      sel (0/1) - leave the result text selected; without this argument it defined automatically
//
//   Example:
//      -"Convert space to tabulation" Call("Scripts::Main", 1, "SpacesToTabs.js") - script process by default options: processing of lead spaces only, definition of count of spaces in block from program settings, residual single-spaces will not be processed

var constsDefault = {
   msgp_SpasesInTab: "Enter the number of spaces in a tab character:",
   msgp_InputNaN: "Input non-numeric value, the operation is canceled.",
   msgp_ArgumentNaN: "Arguments passed a non-numeric value, the operation is canceled."
};

if (AkelPad.GetMainWnd()) {
   var hWndEdit = AkelPad.GetEditWnd();
   
   var bTextSelected = true;
   var pSelText = AkelPad.GetSelText();
   if (!pSelText) {
      pSelText = AkelPad.GetTextRange(0, -1);
      bTextSelected = false;
   }
   if (!pSelText) WScript.Quit();
   
   var sReplaced = "\t";      // заменяющий текст
   var nTabStop;
   var nBSAction = AkelPad.GetArgValue("bSpaces", 0);
   if (nBSAction <= 0) {
      //0 - from program settings
      var nTabStop = AkelPad.SendMessage(hWndEdit, 3239 /*AEM_GETTABSTOP*/, 0, 0);
      // InputBox
      if (nBSAction == -1) {
         if (!(nTabStop = AkelPad.InputBox(hWndEdit, WScript.ScriptName, getConst("msgp_SpasesInTab"), nTabStop))) WScript.Quit();
         checkTabStopIsNaN(hWndEdit, nTabStop, "msgp_InputNaN");
      }
   }
   else {
      checkTabStopIsNaN(hWndEdit, nBSAction, "msgp_ArgumentNaN");
      nTabStop = nBSAction;
   }
   
   // Обработка блоков из определённого количества пробелов
   if (AkelPad.GetArgValue("lead", 1)) {
      // обработка только лидирующиех пробелов
      pSelText = pSelText.replace(/^\s+/mg, replacer);
   }
   else {
      // обработка пробелов всего текста (для вертикальных блоков)
      pSelText = replacer(pSelText);
      
      // Обработка оставшихся пробелов
      var nOSAction = AkelPad.GetArgValue("oActn", 0);
      if (nOSAction != 0) {
         //replace residual space on a Tab character or remove it
         sReplaced = (nOSAction == 1) ? "\t" : "";
         pSelText = pSelText.replace(/ /g, sReplaced);
      }
   }
   
   if (!bTextSelected) AkelPad.SetSel(0, -1);
   var bTextSelected = AkelPad.GetArgValue("sel", bTextSelected);
   AkelPad.ReplaceSel(pSelText, bTextSelected);
}

function checkTabStopIsNaN(hWndEdit, nTabStop, pPlaceActionMsg) {
   if (isNaN(nTabStop))   {
      AkelPad.MessageBox(hWndEdit, getConst(pPlaceActionMsg), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);         //press Cancel
      WScript.Quit();
   }
}

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

function getConst(constName) {
   var sResult;
   var oSet = AkelPad.ScriptSettings();
   if (oSet.Begin(WScript.ScriptBaseName, 0x1 /*POB_READ*/)) {
      sResult = oSet.Read(AkelPad.GetLangId(0 /*LANGID_FULL*/) + "_" + constName, 3 /*PO_STRING*/);
      oSet.End();
   }
   else
      sResult = constsDefault[constName];
   return sResult;
}


SpacesToTabs.ini
Code:
[Options]
;= Constants for SpacesToTabs.js
;= 2012.09.12

;= RU
1049_msgp_SpasesInTab=Введите количество пробелов в одном символе табуляции:
1049_msgp_InputNaN=Введено нечисловое значение, операция отменена.
1049_msgp_ArgumentNaN=В аргументах передано нечисловое значение, операция отменена.

;= Enter text of constants for you language
;= _msgp_SpasesInTab=
;= _msgp_InputNaN=
;= _msgp_ArgumentNaN=


Использование в ContextMenu-плагине
:
Code:
"Пробелы -> символы Табуляции"
{
  -"Скрипты (кол-во пробелов из настроек)" Call("Scripts::Main", 1, "SpacesToTabs.js")
  -"Скрипты (кол-во пробелов = 2)" Call("Scripts::Main", 1, "SpacesToTabs.js", `-bSpaces=2`)
  -"Скрипты (запрос...)" Call("Scripts::Main", 1, "SpacesToTabs.js", `-bSpaces=-1`)
  SEPARATOR
  -"Все вхождения (запрос...)" Call("Scripts::Main", 1, "SpacesToTabs.js", `-lead=0 -bSpaces=-1 -oActn=1`)
}


Last edited by VladSh on Wed Nov 14, 2012 9:37 am; edited 8 times in total
Back to top
View user's profile Send private message Visit poster's website
VladSh



Joined: 29 Nov 2006
Posts: 2584
Location: Киев, Русь

PostPosted: Fri Jul 09, 2010 3:07 pm    Post subject: Reply with quote

Общий скрипт получения слова, на котором установлена каретка, и работы с ним: CaretSelect.js
Code:
///Select the word or link at the cursor position
// script must be placed in ...\Scripts\Include\
///Выделение текущего слова; будет выделено, даже если курсор стоит перед первой и после последней буквы слова
// скрипт должен находиться в ..\Scripts\Include\
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=7969#7969
// Version: 2.4 (2012.09.10)

// Возвращает границы слова, на котором установлена каретка
// используется алгоритм от FeyFre: http://akelpad.sourceforge.net/forum/viewtopic.php?p=7973#7973
function getWordCaretInfo(hWndEdit) {
   if (hWndEdit) {
      var nCaretPos = AkelPad.GetSelStart();
      var crInfo = [];
      crInfo.min = AkelPad.SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK */, 0/*WB_LEFT*/, nCaretPos);
      crInfo.max = AkelPad.SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK */, 7/*WB_RIGHTBREAK*/, crInfo.min);
      //! For case when caret located on word start position i.e. "prev-word |word-to-copy"
      if (crInfo.max < nCaretPos)
      {
         crInfo.min = AkelPad.SendMessage(hWndEdit, 1100/*EM_FINDWORDBREAK*/, 0/*WB_LEFT*/, nCaretPos + 1);
         crInfo.max = AkelPad.SendMessage(hWndEdit, 1100/*EM_FINDWORDBREAK*/, 7/*WB_RIGHTBREAK*/, crInfo.min);
      }
      if (crInfo.max >= nCaretPos)
         return crInfo;
   }
}

// Возвращает текст слова, на котором установлена каретка
function getWordCaret() {
   var sResult = "";
   var hWndEdit = AkelPad.GetEditWnd();
   var crInfo = getWordCaretInfo(hWndEdit);
   if (crInfo) sResult = AkelPad.GetTextRange(crInfo.min, crInfo.max);
   return sResult;
}

// Выделяет слово, на котором установлена каретка
function WordCaretSelect() {
   var bSelected = false;
   var hWndEdit = AkelPad.GetEditWnd();
   var crInfo = getWordCaretInfo(hWndEdit);
   if (crInfo) {
      if (crInfo) AkelPad.SetSel(crInfo.min, crInfo.max);
      bSelected = true;
   }
   return bSelected;
}


// Возвращает границы ссылки, на которой установлена каретка
// код KDJ, VladSh, Instructor; начиная отсюда: http://akelpad.sourceforge.net/forum/viewtopic.php?p=19312#19312
function getLinkCaretInfo(hWndEdit) {
   if (hWndEdit) {
      var bResult = false;
      var lpCaret;
      var lpInfo;
      var crInfo = [];
      if (lpCaret = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/))
      {
         AkelPad.SendMessage(hWndEdit, 3130 /*AEM_GETINDEX*/, 5 /*AEGI_CARETCHAR*/, lpCaret);
         if (lpInfo = AkelPad.MemAlloc(_X64 ? 48 : 24 /*sizeof(AECHARInfo)*/))
         {
            if (AkelPad.SendMessage(hWndEdit, 3149 /*AEM_INDEXINURL*/, lpCaret, lpInfo))
            {
               crInfo.min = AkelPad.SendMessage(hWndEdit, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpInfo);
               crInfo.max = AkelPad.SendMessage(hWndEdit, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpInfo + (_X64 ? 24 : 12) /*offsetof(AECHARInfo, ciMax)*/);
               bResult = true;
            }
            AkelPad.MemFree(lpInfo);
         }
         AkelPad.MemFree(lpCaret);
      }
      if (bResult)
         return crInfo;
   }
}

// Возвращает текст ссылки, на которой установлена каретка
function getLinkCaret() {
   var sResult = "";
   var hWndEdit = AkelPad.GetEditWnd();
   var crInfo = getLinkCaretInfo(hWndEdit);
   if (crInfo) sResult = AkelPad.GetTextRange(crInfo.min, crInfo.max);
   return sResult;
}

// Выделяет ссылку, на которой установлена каретка
function LinkCaretSelect() {
   var bSelected = false;
   var hWndEdit = AkelPad.GetEditWnd();
   var crInfo = getLinkCaretInfo(hWndEdit);
   if (crInfo) {
      if (crInfo) AkelPad.SetSel(crInfo.min, crInfo.max);
      bSelected = true;
   }
   return bSelected;
}

Должен находиться в ..\Scripts\Include\.
Предыдущее название скрипта: WordCaretSelect.js.

Скрипт выделения текущего слова: WordSelect.js
Code:
/// Select the word at the cursor position
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=7969#7969
// Version: 1.5 (2012.08.23)

if (! AkelPad.Include("CaretSelect.js")) WScript.Quit();
WordCaretSelect();

Установил на Ctrl+Alt+Up.

Копирование текущего слова: WordCopy.js
Code:
/// Copy the word at the cursor position
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=7969#7969
// Version: 1.4 (2012.08.23)

if (! AkelPad.Include("CaretSelect.js")) WScript.Quit();
AkelPad.SetClipboardText(getWordCaret());

Установил на Ctrl+Alt+C.


Last edited by VladSh on Mon Sep 24, 2012 10:59 am; edited 17 times in total
Back to top
View user's profile Send private message Visit poster's website
Fr0sT



Joined: 24 Jul 2007
Posts: 875

PostPosted: Fri Jul 09, 2010 3:30 pm    Post subject: Reply with quote

=== Base64 encode/decode ===
converts selection to Base64 and vice versa (also supports decoding of HTML &#nnnn; char codes)

Thanks to Infocatcher & VladSh for script examples

base64.js

Code:

// === Base64 encode/decode ===
// (c) Fr0sT 2010
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=7972#7972
//
// Сonverts selection to Base64 and vice versa
// Arguments:
//   enc - encode
//   dec - decode
// Example:
//   Call("Scripts::Main", 1, "Base64.js", "enc")
//
// v0.1.0 - 18:55 09.07.2010.
//   First release
// v0.1.1 - 20:30 10.07.2010.
//   Optimized encoding/decoding, added dec16 parameter, text length checking
// v1.0   - 17:05 04.08.2010.
//   Completely rewritten decoding/endcoding. Removed dec16 parameter. Works significantly faster!
//   Selected text is converted from wide char to multi-byte
//   string (using current document code page) so that decode now works perfectly with every text code
//   page. Text remains selected after recoding to allow quickly adjust text code page by Alt-R. Remember
//   that in recode dialog you should set target code page in the field "TO" while field "FROM" must be
//   the current document codepage. Added GetLastError to error reports. Removed buffer zero-padding in
//   decode() - it's already zeroed by MemAlloc. Added workaround if current document codepage is UTF16/32
// v1.1   - 11:28 06.08.2010
//   Added HTML entity decoding (&#nnnn;), parameter "dechtml"
// v1.2   - 12:43 08.12.2010
//   Fixed wrong buffer boundary checking (random characters appeared beyond the trailing "=")


/* Base64 encode / decode (originally from http://www.webtoolkit.info) */
/* Text-only modification: stops at 0 character */

var Base64 = {
   // private property
   _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

   // public method for encoding
   // in:  pBuf - buffer with multibyte string (ZERO-TERMINATED!)
   //      bufLen - buffer size
   // out: Base64 string
   encode : function(pBuf, bufLen)
   {
      var output = "";
      var pCurr = pBuf;

      while (true)
      {
         var chr1 = (pCurr < pBuf+bufLen) ? AkelPad.MemRead(pCurr++, 5 /* DT_BYTE */) : 0;
         var chr2 = (pCurr < pBuf+bufLen) ? AkelPad.MemRead(pCurr++, 5 /* DT_BYTE */) : 0;
         var chr3 = (pCurr < pBuf+bufLen) ? AkelPad.MemRead(pCurr++, 5 /* DT_BYTE */) : 0;
         if (!chr1) break;
         var enc1 = chr1 >> 2;
         var enc2 = ((chr1 & 0x03) << 4) | ((chr2 & 0xf0) >> 4);
         var enc3 = (!chr2) ? 0x40 : ((chr2 & 0x0f) << 2) | ((chr3 & 0xc0) >> 6);
         var enc4 = (!chr3) ? 0x40 : (chr3 & 0x3f);
         output += this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
         if (!chr3) break;
      }
      return output;
   },

   // public method for decoding
   // in:  base64str - Base64 string
   //      pBuf - buffer for output
   // out: decoded multibyte string (written to pBuf),
   //      remaining space filled with zero's by MemAlloc (!)
   decode : function(base64str, pBuf)
   {
      // chr1, chr2, chr3;
      // enc1, enc2, enc3, enc4;
      var i = 0;
      base64str = base64str.replace(/[^A-Za-z0-9\+\/\=]/g, "");
      if (base64str.length = 0 || base64str.length % 4 != 0)
         throw("Not a Base64 string!");
      var pCurr = pBuf;

      while (i < base64str.length)
      {
         var enc1 = this._keyStr.indexOf(base64str.charAt(i++));
         var enc2 = this._keyStr.indexOf(base64str.charAt(i++));
         var enc3 = this._keyStr.indexOf(base64str.charAt(i++));
         var enc4 = this._keyStr.indexOf(base64str.charAt(i++));
         var chr1 = (enc1 << 2) | (enc2 >> 4);
         var chr2 = (enc3 != 0x40) ? (((enc2 & 0x0f) << 4) | (enc3 >> 2)) : 0;
         var chr3 = (enc4 != 0x40) ? (((enc3 & 0x03) << 6) | enc4) : 0;
         AkelPad.MemCopy(pCurr++, chr1, 5 /* DT_BYTE */);
         AkelPad.MemCopy(pCurr++, chr2, 5 /* DT_BYTE */);
         AkelPad.MemCopy(pCurr++, chr3, 5 /* DT_BYTE */);
      }
      
      return;
   }
}

var hWndEdit;
var Usage = "Usage: select text and execute Call(\"Scripts::Main\", 1, \""+WScript.ScriptName+"\", \"enc|dec\")";

function ReportError(msg, printUsage)
{
   AkelPad.MessageBox(hWndEdit, msg+(printUsage?("\n"+Usage):""), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
   WScript.Quit();
}

if (hWndEdit = AkelPad.GetMainWnd())
{
   // check arguments
   if (WScript.Arguments.length == 0)
      ReportError("Expect parameter", true);

   // Get & check selected text
   if ((selText = AkelPad.GetSelText()) == "")
      ReportError("No text selected!", true);

   // Warn about long text
   if (selText.length > 60000)
   {
      if (AkelPad.MessageBox(hWndEdit,
         "Selected text is "+selText.length+" characters long.\n"+
         "Process may take a long time. Continue?",
         WScript.ScriptName, 0x4 | 0x30 /*MB_YESNO | MB_ICONWARNING*/) != 6)
            WScript.Quit();
   }

   try
   {
      var pWCBuf = 0; // buffer to store wide char string
      var pMBBuf = 0; // buffer to store multi-byte string
      var sysFn = AkelPad.SystemFunction();
      var codePage = AkelPad.GetEditCodePage(0);
      // current code page is UTF16* or UTF32* - set ansi current code page
      // (WideChar <-> MultiByte functions don't work with this code pages)
      if (codePage == 1 || codePage == 1200 || codePage == 1201 || codePage == 12000 || codePage == 12001)
         codePage = 0;

      switch(WScript.Arguments(0))
      {
         // Encode selected text to Base64.
         // Before encoding convert it from UTF16 to multibyte string using current codepage (!)
         case "enc" :
            selText += "\u0000"; // so we don't worry about string length in conversions

            if (!(pWCBuf = AkelPad.MemAlloc(selText.length * _TSIZE)))
               throw("MemAlloc fail");
            AkelPad.MemCopy(pWCBuf, selText, _TSTR);

            // get required buffer size
            var bufLen = sysFn.Call(
                  "Kernel32::WideCharToMultiByte",
                  codePage, //   __in   UINT CodePage,         
                  0,        //   __in   DWORD dwFlags,         
                  pWCBuf,   //   __in   LPCWSTR lpWideCharStr, 
                  -1,       //   __in   int cchWideChar,       
                  0,        //   __out  LPSTR lpMultiByteStr,   
                  0,        //   __in   int cbMultiByte,       
                  0,        //   __in   LPCSTR lpDefaultChar,   
                  0);       //   __out  LPBOOL lpUsedDefaultChar
            if (bufLen == 0)
               throw("WCtoMB fail "+sysFn.GetLastError());
            if (!(pMBBuf = AkelPad.MemAlloc(bufLen)))
               throw("MemAlloc fail");

            // convert buffer
            bufLen = sysFn.Call(
                  "Kernel32::WideCharToMultiByte",
                  codePage, //   __in   UINT CodePage,         
                  0,        //   __in   DWORD dwFlags,         
                  pWCBuf,   //   __in   LPCWSTR lpWideCharStr, 
                  -1,       //   __in   int cchWideChar,       
                  pMBBuf,   //   __out  LPSTR lpMultiByteStr,   
                  bufLen,   //   __in   int cbMultiByte,       
                  0,        //   __in   LPCSTR lpDefaultChar,   
                  0);       //   __out  LPBOOL lpUsedDefaultChar
            if (bufLen == 0)
               throw("WCtoMB fail "+sysFn.GetLastError());
 
            // encode buffer
            selText = Base64.encode(pMBBuf, bufLen);

            break;

         case "dec"  :
            selText += "\u0000"; // so we don't worry about string length in conversions

            // allocate buffer with enough space for trailing zero's
            var bufLen = Math.ceil(selText.length * 3/4) + 1;
            if (!(pMBBuf = AkelPad.MemAlloc(bufLen)))
               throw("MemAlloc fail");

            // decode string to buffer
            Base64.decode(selText, pMBBuf);
            
            // get required buffer size
            var code = sysFn.Call(
                  "Kernel32::MultiByteToWideChar",
                  codePage, //   __in   UINT CodePage,         
                  0,        //   __in   DWORD dwFlags,         
                  pMBBuf,   //   __in   LPCSTR lpMultiByteStr, 
                  -1,       //   __in   int cbMultiByte,       
                  0,        //   __out  LPWSTR lpWideCharStr,   
                  0);       //   __in   int cchWideChar      
            if (code == 0)
               throw("MBtoWC fail "+sysFn.GetLastError());
            if (!(pWCBuf = AkelPad.MemAlloc(code * _TSIZE)))
               throw("MemAlloc fail");
            
            // convert buffer to wide char
            code = sysFn.Call(
                  "Kernel32::MultiByteToWideChar",
                  codePage,   //   __in   UINT CodePage,         
                  0,          //   __in   DWORD dwFlags,         
                  pMBBuf,     //   __in   LPCSTR lpMultiByteStr, 
                  -1,         //   __in   int cbMultiByte,       
                  pWCBuf,     //   __out  LPWSTR lpWideCharStr,   
                  code);      //   __in   int cchWideChar      
            if (code == 0)
               throw("MBtoWC fail "+sysFn.GetLastError());

            selText = AkelPad.MemRead(pWCBuf, 1 /* DT_UNICODE */);

            break;

         case "dechtml"  :
            var regex = new RegExp("&#([0-9][0-9][0-9][0-9]);", "gm");
            selText = selText.replace(regex,
                function (str, p1, offs, s) { return String.fromCharCode(Number(p1));}
                );

            break;
         default :
            throw("Wrong parameter: "+WScript.Arguments(0));
      } // switch
   } // try
   catch(err)
   {
      ReportError(err);
   }
   finally
   {
      if (pWCBuf) AkelPad.MemFree(pWCBuf);
      if (pMBBuf) AkelPad.MemFree(pMBBuf);
   }

   AkelPad.ReplaceSel(selText, true);
}



Last edited by Fr0sT on Thu Oct 11, 2012 12:16 pm; edited 5 times in total
Back to top
View user's profile Send private message
VladSh



Joined: 29 Nov 2006
Posts: 2584
Location: Киев, Русь

PostPosted: Fri Jul 09, 2010 4:59 pm    Post subject: Чуток кода для разбора и унификации старого LotusScript'а. Reply with quote

LSConst.js
Code:
///LS: Преобразование столбца наименований айтемов в строки описаний констант
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=7982#7982
// Version: 1.5 (2012.10.30)

var pBreak = "\r";
var strContent = AkelPad.GetSelText() || AkelPad.GetClipboardText();

if (strContent) {
   // идентификатор константы; по умолчанию для VB или LS
   var constLang = "Const";
   var smbEndRow = "";
   // если у файла установлена синтаксическая тема java или js, изменяем идентификатор на Java
   if (AkelPad.Include("CoderFunctions.js")) {
      if (GetSyntaxAliasExtension().indexOf("j") != -1) {
         constLang = "final String";
         smbEndRow = ";";
      }
   }
   
   var arrContent = strContent.split(pBreak);
   
   for (var nLine = 0; nLine < arrContent.length; nLine++)
   {
      sLine = arrContent[nLine].replace(/([ \t]+$)/, "");      //Убираем пустые символы в конце
      if (sLine) {
         arrContent[nLine] = constLang + ' IN_' + sLine.toUpperCase() + ' = "' + sLine + '"' + smbEndRow;
      }
   }
   strContent = arrContent.join(pBreak);
   
   AkelPad.ReplaceSel(strContent);
   AkelPad.SetClipboardText(strContent);
}

пример работы

исходное выражение:
Code:
ItemName1
ItemName2
результат:
Code:
Const IN_ITEMNAME1 = "ItemName1"
Const IN_ITEMNAME2 = "ItemName2"
для установленной синтаксической темы Java или js работает так:
Code:
final String IN_ITEMNAME1 = "ItemName1";
final String IN_ITEMNAME2 = "ItemName2";


LSGetItemValue.js
Code:
///LS: Преобразование dot-синтаксиса GetItemValue к стандартному
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=7982#7982
// Version: 1.3 (2011.04.06)

var strContent = AkelPad.GetSelText() || AkelPad.GetClipboardText();

if (strContent)
{
   if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();
   
   var arrContent = strContent.split(pBreak);
   var sLine = "";
   var iPoint; var iEnd; var iTmp;
   
   for (var nLine = 0; nLine < arrContent.length; nLine++)
   {
      sLine = oStr.rtrim(arrContent[nLine], " \t");      //Убираем пустые символы в конце
      if (sLine)
      {
         iPoint = sLine.indexOf(".");
         
         iEnd = sLine.indexOf(", ", iPoint);      //пример: Join(nd.Value, "/") + text
         iTmp = sLine.indexOf("(", iPoint);      //пример: ndDialog.Value(0) + function(...)
         if (iEnd < iTmp)      //это вариант (nd.Value, "/")
            iEnd = iTmp;
         
         iTmp = sLine.indexOf(")", iPoint);
         if (iTmp > iEnd)      //значит это закрывающая скобка для (0)

         sLine = replacebyBorders(sLine, iEnd, iEnd, '")');      //вставка в нужное место закрывающей кавычки и скобки
         sLine = replacebyBorders(sLine, iPoint, iPoint + 1, '.GetItemValue("');      //замена точки
         
         arrContent[nLine] = sLine;
      }
   }
   strContent = arrContent.join(pBreak);
   
   AkelPad.ReplaceSel(strContent, true);
   AkelPad.SetClipboardText(strContent);
}

пример работы

исходное выражение:
Code:
ND.ItemName1
ND.ItemName2(0)
результат:
Code:
ND.GetItemValue("ItemName1")
ND.GetItemValue("ItemName2")(0)


LSReplaceItemValue.js
Code:
///LS: Преобразование dot-синтаксиса ReplaceItemValue к стандартному
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=7982#7982
// Version: 1.4 (2011.04.06)

var pBreak = "\r";
var strContent = AkelPad.GetSelText() || AkelPad.GetClipboardText();

if (strContent)
{
   var arrContent = strContent.split(pBreak);
   var sLine = "";
   
   for (var nLine = 0; nLine < arrContent.length; nLine++)
   {
      sLine = arrContent[nLine].replace(/([ \t]+$)/, "");      //Убираем пустые символы в конце
      if (sLine)
      {
         sLine = sLine.replace(/\./, '.ReplaceItemValue("');
         sLine = sLine.replace(/\s*=\s*/, '", ');
         arrContent[nLine] = 'Call ' + sLine + ')'
      }
   }
   strContent = arrContent.join(pBreak);
   
   AkelPad.ReplaceSel(strContent, true);
   AkelPad.SetClipboardText(strContent);
}

пример работы

исходное выражение:
Code:
ND.ItemName1 = ""
ND.ItemName2 = Values
результат:
Code:
Call ND.ReplaceItemValue("ItemName1", "")
Call ND.ReplaceItemValue("ItemName2", Values)


LSFunctionsItemToConst.js
Code:
///LS: Преобразование наименований полей в функциях в константы
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=7982#7982
// Version: 1.3 (2011.04.06)

var pBreak = "\r";
var strContent = AkelPad.GetSelText() || AkelPad.GetClipboardText();

if (strContent)
{
   var arrContent = strContent.split(pBreak);
   var sLine = "";
   var iStart;
   var iEnd;
   var sItemName = "";
   
   for (var nLine = 0; nLine < arrContent.length; nLine++)
   {
      sLine = arrContent[nLine].replace(/([ \t]+$)/, "");      //Убираем пустые символы в конце
      
      if (sLine)
      {
         iStart = sLine.indexOf('("');
         if (iStart != -1)
         {
            iStart += 2;
            iEnd = sLine.indexOf('"', iStart);
         }
         else
         {
            iEnd = sLine.lastIndexOf('")');
            if (iEnd != -1)
            {
               iStart = sLine.lastIndexOf('"', iEnd - 1);
               if (iStart != -1) iStart += 1;
            }
         }
         sItemName = sLine.substring(iStart, iEnd);
         
         var expr = new RegExp('"' + sItemName + '"', 'g');
         sLine = sLine.replace(expr, 'IN_' + sItemName.toUpperCase());
         
         arrContent[nLine] = sLine;
      }
   }
   strContent = arrContent.join(pBreak);
   
   AkelPad.ReplaceSel(strContent);
   AkelPad.SetClipboardText(strContent);
}

пример работы

исходное выражение:
Code:
Call ND.ReplaceItemValue("ItemName1", "")
Result = ND.AnyFunction("ItemName2", Values)
результат:
Code:
Call ND.ReplaceItemValue(IN_ITEMNAME1, "")
Result = ND.AnyFunction(IN_ITEMNAME2, Values)


LSNotesPeekTextDecode.js

Code:
///LND: Раскодирование текста, скопированного из NotesPeek
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=7982#7982
// Version: 1.0 (2011.04.13)

//eval(AkelPad.ReadFile(AkelPad.GetAkelDir(5) + "\\converter.js"));      //временно закоменчено (ждём выделение функций для конвертации в отдельную библиотеку)

var CP_NOT_CONVERT = -2;
var CP_CURRENT     = -1;
var oSys = AkelPad.SystemFunction();

var pText = AkelPad.GetSelText() || AkelPad.SetSel(0, -1) || AkelPad.GetSelText();

pText = decodeEscapes(pText);
pText = convertToUnicode(pText, 1251);
pText = pText.replace(/\x05/gm, "");      //рубим тупые квадратики
pText = pText.replace(new RegExp('"\r\t"', "gm"), "");      //убираем ненужные разрывы внутри строк

AkelPad.ReplaceSel(pText);


// Infocatcher's code
function decodeEscapes(str) {
/*
   if(customEscapesDecoder)
      return decodeEscapesCustom(str);
*/

   // Keep some escaped chars inside string literals
   // "ab\ncd" => "ab\\ncd" => eval() => "ab\ncd"
   var doubleEscape = function(s) {
      return s.replace(
         /(\\+)([nrt'"])?/g,
         function(s, bs, chr) {
            if(bs.length % 2 == 0 || chr) // \ => \\ (*2)
               return new Array(bs.length + 1).join("\\") + s;
            // \\\ => \\ + \ => (\\)*2 + \
            return new Array(Math.floor(bs.length/2)*2 + 1).join("\\") + s;
         }
      );
   };
   str = str // Single RegExp like /("|')(?:\\\1|[^\1])*\1/g fail
      .replace(/"(?:\\"|[^"\n\r])*"/g, doubleEscape)
      .replace(/'(?:\\'|[^'\n\r])*'/g, doubleEscape);

   var fixEsc = function(s, bs, chr, hex) {
      return bs.length % 2 == 0 && /[^0-9a-f]/i.test(hex)
         ? bs + chr + hex
         : s;
   };

   try {
      str = eval(
         '"' +
         str // Make valid string
            .replace(
               /(\\*)["']/g,
               function(s, bs) {
                  return bs.length % 2 == 0
                     ? "\\" + s
                     : s;
               }
            )
            .replace(
               /\\+$/, // Fix qwe\ => "qwe\" => eval() error
               function(s) {
                  return s.length % 2 != 0
                     ? "\\" + s
                     : s;
               }
            )

            // Fix invalid \u and \x
            .replace(/(\\*)\\(x)([\s\S]{2})/g, fixEsc)
            .replace(/(\\*)\\(u)([\s\S]{4})/g, fixEsc)

            .replace(/\n/g, "\\n")
            .replace(/\r/g, "\\r")
            .replace(/\x00/g, "\\x00")
            .replace(/\u2028/g, "\\u2028")
            .replace(/\u2029/g, "\\u2029") +
         '"'
      );
   }
   catch(e) {
      throw new (e.constructor || SyntaxError)('eval("string") fail\n' + e.message);
   }

   return str;
}

function convertToUnicode(str, cp) {
   if(cp == CP_NOT_CONVERT)
      return str;
   if(cp == CP_CURRENT || cp === undefined)
      cp = AkelPad.GetEditCodePage(0);

   var ret = "";

   if(
      cp == 1200 //UTF-16LE
      || cp == 1201 //UTF-16BE
      || cp == 12000 //UTF-32LE
      || cp == 12001 //UTF-32BE
   ) {
      var isLE = cp == 1200 || cp == 12000;
      var step = cp == 12000 || cp == 12001 ? 4 : 2;
      if(str.length % step != 0)
         throw "Invalid unicode string";
      for(var i = 0, l = str.length; i < l; i += step) {
         var chars = str.substr(i, step);
         if(isLE) {
            var b1 = chars.charCodeAt(0);
            var b2 = chars.charCodeAt(1);
         }
         else {
            var b1 = chars.charCodeAt(step - 1);
            var b2 = chars.charCodeAt(step - 2);
         }
         ret += String.fromCharCode((b2 << 8) + b1);
      }
      return ret;
   }

   // based on Fr0sT's code: http://akelpad.sourceforge.net/forum/viewtopic.php?p=7972#7972

   // current code page is UTF16* or UTF32* - set ansi current code page
   // (WideChar <-> MultiByte functions don't work with this code pages)
   if(cp == 1 || cp == 1200 || cp == 1201 || cp == 12000 || cp == 12001)
      cp = 0;

   try {
      var strLen = str.length;
      var pMBBuf = AkelPad.MemAlloc(strLen * 1 /*sizeof(char)*/);
      if(!pMBBuf)
         throw new Error("MemAlloc fail");
      for(var i = 0; i < strLen; i++)
         AkelPad.MemCopy(pMBBuf + i, str.charCodeAt(i), 5 /*DT_BYTE*/);

      // get required buffer size
      var bufLen = oSys.Call(
         "Kernel32::MultiByteToWideChar",
         cp,       //   __in   UINT CodePage,
         0,        //   __in   DWORD dwFlags,
         pMBBuf,   //   __in   LPCSTR lpMultiByteStr,
         strLen,   //   __in   int cbMultiByte,
         0,        //   __out  LPWSTR lpWideCharStr,
         0         //   __in   int cchWideChar
      );
      if(!bufLen)
         throw new Error("MultiByteToWideChar fail " + oSys.GetLastError());
      bufLen *= 2 /*sizeof(wchar_t)*/;

      var pWCBuf = AkelPad.MemAlloc(bufLen);
      if(!pWCBuf)
         throw new Error("MemAlloc fail");

      // convert buffer
      bufLen = oSys.Call(
         "Kernel32::MultiByteToWideChar",
         cp,       //   __in   UINT CodePage,
         0,        //   __in   DWORD dwFlags,
         pMBBuf,   //   __in   LPCSTR lpMultiByteStr,
         strLen,   //   __in   int cbMultiByte,
         pWCBuf,   //   __out  LPWSTR lpWideCharStr,
         bufLen    //   __in   int cchWideChar
      );
      if(!bufLen)
         throw new Error("MultiByteToWideChar fail " + oSys.GetLastError());

      //ret = AkelPad.MemRead(pWCBuf, 1 /*DT_UNICODE*/);
      for(var pCurr = pWCBuf, bufMax = pWCBuf + bufLen*2; pCurr < bufMax; pCurr += 2)
         ret += String.fromCharCode(AkelPad.MemRead(pCurr, 4 /*DT_WORD*/));
   }
   catch(e) {
      throw e;
   }
   finally {
      pMBBuf && AkelPad.MemFree(pMBBuf);
      pWCBuf && AkelPad.MemFree(pWCBuf);
   }

   return ret;
}

Благодарности: Infocatcher'у за функции раскодирования и помощь!


Last edited by VladSh on Tue Oct 30, 2012 1:37 pm; edited 11 times in total
Back to top
View user's profile Send private message Visit poster's website
FeyFre



Joined: 07 Aug 2007
Posts: 2005
Location: Vinnitsa, Ukraine

PostPosted: Wed Jul 14, 2010 9:53 pm    Post subject: Reply with quote

zen-coding bindings for AkelPad(not finished yet!)
zen-coding привязки к AkelPad(не закончено!)

zen_coding-20100715.7z
zen_coding-20100715-v2.7z удалось заставить работать ещё пару скриптов
zen_coding-20100715-v3.7z заработали ещё пара скриптов + убрано мерцание во время работы скриптов
zen_coding-20100716.7z исправлено сворачивание/разворачивание окна запроса
zen_coding-20100915.7z
  1. Исправления в реализации интерфейса zen_editor
  2. Реализован интерфейс zen_file (минимальная версия плагина 6.5)
  3. Исправлены некоторые внутренние ошибки zen
zen_coding-20110209.7z fixed type, caused error on newer AkelPad versions

Scripts to run are zen_*.js All of them does not require additional arguments and can be called using HotKey/ToolBar/ContextMenu or directly from Scripts, but zen_wrapwithabbreviation.js(which requests additional parameter using GUI)
zen subfolder contains zen-coding core. Primary task is to implement interfaces in zen_editor.js and zen_file.js Still working on it.

Скрипты для запуска - zen_*.js Все они не требуют дополнительных параметров и могут быть вызваны из HotKey/ToolBar/ContextMenu или напрямую из Scripts, кроме zen_wrapwithabbreviation.js(который запрашивает параметр используя интерфейс)
Подпапка zen содержит ядро zen-coding. Основная задача - реализовать интерфейсы в файлах zen_editor.js и zen_file.js Работаю над этим.

zen-coding source


Last edited by FeyFre on Wed Feb 09, 2011 6:37 pm; edited 5 times in total
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
VladSh



Joined: 29 Nov 2006
Posts: 2584
Location: Киев, Русь

PostPosted: Fri Jul 16, 2010 11:54 am    Post subject: Reply with quote

ScriptNamesToContextMenuStrings.js
Code:
///Converting the scriptnames to the string for ContextMenu-plugin
///Преобразование имён скриптов в строки вызова ContextMenu-плагина
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=8131#8131
// Version: 2.1 (2011.07.21)
//
// - если выделение есть, то скрипт преобразует выделение в строку меню и заменит выделение результатом;
// - если выделения нет, то текст для преобразования будет браться из буфера обмена, результат будет записываться тоже в буфер

var pArg = AkelPad.GetArgLine();
if (pArg) pArg = ", `" + WScript.Arguments(0) + "`";

var pBreak = "\r";
var pContent = AkelPad.GetSelText();
var bPasteToClipboard = false;

if (!pContent)
{
   pContent = AkelPad.GetClipboardText();
   if (!pContent) WScript.Quit();
   bPasteToClipboard = true;
}

var arrContent = pContent.split(pBreak);

for (line = 0; line < arrContent.length; line++)
{
   if (arrContent[line])
   {
      arrContent[line] = '-"" Call("Scripts::Main", 1, "' + arrContent[line] + '"' + pArg + ')';
   }
}
pContent = arrContent.join(pBreak);

if (bPasteToClipboard)
   AkelPad.SetClipboardText(pContent);
else
   AkelPad.ReplaceSel(pContent);


Last edited by VladSh on Thu Jul 21, 2011 2:26 pm; edited 2 times in total
Back to top
View user's profile Send private message Visit poster's website
VladSh



Joined: 29 Nov 2006
Posts: 2584
Location: Киев, Русь

PostPosted: Fri Jul 16, 2010 8:07 pm    Post subject: Reply with quote

ShowMenuEx.js

Code:
///Script "library" for working with users menu (menu autogenerated from parameter files)
// must be placed in ...\Scripts\Include\
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=8153#8153
// Version: 4.1 (2012.12.18)
//
/// Getting the value selected in the user menu (getSelectedMenuItem function)
//
// Menu automatically generated from the parameter files.
// Settings are located in files <current script name>. Param in the directory "[AkelPad]\AkelFiles\Plugs\Scripts\Params"
//
/// Получение значения, выбранного в пользовательском меню (функция getSelectedMenuItem)
//
// Меню автоматически формируются из соответствующего скрипту файла параметров.
// Параметры размещается в файлах <имя запускаемого скрипта>.param в директории "[AkelPad]\AkelFiles\Plugs\Scripts\Params"
//
// Имена параметров, передаваемых в аргументах вызывающих скриптов:
//    -paramFile - имя файла параметров; если не передано, то будет определено по имени запускаемого скрипта
//    -place - значение для pPOS_PLACE (см. ниже) либо идентификатор кнопки тулбара, передавать который в виде -place="%m %i"
//    -ignore1menu (0/1) - если в файле параметров одна строка и bIgnoreMenu = 1, тогда меню выводиться не будет


var hWndMain = AkelPad.GetMainWnd();
if (hWndMain) {
   //Подключение общего скрипта-"библиотеки" вывода меню
   if (! AkelPad.Include("ShowMenu.js")) WScript.Quit();
   
   //позиция идентификатора меню в структуре
   var poslpItemsId = 2;
   
   //Variables for used files
   var pMenuFile = "";
   
   var pScriptName = WScript.ScriptName;
   var paramExt = ".param";
   
   //имя *.param-файла
   var pMenuFile = AkelPad.GetArgValue("paramFile", "");
   if (!pMenuFile)
         pMenuFile = pScriptName.substring(0, pScriptName.indexOf(".")) + paramExt;      //Имя файла параметров берём по запускаемому скрипту
      pMenuFile = AkelPad.GetAkelDir(5) + "\\Params\\" + pMenuFile;
   
   var bIgnoreMenu = AkelPad.GetArgValue("ignore1menu", 0);
}


//Functions

function getSelectedMenuItem(pPOS_PLACE, pParsepProcSep, bReturnStructure)
//Принцип разбора файла: одна строка файла параметров - один пункт меню
//Параметры:
//   pPOS_PLACE - возможность задавать позицию вывода меню; варианты см. в ShowMenu.js var's POS_...
//   pParsepProcSep   - каким образом будет распознаваться файл параметров:
//         "разделитель" - вариант записи параметров в виде: <идентификатор> <разделитель> <надпись, выводимая в меню> (без уголков);
//               для обычного ini передавать "=",
//               для случаев, когда знак равенства может содержаться в идентификаторах или надписях, используйте более сложный разделитель
//         "", т.е. отсутствие разделителя - и для идентификатора и для надписи будет браться строка целиком; применяется для простых случаев
//   bReturnStructure - в каком виде будет возвращаться результат:
//         false (0) - в виде текста (возврат надписи выбранного пункта меню)
//         true (1) - в виде структуры [текст пункта меню, MF_NORMAL, идентификатор] (для сложных случаев)
//      если пользователь может использовать любой вариант меню, то лучше передавать 1, а потом универсально анализировать результат pMenuItem[0]
//Примеры вызовов:
//         var pMenuLable = getSelectedMenuItem(POS_CARET, "", 0);   - простой аналог ListBox'а и формированием меню с целыми строками файла параметров
//         var pMenuItem = getSelectedMenuItem(POS_CARET, "=", 1);   - аналог ListBox'а с псевдонимом (идентификатором) - разбором файла параметров как ini
{
   if (hWndMain) {
      var fso = new ActiveXObject("Scripting.FileSystemObject");
      if (fso.FileExists(pMenuFile) == true) {
         var lpItems = [];
         var nItem;

         var lpContent = AkelPad.ReadFile(pMenuFile);
         lpContent = lpContent.replace(/\r\n/g, "\r");
         lpContent = lpContent.replace(/\r{2,}/g, "\r");
         lpContent = trim(lpContent, "\r\n");
         if (lpContent) {
            var nEditItem = 1111;
            var lpArrayName = lpContent.split("\r");
            
            //Определение объекта-парсера
            var Parser = {
               proc0: function(lpArrayName, lpItems) {
                  for (nItem = 0; nItem < lpArrayName.length; ++nItem) {
                     pItem = lpArrayName[nItem];
                     if (pItem)
                        lpItems[nItem] = [pItem, MF_NORMAL, pItem];
                  }
                  return nItem;
               },
               
               procINI: function(lpArrayName, lpItems) {
                  var oRegExp = {
                     getPureValue: function(pStr) {
                        return trim(pStr, " \t");
                     }
                  };
                  
                  var pItem;
                  var iSep;
                  var pValue;
                  var pLabel;
                  
                  for (nItem = 0; nItem < lpArrayName.length; ++nItem) {
                     pItem = lpArrayName[nItem];
                     if (pItem) {
                        iSep = pItem.lastIndexOf(pParsepProcSep);
                        if (iSep == -1) {
                           pItem += pParsepProcSep;      //здесь было "="
                           iSep = pItem.length;
                        }
                        pID = oRegExp.getPureValue(pItem.substr(0, iSep));
                        pLabel = oRegExp.getPureValue(pItem.substr(iSep + 1));
                        if (!pLabel)
                           pLabel = "- надпись для " + pID + " не указана -";
                        
                        lpItems[nItem] = [pLabel, MF_NORMAL, pID];
                     }
                  }
                  return nItem;
               }
            };
            
            //Формирование меню
            nItem = Parser["proc" + ((!pParsepProcSep || pParsepProcSep == "0") ? "0" : "INI")](lpArrayName, lpItems);
            
            if (!(lpItems.length == 1 && bIgnoreMenu)) {
               //Добавление возможности изменять настроечные файлы параметров
               lpItems[nItem] = ["", MF_SEPARATOR, ""];
               lpItems[nItem + 1] = ["изменить меню...", MF_NORMAL, nEditItem];
               
               //Вывод меню на экран и получение выбранного Item'а
               if (!isNaN(pPOS_PLACE))      //если не числовое значение, то это константа POS_... из ShowMenu.js
                  nItem = ShowMenu(lpItems, pPOS_PLACE, pPOS_PLACE);
               else {      //иначе стартовали из тулбара
                  pPOS_PLACE = pPOS_PLACE.split(" ");
                  var hToolbarHandle = parseInt(pPOS_PLACE[0]);
                  var nToolbarItemID = parseInt(pPOS_PLACE[1]);
                  var ptPoint = GetToolbarBottonPos(hToolbarHandle, nToolbarItemID)
                  nItem = ShowMenu(lpItems, ptPoint.x, ptPoint.y);
               }
            }
            else
               nItem -= 1;
            
            if (nItem != -1) {
               if (lpItems[nItem][poslpItemsId] != nEditItem) {
                  if (!bReturnStructure)
                     return lpItems[nItem][poslpItemsId];   //Возвращаем выбранный пункт меню
                  else
                     return lpItems[nItem];                  //Возвращаем полностью структуру
               }
               else {
                  AkelPad.OpenFile(pMenuFile);      //Открываем файл параметров для внесения изменений
                  WScript.Quit();
               }
            }
            else
               return '';
         }
         else {
            if (AkelPad.MessageBox(hWndEdit, "Файл параметров '" + pMenuFile + "' ПУСТ! Открыть его?", pScriptName, 4 /*MB_YESNO*/ + 48 /*MB_ICONEXCLAMATION*/) == 6)
               AkelPad.OpenFile(pMenuFile);
            WScript.Quit();
         }
      }
      else {
         if (AkelPad.MessageBox(hWndEdit, "Файл параметров '" + pMenuFile + "' НЕ СУЩЕСТВУЕТ! Создать его?", pScriptName, 4 /*MB_YESNO*/ + 48 /*MB_ICONEXCLAMATION*/) == 6) {
            AkelPad.SendMessage(hWndMain, 273 /*WM_COMMAND*/, 4101 /*IDM_FILE_NEW*/, 0);
            hWndEdit = AkelPad.GetEditWnd();
            AkelPad.SaveFile(hWndEdit, pMenuFile);
         }
         WScript.Quit();
      }
   }
}

function trim(pText, chars) {
   return pText.replace(new RegExp("(^[" + chars + "])|([" + chars + "]+$)", "g"), "");
}
Скрипт использует ShowMenu.js из дистрибутива Scripts-плагина.

Описание ShowMenuEx.js

Пример использования:
создайте в директории со скриптами файл.. например test.js, с таким содержимым:
Code:
if (! AkelPad.Include("ShowMenuEx.js")) WScript.Quit();

var pMenuLabel = getSelectedMenuItem(POS_CARET, "", 0);

WScript.Echo(pMenuLabel);
далее скрипт всё сам расскажет Very Happy

Сейчас поддерживается 2 варианта разбора файлов параметров для меню:
"" - простой, т.е. заполнение лейблов разделяя переводом строки:
Code:
js
htm

"разделитель" - например "=" для аналога ini; в файлах разделитель указывается без кавычек:
Code:
js = JavaScript
htm = HTML-файл

Менюхи можно менять на лету, с помощью "изменить меню..." внизу менюхи Wink


Скрипты ShowMenuCommon.js и ShowMenuAlt.js упразднены по причине возвращения оригинального ShowMenu.js в дистрибутив Scripts-плагина.
По этой же причине формат возвращаемой структуры выделенного пункта меню был возвращён к прежнему [текст пункта меню, MF_NORMAL, идентификатор].

p.s.: Благодарности: Instructor, FeyFre, Infocatcher, se7h.


Last edited by VladSh on Tue Dec 18, 2012 2:05 pm; edited 23 times in total
Back to top
View user's profile Send private message Visit poster's website
VladSh



Joined: 29 Nov 2006
Posts: 2584
Location: Киев, Русь

PostPosted: Sat Jul 17, 2010 6:26 pm    Post subject: Opening on the fly internal files of AkelPad Reply with quote

OpenHelpString.js
Code:
///Opens a file on the specified path, opens it and is positioned at a certain text
///Скрипт-функция: открывает файл по заданному пути ищет в нём определённое вхождение ВЫДЕЛЕННОГО ТЕКСТА
// must be placed in ...\Scripts\Include\
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=8164#8164
// Version: 1.7 (2012.08.23)

function openHelpString(pFileInAkelDirPath, pSearchText, nCycles)
{
   if (!pSearchText)
   {
      if (! AkelPad.Include("CaretSelect.js")) WScript.Quit();
      pSearchText = getWordCaret();
   }
   
   var pFile = AkelPad.GetAkelDir() + pFileInAkelDirPath;
   
   var fso = new ActiveXObject("Scripting.FileSystemObject");
   if (fso.FileExists(pFile) == false)
      WScript.Quit();
   
   AkelPad.OpenFile(pFile);
   if (pSearchText)
   {
      AkelPad.SetSel(0, 0);
      
      for (var n = nCycles; n > 0; n--)
      {
         AkelPad.TextFind(AkelPad.GetEditWnd(), pSearchText, 0x00000002 /*FR_WHOLEWORD*/ + 0x00000001 /*FR_DOWN*/);
      }
   }
}



OpenScriptsHelp.js (Shift+F1)
Code:
///Opens help for Scripts-plugin and goes to the requested method
///Открывает справку по Scripts-плагину и переходит к запрашиваемому методу
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=8164#8164
// Version: 1.3 (2011.07.21)

if (! AkelPad.Include("OpenHelpString.js")) WScript.Quit();

var pLng = AkelPad.GetArgLine() || "Rus";

var pHelpFile = "\\AkelFiles\\Docs\\Plugs\\Scripts-" + pLng + ".txt";

openHelpString(pHelpFile, AkelPad.GetSelText(), 2);


OpenCoderParamsFile.js (Alt+F1)
Code:
///Opens coder-plugin configuration file
///Открывает файл параметров Coder-плагина
// Если в аргументах не передано расширение файла, то открывается файл параметров, соответствующий текущему файлу;
// текущий файл файл должен быть сохранён
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=8164#8164
// Version: 1.7 (2012.09.11)

if (! AkelPad.Include("OpenHelpString.js")) WScript.Quit();

var pExt = AkelPad.GetArgLine();
var coderFileName;

if (!pExt)
{
   if (AkelPad.Include("CoderFunctions.js"))
      coderFileName = GetSyntaxFile(AkelPad.GetEditWnd());
   
   if (!coderFileName) {
      pExt = GetExtensionName(AkelPad.GetEditFile(0))
      if (!pExt) WScript.Quit();
      coderFileName = pExt + ".coder";
   }
}

openHelpString("\\AkelFiles\\Plugs\\Coder\\" + coderFileName, AkelPad.GetSelText(), 2);

function GetExtensionName(pFile) {
   return pFile.substr(pFile.lastIndexOf(".") + 1);
}


Last edited by VladSh on Tue Sep 11, 2012 11:41 am; edited 14 times in total
Back to top
View user's profile Send private message Visit poster's website
se7h



Joined: 28 Sep 2009
Posts: 764
Location: Minsk, Belarus

PostPosted: Sat Jul 17, 2010 9:28 pm    Post subject: Reply with quote

Show help for selected or caret position word

(Справка по выделенному или текущему слову)

LanguageHelp.js
Code:
/// Show help for selected or word at caret position
//
// Required ChmKw.exe (AkelPad\AkelFiles\Tools)
//
// Version: 1.6 (05.08.2010)
//
// Path to CHM files: AkelPad\AkelFiles\Help
//
// Usage:
// Call("Scripts::Main", 1, "LanguageHelp.js", "help_name.chm")
//
// Or support ShowMenuEx.js if you do not specify a flags in argument:
//  Call("Scripts::Main", 1, "LanguageHelp.js")

var nPos = AkelPad.GetSelStart();
var WshShell = new ActiveXObject("WScript.shell");
var pChmKwPath = AkelPad.GetAkelDir() + "\\AkelFiles\\Tools\\ChmKw.exe";

var fso = new ActiveXObject("Scripting.FileSystemObject");

if(fso.FileExists(pChmKwPath) == false)
    AkelPad.MessageBox(hWndEdit, 'File "' + pChmKwPath + '" Not found!', "AkelPad -> " + WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);

var pHelpDir = AkelPad.GetAkelDir() + "\\AkelFiles\\Help\\";
var pHelpPath = "";

if(WScript.Arguments.length) {
    pHelpPath = pHelpDir + WScript.Arguments(0);
} else if(pHelpPath == "") {
    eval(AkelPad.ReadFile(AkelPad.GetAkelDir() + "\\AkelFiles\\Plugs\\Scripts\\ShowMenuEx.js"));
    var pHelpFile = getSelectedMenuItem(POS_CURSOR, "", 0);

    if(pHelpFile == "") {
        WScript.Quit();
    }

    pHelpPath = pHelpDir + pHelpFile;
}

var hWndEdit = AkelPad.GetEditWnd();

if(hWndEdit) {
    if(AkelPad.GetSelEnd() == nPos) {
        var nWordBeg = AkelPad.SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK */, 0/*WB_LEFT*/, nPos);
        var nWordEnd = AkelPad.SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK */, 7/*WB_RIGHTBREAK*/, nWordBeg);

        if(nWordEnd < nPos) {
            nWordBeg = AkelPad.SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK */, 0/*WB_LEFT*/, nPos);
            nWordEnd = AkelPad.SendMessage(hWndEdit, 1100 /*EM_FINDWORDBREAK */, 7/*WB_RIGHTBREAK*/, nWordBeg);
        }

        if(nWordEnd > nPos) {
            AkelPad.SetSel(nWordBeg, nWordEnd);
        }
    }

    var sSel = AkelPad.GetSelText();
    pHelpPath = pHelpPath + "::/@" + sSel;
}

pHelpPath = correctCommandLine(pHelpPath);
pChmKwPath = correctCommandLine(pChmKwPath);
WshShell.Run("%COMSPEC% /c " + "\"" + pChmKwPath + " " + pHelpPath + "\"", 0, false);

function correctCommandLine(pPath) {
    if(pPath.search( / /) != -1) {
        return "\"" + pPath + "\"";
    } else {
        return pPath;
    }
}
(v1.6 - 05.08.2010)

Download and place ChmKw.exe in AkelPad\AkelFiles\Tools\

ChmKw.exe (only 2 kb) allows you to search for index CHM, forget about recompilations and the like, simply download the help file, place it in folder and enjoy!

Path to CHM files AkelPad\AkelFiles\Help

Support ShowMenuEx.js if you do not specify a file name in argument

Some help files (update 03.08.2010)
HTML.chm (07.10.2010) , CSS.chm (22.07.2010), JS.chm (07.10.2010)

Usage:
Code:
Call("Scripts::Main", 1, "LanguageHelp.js", "help_name.chm")


Example for Context Menu

Code:
-"Select Help" Call("Scripts::Main", 1, "LanguageHelp.js")    // required ShowMenuEx.js
-"HTML Help" Call("Scripts::Main", 1, "LanguageHelp.js", "HTML.chm")
-"CSS Help" Call("Scripts::Main", 1, "LanguageHelp.js", "CSS.chm")
-"JS Help" Call("Scripts::Main", 1, "LanguageHelp.js", "JS.chm")


Example LanguageHelp.param for ShowMenuEx.js

Code:
HTML.chm = HTML Item
CSS.chm = CSS Item
JS.chm = JS Item


History versions

Code:
1.4: transition to ChmKw.exe
1.5: added check for ChmKw.exe
1.6: corrected method call CHM



p.s.: thank VladSh and FeyFre for their scripts


Last edited by se7h on Thu Oct 07, 2010 8:56 pm; edited 11 times in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1263
Location: Poland

PostPosted: Tue Jul 20, 2010 1:19 pm    Post subject: Reply with quote

Selects entire lines, copies, moves up/down or duplicates selected lines.
New version.
LinesSelectCopyMoveDuplicate.js

Code:
// LinesSelectCopyMoveDuplicate.js - 2013-08-23 (x86/x64)
//
// Selects entire lines, copies, moves up/down or duplicates selected lines.
// If there is no selection, selects/copies/moves/duplicates current line.
// Remembers the selection and caret position relative moving text.
//
// Usage:
// Call("Scripts::Main", 1, "LinesSelectMoveDuplicate.js"[, "Action Shift"])
// Action:
// S - select entire lines
// C - copy to clipboard
// M - move
// D - duplicate
// Shift:
// -n - shift up n lines
// n  - shift down n lines
// T  - shift to top
// B  - shift to bottom
//
// Examples:
// "S 5"  - selects entire lines of 5 below
// "M -3" - moves lines of 3 above
// "D T"  - duplicates lines at top
//
// If no arguments - menu displays
// If only the first argument - input box
//
// Can assign shortcut keys, eg: Ctrl+Shift+L, Ctrl+Shift+C, Ctrl+Shift+Up, Ctrl+Shift+Down, Ctrl+Shift+Y.

var sTxtSelect    = "Select entire lines";
var sTxtCopy      = "Copy entire lines";
var sTxtMove      = "Move lines";
var sTxtDuplicate = "Duplicate lines";
var sTxtShift     = "Shift (T=top, B=bottom)";

var oSys     = AkelPad.SystemFunction();
var hEditWnd = AkelPad.GetEditWnd();
var nWordWrap;
var nBegSel;
var nEndSel;
var bCarAtEnd;
var bColSel;
var nLine1;
var nLine2;
var nLastLine;
var nOffset1;
var nOffset2;
var nOffset3;
var sAction;
var nShift;
var sArg1;
var sTxt1;
var sTxt2;

if (hEditWnd)
{
  //Get arguments
  if (WScript.Arguments.length)
    sAction = WScript.Arguments(0).toUpperCase();
  else
    sAction = GetAction();

  if ((sAction != "S") && (sAction != "C") && (sAction != "M") && (sAction != "D"))
    WScript.Quit();

  SetRedraw(hEditWnd, false);

  //Disable Word Wrap
  nWordWrap = SendMessage(hEditWnd, 3241 /*AEM_GETWORDWRAP*/, 0, 0);
  if (nWordWrap > 0)
    AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);

  nBegSel   = AkelPad.GetSelStart();
  nEndSel   = AkelPad.GetSelEnd();
  bCarAtEnd = (GetOffset(hEditWnd, 5 /*AEGI_CARETCHAR*/) == nEndSel);
  bColSel   = SendMessage(hEditWnd, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0);
  nLine1    = SendMessage(hEditWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, nBegSel);
  nLine2    = SendMessage(hEditWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, nEndSel);
  nLastLine = SendMessage(hEditWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, -2);

  if (WScript.Arguments.length > 1)
    sArg1 = WScript.Arguments(1).toUpperCase();
  else
    sArg1 = GetShift();

  if (sArg1 == "T")
    nShift = -nLine1 - ((sAction == "D") ? 1 : 0);
  else if (sArg1 == "B")
    nShift = nLastLine - nLine2 + ((sAction == "D") ? 1 : 0);
  else
  {
    nShift = parseInt(sArg1);

    if (isFinite(nShift))
    {
      if (sAction =="D")
      {
        if ((nShift < 0) && (nShift < -nLine1 - 1))
          nShift = -nLine1 - 1;
        else if ((nShift > 0) && (nShift > nLastLine - nLine1 + 1))
          nShift = nLastLine - nLine2 + 1;
      }
      else
      {
        if ((nShift < 0) && (nShift < -nLine1))
          nShift = -nLine1;
        else if ((nShift > 0) && (nShift > nLastLine - nLine2))
          nShift = nLastLine - nLine2;
      }
    }
  }

  if (isFinite(nShift))
  {
    //Select or Copy
    if ((sAction == "S") || (sAction == "C"))
    {
      nBegSel = GetBeginLine(nLine1 + nShift);
      nEndSel = GetEndLine(nLine2 + nShift);
    }

    //Move
    else if (sAction == "M")
    {
      if (nShift && (! AkelPad.GetEditReadOnly(hEditWnd)))
      {
        if (nShift < 0)
        {
          nOffset1 = GetBeginLine(nLine1 + nShift);
          nOffset2 = GetEndLine(nLine1 - 1);
          nOffset3 = GetEndLine(nLine2);
        }
        else
        {
          nOffset1 = GetBeginLine(nLine1);
          nOffset2 = GetEndLine(nLine2);
          nOffset3 = GetEndLine(nLine2 + nShift);
        }

        sTxt1 = AkelPad.GetTextRange(nOffset1,     nOffset2);
        sTxt2 = AkelPad.GetTextRange(nOffset2 + 1, nOffset3) + "\r";
        AkelPad.SetSel(nOffset1, nOffset3);
        AkelPad.ReplaceSel(sTxt2 + sTxt1);

        if (nShift < 0)
        {
          nBegSel -= sTxt1.length + 1;
          nEndSel -= sTxt1.length + 1;
        }
        else
        {
          nBegSel += sTxt2.length;
          nEndSel += sTxt2.length;
        }
      }
    }

    //Duplicate
    else
    {
      if (nShift && (! AkelPad.GetEditReadOnly(hEditWnd)))
      {
        nOffset1 = GetBeginLine(nLine1);
        nOffset2 = GetEndLine(nLine2);
 
        if (nShift < 0)
        {
          sTxt1    = AkelPad.GetTextRange(nOffset1, nOffset2) + "\r";
          nOffset3 = GetBeginLine(nLine1 + nShift + 1);
          nBegSel += nOffset3 - nOffset1;
          nEndSel += nOffset3 - nOffset1;
        }
        else
        {
          sTxt1    = "\r" + AkelPad.GetTextRange(nOffset1, nOffset2);
          nOffset3 = GetEndLine(nLine2 + nShift - 1);
          nBegSel += nOffset3 - nOffset1 + 1;
          nEndSel += nOffset3 - nOffset1 + 1;
        }
 
        AkelPad.SetSel(nOffset3, nOffset3);
        AkelPad.ReplaceSel(sTxt1);
      }
    }

    if (sAction == "C")
      AkelPad.SetClipboardText(AkelPad.GetTextRange(nBegSel, nEndSel));
    else
    {
      if (bCarAtEnd)
        AkelPad.SetSel(nBegSel, nEndSel);
      else
        AkelPad.SetSel(nEndSel, nBegSel);

      if (sAction != "S")
        SendMessage(hEditWnd, 3128 /*AEM_UPDATESEL*/, bColSel, 0);
    }
  }

  if (nWordWrap > 0)
    AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);

  SetRedraw(hEditWnd, true);
}

function GetAction()
{
  var lpPoint = AkelPad.MemAlloc(8); //sizeof(POINT)
  var hMenu   = oSys.Call("User32::CreatePopupMenu");
  var hWndHid = oSys.Call("User32::CreateWindowEx" + _TCHAR, 0, "STATIC", 0, 0x50000000 /*WS_VISIBLE|WS_CHILD*/, 0, 0, 0, 0, hEditWnd, 0, AkelPad.GetInstanceDll(), 0);
  var aAction = ["", "S", "C", "M", "D"];
  var nX;
  var nY;
  var nCmd;

  SendMessage(hEditWnd, 3190 /*AEM_GETCARETPOS*/, lpPoint, 0);
  oSys.Call("User32::ClientToScreen", hEditWnd, lpPoint);

  nX = AkelPad.MemRead(lpPoint,     3 /*DT_DWORD*/);
  nY = AkelPad.MemRead(lpPoint + 4, 3 /*DT_DWORD*/) + SendMessage(hEditWnd, 3188 /*AEM_GETCHARSIZE*/, 0 /*AECS_HEIGHT*/, 0);

  oSys.Call("User32::SetFocus", hWndHid);
  oSys.Call("User32::AppendMenu" + _TCHAR, hMenu, 0 /*MF_STRING*/, 1, sTxtSelect);
  oSys.Call("User32::AppendMenu" + _TCHAR, hMenu, 0 /*MF_STRING*/, 2, sTxtCopy);
  oSys.Call("User32::AppendMenu" + _TCHAR, hMenu, 0 /*MF_STRING*/, 3, sTxtMove);
  oSys.Call("User32::AppendMenu" + _TCHAR, hMenu, 0 /*MF_STRING*/, 4, sTxtDuplicate);

  nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, 0x0180 /*TPM_RETURNCMD|TPM_NONOTIFY*/, nX, nY, 0, hWndHid, 0);

  AkelPad.MemFree(lpPoint);
  oSys.Call("User32::DestroyMenu", hMenu);
  oSys.Call("User32::DestroyWindow", hWndHid);

  return aAction[nCmd];
}

function GetShift()
{
  var sText = "1";
  var sCaption;

  if (sAction == "S")
  {
    sCaption = sTxtSelect;
    sText    = "0";
  }
  else if (sAction == "C")
  {
    sCaption = sTxtCopy;
    sText    = "0";
  }
  else if (sAction == "M")
    sCaption = sTxtMove;
  else
    sCaption = sTxtDuplicate;

  sCaption += ": " + (nLine1 + 1) + " - " + (nLine2 + 1);

  sText = AkelPad.InputBox(hEditWnd, sCaption, sTxtShift, sText);

  if (sText)
    sText = sText.toUpperCase();

  return sText;
}

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

function GetOffset(hWnd, nFlag)
{
  var lpIndex;
  var nOffset = -1;

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

function GetBeginLine(nLine)
{
  return SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine, 0);
}

function GetEndLine(nLine)
{
  return SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine, 0) + SendMessage(hEditWnd, 193 /*EM_LINELENGTH*/, SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine, 0), 0);
}

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


Old version.
Vertically moves the lines covered by the selection.
MoveLinesUpDown_alt.js

Code:
// Move up or down selected lines - 2010-07-28
// If there is no selection, it moves the current line.
// Moved lines, are selected in their entirety.
//
// Call("Scripts::Main", 1, "MoveLinesUpDown_alt.js", "-1") - move up
// Call("Scripts::Main", 1, "MoveLinesUpDown_alt.js", "1")  - move down
//
// Can assign shortcut keys, eg: Ctrl+Alt+Up, Ctrl+Alt+Down


var nMovDir;
if (WScript.Arguments.length)
   nMovDir = WScript.Arguments(0);
if (!((nMovDir == -1) || (nMovDir == 1)))
   WScript.Quit();

var hEditWnd = AkelPad.GetEditWnd();

SetRedraw(hEditWnd, false);


// SmartSel::NoSelEOL plugin
var pFuncEOL  = "SmartSel::NoSelEOL";
var bNoSelEOL = AkelPad.IsPluginRunning(pFuncEOL);
if (bNoSelEOL)
   AkelPad.Call(pFuncEOL);


// Word Wrap
var nWordWrap = AkelPad.SendMessage(hEditWnd, 3241 /*AEM_GETWORDWRAP*/, 0, 0);
if (nWordWrap > 0)
   AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);


var nBegSel   = AkelPad.GetSelStart();
var nEndSel   = AkelPad.GetSelEnd();
var nLine1    = AkelPad.SendMessage(hEditWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, nBegSel);
var nLine2    = AkelPad.SendMessage(hEditWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, nEndSel);
var nLastLine = AkelPad.SendMessage(hEditWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, -2);
var pEOL      = "\r";

var nBegLine1;
var nBegLine2;
var nLenLine2;
var nSel1;
var nSel2;
var pSelTxt;
var pTxt1;
var pTxt2;

if (((nMovDir == 1) && (nLine2 < nLastLine) || (nMovDir == -1) && (nLine1 > 0)) && !AkelPad.GetEditReadOnly(hEditWnd))
{
   nBegSel = AkelPad.SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine1, 0);
   nEndSel = AkelPad.SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine2, 0) + AkelPad.SendMessage(hEditWnd, 193 /*EM_LINELENGTH*/, nEndSel, 0);

   if (nMovDir == 1)
      ++ nLine2;
   else
      -- nLine1;

   nBegLine1 = AkelPad.SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine1, 0);
   nBegLine2 = AkelPad.SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine2, 0);
   nLenLine2 = AkelPad.SendMessage(hEditWnd, 193 /*EM_LINELENGTH*/, nBegLine2, 0);
   nSel1 = nBegLine1;
   nSel2 = nBegLine2 + nLenLine2;
   if (nLine2 < nLastLine)
      ++ nSel2;

   AkelPad.SetSel(nSel1, nSel2);
   pSelTxt = AkelPad.GetSelText(1 /*\r*/);

   if (nMovDir == 1)
   {
      if (nLine2 < nLastLine)
      {
         pTxt1 = pSelTxt.substr(0, pSelTxt.lastIndexOf(pEOL) - nLenLine2);
         pTxt2 = pSelTxt.substr(pTxt1.length);
      }
      else
      {
         pTxt1 = pSelTxt.substr(0, pSelTxt.lastIndexOf(pEOL));
         pTxt2 = pSelTxt.substr(pSelTxt.lastIndexOf(pEOL) + 1) + pEOL;
      }
      nBegSel += pTxt2.length;
      nEndSel += pTxt2.length;
   }
   else
   {
      if (nLine2 < nLastLine)
      {
         pTxt1 = pSelTxt.substr(0, pSelTxt.indexOf(pEOL) + 1);
         pTxt2 = pSelTxt.substr(pSelTxt.indexOf(pEOL) + 1);
         nBegSel -= pTxt1.length;
         nEndSel -= pTxt1.length;
      }
      else
      {
         pTxt1 = pSelTxt.substr(0, pSelTxt.indexOf(pEOL));
         pTxt2 = pSelTxt.substr(pSelTxt.indexOf(pEOL) + 1) + pEOL;
         nBegSel -= (pTxt1.length + 1);
         nEndSel -= (pTxt1.length + 1);
      }
   }

   AkelPad.ReplaceSel(pTxt2 + pTxt1);

   if (nMovDir == 1)
      AkelPad.SetSel(nBegSel, nEndSel);
   else
      AkelPad.SetSel(nEndSel, nBegSel);
}

if (nWordWrap > 0)
   AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);

if (bNoSelEOL)
   AkelPad.Call(pFuncEOL);

SetRedraw(hEditWnd, true);


///////////////////////////////

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



Old version.
Improved version of the script MoveLinesUpDown_alt.js. In addition, the script duplicates the lines or only selects.
LinesMoveDuplicateSelect.js

Code:
// Move up/down, duplicate selected lines or only select whole lines - 2010-10-12
// If there is no selection, it selects, moves or duplicates the current line.
//
// Call("Scripts::Main", 1, "LinesMoveDuplicateSelect.js", "0")  - only select whole lines
// Call("Scripts::Main", 1, "LinesMoveDuplicateSelect.js", "-1") - move up
// Call("Scripts::Main", 1, "LinesMoveDuplicateSelect.js", "1")  - move down
// Call("Scripts::Main", 1, "LinesMoveDuplicateSelect.js", "2")  - duplicate
//
// Can assign shortcut keys, eg: Ctrl+Shift+L, Ctrl+Shift+Up, Ctrl+Shift+Down, Ctrl+Shift+Y.


var hEditWnd = AkelPad.GetEditWnd();
if (! hEditWnd)
   WScript.Quit();

var nAction;
if (WScript.Arguments.length)
   nAction = WScript.Arguments(0);
if (!((nAction == -1) || (nAction == 1)  || (nAction == 0)  || (nAction == 2)))
   WScript.Quit();


SetRedraw(hEditWnd, false);

// Word Wrap
var nWordWrap = AkelPad.SendMessage(hEditWnd, 3241 /*AEM_GETWORDWRAP*/, 0, 0);
if (nWordWrap > 0) AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);

if (! LinesSelect(hEditWnd) || (nAction == 0) || AkelPad.GetEditReadOnly(hEditWnd))
{
   if (nWordWrap > 0) AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);
   SetRedraw(hEditWnd, true);
   WScript.Quit();
}

// SmartSel::NoSelEOL plugin
var pFuncEOL  = "SmartSel::NoSelEOL";
var bNoSelEOL = AkelPad.IsPluginRunning(pFuncEOL);
if (bNoSelEOL)
   AkelPad.Call(pFuncEOL);

var nBegSel   = AkelPad.GetSelStart();
var nEndSel   = AkelPad.GetSelEnd();
var nLine1    = AkelPad.SendMessage(hEditWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, nBegSel);
var nLine2    = AkelPad.SendMessage(hEditWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, nEndSel);
var nLastLine = AkelPad.SendMessage(hEditWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, -2);
var pEOL      = "\r";

var nBegLine1;
var nBegLine2;
var nLenLine2;
var nSel1;
var nSel2;
var pSelTxt;
var pTxt1;
var pTxt2;

if (((nAction == 1) && (nLine2 < nLastLine) || (nAction == -1) && (nLine1 > 0)))
{
   if (nAction == 1)
      ++ nLine2;
   else
      -- nLine1;

   nBegLine1 = AkelPad.SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine1, 0);
   nBegLine2 = AkelPad.SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine2, 0);
   nLenLine2 = AkelPad.SendMessage(hEditWnd, 193 /*EM_LINELENGTH*/, nBegLine2, 0);
   nSel1 = nBegLine1;
   nSel2 = nBegLine2 + nLenLine2;

   AkelPad.SetSel(nSel1, nSel2);
   pSelTxt = AkelPad.GetSelText(1 /*\r*/);

   if (nAction == 1)
   {
      pTxt1 = pSelTxt.substr(0, pSelTxt.lastIndexOf(pEOL));
      pTxt2 = pSelTxt.substr(pSelTxt.lastIndexOf(pEOL) + 1) + pEOL;
      nBegSel += pTxt2.length;
      nEndSel += pTxt2.length;
   }
   else
   {
      pTxt1 = pSelTxt.substr(0, pSelTxt.indexOf(pEOL));
      pTxt2 = pSelTxt.substr(pSelTxt.indexOf(pEOL) + 1) + pEOL;
      nBegSel -= (pTxt1.length + 1);
      nEndSel -= (pTxt1.length + 1);
   }

   AkelPad.ReplaceSel(pTxt2 + pTxt1);

   if (nAction == 1)
      AkelPad.SetSel(nBegSel, nEndSel);
   else
      AkelPad.SetSel(nEndSel, nBegSel);
}
else if (nAction == 2)
{
   pSelTxt = pEOL + AkelPad.GetSelText(1 /*\r*/);
   AkelPad.SetSel(nEndSel, nEndSel);
   AkelPad.ReplaceSel(pSelTxt);
   AkelPad.SetSel(nBegSel, nEndSel);
}

if (nWordWrap > 0)
   AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);

if (bNoSelEOL)
   AkelPad.Call(pFuncEOL);

SetRedraw(hEditWnd, true);


///////////////////////////////

function LinesSelect(hWnd)
{
   var bSelLine;
   var nBegSel = AkelPad.GetSelStart();
   var nEndSel = AkelPad.GetSelEnd();
   var nLine1  = AkelPad.SendMessage(hWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, nBegSel);
   var nLine2  = AkelPad.SendMessage(hWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, nEndSel);

   nBegSel = AkelPad.SendMessage(hWnd, 187 /*EM_LINEINDEX*/, nLine1, 0);
   nEndSel = AkelPad.SendMessage(hWnd, 187 /*EM_LINEINDEX*/, nLine2, 0) + AkelPad.SendMessage(hWnd, 193 /*EM_LINELENGTH*/, nEndSel, 0);

   if (nBegSel < nEndSel)
   {
      AkelPad.SetSel(nBegSel, nEndSel);
      bSelLine = true;
   }
   return bSelLine;
}


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



Last edited by KDJ on Sat Aug 31, 2013 12:08 pm; edited 22 times in total
Back to top
View user's profile Send private message
VladSh



Joined: 29 Nov 2006
Posts: 2584
Location: Киев, Русь

PostPosted: Tue Jul 20, 2010 4:43 pm    Post subject: Reply with quote

Alternative script offset the text vertically, without limitation selected strings.

ShiftVerticaly.js
Code:
///Move the text vertically
///Перемещение выделенного текста вверх или вниз, в зависимости от переданного аргумента
// Call("Scripts::Main", 1, "ShiftVerticaly.js", "-1")   - Up
// Call("Scripts::Main", 1, "ShiftVerticaly.js", "1")   - Down
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=8255#8255
// Version: 2.2 (2012.06.26)

var nMoveDirection = AkelPad.GetArgLine();
if (!nMoveDirection) WScript.Quit();

var hWndEdit = AkelPad.GetEditWnd();
var oSys = AkelPad.SystemFunction();
var bSelEOL = 1;
var pBreak = "\r";
var nStartCorrect = 0;
var nEndCorrect = 0;
var nMinSel = AkelPad.GetSelStart();
var nMaxSel = AkelPad.GetSelEnd();
var nLastLine = AkelPad.SendMessage(hWndEdit, 1078 /*EM_EXLINEFROMCHAR*/, 0, -2);         //Последняя строка файла!
var nMinLine = AkelPad.SendMessage(hWndEdit, 1078 /*EM_EXLINEFROMCHAR*/, 0, nMinSel);
if (nMoveDirection < 0)
{
   if (nMinLine == 0) WScript.Quit();
   nMinLine -= 1;
}
var nMaxLine = AkelPad.SendMessage(hWndEdit, 1078 /*EM_EXLINEFROMCHAR*/, 0, nMaxSel) + 1;
if (nMoveDirection > 0)
{
   if (nMaxLine -1 == nLastLine) WScript.Quit();
   nMaxLine += 1;
}
nMinLineIndex = AkelPad.SendMessage(hWndEdit, 187 /*EM_LINEINDEX*/, nMinLine, 0);
nMaxLineIndex = AkelPad.SendMessage(hWndEdit, 187 /*EM_LINEINDEX*/, nMaxLine, 0) - bSelEOL;

setRedraw(hWndEdit, false);

AkelPad.SetSel(nMinLineIndex, nMaxLineIndex);

var pSelText = AkelPad.GetSelText();

if (nMoveDirection < 0) nSep = pSelText.indexOf(pBreak); else nSep = pSelText.lastIndexOf(pBreak);

var partFirst = pSelText.substr(0, nSep);
var partRest = pSelText.substr(nSep + 1);

if (nMoveDirection < 0)
{
   nEndCorrect = nEndCorrect + partFirst.length + bSelEOL;
}
else
{
   nStartCorrect = partRest.length + 1;
   nEndCorrect = nEndCorrect - 1 + bSelEOL;
}
AkelPad.ReplaceSel(partRest + pBreak + partFirst, true);
AkelPad.SetSel(AkelPad.GetSelStart() + nStartCorrect, AkelPad.GetSelEnd() - nEndCorrect);

setRedraw(hWndEdit, true);


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


p.s.: KDJ thanks for the idea of this script, DV thanks for the new NoSelEOL!


Last edited by VladSh on Tue Jun 26, 2012 2:05 pm; edited 7 times in total
Back to top
View user's profile Send private message Visit poster's website
VladSh



Joined: 29 Nov 2006
Posts: 2584
Location: Киев, Русь

PostPosted: Wed Jul 21, 2010 9:59 am    Post subject: Reply with quote

OpenAllFilesFromFileFolder.js
Code:
///Opens all files located in the folder
///Открывает все файлы, находящиеся в папке
// -"Открыть все файлы папки" Call("Scripts::Main", 1, "OpenAllFilesFromFileFolder.js", `"%f"`) Icon("%a\AkelFiles\Plugs\Coder.dll", 1)
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=8303#8303
// Version: 1.3 (2011.03.22)

var path = "";

if (WScript.Arguments.length)
   path = WScript.Arguments(0);
else
   path = AkelPad.GetEditFile(0);

if (! AkelPad.Include("ProcessFolderFiles.js")) WScript.Quit();
//if (typeof(processFolderFiles) == "function")      //Проверка, подключена ли функция, т.к. подключаемого скрипта может не быть на диске (оставил для памяти)
processFolderFiles(path, true);


function processFile(file)
{
   AkelPad.OpenFile(file);
}


Script uses: ProcessFolderFiles.js.


Last edited by VladSh on Fri Mar 25, 2011 1:41 pm; edited 4 times in total
Back to top
View user's profile Send private message Visit poster's website
KDJ



Joined: 06 Mar 2010
Posts: 1263
Location: Poland

PostPosted: Mon Jul 26, 2010 8:49 pm    Post subject: Reply with quote

Moves selected text to the left and right or up and down.

TextMove.js

Code:
// TextMove.js - ver. 2014-04-14 (x86/x64)
//
// Move left/right/up/down selected text.
//
// Usage:
// Call("Scripts::Main", 1, "TextMove.js", "-1") - move left one character
// Call("Scripts::Main", 1, "TextMove.js", "1")  - move right one character
// Call("Scripts::Main", 1, "TextMove.js", "-2") - move to the begin of the line
// Call("Scripts::Main", 1, "TextMove.js", "2")  - move to the end of the line
// Call("Scripts::Main", 1, "TextMove.js", "-3") - move one line up
// Call("Scripts::Main", 1, "TextMove.js", "3")  - move one line down
//
// Can assign shortcut keys, eg:
// Ctrl+Alt+Left, Ctrl+Alt+Right, Ctrl+Alt+Home, Ctrl+Alt+End, Ctrl+Alt+Up, Ctrl+Alt+Down

var DT_QWORD              = 2;
var DT_DWORD              = 3;
var AEGL_LINECOUNT        = 0;
var AEGL_FIRSTSELLINE     = 1;
var AEGL_LASTSELLINE      = 2;
var AEGI_LASTCHAR         = 2;
var AEGI_FIRSTSELCHAR     = 3;
var AEGI_LASTSELCHAR      = 4;
var AEGI_CARETCHAR        = 5;
var AESELT_COLUMNON       = 0x1;
var AEM_GETSEL            = 3125;
var AEM_SETSEL            = 3126;
var AEM_GETCOLUMNSEL      = 3127;
var AEM_GETLINENUMBER     = 3129;
var AEM_GETINDEX          = 3130;
var AEM_INDEXUPDATE       = 3132;
var AEM_INDEXTORICHOFFSET = 3136;
var AEM_GETWORDWRAP       = 3241;
var IDM_VIEW_WORDWRAP     = 4209;
var EM_LINEINDEX          = 187;
var EM_LINELENGTH         = 193;
var EM_EXLINEFROMCHAR     = 1078;

var hEditWnd = AkelPad.GetEditWnd();
if ((! hEditWnd) || AkelPad.GetEditReadOnly(hEditWnd))
  WScript.Quit();

var nAction;
if (WScript.Arguments.length)
  nAction = WScript.Arguments(0);
if (!((nAction == -1) || (nAction == 1) || (nAction == -2) || (nAction == 2) || (nAction == -3) || (nAction == 3)))
  WScript.Quit();

SetRedraw(hEditWnd, false);

// Word Wrap
var nWordWrap = SendMessage(hEditWnd, AEM_GETWORDWRAP, 0, 0);
if (nWordWrap > 0)
  AkelPad.Command(IDM_VIEW_WORDWRAP);

// SmartSel::NoSelEOL plugin
var sFuncEOL  = "SmartSel::NoSelEOL";
var bNoSelEOL = AkelPad.IsPluginRunning(sFuncEOL);
if (bNoSelEOL)
  AkelPad.Call(sFuncEOL);

var nMove = parseInt(nAction);

if (SendMessage(hEditWnd, AEM_GETCOLUMNSEL, 0, 0))
  TextMoveColumn();
else
  TextMoveNoColumn();

if (nWordWrap > 0)
  AkelPad.Command(IDM_VIEW_WORDWRAP);

if (bNoSelEOL)
  AkelPad.Call(sFuncEOL);

SetRedraw(hEditWnd, true);

function TextMoveColumn()
{
  var sSelText  = AkelPad.GetSelText(1 /*\r*/);
  var nLine1    = SendMessage(hEditWnd, AEM_GETLINENUMBER, AEGL_FIRSTSELLINE, 0);
  var nLine2    = SendMessage(hEditWnd, AEM_GETLINENUMBER, AEGL_LASTSELLINE,  0);
  var nLastLine = SendMessage(hEditWnd, AEM_GETLINENUMBER, AEGL_LINECOUNT,    0) - 1;
  var nLenLine  = SendMessage(hEditWnd, EM_LINELENGTH, GetOffset(hEditWnd, AEGI_CARETCHAR), 0);
  var lpFirstC  = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
  var lpLastC   = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
  var lpCaret   = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
  var lpSelect  = AkelPad.MemAlloc(_X64 ? 56 : 32 /*sizeof(AESELECTION)*/);
  var lpSelect1 = AkelPad.MemAlloc(_X64 ? 56 : 32 /*sizeof(AESELECTION)*/);
  var lpBegSel  = lpSelect;
  var lpEndSel  = lpSelect + (_X64 ? 24 : 12);
  var lpBegSel1 = lpSelect1;
  var lpEndSel1 = lpSelect1 + (_X64 ? 24 : 12);
  var nShiftRow = 0;
  var nShiftCol = 0;
  var nCol1;
  var nCol2;

  SendMessage(hEditWnd, AEM_GETINDEX, AEGI_FIRSTSELCHAR, lpFirstC);
  SendMessage(hEditWnd, AEM_GETINDEX, AEGI_LASTSELCHAR,  lpLastC);
  SendMessage(hEditWnd, AEM_GETSEL, lpCaret, lpSelect);

  nCol1 = AkelPad.MemRead(lpFirstC + (_X64 ? 16 : 8), DT_DWORD);
  nCol2 = AkelPad.MemRead(lpLastC  + (_X64 ? 16 : 8), DT_DWORD);

  if (nMove == 1)
    nShiftCol = 1;
  else if ((nMove == -1) && (nCol1 > 0))
    nShiftCol = -1;
  else if ((nMove == 2) && (nLenLine > nCol2))
    nShiftCol = nLenLine - nCol2;
  else if (nMove == -2)
    nShiftCol = - nCol1;
  else if ((nMove == 3) && (nLine2 < nLastLine))
    nShiftRow = 1;
  else if ((nMove == -3) && (nLine1 > 0))
    nShiftRow = -1;

  if ((nShiftRow != 0) || (nShiftCol != 0))
  {
    AkelPad.ReplaceSel("");

    ShiftCharIndex(lpFirstC, nShiftRow, nShiftCol);
    ShiftCharIndex(lpLastC,  nShiftRow, nShiftCol);

    CopyCharIndex(lpBegSel1, lpFirstC);
    CopyCharIndexRowCol(lpEndSel1, lpLastC, lpFirstC);
    AkelPad.MemCopy(lpSelect1 + (_X64 ? 48 : 24), AESELT_COLUMNON, DT_DWORD);

    SendMessage(hEditWnd, AEM_SETSEL, 0, lpSelect1);
    AkelPad.ReplaceSel(sSelText);

    ShiftCharIndex(lpCaret,  nShiftRow, nShiftCol);
    ShiftCharIndex(lpBegSel, nShiftRow, nShiftCol);
    ShiftCharIndex(lpEndSel, nShiftRow, nShiftCol);

    SendMessage(hEditWnd, AEM_SETSEL, lpCaret, lpSelect);
  }

  AkelPad.MemFree(lpFirstC);
  AkelPad.MemFree(lpLastC);
  AkelPad.MemFree(lpCaret);
  AkelPad.MemFree(lpSelect);
  AkelPad.MemFree(lpSelect1);
}

function TextMoveNoColumn()
{
  var nBegSel   = AkelPad.GetSelStart();
  var nEndSel   = AkelPad.GetSelEnd();
  var nCarChar  = GetOffset(hEditWnd, AEGI_CARETCHAR);
  var bCarOnEnd = (nCarChar == nBegSel) ? false : true;
  var nLastChar = GetOffset(hEditWnd, AEGI_LASTCHAR);
  var nLine1    = SendMessage(hEditWnd, EM_EXLINEFROMCHAR, 0, nBegSel);
  var nLine2    = SendMessage(hEditWnd, EM_EXLINEFROMCHAR, 0, nEndSel);
  var nLastLine = SendMessage(hEditWnd, EM_EXLINEFROMCHAR, 0, -2);
  var nBegLine;
  var nLenLine;
  var nCol;
  var sSelText;
  var sText1;
  var sText2;

  if ((nBegSel == nEndSel) || ((nMove > 0) && (nMove < 3) && (nEndSel == nLastChar)) || ((nMove > -3) && (nMove < 0) && (nBegSel == 0)) || ((nMove == 3) && (nLine2 == nLastLine)) || ((nMove == -3) && (nLine1 == 0)))
    nMove = 0;
  else if (nMove == 2)
  {
    nBegLine = SendMessage(hEditWnd, EM_LINEINDEX, nLine2, 0);
    nLenLine = SendMessage(hEditWnd, EM_LINELENGTH, nBegLine, 0);
    nMove    = nBegLine + nLenLine - nEndSel;
  }
  else if (nMove == -2)
  {
    nBegLine = SendMessage(hEditWnd, EM_LINEINDEX, nLine1, 0);
    nMove    = nBegLine - nBegSel;
  }
  else if (nMove == 3)
  {
    nBegLine = SendMessage(hEditWnd, EM_LINEINDEX, nLine1, 0);
    nCol     = nBegSel - nBegLine;
    nBegLine = SendMessage(hEditWnd, EM_LINEINDEX, nLine2 + 1, 0);
    nLenLine = SendMessage(hEditWnd, EM_LINELENGTH, nBegLine, 0);
    if (nCol < nLenLine)
      nMove = nBegLine + nCol - nEndSel;
    else
      nMove = nBegLine + nLenLine - nEndSel;
  }
  else if (nMove == -3)
  {
    nBegLine = SendMessage(hEditWnd, EM_LINEINDEX, nLine1, 0);
    nCol     = nBegSel - nBegLine;
    nBegLine = SendMessage(hEditWnd, EM_LINEINDEX, nLine1 - 1, 0);
    nLenLine = SendMessage(hEditWnd, EM_LINELENGTH, nBegLine, 0);
    if (nCol < nLenLine)
      nMove = - nLenLine - 1;
    else
      nMove = - nCol - 1;
  }

  if (nMove != 0)
  {
    if (nMove > 0)
      AkelPad.SetSel(nBegSel, nEndSel + nMove);
    else
      AkelPad.SetSel(nBegSel + nMove, nEndSel);
 
    sSelText = AkelPad.GetSelText(1 /*\r*/);
 
    if (nMove > 0)
    {
      sText1 = sSelText.substr(0, nEndSel - nBegSel);
      sText2 = sSelText.substr(nEndSel - nBegSel);
    }
    else
    {
      sText1 = sSelText.substr(0, -nMove);
      sText2 = sSelText.substr(-nMove);
    }
 
    nBegSel += nMove;
    nEndSel += nMove;
 
    AkelPad.ReplaceSel(sText2 + sText1);
 
    if (bCarOnEnd)
      AkelPad.SetSel(nBegSel, nEndSel);
    else
      AkelPad.SetSel(nEndSel, nBegSel);
  }
}

function SetRedraw(hWnd, bRedraw)
{
  SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
  bRedraw && AkelPad.SystemFunction().Call("User32::InvalidateRect", hWnd, 0, true);
}

function GetOffset(hWnd, nFlag)
{
  var lpIndex = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
  var nOffset;

  SendMessage(hWnd, AEM_GETINDEX, nFlag, lpIndex);
  nOffset = SendMessage(hWnd, AEM_INDEXTORICHOFFSET, 0, lpIndex);
  AkelPad.MemFree(lpIndex);

  return nOffset;
}

function ShiftCharIndex(lpIndex, nShiftRow, nShiftCol)
{
  AkelPad.MemCopy(lpIndex, AkelPad.MemRead(lpIndex, DT_DWORD) + nShiftRow, DT_DWORD);
  AkelPad.MemCopy(lpIndex + (_X64 ? 16 : 8), AkelPad.MemRead(lpIndex + (_X64 ? 16 : 8), DT_DWORD) + nShiftCol, DT_DWORD);
  SendMessage(hEditWnd, AEM_INDEXUPDATE, 0, lpIndex);
}

function CopyCharIndex(lpToIndex, lpFromIndex)
{
  AkelPad.MemCopy(lpToIndex, AkelPad.MemRead(lpFromIndex, DT_DWORD), DT_DWORD);
  AkelPad.MemCopy(lpToIndex + (_X64 ?  8 : 4), AkelPad.MemRead(lpFromIndex + (_X64 ?  8 : 4), DT_QWORD), DT_QWORD);
  AkelPad.MemCopy(lpToIndex + (_X64 ? 16 : 8), AkelPad.MemRead(lpFromIndex + (_X64 ? 16 : 8), DT_DWORD), DT_DWORD);
}

function CopyCharIndexRowCol(lpToIndex, lpFromIndexRow, lpFromIndexCol)
{
  var nRow = AkelPad.MemRead(lpFromIndexRow, DT_DWORD);
  var nCol = AkelPad.MemRead(lpFromIndexCol + (_X64 ? 16 : 8), DT_DWORD);

  AkelPad.MemCopy(lpToIndex, nRow, DT_DWORD);
  AkelPad.MemCopy(lpToIndex + (_X64 ? 16 : 8), nCol, DT_DWORD);
  SendMessage(hEditWnd, AEM_INDEXUPDATE, 0, lpToIndex);
}

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


Last edited by KDJ on Mon Apr 14, 2014 8:21 pm; edited 4 times in total
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    AkelPad Forum Index -> Plugins All times are GMT
Goto page Previous  1, 2, 3, 4, 5, 6 ... 16, 17, 18  Next
Page 5 of 18

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


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