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 ... 16, 17, 18  Next
 
Post new topic   Reply to topic    AkelPad Forum Index -> Plugins
View previous topic :: View next topic  
Author Message
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5289

PostPosted: Fri Mar 13, 2009 10:29 am    Post subject: Reply with quote

ForceNewInstance.js

Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4222#4222
// Version v1.2
//
//
//// Force create new instance.

var hMainWnd=AkelPad.GetMainWnd();

ForceNewInstance(hMainWnd, true);

function ForceNewInstance(hMainWnd, bNoSessions)
{
  var hNewMainWnd=0;
  var lpPluginFunction;
  var bAutoLoad=false;

  //Turn off Sessions plugin autoload
  if (bNoSessions)
  {
    if (lpPluginFunction=AkelPad.SendMessage(hMainWnd, 1331 /*AKD_DLLFINDW*/, AkelPad.MemStrPtr("Sessions::Main"), 0))
    {
      if (bAutoLoad=AkelPad.MemRead(lpPluginFunction + (_X64?812:800) /*offsetof(PLUGINFUNCTION, bAutoLoad)*/, 3 /*DT_DWORD*/))
      {
        AkelPad.MemCopy(lpPluginFunction + (_X64?812:800) /*offsetof(PLUGINFUNCTION, bAutoLoad)*/, false, 3 /*DT_DWORD*/);
        AkelPad.SendMessage(hMainWnd, 1336 /*AKD_DLLSAVE*/, 0x1 /*DLLSF_NOW*/, 0);
      }
    }
  }

  if (AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 153 /*MI_SINGLEOPENPROGRAM*/, 0))
  {
    AkelPad.Command(4256 /*IDM_OPTIONS_SINGLEOPEN_PROGRAM*/);
    hNewMainWnd=AkelPad.Command(4102 /*IDM_FILE_CREATENEW*/);
    AkelPad.Command(4256 /*IDM_OPTIONS_SINGLEOPEN_PROGRAM*/);
    AkelPad.SendMessage(hNewMainWnd, 273 /*WM_COMMAND*/, 4256 /*IDM_OPTIONS_SINGLEOPEN_PROGRAM*/, 0);
  }
  else hNewMainWnd=AkelPad.Command(4102 /*IDM_FILE_CREATENEW*/);

  //Turn on Sessions plugin autoload
  if (bNoSessions && bAutoLoad)
  {
    AkelPad.MemCopy(lpPluginFunction + (_X64?812:800) /*offsetof(PLUGINFUNCTION, bAutoLoad)*/, bAutoLoad, 3 /*DT_DWORD*/);
    AkelPad.SendMessage(hMainWnd, 1336 /*AKD_DLLSAVE*/, 0x1 /*DLLSF_NOW*/, 0);
  }
  return hNewMainWnd;
}



Last edited by Instructor on Fri Aug 24, 2012 4:36 am; edited 6 times in total
Back to top
View user's profile Send private message Send e-mail
Infocatcher



Joined: 06 Aug 2007
Posts: 1589

PostPosted: Tue Mar 17, 2009 9:26 pm    Post subject: Reply with quote

highlighter.js
Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4270#4270
// http://infocatcher.ucoz.net/js/akelpad_scripts/highlighter.js

// (c) Infocatcher 2009-2012
// version 0.3.4 - 2012-04-06

//===================
// Set extension manually for Coder plugin

// Arguments:
//   -noRecognize    - don't use recognize mechanism for unsaved files or files without extension
//   -restore        - use extension of current file (without dialog)
//   -saveLastExt=0  - don't save last used extension
//               =1  - save only typed (default)
//               =2  - always save

// Usage:
//   Call("Scripts::Main", 1, "highlighter.js")
//   Call("Scripts::Main", 1, "highlighter.js", "-noRecognize")
//   Call("Scripts::Main", 1, "highlighter.js", "-restore")
//   Call("Scripts::Main", 1, "highlighter.js", "-noRecognize=true -restore=false -saveLastExt=0")
//===================

//== Settings begin
var hlExtRegions = {
   // Syntax:
   //   extension: {
   //       subExtension0: [[ext0_startMask0, ext0_endMask0], [ext0_startMask1, ext0_endMask1]],
   //       subExtension1: [[ext1_startMask0, ext1_endMask0]]
   //   }
   // Or "links" like
   //   otherExtension: "extension"
   // "extension" must be already defined!
   // Masks is case unsensitive.
   html: {
      js: [["<script", "</script>"]],
      css: [["<style", "</style>"]],
      php: [["<?php", "?>"], ["<?", "?>"]]
   },
   htm: "html",
   xhtml: "html",
   shtml: "html",
   php: "html",
   xml: {
      js: [
         ["<script", "</script>"],
         ["<![cdata[", "]]>"],
         ["<constructor>", "</constructor>"],
         ["<destructor>", "</destructor>"],
         ["<getter>", "</getter>"],
         ["<setter>", "</setter>"],
         ["<field", "</field>"],
         ["<method", "</method>"],
         ["<handler", "</handler>"]
      ],
      css: [["<style", "</style>"]],
      php: [["<?php", "?>"], ["<?", "?>"]]
   },
   xul: "xml",
   xbl: "xml"
};
var hlExtForceRecognize = {
   // Force use recognize algorithm for following extension
   // Syntax:
   //   extension: true
   xml: true // XBL-files use same extension
};
var hlExtRecognize = {
   // Used for unsaved files without filename and extension
   // Syntax:
   //   extension: function(str) { return isExtension; }
   html: function(str) {
      return /^\s*<!DOCTYPE html\W/.test(str) || /<\/html[\s>]/i.test(str);
   },
   php: function(str) {
      return /<\?php\W.*\?>/.test(str)
         || /<\?.*\?>/.test(str) && (
            /\Whtmlspecialchars\s*\(/i.test(str)
            || /\Wsession_start\s*\(\)/i.test(str)
            || /\Wmysql_query\s*\(/i.test(str)
         );
   },
   xbl: function(str) {
      return /^\s*<\?xml/.test(str)
         && /\sxmlns\s*=\s*("|')http:\/\/www\.mozilla\.org\/xbl\1[\s>]/.test(str)
         && /<bindings[\s>]/.test(str);
   },
   xul: function(str) {
      return /^\s*<\?xml\W/.test(str)
         && /\sxmlns\s*=\s*("|')http:\/\/www\.mozilla\.org\/keymaster\/gatekeeper\/there\.is\.only\.xul\1[\s>]/.test(str);
   },
   rdf: function(str) {
      return /^\s*<\?xml/.test(str)
         && /\sxmlns\s*=\s*("|')http:\/\/www\.w3\.org\/1999\/02\/22-rdf-syntax-ns#\1[\s>]/.test(str);
   },
   xsl: function(str) {
      return /^\s*<\?xml/.test(str)
         && /\sxmlns\s*=\s*("|')http:\/\/www\.w3\.org\/1999\/XSL\/Transform\1[\s>]/.test(str);
   },
   svg: function(str) {
      return /^\s*<\?xml/.test(str)
         && /\sxmlns\s*=\s*("|')http:\/\/www\.w3\.org\/2000\/svg\1[\s>]/.test(str);
   },
   dtd: function(str) {
      return /<!ENTITY\s[^<>]+>/.test(str);
   },
   xml: function(str) {
      return /^\s*<\?xml\W/.test(str);
   },
   rc: function(str) {
      return (
         (/(^|\n|\r)#define\s\S/.test(str) || /(^|\n|\r)#include\s\S/.test(str))
         || /\sMENUITEM\s/.test(str)
         || /\sBLOCK\s/.test(str)
      )
      && /\sBEGIN\s/.test(str) && /\sEND\s/.test(str);
   },
   cpp: function(str) {
      return /(^|\n|\r)#define\s\S/.test(str)
         || /(^|\n|\r)#include\s\S/.test(str);
   },
   manifest: function(str) {
      return /(^|\n|\r)content[ \t]\S/.test(str);
   },
   akelmenu: function(str) {
      return /("|'|`)[ +](Command\(\d+\)|Call\(|Exec\()/.test(str);
   },
   bat: function(str) {
      return /^@echo off\s/i.test(str)
         || /(^|\s)if( not)? exist\s/.test(str);
   },
   coder: function(str) {
      return /(^|\n|\r)Delimiters:[\n\r]/.test(str)
         && /(^|\n|\r)Words:[\n\r]/.test(str);
   },
   js: function(str) {
      return /(^|\s)var\s+\S/.test(str);
   },
   vbs: function(str) {
      return /(^|\s)dim\s+\S/i.test(str);
   },
   css: function(str) {
      return /!\s*important[\s;]/.test(str)
         || /\Wcolor\s*:\s*(#[a-f0-9]{3}|#[a-f0-9]{6}|[a-z-]+)\s*(!\s*important)?[\s;]/i.test(str)
         || /\W[a-z-]\s*:\s*(\d+|(\d+)?\.\d+)(px|em|%|pt)[\s;]/i.test(str);
   },
   ini: function(str) {
      return /(^|\n|\r)[^=\s]+=/.test(str);
   }
};
//== Settings end

function _localize(s) {
   var strings = {
      "Syntax highlighting:": {
         ru: "Подсветка синтаксиса:"
      },
      "Syntax highlighting (%S):": {
         ru: "Подсветка синтаксиса (%S):"
      },
      "by file extension": {
         ru: "по расширению файла"
      },
      "special detection": {
         ru: "специальное определение"
      },
      "recognition": {
         ru: "автоопределение"
      },
      "region": {
         ru: "регион"
      },
      "recognition + region": {
         ru: "автоопределение + регион"
      },
      "history": {
         ru: "предыдущее значение"
      }
   };
   var lng;
   switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
      case 0x19: lng = "ru"; break;
      default:   lng = "en";
   }
   _localize = function(s) {
      return strings[s] && strings[s][lng] || s;
   };
   return _localize(s);
}

// Read arguments:
// getArg(argName, defaultValue)
var noRecognize = getArg("noRecognize", false);
var restore     = getArg("restore",     false);
var saveLastExt = getArg("saveLastExt", 1);

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

if(hMainWnd) {
   var ext, forceSet;
   if(restore) {
      forceSet = true;
      ext = /\.([^.]+)$/i.test(AkelPad.GetEditFile(0)) ? RegExp.$1.toLowerCase() : "";
   }
   else {
      ext = getExt();
   }
   if(ext || forceSet) {
      //AkelPad.IsPluginRunning("HighLight::Main")    && AkelPad.Call("HighLight::Main", 1, ext);
      //AkelPad.IsPluginRunning("AutoComplete::Main") && AkelPad.Call("AutoComplete::Main", 1, ext);
      //AkelPad.IsPluginRunning("CodeFold::Main")     && AkelPad.Call("CodeFold::Main", 1, ext);
      if(
         AkelPad.IsPluginRunning("Coder::HighLight")
         || AkelPad.IsPluginRunning("Coder::AutoComplete")
         || AkelPad.IsPluginRunning("Coder::CodeFold")
      )
         AkelPad.Call("Coder::Settings", 1, ext);
   }
}

function getExt() {
   var ext = getCurrentExt();
   if(!ext) {
      ext = saveLastExt && pref("lastExt", 3 /*PO_STRING*/) || "";
      if(ext)
         detectType = "history";
   }
   var typedExt = AkelPad.InputBox(
      hMainWnd,
      WScript.ScriptName,
      detectType
         ? _localize("Syntax highlighting (%S):").replace("%S", _localize(detectType))
         : _localize("Syntax highlighting:"),
      ext
   );
   if(!typedExt)
      return "";
   typedExt = typedExt.toLowerCase();
   if(saveLastExt && (typedExt != ext.toLowerCase() || saveLastExt == 2))
      pref("lastExt", 3 /*PO_STRING*/, typedExt);
   return typedExt;
}
function getCurrentExt() {
   var filePath = AkelPad.GetEditFile(0);
   var ext = filePath && /\.([^.]+)$/i.test(filePath) && RegExp.$1.toLowerCase();
   if(ext)
      detectType = "by file extension";
   if(
      (ext == "coder" || ext == "highlight" || ext == "autocomplete" || ext == "codefold")
      && /[\n\r](Files|Extensions):[\n\r]+(;[^\n\r]*[\n\r]+)*[\n\r]*([^;][^\s]*)[\n\r]/.test(getFullText())
   ) {
      detectType = "special detection";
      return RegExp.$3;
   }
   if(ext == "txt" && /log/i.test(filePath)) {
      detectType = "special detection";
      return "log";
   }
   if(!ext || hlExtForceRecognize[ext])
      ext = recognizeExt() || ext;
   var mSet = ext && getParams(hlExtRegions, ext);
   var rgnExt = mSet && defineExtRegion(mSet);
   return rgnExt || ext || "";
}
function getParams(sets, key) {
   var params = sets[key];
   if(typeof params == "string")
      params = sets[params];
   return params;
}
function recognizeExt() {
   if(noRecognize)
      return undefined;
   var fullText = getFullText();
   if(!fullText)
      return undefined;
   for(var rcgExt in hlExtRecognize) {
      if(hlExtRecognize[rcgExt](fullText)) {
         detectType = "recognition";
         return rcgExt;
      }
   }
   return undefined;
}
function defineExtRegion(mSet) {
   var fText = getFullText();
   var ss = AkelPad.GetSelStart();
   var se = AkelPad.GetSelEnd();
   var startText = fText.substring(0, ss).toLowerCase();
   var selText   = fText.substring(ss, se).toLowerCase();
   var endText   = fText.substring(se, fText.length).toLowerCase();
   var i, start, end, startIndx, endIndx;
   var mParams;
   for(var ext in mSet) {
      mParams = mSet[ext];
      for(i = 0, len = mParams.length; i < len; i++) {
         start = mParams[i][0];
         end = mParams[i][1];
         startIndx = endText.indexOf(start);
         endIndx = endText.indexOf(end);
         if(
            startText.lastIndexOf(start) > startText.lastIndexOf(end)
            && selText.indexOf(start) == -1 && selText.indexOf(end) == -1
            && endIndx != -1
            && (startIndx == -1 || endIndx < startIndx)
         ) {
            detectType = detectType == "recognition"
               ? "recognition + region"
               : "region";
            return ext;
         }
      }
   }
   return "";
}
function getFullText() {
   if(fullText != undefined)
      return fullText;

   if(typeof AkelPad.GetTextRange != "undefined")
      return fullText = 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);
   fullText = 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 fullText;
}

function setRedraw(hWnd, bRedraw) {
   AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
   bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}
function pref(name, type, val) {
   var oSet = AkelPad.ScriptSettings();
   if(arguments.length == 3) {
      if(!oSet.Begin(WScript.ScriptBaseName, 0x2 /*POB_SAVE*/))
         return false;
      var ok = oSet.Write(name, type, val);
      oSet.End();
      return ok;
   }
   if(!oSet.Begin(WScript.ScriptBaseName, 0x1 /*POB_READ*/))
      return undefined;
   var ret = oSet.Read(name, type || 1 /*PO_DWORD*/);
   oSet.End();
   return ret;
}
function getArg(argName, defaultVal) {
   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;
   getArg = function(argName, defaultVal) {
      argName = argName.toLowerCase();
      return typeof args[argName] == "undefined" // argName in args
         ? defaultVal
         : args[argName];
   };
   return getArg(argName, defaultVal);
}
<download>
Allow set extension manually for Coder plugin with basic autodetection.

Version 0.3.4 (2012-04-06)
[+] Added detection of files masks from *.coder files in new format.

Version 0.3.3 (2011-12-20)
[*] Used AkelPad language (AkelPad.GetLangId()) instead of system language for localization.

Old changelog

Version 0.3.2 (2011-03-06)
[*] Now used AkelPad.ScriptSettings() to store data.
[+] Added -saveLastExt argument.

Version 0.3.1 (2010-12-07)
[+] Added recognize mechanism for unsaved files or files without extension.

Version 0.2.7 (2010-11-23)
[*] New localization method.
[*] Improved logic of text getting.

Version 0.2.6 (2010-09-18)
[+] Support for comments between «Extensions:» header and first extension.

Version 0.2.5.1 (2010-06-22)
[+] Support for changed Scripts plugin and new Coder plugin.
[-] Removed compatibility with old plugins (separate HighLight, AutoComplete, CodeFold).

Version 0.2.5 (2010-03-21)
[x] Fixed error message for not installed plugins.

Version 0.2.4 (2010-02-11)
[+] Added extension detection for *.autocomplete and *.codefold files.
[*] Some improvements. Smile

Version 0.2.3 (2010-02-10)
[+] Support for CodeFold plugin.


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



Joined: 06 Aug 2007
Posts: 1589

PostPosted: Tue Mar 17, 2009 9:35 pm    Post subject: Reply with quote

encodeHTML.js
Code:
// (c) Infocatcher 2009-2010
// version 0.1.5.2 - 2010-07-08

// Convert:
// & => &amp;
// < => &lt;
// > => &gt;
// " => &quot;

//var AkelPad = new ActiveXObject("AkelPad.document");

var hMainWnd = AkelPad.GetMainWnd();
var hWndEdit = AkelPad.GetEditWnd();
var oFunction = AkelPad.SystemFunction();

if(hMainWnd && !AkelPad.GetEditReadOnly(hWndEdit)) {
   var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
   if(lpPoint) {
      toggleRedraw(hWndEdit, false);
      var selParams = getSelParams();
      AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
      selParams = encodeHTML(selParams);
      restoreSelParams(selParams);
      AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
      toggleRedraw(hWndEdit, true);
      AkelPad.MemFree(lpPoint);
   }
}

function encodeHTML(selParams) {
   // Get selection or all text
   var txt = AkelPad.GetSelText() || AkelPad.SetSel(0, -1) || AkelPad.GetSelText();
   var selStart = AkelPad.GetSelStart();

   txt = txt
      .replace(/&/g, "&amp;")
      .replace(/</g, "&lt;")
      .replace(/>/g, "&gt;")
      .replace(/"/g, "&quot;");
   AkelPad.ReplaceSel(txt);

   return [selStart, selStart + txt.length];
}

function toggleRedraw(hWnd, bRedraw) {
   AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
   if(!bRedraw)
      return;
   oFunction.AddParameter(hWnd);
   oFunction.AddParameter(0);
   oFunction.AddParameter(true);
   oFunction.Call("user32::InvalidateRect");
}
function getSelParams() {
   return [AkelPad.GetSelStart(), AkelPad.GetSelEnd()];
}
function restoreSelParams(selParams) {
   AkelPad.SetSel(selParams[0], selParams[1]);
}
<download> (see convertHTML.js and converter.js)

Convert:
& => &amp;
< => &lt;
> => &gt;
" => &quot;


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



Joined: 06 Aug 2007
Posts: 1589

PostPosted: Tue Mar 17, 2009 9:36 pm    Post subject: Reply with quote

decodeHTML.js
Code:
// (c) Infocatcher 2009-2010
// version 0.1.5.2 - 2010-07-08

// Convert:
// &amp;  => &
// &lt;   => <
// &gt;   => >
// &quot; => "

//var AkelPad = new ActiveXObject("AkelPad.document");

var hMainWnd = AkelPad.GetMainWnd();
var hWndEdit = AkelPad.GetEditWnd();
var oFunction = AkelPad.SystemFunction();

if(hMainWnd && !AkelPad.GetEditReadOnly(hWndEdit)) {
   var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
   if(lpPoint) {
      toggleRedraw(hWndEdit, false);
      var selParams = getSelParams();
      AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
      selParams = decodeHTML(selParams);
      restoreSelParams(selParams);
      AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
      toggleRedraw(hWndEdit, true);
      AkelPad.MemFree(lpPoint);
   }
}

function decodeHTML(selParams) {
   // Get selection or all text
   var txt = AkelPad.GetSelText() || AkelPad.SetSel(0, -1) || AkelPad.GetSelText();
   var selStart = AkelPad.GetSelStart();

   txt = txt
      .replace(/&lt;/g, "<")
      .replace(/&gt;/g, ">")
      .replace(/&quot;/g, '"')
      .replace(/&amp;/g, "&");
   AkelPad.ReplaceSel(txt);

   return [selStart, selStart + txt.length];
}

function toggleRedraw(hWnd, bRedraw) {
   AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
   if(!bRedraw)
      return;
   oFunction.AddParameter(hWnd);
   oFunction.AddParameter(0);
   oFunction.AddParameter(true);
   oFunction.Call("user32::InvalidateRect");
}
function getSelParams() {
   return [AkelPad.GetSelStart(), AkelPad.GetSelEnd()];
}
function restoreSelParams(selParams) {
   AkelPad.SetSel(selParams[0], selParams[1]);
}
<download> (see convertHTML.js and converter.js)

Convert:
&amp; => &
&lt; => <
&gt; => >
&quot; => "


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



Joined: 06 Aug 2007
Posts: 1589

PostPosted: Sun Mar 22, 2009 11:10 pm    Post subject: Reply with quote

convertHTML.js
Code:
// (c) Infocatcher 2009-2010
// version 0.4.3 - 2010-12-06

//===================
// Encode HTML entities:
//   &    => &amp;
//   <    => &lt;
//   >    => &gt;
//   "    => &quot;
//   char => &#code; (see arguments)

// Decode HTML entities:
//   &amp;   => &
//   &lt;    => <
//   &gt;    => >
//   &quot;  => "
//   &#code; => char (see arguments)

// Arguments:
//   -mode=0                               - (default) auto encode or decode
//   -mode=1                               - encode
//   -mode=2                               - decode
//   -decodeCharCodes=true                 - (default: true) decode &#code; => char
//   -encodeChars=false                    - (default: false) encode char => &#code;
//   -encodeAsHex=false                    - use hex instead of decimal
//   -charsToEncode=/[^!-~ \t\n\rа-яё]/ig  - (optional) mask for chars to encode

// Usage:
//   Call("Scripts::Main", 1, "convertHTML.js", "-mode=0")
//   Call("Scripts::Main", 1, "convertHTML.js", "-mode=0 -decodeCharCodes=true -encodeChars=true '-charsToEncode=/[^!-~ \t\n\rа-яё]/ig'")
//===================

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) {
   argName = argName.toLowerCase();
   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 decodeCharCodes = getArg("decodeCharCodes", true);
var encodeChars     = getArg("encodeChars", false);
var encodeAsHex     = getArg("encodeAsHex", false);
var charsToEncode   = getArg("charsToEncode", /[^!-~ \t\n\rа-яё]/ig);
// "!-~"     - latin symbols
// " \t\n\r" - spaces
// "а-яё"    - cyrillic symbols


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

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

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

   var res;
   if(decode || auto) {
      res = decodeHTML(text);
      if(auto)
         encode = res == text; // Can't decode (entities is missing)
   }
   if(encode)
      res = encodeHTML(text);
   if(res == text) {
      AkelPad.MessageBox(hMainWnd, _localize("Nothing to recode!"), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
      return;
   }

   insertNoScroll(res, selectAll);
}
function encodeHTML(str) {
   str = str
      .replace(/&/g, "&amp;")
      .replace(/</g, "&lt;")
      .replace(/>/g, "&gt;")
      .replace(/"/g, "&quot;");
   if(encodeChars)
      str = str.replace(
         charsToEncode,
         function(s) {
            var code = s.charCodeAt(0);
            if(encodeAsHex)
               code = "x" + code.toString(16);
            return "&#" + code + ";";
         }
      );
   return str;
}
function decodeHTML(str) {
   if(decodeCharCodes)
      str = str
         .replace(
            /&#(?:x([\da-f]+)|(\d+));/ig,
            function(s, hex, dec) {
               return String.fromCharCode(
                  hex
                     ? parseInt(hex, 16)
                     : parseInt(dec, 10)
               );
            }
         );
   return str
      .replace(/&lt;/g, "<")
      .replace(/&gt;/g, ">")
      .replace(/&quot;/g, '"')
      .replace(/&amp;/g, "&");
}

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);
}
(encode HTML + decode HTML) <download> (see converter.js)

Encode HTML entities:
& => &amp;
< => &lt;
> => &gt;
" => &quot;
char => &#code; (see arguments)

Decode HTML entities:
&amp; => &
&lt; => <
&gt; => >
&quot; => "
&#code; => char (see arguments)


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



Joined: 06 Aug 2007
Posts: 1589

PostPosted: Mon Mar 23, 2009 12:03 am    Post subject: Reply with quote

insertDateTemplateExample.js
Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4311#4311

// (c) Infocatcher 2008-2009, 2012
// version 0.1.2 - 2012-12-03

// Insert current date

//== User settings:
var dateTemplate = "<fullYear>-<month>-<date>";
// You can use <day>, <date>, <month>, <monthName>, <year>, <fullYear>, <hours>, <minutes>, <seconds>, <timezone>
// Days of week:
var daysOfWeek = "sunday,monday,tuesday,wednesday,thursday,friday,saturday";
var monthNames = "jan,feb,mar,apr,may,jun,jul,avg,sep,oct,nov,dec";
// Use "," as separator

// Or you can specified dateTemplate, daysOfWeek and monthNames in command line arguments:
// Call("Scripts::Main", 1, "insertDate.js", "/t=dateTemplate /w=daysOfWeek /m=monthNames", 0)
// \s - " " (space), \n - line feed
// For example:
// Call("Scripts::Main", 1, "insertDate.js", "/t=<monthName>,\s<day> /w=su,mo,tu,we,th,fr,sa /m=jan,feb,mar,apr,may,jun,jul,avg,sep,oct,nov,dec", 0)
//== End of user settings

var argsCount = WScript.Arguments.length;
var args = {};
for(var i = 0; i < argsCount; ++i) // read arguments
   if(/^\/([a-z]+)=(.+)$/i.test(WScript.Arguments(i)))
      args[RegExp.$1] = RegExp.$2;

dateTemplate = (args.t && convertArg(args.t)) || dateTemplate;
daysOfWeek = ((args.w && convertArg(args.w)) || daysOfWeek).split(/\s*,\s*/);
monthNames = ((args.m && convertArg(args.m)) || monthNames).split(/\s*,\s*/);

function convertArg(s) {
   return s
      .replace(/\\s/g, " ")
      .replace(/\\n/g, "\n");
}
function addZero(n) {
   return n > 9 ? n : "0" + n;
}
function getTimezone(tzo) {
   var m = Math.abs(tzo);
   var h = Math.floor(m/60);
   m = Math.floor(m - h*60);
   return (tzo > 0 ? "-" : "+") + addZero(h) + addZero(m);
}
function getFormattedDate(template, days, months) {
   var d = new Date();
   var y = d.getFullYear().toString();
   var m = d.getMonth();
   return template
      .replace(/<day>/g, days[d.getDay()])
      .replace(/<date>/g, addZero(d.getDate()))
      .replace(/<month>/g, addZero(m + 1))
      .replace(/<monthName>/g, months[m])
      .replace(/<fullYear>/g, y)
      .replace(/<year>/g, y.substring(2, y.length))
      .replace(/<hours?>/g, addZero(d.getHours()))
      .replace(/<minutes>|<min>/g, addZero(d.getMinutes()))
      .replace(/<seconds>|<sec>/g, addZero(d.getSeconds()))
      .replace(/<timezone>/g, getTimezone(d.getTimezoneOffset()));
}

//var AkelPad = new ActiveXObject("AkelPad.document");
AkelPad.ReplaceSel(getFormattedDate(dateTemplate, daysOfWeek, monthNames));
<download>


Last edited by Infocatcher on Mon Dec 03, 2012 7:07 am; edited 4 times in total
Back to top
View user's profile Send private message
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5289

PostPosted: Sun Mar 29, 2009 8:34 am    Post subject: Reply with quote

TabSwitch.js

Code:
// Switch between tabs.
// Version v3.2
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4368#4368
//
// Arguments:
// -Next=true         -Switch direction (one of the following):
//                       true   Forward switch.
//                       false  Backward switch (default).
//                       -1     Stay current.
// -CtrlTab=false     -No Ctrl+Tab hotkey is assigned to TabSwitch.js (default is true).
// -RightLeft=true    -Switch between tabs: Left-Right. Default is false - switch between tabs: Next-Previous.
// -MinTabs=2         -Minimum number of tabs before switch window appeared (default is 2).
// -TabIndex=0        -Activate tab by specified index. If used, all other arguments ignored.
// -FontName="Arial"  -Font name. Unchanged, if "".
// -FontStyle=3       -Font style (one of the following):
//                       0  ignored.
//                       1  normal.
//                       2  bold.
//                       3  italic.
//                       4  bold italic.
// -FontSize=10       -Font size. Unchanged, if 0.
// -LineGap=10        -Space between items (default is 1).
// -WindowLeft=100    -Left window position. Centered, if -1 (default).
// -WindowTop=100     -Top window position. Centered, if -1 (default).
//
// Examples:
// -"Previous (Ctrl+Tab)" Call("Scripts::Main", 1, "TabSwitch.js", `-Next=false`)
// -"Next (Ctrl+Shift+Tab)" Call("Scripts::Main", 1, "TabSwitch.js", `-Next=true`)
// -"Right (Ctrl+Tab)" Call("Scripts::Main", 1, "TabSwitch.js", `-RightLeft=true -Next=true`)
// -"Left (Ctrl+Shift+Tab)" Call("Scripts::Main", 1, "TabSwitch.js", `-RightLeft=true -Next=false`)
// -"Tab1 (Alt+1)" Call("Scripts::Main", 1, "TabSwitch.js", `-TabIndex=0`)
// -"Tab2 (Alt+2)" Call("Scripts::Main", 1, "TabSwitch.js", `-TabIndex=1`)
// Toolbar button example:
// -"Tab list" Call("Scripts::Main", 1, "TabSwitch.js", `-Next=-1 -CtrlTab=false -RightLeft=true -MinTabs=1 -WindowLeft=%bl -WindowTop=%bb`) Icon(0)

//Arguments
var bNext=AkelPad.GetArgValue("Next", false);
var bCtrlTab=AkelPad.GetArgValue("CtrlTab", true);
var bRightLeft=AkelPad.GetArgValue("RightLeft", false);
var nMinTabs=AkelPad.GetArgValue("MinTabs", 2);
var nTabIndex=AkelPad.GetArgValue("TabIndex", -1);
var pFontName=AkelPad.GetArgValue("FontName", "");
var nFontStyle=AkelPad.GetArgValue("FontStyle", 0);
var nFontSize=AkelPad.GetArgValue("FontSize", 0);
var nLineGap=AkelPad.GetArgValue("LineGap", 1);
var nWindowLeft=AkelPad.GetArgValue("WindowLeft", -1);
var nWindowTop=AkelPad.GetArgValue("WindowTop", -1);

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var oSys=AkelPad.SystemFunction();
var hInstanceDLL=AkelPad.GetInstanceDll();
var pClassName="AkelPad::Scripts::" + WScript.ScriptName + "::" + oSys.Call("kernel32::GetCurrentProcessId");
var hWndContainer=0;
var hWndListBox=0;
var hSubClass;
var hDC;
var hBrushHollow;
var hFontEdit;
var lpFrameList=[];
var rcMain=[];
var nItemHeight;
var nControlHeight;
var nCharWidth;
var nCharHeight;
var nMaxCharWidth=0;
var nMaxCharHeight=0;
var nIconSize=16;
var nIconGap=2;
var bNoSwitch=false;
var i;

if (hMainWnd)
{
  if (nTabIndex >= 0)
  {
    var hWndTab;
    var lpFrame;
    var nCurSel;

    hWndTab=oSys.Call("user32::GetDlgItem", hMainWnd, 10003 /*ID_TAB*/);
    if (lpFrame=AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 8 /*FWF_BYTABINDEX*/, nTabIndex))
      oSys.Call("user32::PostMessage" + _TCHAR, hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrame);
    WScript.Quit();
  }

  //Get list of documents
  nCurSel=GetFrameList(lpFrameList);

  if (lpFrameList.length >= nMinTabs && lpFrameList.length > 0)
  {
    if (bCtrlTab)
    {
      if (!(oSys.Call("user32::GetKeyState", 0x11 /*VK_CONTROL*/) & 0x8000))
      {
        //Ctrl already released
        if (lpFrameList.length >= 2)
          oSys.Call("user32::PostMessage" + _TCHAR, hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrameList[nCurSel][1]);
        WScript.Quit();
      }
    }

    //Get font
    if (pFontName || nFontStyle || nFontSize)
      hFontEdit=CreateFont(pFontName, nFontStyle, nFontSize);
    else
      hFontEdit=AkelPad.SendMessage(hWndEdit, 0x31 /*WM_GETFONT*/, 0, 0);
    if (!hFontEdit) WScript.Quit();

    //Get maximum character size
    if (lpSize=AkelPad.MemAlloc(8 /*sizeof(SIZE)*/))
    {
      if (hDC=oSys.Call("user32::GetDC", hWndEdit))
      {
        oSys.Call("gdi32::SelectObject", hDC, hFontEdit);

        for (i=0; i < lpFrameList.length; ++i)
        {
          if (oSys.Call("gdi32::GetTextExtentPoint32" + _TCHAR, hDC, lpFrameList[i][0], lpFrameList[i][0].length, lpSize))
          {
            nCharWidth=AkelPad.MemRead(lpSize + 0 /*SIZE.cx*/, 3 /*DT_DWORD*/);
            nCharHeight=AkelPad.MemRead(lpSize + 4 /*SIZE.cy*/, 3 /*DT_DWORD*/);
            if (nCharWidth > nMaxCharWidth) nMaxCharWidth=nCharWidth;
            if (nCharHeight > nMaxCharHeight) nMaxCharHeight=nCharHeight;
          }
        }
        oSys.Call("user32::ReleaseDC", hWndEdit, hDC);
      }
      nMaxCharWidth+=nIconSize + nIconGap + 16;

      AkelPad.MemFree(lpSize);
    }

    //Create dialog
    if (AkelPad.WindowRegisterClass(pClassName))
    {
      if (hWndContainer=oSys.Call("user32::CreateWindowEx" + _TCHAR, 0, pClassName, 0, bCtrlTab?0x40000000 /*WS_CHILD*/:0x80000000 /*WS_POPUP*/, 0, 0, 0, 0, hMainWnd, 0, hInstanceDLL, DialogCallback))
      {
        if (hWndListBox=oSys.Call("user32::CreateWindowEx" + _TCHAR, 0, "LISTBOX", 0, 0x50400010 /*WS_VISIBLE|WS_CHILD|WS_DLGFRAME|LBS_OWNERDRAWFIXED*/, 0, 0, 0, 0, hWndContainer, 0, hInstanceDLL, 0))
        {
          //Make hWndContainer invisible
          hBrushHollow=oSys.Call("gdi32::GetStockObject", 5 /*HOLLOW_BRUSH*/);
          oSys.Call("user32::SetClassLong" + _TCHAR, hWndContainer, -10 /*GCL_HBRBACKGROUND*/, hBrushHollow);

          oSys.Call("user32::SetFocus", hWndListBox);
          AkelPad.SendMessage(hWndListBox, 48 /*WM_SETFONT*/, hFontEdit, 1);
          nItemHeight=nMaxCharHeight + nLineGap;
          i=AkelPad.SendMessage(hWndListBox, 0x1A1 /*LB_GETITEMHEIGHT*/, 0, 0);
          if (nItemHeight < i)
            nItemHeight=i;
          else
            AkelPad.SendMessage(hWndListBox, 0x1A0 /*LB_SETITEMHEIGHT*/, 0, nItemHeight);
          nControlHeight=lpFrameList.length * nItemHeight + oSys.Call("user32::GetSystemMetrics", 8 /*SM_CYDLGFRAME*/) * 2;

          //Fill listbox
          for (i=0; i < lpFrameList.length; ++i)
            oSys.Call("user32::SendMessage" + _TCHAR, hWndListBox, 0x180 /*LB_ADDSTRING*/, 0, lpFrameList[i][0]);
          AkelPad.SendMessage(hWndListBox, 0x186 /*LB_SETCURSEL*/, nCurSel, 0);

          GetWindowPos(hMainWnd, 0, rcMain);
          if (nWindowLeft >= 0)
            rcMain.left=Math.min(nWindowLeft, Math.max(oSys.Call("user32::GetSystemMetrics", 0 /*SM_CXSCREEN*/) - nMaxCharWidth, 0));
          else
          {
            rcMain.left=rcMain.right / 2 - nMaxCharWidth / 2;
            if (rcMain.left < 0) rcMain.left=0;
          }
          if (nWindowTop >= 0)
            rcMain.top=Math.min(nWindowTop, Math.max(oSys.Call("user32::GetSystemMetrics", 1 /*SM_CYSCREEN*/) - nControlHeight, 0));
          else
          {
            rcMain.top=rcMain.bottom / 2 - nControlHeight / 2;
            if (rcMain.top < 0) rcMain.top=0;
          }
          oSys.Call("user32::SetWindowPos", hWndContainer, 0, rcMain.left, rcMain.top, nMaxCharWidth, nControlHeight, 0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);
          oSys.Call("user32::SetWindowPos", hWndListBox, 0, 0, 0, nMaxCharWidth, nControlHeight, 0x16 /*SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE*/);
          oSys.Call("user32::ShowWindow", hWndContainer, 5 /*SW_SHOW*/);
          oSys.Call("user32::UpdateWindow", hMainWnd);

          if (hSubClass=AkelPad.WindowSubClass(hWndListBox, ListBoxCallback, 0x87 /*WM_GETDLGCODE*/, 0x100 /*WM_KEYDOWN*/, 0x101 /*WM_KEYUP*/, 0x203 /*WM_LBUTTONDBLCLK*/, 0x8 /*WM_KILLFOCUS*/))
          {
            //Message loop
            AkelPad.WindowGetMessage();

            AkelPad.WindowUnsubClass(hWndListBox);
          }

          if (!bNoSwitch)
          {
            i=AkelPad.SendMessage(hWndListBox, 0x188 /*LB_GETCURSEL*/, 0, 0);
            oSys.Call("user32::PostMessage" + _TCHAR, hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrameList[i][1]);
          }
          //oSys.Call("user32::DestroyWindow", hWndListBox);
        }
        oSys.Call("user32::DestroyWindow", hWndContainer);
      }
      AkelPad.WindowUnregisterClass(pClassName);
    }

    //Release font
    if (pFontName || nFontStyle || nFontSize)
    {
      if (hFontEdit)
        oSys.Call("gdi32::DeleteObject", hFontEdit);
    }
  }
  else
  {
    if (lpFrameList.length >= 2)
      oSys.Call("user32::PostMessage" + _TCHAR, hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrameList[nCurSel][1]);
  }
}

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 0x2B)  //WM_DRAWITEM
  {
    var hDC;
    var hIcon;
    var nItemID;
    var nItemState;
    var lpItem;
    var rcItem=[];
    var crText;
    var crBk;
    var hBrushBk;
    var nModeBkOld;

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

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

    //Draw icon
    hIcon=AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 38 /*FI_ICONHANDLE*/, lpFrameList[nItemID][1]);
    oSys.Call("user32::DrawIconEx", hDC, rcItem.left, rcItem.top + (rcItem.bottom - rcItem.top) / 2 - nIconSize / 2, hIcon, nIconSize, nIconSize, 0, 0, 0x3 /*DI_NORMAL*/);

    //Draw text
    oSys.Call("gdi32::SetTextColor", hDC, crText);
    oSys.Call("gdi32::SetBkColor", hDC, crBk);
    oSys.Call("gdi32::TextOut" + _TCHAR, hDC, rcItem.left + nIconSize + nIconGap, rcItem.top + (rcItem.bottom - rcItem.top) / 2 - nMaxCharHeight / 2, lpFrameList[nItemID][0], lpFrameList[nItemID][0].length);

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

function ListBoxCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 0x87) //WM_GETDLGCODE
  {
    AkelPad.WindowNoNextProc(hSubClass);
    return 0x4 /*DLGC_WANTALLKEYS*/;
  }
  else if (uMsg == 0x100) //WM_KEYDOWN
  {
    if (wParam == 0x43 /*c*/)
    {
      if (bCtrlTab || (oSys.Call("user32::GetKeyState", 0x11 /*VK_CONTROL*/) & 0x8000))
      {
        i=AkelPad.SendMessage(hWndListBox, 0x188 /*LB_GETCURSEL*/, 0, 0);
        AkelPad.SetClipboardText(lpFrameList[i][0]);
      }
    }
    else if (wParam == 0x9 /*VK_TAB*/)
    {
      var nCount;

      nCount=AkelPad.SendMessage(hWndListBox, 0x18B /*LB_GETCOUNT*/, 0, 0);
      i=AkelPad.SendMessage(hWndListBox, 0x188 /*LB_GETCURSEL*/, 0, 0);

      if (!(oSys.Call("user32::GetKeyState", 0x10 /*VK_SHIFT*/) & 0x8000))
      {
        if (++i >= nCount)
          i=0;
      }
      else
      {
        if (--i < 0)
          i=nCount - 1;
      }
      AkelPad.SendMessage(hWndListBox, 0x186 /*LB_SETCURSEL*/, i, 0);
    }
    else if (wParam == 0xD /*VK_RETURN*/)
    {
      //Exit message loop
      oSys.Call("user32::PostQuitMessage", 0);
    }
    else if (wParam == 0x1B /*VK_ESCAPE*/)
    {
      bNoSwitch=true;

      //Exit message loop
      oSys.Call("user32::PostQuitMessage", 0);
    }
  }
  else if (uMsg == 0x101) //WM_KEYUP
  {
    if (wParam == 0x11 /*VK_CONTROL*/)
    {
      if (bCtrlTab)
      {
        //Exit message loop
        oSys.Call("user32::PostQuitMessage", 0);
      }
    }
  }
  else if (uMsg == 0x203) //WM_LBUTTONDBLCLK
  {
    var lResult=AkelPad.SendMessage(hWndListBox, 0x01A9 /*LB_ITEMFROMPOINT*/, 0, lParam);

    if (HIWORD(lResult) == 0)
      AkelPad.SendMessage(hWndListBox, 0x186 /*LB_SETCURSEL*/, LOWORD(lResult), 0);

    //Exit message loop
    oSys.Call("user32::PostQuitMessage", 0);
  }
  else if (uMsg == 0x8)  //WM_KILLFOCUS
  {
    bNoSwitch=true;

    //Exit message loop
    oSys.Call("user32::PostQuitMessage", 0);
  }
}

function GetFrameList(lpFrameList)
{
  var lpCurFrame=AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
  var lpInitFrame;
  var lpFrame;
  var nCurFrame=0;
  var i;

  if (bRightLeft)
    lpInitFrame=AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 8 /*FWF_BYTABINDEX*/, 0);
  else
    lpInitFrame=lpCurFrame;
  lpFrame=lpInitFrame;

  for (i=0; lpFrame; ++i)
  {
    lpFrameList[i]=[0, 0];
    lpFrameList[i][0]=AkelPad.MemRead(AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 32 /*FI_FILEW*/, lpFrame), 1 /*DT_UNICODE*/);
    lpFrameList[i][1]=lpFrame;
    if (lpFrame == lpCurFrame)
      nCurFrame=i;

    if (bRightLeft)
      lpFrame=AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 8 /*FWF_BYTABINDEX*/, i + 1);
    else
      lpFrame=AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 3 /*FWF_PREV*/, lpFrame);
    if (lpFrame == lpInitFrame) break;
  }

  //Next frame
  if (lpFrameList.length >= 2 && bNext != -1)
  {
    if ((bRightLeft && bNext) || (!bRightLeft && !bNext))
      ++nCurFrame;
    else
      --nCurFrame;
    if (nCurFrame < 0)
      nCurFrame=lpFrameList.length - 1;
    else if (nCurFrame >= lpFrameList.length)
      nCurFrame=0;
  }
  return nCurFrame;
}

function CreateFont(pFaceName, nFontStyle, nPointSize)
{
  //Release it with: oSys.Call("gdi32::DeleteObject", hFont);
  var lpLogFontSrc;
  var lpLogFontDst;
  var hDC;
  var hFont=0;
  var nHeight;
  var nWeight;
  var nItalic;

  if (lpLogFontDst=AkelPad.MemAlloc(92 /*sizeof(LOGFONTW)*/))
  {
    lpLogFontSrc=AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 48 /*FI_EDITFONTW*/, 0);
    oSys.Call("kernel32::RtlMoveMemory", lpLogFontDst, lpLogFontSrc, 92 /*sizeof(LOGFONTW)*/);

    if (nPointSize)
    {
      if (hDC=oSys.Call("user32::GetDC", hMainWnd))
      {
        nHeight=-oSys.Call("kernel32::MulDiv", nPointSize, oSys.Call("gdi32::GetDeviceCaps", hDC, 90 /*LOGPIXELSY*/), 72);
        AkelPad.MemCopy(lpLogFontDst + 0 /*offsetof(LOGFONTW, lfHeight)*/, nHeight, 3 /*DT_DWORD*/);
        oSys.Call("user32::ReleaseDC", hMainWnd, hDC);
      }
    }
    if (nFontStyle != 0 /*FS_NONE*/)
    {
      nWeight=(nFontStyle == 2 /*FS_FONTBOLD*/ || nFontStyle == 4 /*FS_FONTBOLDITALIC*/)?700 /*FW_BOLD*/:400 /*FW_NORMAL*/;
      AkelPad.MemCopy(lpLogFontDst + 16 /*offsetof(LOGFONTW, lfWeight)*/, nWeight, 3 /*DT_DWORD*/);
      nItalic=(nFontStyle == 3 /*FS_FONTITALIC*/ || nFontStyle == 4 /*FS_FONTBOLDITALIC*/)?1:0;
      AkelPad.MemCopy(lpLogFontDst + 20 /*offsetof(LOGFONTW, lfItalic)*/, nItalic, 5 /*DT_BYTE*/);
    }
    if (pFaceName)
    {
      AkelPad.MemCopy(lpLogFontDst + 28 /*offsetof(LOGFONTW, lfFaceName)*/, pFaceName.substr(0, 32 /*LF_FACESIZE*/), _TSTR);
    }
    hFont=oSys.Call("gdi32::CreateFontIndirect" + _TCHAR, lpLogFontDst);
    AkelPad.MemFree(lpLogFontDst);
  }
  return hFont;
}

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

function GetWindowPos(hWnd, hWndOwner, rcRect)
{
  var lpRect;
  var bResult=false;

  //Get rect
  if (lpRect=AkelPad.MemAlloc(16 /*sizeof(RECT)*/))
  {
    if (oSys.Call("user32::GetWindowRect", hWnd, lpRect))
    {
      RectToArray(lpRect, rcRect);
      rcRect.right-=rcRect.left;
      rcRect.bottom-=rcRect.top;

      if (hWndOwner)
        bResult=oSys.Call("user32::ScreenToClient", hWndOwner, lpRect);
      else
        bResult=true;
      rcRect.left=AkelPad.MemRead(lpRect, 3 /*DT_DWORD*/);
      rcRect.top=AkelPad.MemRead(lpRect + 4, 3 /*DT_DWORD*/);
    }
    AkelPad.MemFree(lpRect);
  }
  return bResult;
}

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

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

function MAKELONG(a, b)
{
  return (a & 0xffff) | ((b & 0xffff) << 16);
}



screenshot




Last edited by Instructor on Sun Jul 20, 2014 11:41 am; edited 29 times in total
Back to top
View user's profile Send private message Send e-mail
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5289

PostPosted: Tue Mar 31, 2009 4:16 pm    Post subject: Reply with quote

VersionIncrement.js

Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4393#4393
// Version v1.0
//
//
//// Increment selection (version).
//
//  1.0.1 -> 1.0.2
//  1.0.9 -> 1.1.0


var hMainWnd=AkelPad.GetMainWnd();
var pSelText;
var pDelimiter;
var pLinesArray;
var nIndex;

if (hMainWnd)
{
  if (pSelText=AkelPad.GetSelText())
  {
    if (pSelText.match(/([.,])/))
    {
      pDelimiter=RegExp.$1;

      if (pLinesArray=pSelText.split(pDelimiter))
      {
        for (nIndex=pLinesArray.length - 1; nIndex >= 0; --nIndex)
        {
          pLinesArray[nIndex]=parseInt(pLinesArray[nIndex]) + 1;
          pLinesArray[nIndex]="" + pLinesArray[nIndex];
          if (pLinesArray[nIndex].length <= 1)
            break;
          pLinesArray[nIndex]=0;
        }
        pSelText=pLinesArray.join(pDelimiter);
        AkelPad.ReplaceSel(pSelText, true);
      }
    }
  }
}



Last edited by Instructor on Fri Mar 25, 2011 4:54 pm; edited 3 times in total
Back to top
View user's profile Send private message Send e-mail
VladSh



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

PostPosted: Fri Apr 17, 2009 10:36 am    Post subject: UndoAllNoScroll.js Reply with quote

UndoAllNoScroll.js

Code:
///Undo all changes without scroll (4.x.x only)
///Отменяет все изменения без скролирования документа
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4537#4537
// Version: 2.3 (2012.07.31)

var hWndEdit = AkelPad.GetEditWnd();
var oSys = AkelPad.SystemFunction();

if (AkelPad.GetMainWnd() && hWndEdit
   && AkelPad.SendMessage(hWndEdit, 3075 /*AEM_CANUNDO*/, 0, 0)
   //&& AkelPad.SendMessage(hWndEdit, 3086 /*AEM_GETMODIFY*/, 0, 0)         //закоментил, т.к. иначе не работало, - на форуме были багрепорты
)
{
   SetRedraw(hWndEdit, false);
   AkelPad.SendMessage(hWndEdit, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, true)

   while (AkelPad.SendMessage(hWndEdit, 3075 /*AEM_CANUNDO*/, 0, 0)) {
      AkelPad.SendMessage(hWndEdit, 3077 /*AEM_UNDO*/, 0, 0)
   }
   
   AkelPad.SendMessage(hWndEdit, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, false);
   SetRedraw(hWndEdit, true);
}

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


От undoNoScroll.js сомнительная польза, т.к. при одной операции отмены нужно видеть, какое действие отменяешь, - переброска курсора как раз там очень полезна.

Данный скрипт сваял на основе скриптов, написанных Instructor'ом: UndoAll.js и undoNoScroll.js; часто его использую из-за удобства, особенно при работе с временными файлами, не сохраняемыми на диск.


Last edited by VladSh on Tue Jul 31, 2012 12:40 pm; edited 12 times in total
Back to top
View user's profile Send private message Visit poster's website
VladSh



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

PostPosted: Fri Apr 17, 2009 9:32 pm    Post subject: Reply with quote

URLOpen.js

Code:
///Open URL or Site
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4548#4548
// Version: 2.1 (2011.04.06)
//
// Arguments:   `"%u" "SiteFind" "Program"`
//               - SiteFind = 0      -   opened URL
//               - SiteFind = 1      -   opened Site

if (WScript.Arguments.length == 0) WScript.Quit();

var URL = WScript.Arguments(0);
//default values for this script:
var SiteOpen = 1;
var Program = 'rundll32.exe shell32, ShellExec_RunDLL';

if (WScript.Arguments.length > 1)
{
   SiteOpen = WScript.Arguments(1);
   if (WScript.Arguments.length == 3)
      Program = WScript.Arguments(2);
}

if (SiteOpen == "1")
{
   //определяем адрес сайта
   URL = URL.slice(0, URL.indexOf('/', URL.indexOf(':/', 0) + 3));
}

var WshShell = new ActiveXObject("WScript.Shell");
WshShell.Exec(Program + ' "' + URL + '"');


Конечно лучше бы вываливался список (а красивей была бы малюсенькая менюха) всех промежуточных вариантов путей как в Висте, но... пока нет метода ListBox сойдёт и так.


Примеры использования в моём контекстном меню (ссылок).


Last edited by VladSh on Thu Nov 17, 2011 3:00 pm; edited 7 times in total
Back to top
View user's profile Send private message Visit poster's website
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5289

PostPosted: Wed Apr 29, 2009 10:26 am    Post subject: Reply with quote

SaveDefault.js

Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4678#4678
// Version v1.0
//
//
//// Save new file to a default folder.

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

//Options
var pDefaultDir="C:\\MyFolder\\";
var pDefaultName="new";
var pDefaultExt=".txt";
var nDefaultCodePage=-1;
var bDefaultBOM=-1;

var hMainWnd=AkelPad.GetMainWnd();
var hEditWnd=AkelPad.GetEditWnd();
var pFile=AkelPad.GetEditFile(0);
var nFileCount;
var nSaveResult;

if (hMainWnd)
{
  if (pFile == "")
  {
    if (fso.FolderExists(pDefaultDir))
    {
      for (nFileCount=1; ; ++nFileCount)
      {
        pFile="" + pDefaultDir + pDefaultName + nFileCount + pDefaultExt;

        if (!fso.FileExists(pFile))
        {
          if (nSaveResult=AkelPad.SaveFile(hEditWnd, pFile, nDefaultCodePage, bDefaultBOM))
            AkelPad.MessageBox(hMainWnd, "Error: " + nSaveResult, WScript.ScriptName, 16 /*MB_ICONERROR*/);
          break;
        }
      }
    }
    else AkelPad.MessageBox(hMainWnd, "Folder \"" + pDefaultDir + "\" doesn't exist", WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
  }
  else AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4105 /*IDM_FILE_SAVE*/, 0);
}



Last edited by Instructor on Fri Mar 25, 2011 4:59 pm; edited 3 times in total
Back to top
View user's profile Send private message Send e-mail
VladSh



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

PostPosted: Wed May 20, 2009 11:21 am    Post subject: Для тех, кто использует клиент Lotus Notes Reply with quote

CreateLNMemo.js

Code:
///Создание письма в клиенте Lotus Notes на основе открытого файла в текстовом редакторе AkelPad (2009.05.20)
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4873#4873
// Version: 1.10 (2013.11.21)   © VladSh

var WshShell = new ActiveXObject("WScript.Shell");
var LNAppHeader = "Lotus Notes";      //не изменять!
var APAppHeader = "AkelPad";      //не изменять!
var subject = "";
var content = "";
if (WScript.Arguments.length && WScript.Arguments(0)) {
   //Для файла из списка свежих
   var fso = new ActiveXObject("Scripting.FileSystemObject");
   if (fso.FileExists(WScript.Arguments(0)))
      content = AkelPad.ReadFile(WScript.Arguments(0));
   else {
      AkelPad.MessageBox(AkelPad.GetMainWnd(), "Файла '" + WScript.Arguments(0) + "' не существует на диске!", APAppHeader + " -> " + WScript.ScriptName, 48);
      WScript.Quit();
   }
   
   subject = getFileNameOnly(WScript.Arguments(0));
}
else {
   //Для файла, открытого в текущей вкладке
   var tmpSelStart = AkelPad.GetSelStart();
   content = AkelPad.GetSelText() || AkelPad.GetTextRange(0, -1);
   AkelPad.SetSel(tmpSelStart, tmpSelStart);
   
   subject = getFileNameOnly(AkelPad.GetEditFile(0)) || (content.slice(0, content.indexOf("\r"))).replace(/\/\/\//, "");      //Если файл не сохранён, то для темы письма берём его первую строку
}

if (startNotes()) {
   var errText = createNotesMemo(subject, content);
   if (errText) {
      WshShell.AppActivate(APAppHeader);
      AkelPad.MessageBox(AkelPad.GetMainWnd(), errText, APAppHeader + " -> " + WScript.ScriptName, 48);
   }
}


/* ===== FUNCTIONS ===== */

function getFileNameOnly(fileNameFull) {
   return fileNameFull.slice(fileNameFull.lastIndexOf("\\") + 1, fileNameFull.lastIndexOf("."));
}


function startNotes() {
   var LN_PROCNAME = "nlnotes.exe";
   
   if (isProcessRunning(LN_PROCNAME) == 0) {
      //Запуск клиента Lotus в стандартном режиме (с возможностью смены пользователя при загрузке)
      
      var pathLN_app = regGetStringValue(0x80000002   /* HKEY_LOCAL_MACHINE */, "Software\\Lotus\\Notes\\", "Path");
      if (pathLN_app == null) {
         AkelPad.MessageBox(AkelPad.GetMainWnd(), "Приложение ''" + LNAppHeader + "'' не зарегистрировано в реестре Windows!", APAppHeader + " -> " + WScript.ScriptName, 48);
         WScript.Quit();
      }
      var pathLN_ini = regGetStringValue(0x80000001   /* HKEY_CURRENT_USER */, "Software\\Lotus\\Notes\\Installer", "VDIR_INI") || pathLN_app;
      
/*
      var oWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2");
      var oClass = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2:Win32_Process");
      var oStartup = oWMIService.Get("Win32_ProcessStartup");
      var oConfig = oStartup.SpawnInstance_();
      oConfig.ShowWindow = 3      //максимизированное окно
      var PID = "";
      var res = oClass.Create('"' + pathLN_app + '\\notes.exe" "=' + pathLN_ini + '\\notes.ini"', null, oConfig, PID);
      if (res != 0) {
         AkelPad.MessageBox(AkelPad.GetMainWnd(), "Код ошибки запуска: " + res, APAppHeader + " -> " + WScript.ScriptName, 48);
         WScript.Quit();
      }
*/
      var oLNExec = WshShell.Exec('"' + pathLN_app + '\\notes.exe" "=' + pathLN_ini + '\\notes.ini"');
      //Даём инициализироваться и запуститься животному
      while (oLNExec.Status == 0)
         WScript.Sleep(100);
      
      //Ждём, пока пользователь не введёт пароль
      while (isProcessRunning("nfileret.exe") == 1)
         WScript.Sleep(100);
      
      //Обрабатываем ситуацию, когда пользователь выбрал выход из Lotus Notes
      WScript.Sleep(400);      //Даём животинке полностью выгрузится
      if (isProcessRunning(LN_PROCNAME) != 0)
         return true;
      else
         return false;
   }
   else
      return true;
}


function isProcessRunning(processName) {
   var oWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2");
   var colProcesses = oWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '" + processName + "'");
   return colProcesses.Count;
}


function createNotesMemo(subject, content) {
   var ns = new ActiveXObject("Notes.NotesSession");
   
   var IN_MAILSERVER = "MailServer";
   var IN_MAILFILE = "MailFile";
   var mailServer;
   var mailFile;
   var locationName = ns.GetEnvironmentString("Location", true);
   if (locationName) {      //Определение пути к mail-базе из текущего локейшена
      var pathAB = ns.GetEnvironmentString("NAMES", true) || "names.nsf";
      var ndbAB = ns.GetDatabase("", pathAB, false);
      if (ndbAB != null) {
         var nvLocations = ndbAB.GetView("Locations");
         if (nvLocations != null) {
            locationName = locationName.split(",")[0];
            var ndLocation = nvLocations.GetDocumentByKey(locationName, true);
            if (ndLocation != null) {
               mailServer = ndLocation.GetFirstItem(IN_MAILSERVER).Text;
               mailFile = ndLocation.GetFirstItem(IN_MAILFILE).Text;
            }
         }
      }
   }
   if (!mailFile) {      //Вычитка пути к mail-базе напрямую из notes.ini
      mailServer = ns.GetEnvironmentString(IN_MAILSERVER, true);
      mailFile = ns.GetEnvironmentString(IN_MAILFILE, true);
   }
   
   var ndbMail = ns.GetDatabase(mailServer, mailFile);
   if (ndbMail.IsOpen == true) {
      var ndMemo = ndbMail.CreateDocument();
      ndMemo.ReplaceItemValue("Form", "Memo");
      ndMemo.ReplaceItemValue("Subject", subject);
      var nrtiBody = ndMemo.CreateRichTextItem("Body");
      nrtiBody.AppendText(content);
      nrtiBody.GetFormattedText(false, 1);                           //Ставшие привычными танцы с бубном :-)
      
      //Открываем созданное письмо
      var nuiws = new ActiveXObject("Notes.NotesUIWorkspace");
      nuiws.EditDocument(true, ndMemo);
      
      //Выводим окно Lotus Notes на передний план
      if (ns.NotesBuildVersion >= 400)
         LNAppHeader = "IBM Notes";
      WshShell.AppActivate(LNAppHeader);
      return "";
   }
   else
      return "Почтовая база выбранного пользователя " + mailServer + "!!" + mailFile + " не может быть открыта! Проверьте настройки подключения и текущее место вызова.";
}


function regGetStringValue(hKey, sKey, sParam) {
   var oWMIReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\default:StdRegProv");
   
   oMethod = oWMIReg.Methods_.Item("GetStringValue");
   oInParam = oMethod.InParameters.SpawnInstance_();
   oInParam.hDefKey = hKey;
   oInParam.sSubKeyName = sKey;
   oInParam.sValueName = sParam;
   
   oOutParam = oWMIReg.ExecMethod_(oMethod.Name, oInParam);
   
   return oOutParam.sValue;      //Если параметр не найден, то возвращает null, в отличие от WshShell.RegRead(), которая генерит ошибку
}


Удобно отправить какой-нить файлик другу (я часто приколы или цитаты в текстовых файлах собираю) Very Happy

Посадил на комбинацию клавиш Ctrl+M, точно, как в Lotus Notes Cool


Last edited by VladSh on Thu Nov 21, 2013 7:15 pm; edited 10 times in total
Back to top
View user's profile Send private message Visit poster's website
VladSh



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

PostPosted: Fri May 22, 2009 2:25 pm    Post subject: делаем перевод строки более интеллектуальным :-) Reply with quote

CreateSubParagraph.js

Code:
///Создание новой строки с отступом и существующим типом пункта; поддерживается последовательная нумерация строк
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4890#4890
// Version: 4.6 (2011.07.19)

if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();
oCh.runWithRedraw();

function process()
{
   var nCursor = AkelPad.GetSelEnd();
   oCh.setCompleteLineRange(nCursor, nCursor);
   
   var nonNullIndex = oCh.Text.lastIndexOf(oStr.trim(oCh.Text, " \t"));      //индекс первого значащего символа
   var shiftExistent = oCh.Text.slice(0, nonNullIndex);      //отступ 1-го значащего символа от начала строки
   
   var nShiftStart = oCh.Text.indexOf(" ", nonNullIndex) || oCh.Text.indexOf("\t", nonNullIndex);      //индекс начала отступа текста от пункта
   var pSymbol = oCh.Text.slice(nonNullIndex, nShiftStart);      //символ пункта
   
   nCursor = nCursor - oCh.rResult[0];
   if (nCursor < nShiftStart) nCursor = nShiftStart;
   
   var pTextLeft = oCh.Text.substr(0, nCursor);      //часть текста до курсора (остаётся на текущей строке)
   var pTextRight = oStr.ltrim(oCh.Text.substr(nCursor), " \t");      //часть текста после курсора (переводится в новую строку)
   
   var shiftAfterSymbol = "";
   if (pSymbol.length <= 5)
   {
      shiftAfterSymbol = oCh.Text.slice(nShiftStart);
      if (oStr.trim(shiftAfterSymbol, " \t"))      //если в строке после символа пункта что-то есть
      {
         var nShiftEnd = oCh.Text.indexOf(oStr.trim(shiftAfterSymbol, " \t"), nShiftStart);
         shiftAfterSymbol = oCh.Text.slice(nShiftStart, nShiftEnd);      //отступ между символом пункта и текстом
      }
   }
   else
      pSymbol = "";
   
   var pNumber = parseInt(pSymbol);
   if (!isNaN(pNumber))
   {
      pSymbol = pSymbol.replace(new RegExp(pNumber), "");
      pSymbol = (pNumber + 1) + pSymbol;
   }
   
   oCh.Text = pTextLeft + pBreak + shiftExistent + pSymbol + shiftAfterSymbol + pTextRight;

   oCh.setSelCaret(oCh.rResult[0] + oCh.Text.length);      //ставим каретку после вставленного текста
}


Пример 1:
Code:
   - Текст
результат:
Code:
   - Текст
   - |

Пример 2:
Code:
   Текст
результат:
Code:
   Текст
   |

Пример 3:
Code:
* |
результат:
Code:
*
* |

Пример 4:
Code:
Текст
результат:
Code:
Текст
|

Пример 5:
Code:
|
результат:
Code:

|

Пример 6:
Code:
   4. Текст4|
результат:
Code:
   4. Текст4
   5. |

Пример 7:
Code:
   4). Очень хороший |текст
результат:
Code:
   4). Очень хороший
   5). текст|

Посадил этот скрипт на комбинацию клавиш Shift+Enter через HotKeys-плагин, по аналогии тому, как советовал Instructor.
Бомба!


RecalcLineNumbers.js

Code:
///Recalculation of line numbers
///Перепросчёт номеров строк
// - начиная с той, на которой установлен курсор
// - либо чисто в выделенных строках (нужно для подблоков нумерации)
//
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4890#4890
// Version: 1.0 (2011.07.19)
//
// предлагаемая комбинация клавиш: Alt + Shift + N

//Oбразцы, с которыми будем сравнивать все последующие строки
var nonNullIndexBase;      //индекс первого значащего символа
var pSymbolBase;            //символы, которые идут сразу за числом
var pNumberBase;            //счётчик

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

oCh.runWithRedraw();


function process()
{
   var nSelStart = AkelPad.GetSelStart();
   if (nSelStart == AkelPad.GetSelEnd())
      oCh.setCompleteLineRange(nSelStart, -2);      //берём текст от строки, на которой стоит курсор и до конца файла
   else
      oCh.setCompleteLineRange(nSelStart, AkelPad.GetSelEnd());
   
   oCh.Text = processRowText(oCh.Text, pBreak);
}


function processString(s)
{
   //code modify the string s...
   var pResult;      //строка, в которую записываем результат
   
   var nonNullIndex = s.lastIndexOf(oStr.trim(s, " \t"));
   if (nonNullIndexBase == undefined) nonNullIndexBase = nonNullIndex;
   
   if (nonNullIndex == nonNullIndexBase)
   {
      var shiftExistent = s.slice(0, nonNullIndex);      //отступ 1-го значащего символа от начала строки
      
      var nShiftStart = s.indexOf(" ", nonNullIndex) || s.indexOf("\t", nonNullIndex);      //индекс начала отступа текста от пункта
      
      var pSymbol = s.slice(nonNullIndex, nShiftStart);      //символ пункта
      
      if (pSymbol.length <= 5)
      {
         var pNumber = parseInt(pSymbol);
         if (!isNaN(pNumber))
         {
            pSymbol = pSymbol.replace(new RegExp(pNumber), "");
            if (pSymbol)
            {
               if (!pSymbolBase) pSymbolBase = pSymbol;
               
               if (pSymbol == pSymbolBase)
               {
                  if (pNumberBase) pNumberBase += 1; else pNumberBase = pNumber;
                  
                  pSymbol = pNumberBase + pSymbol;
                  var pRowText = s.slice(nShiftStart);      //текст от от начала отступа текста
                  
                  pResult = shiftExistent + pSymbol + pRowText;
               }
            }
         }
      }
   }
   
   if (!pResult) pResult = s;
   return pResult;
}

function addToResult(arrOutput, vResult)
{
   arrOutput[arrOutput.length] = vResult;
}

N.B. Скрипт использует ProcessRowText.js.


Both scripts used selCompleteLine.js.


Last edited by VladSh on Wed Oct 19, 2011 4:31 pm; edited 18 times in total
Back to top
View user's profile Send private message Visit poster's website
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5289

PostPosted: Mon Jul 13, 2009 4:56 am    Post subject: Reply with quote

PrintAll.js

Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=5163#5163
// Version v1.4
//
//
//// Print all MDI documents.
//
// Arguments:
// -FromPage=1     -Print from first page (default is 0).
// -ToPage=4       -Print to fourth page (default is 0).
// -Copies=2       -Print two copies (default is 1).
// -Collate=false  -Collate copies (default is true).
// -AddFlags=0x0   -Additional print flags (default is 0x0). See PRINTDLG.Flags in MSDN.
//
// Examples:
// -"Print all" Call("Scripts::Main", 1, "PrintAll.js")
// -"Print all (only first page)" Call("Scripts::Main", 1, "PrintAll.js", `-FromPage=1 -ToPage=1`)

//Arguments
var nFromPage=AkelPad.GetArgValue("FromPage", 0);
var nToPage=AkelPad.GetArgValue("ToPage", 0);
var nCopies=AkelPad.GetArgValue("Copies", 1);
var bCollate=AkelPad.GetArgValue("Collate", true);
var dwAddFlags=AkelPad.GetArgValue("AddFlags", 0x0);

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var lpFrameInit;
var lpFrameCur;

if (hWndEdit)
{
  //Initial MDI frame
  lpFrameInit=AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
  lpFrameCur=lpFrameInit;

  for (;;)
  {
    if ((nFromPage != 0 && nToPage != 0) || nCopies > 1 || dwAddFlags)
      SetPrintSettings(nFromPage, nToPage, nCopies, bCollate, dwAddFlags);

    if (lpFrameCur == lpFrameInit)
    {
      if (!AkelPad.Command(4108 /*IDM_FILE_PRINT*/))
        break;
    }
    else
    {
      if (!AkelPad.Command(4113 /*IDM_FILE_SILENTPRINT*/))
        break;
    }

    //Next MDI frame
    lpFrameCur=AkelPad.Command(4316 /*IDM_WINDOW_FRAMENEXT*/);
    if (!lpFrameCur || lpFrameCur == lpFrameInit)
      break;
  }
}

function SetPrintSettings(nFromPage, nToPage, nCopies, bCollate, dwAddFlags)
{
  var lpPrintInfo;
  var dwPrintFlags;

  if (lpPrintInfo=AkelPad.MemAlloc(_X64?56:44 /*sizeof(PRINTINFO)*/))
  {
    AkelPad.SendMessage(hMainWnd, 1215 /*AKD_GETPRINTINFO*/, lpPrintInfo, 0);
    dwPrintFlags=AkelPad.MemRead(lpPrintInfo + (_X64?24:12) /*offsetof(PRINTINFO, dwPrintFlags)*/, 3 /*DT_DWORD*/);
    if (nFromPage != 0 && nToPage != 0)
    {
      dwPrintFlags|=0x2 /*PD_PAGENUMS*/;
      AkelPad.MemCopy(lpPrintInfo + (_X64?28:16) /*offsetof(PRINTINFO, nFromPage)*/, nFromPage, 4 /*DT_WORD*/);
      AkelPad.MemCopy(lpPrintInfo + (_X64?30:18) /*offsetof(PRINTINFO, nToPage)*/, nToPage, 4 /*DT_WORD*/);
    }
    if (nCopies > 1)
    {
      AkelPad.MemCopy(lpPrintInfo + (_X64?32:20) /*offsetof(PRINTINFO, nCopies)*/, nCopies, 4 /*DT_WORD*/);
      if (bCollate)
        dwPrintFlags|=0x10 /*PD_COLLATE*/;
      else
        dwPrintFlags&=~0x10 /*PD_COLLATE*/;
    }
    if (dwAddFlags)
    {
      dwPrintFlags|=dwAddFlags;
    }
    AkelPad.MemCopy(lpPrintInfo + (_X64?24:12) /*offsetof(PRINTINFO, dwPrintFlags)*/, dwPrintFlags, 3 /*DT_DWORD*/);
    AkelPad.SendMessage(hMainWnd, 1216 /*AKD_SETPRINTINFO*/, lpPrintInfo, 0);
    AkelPad.MemFree(lpPrintInfo);
  }
}



Last edited by Instructor on Sat Feb 22, 2014 6:18 am; edited 7 times in total
Back to top
View user's profile Send private message Send e-mail
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5289

PostPosted: Sat Sep 05, 2009 3:39 pm    Post subject: Reply with quote

OpenEveryLine.js

Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=5464#5464
// Version v1.1
//
//
//// One line - one file. Open all selected lines.

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

var pSelText;
var nIndex;

if (pSelText=AkelPad.GetSelText())
{
  if (pLinesArray=pSelText.split("\r"))
  {
    for (nIndex=0; nIndex < pLinesArray.length; ++nIndex)
    {
      if (pLinesArray[nIndex])
      {
        WshShell.Run(pLinesArray[nIndex], 1, false);
      }
    }
  }
}



OpenFileList.js

Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=5464#5464
// Version v1.0
//
//
//// Open files in file list.
//
// Arguments:
// -FileList="files.lst"
//
// Usage:
// Call("Scripts::Main", 1, "OpenFileList.js", `-FileList="C:\MyFiles.txt"`)

var pFileList=AkelPad.GetArgValue("FileList", "");

OpenFilesInFileList(pFileList);

function OpenFilesInFileList(pFileList)
{
  var pFilesText;
  var nIndex;

  if (pFileList)
  {
    if (pFilesText=AkelPad.ReadFile(pFileList))
    {
      pFilesText=pFilesText.replace(/\r\r\n|\r\n|\r|\n/g, "\n");
      if (pLinesArray=pFilesText.split("\n"))
      {
        for (nIndex=0; nIndex < pLinesArray.length; ++nIndex)
        {
          if (pLinesArray[nIndex])
          {
            AkelPad.OpenFile(pLinesArray[nIndex]);
          }
        }
      }
    }
  }
}



DeleteLastChar.js

Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=5464#5464
// Version v1.0
//
//
//// Delete last character in selected lines.

var hWndEdit=AkelPad.GetEditWnd();
var oSys=AkelPad.SystemFunction();
var pSelText;
var pLinesArray;
var nIndex;

if (pSelText=AkelPad.GetSelText())
{
  if (pLinesArray=pSelText.split("\r"))
  {
    for (nIndex=0; nIndex < pLinesArray.length; ++nIndex)
      pLinesArray[nIndex]=pLinesArray[nIndex].substr(0, pLinesArray[nIndex].length - 1);
    pSelText=pLinesArray.join("\r");

    SetRedraw(hWndEdit, false);
    AkelPad.ReplaceSel(pSelText, true);
    SetRedraw(hWndEdit, true);
  }
}

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



Last edited by Instructor on Sat Aug 25, 2012 6:13 am; edited 7 times in total
Back to top
View user's profile Send private message Send e-mail
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 ... 16, 17, 18  Next
Page 3 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