├── AESCrypt.js
├── Include
├── jsBeautifier_tests.js
└── timer.js
├── README.md
├── TabsToSpaces_mod.js
├── adblockPlusChecksum.js
├── alignWithSpaces-en.png
├── alignWithSpaces-ru.png
├── alignWithSpaces.js
├── autoSaveSession.js
├── backupVersion.js
├── closeLeftOrRightTabs.js
├── closeUnsavedTabs.js
├── colorsConverter.js
├── convertEscapes.js
├── convertHTML.js
├── converter-en.png
├── converter-ru.png
├── converter.js
├── copyPath.js
├── crypt-en.png
├── crypt-ru.png
├── crypt.js
├── cryptExt-en.png
├── cryptExt-ru.png
├── cryptExt.js
├── decodeHTML.js
├── encodeHTML.js
├── executeScript.js
├── executeScript.vbs
├── forceCloneTab.js
├── forgetAboutTab.js
├── fullWindow.js
├── getHash-en.png
├── getHash-ru.png
├── getHash.js
├── getLinks.js
├── goToLongestLine-en.png
├── goToLongestLine-ru.png
├── goToLongestLine.js
├── highlighter.js
├── insertDateTemplateExample.js
├── insertEval.js
├── insertTag.js
├── jsBeautifier.js
├── measuresConverter-en.png
├── measuresConverter-ru.png
├── measuresConverter.js
├── moveResizeWindow-ru.png
├── moveResizeWindow.js
├── newFileTemplate-test.js
├── newFileTemplate.js
├── openFileIn-options.jsm
├── openFileIn.js
├── openRelativeFile.js
├── punctuationFixer.js
├── replaceDiacriticLetters.js
├── restart.js
├── runScript-en.png
├── runScript-ru.png
├── runScript.js
├── saveStoreTime.js
├── scriptToBookmarklet.js
├── scriptToBookmarklet_w2k.js
├── silentlyReloader.js
├── tabsNextPrevious.js
├── tabsRightLeft.js
├── tabsSwitchAlt.js
├── textStatistics.js
├── tileTabs.js
├── toggleComments.js
├── toggleToolbarRows-en-1.png
├── toggleToolbarRows-en-2.png
├── toggleToolbarRows-ru-1.png
├── toggleToolbarRows-ru-2.png
├── toggleToolbarRows.js
├── undoRedoAll.js
├── undoableReopen.js
├── unixTime.js
├── unixTime.png
└── winMergeTabs.js
/Include/timer.js:
--------------------------------------------------------------------------------
1 | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=24559#24559
2 | // http://infocatcher.ucoz.net/js/akelpad_scripts/Include/timer.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/Include/timer.js
4 |
5 | // (c) Infocatcher 2014
6 | // version 0.1.1 - 2014-04-22
7 |
8 | // Helper functions for user32::SetTimer()
9 | // Usage example:
10 | /*
11 | var hMainWnd = AkelPad.GetMainWnd();
12 | if(AkelPad.Include("timer.js")) {
13 | _log("Started");
14 | setTimeout(function() {
15 | _log("Finished");
16 | oSys.Call("user32::PostQuitMessage", 0);
17 | }, 2000);
18 | AkelPad.ScriptNoMutex();
19 | AkelPad.WindowGetMessage();
20 | }
21 | function _log(s) {
22 | oSys.Call("user32::SetWindowText" + _TCHAR, hMainWnd, WScript.ScriptName + ": " + s);
23 | }
24 | */
25 |
26 | // Be careful: 3rd argument is an ID of already created timer!
27 | function setTimeout(fn, delay, id) {
28 | return timers.set(fn, delay, true, id);
29 | }
30 | function setInterval(fn, delay, id) {
31 | return timers.set(fn, delay, false, id);
32 | }
33 | function clearTimeout(id) {
34 | timers.clear(id);
35 | }
36 | function clearInterval(id) {
37 | timers.clear(id);
38 | }
39 |
40 | if(!hMainWnd)
41 | var hMainWnd = AkelPad.GetMainWnd();
42 | if(!oSys)
43 | var oSys = AkelPad.SystemFunction();
44 |
45 | var timers = {
46 | _id: 1000,
47 | getId: function() {
48 | return AkelPad.SendMessage(hMainWnd, 1319 /*AKD_UNIQUEID*/, 0, 0) // AkelPad 4.8.8+
49 | || ++this._id;
50 | },
51 | funcs: {}, // IDs of all timers
52 | timeouts: {}, // IDs of single-time timers
53 | lpTimerCallback: 0,
54 | init: function() {
55 | if(!this.lpTimerCallback) try { // AkelPad 4.8.8+
56 | this.lpTimerCallback = oSys.RegisterCallback(timerProc);
57 | }
58 | catch(e) {
59 | this.lpTimerCallback = oSys.RegisterCallback("", timerProc, timerProc.length);
60 | }
61 | this.hWndTimer = AkelPad.ScriptHandle(0, 17 /*SH_GETSERVICEWINDOW*/) || hMainWnd;
62 | return this.lpTimerCallback;
63 | },
64 | destroy: function() {
65 | if(!this.lpTimerCallback)
66 | return;
67 | for(var id in this.funcs)
68 | this._clear(id);
69 | oSys.UnregisterCallback(this.lpTimerCallback);
70 | this.lpTimerCallback = 0;
71 | this._log("destroy");
72 | },
73 | has: function() {
74 | for(var id in this.funcs)
75 | return true;
76 | return false;
77 | },
78 | set: function(fn, delay, isSingle, id) {
79 | if(!this.init()) {
80 | AkelPad.MessageBox(hMainWnd, "oSys.RegisterCallback() failed!", WScript.ScriptName, 16 /*MB_ICONERROR*/);
81 | return 0;
82 | }
83 | if(!id)
84 | id = this.getId();
85 | this.funcs[id] = fn;
86 | if(isSingle)
87 | this.timeouts[id] = true;
88 | this._log("set(" + isSingle + ") " + id);
89 | oSys.Call("user32::SetTimer", this.hWndTimer, id, delay, this.lpTimerCallback);
90 | return id;
91 | },
92 | clear: function(id, isSingle) {
93 | this._clear(id);
94 | if(!this.has())
95 | this.destroy();
96 | },
97 | _clear: function(id) {
98 | this._log("_clear(" + id + ")");
99 | oSys.Call("user32::KillTimer", this.hWndTimer, id);
100 | delete this.funcs[id];
101 | delete this.timeouts[id];
102 | },
103 | _prev: [],
104 | _log: function(s) {
105 | return; // disable logs
106 | var prev = this._prev;
107 | var last = prev[prev.length - 1];
108 | RegExp.$1 = 0;
109 | if(last && s == last.replace(/ #(\d+)$/, ""))
110 | prev[prev.length - 1] = s + " #" + ((+RegExp.$1 || 1) + 1);
111 | else {
112 | while(prev.length > 8)
113 | prev.shift();
114 | prev.push(s);
115 | }
116 | s = prev.join(" -> ");
117 | oSys.Call("user32::SetWindowText" + _TCHAR, hMainWnd, WScript.ScriptName + ": " + s);
118 | }
119 | };
120 |
121 | function timerProc(hWnd, uMsg, nIDEvent, dwTime) {
122 | var fn = timers.funcs[nIDEvent];
123 | if(timers.timeouts[nIDEvent])
124 | timers.clear(nIDEvent);
125 | fn();
126 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Scripts for AkelPad text editor with Scripts plugin.
2 |
Also see Scripts collection forum thread.
3 |
License for all scripts: BSD (like for AkelPad itself).
4 |
5 | #### Scripts in alphabetical order
6 |
7 | ##### [Include/jsBeautifier_tests.js](Include/jsBeautifier_tests.js)
8 | Tests part of jsBeautifier.js (not required for regular usage)
9 |
10 | ##### [Include/timer.js](Include/timer.js)
11 | Helper functions for user32::SetTimer()
12 |
13 | ##### [adblockPlusChecksum.js](adblockPlusChecksum.js)
14 | Adds checksum to Adblock Plus subscription
15 |
16 | ##### [AESCrypt.js](AESCrypt.js)
17 | Encrypt/decrypt text using AES-256
18 |
[see crypt.js and cryptExt.js]
19 |
20 | ##### [alignWithSpaces.js](alignWithSpaces.js)
21 | Align selected code with spaces to user defined string
22 |
23 |
24 | ##### [autoSaveSession.js](autoSaveSession.js)
25 | Automatically saves current session after selection or scroll changes
26 |
27 | ##### [backupVersion.js](backupVersion.js)
28 | Tries find file version and copy current file to the same directory:
29 | ```
30 | file.js -> file-%version%.js
31 | file.user.js -> file-%version%.user.js
32 | ```
33 |
34 | ##### [closeLeftOrRightTabs.js](closeLeftOrRightTabs.js)
35 | Close tabs to the left or right (temporary check “Switch tabs: right-left” option)
36 |
37 | ##### [closeUnsavedTabs.js](closeUnsavedTabs.js)
38 | Close unsaved tabs (all or only empty)
39 |
40 | Context menu example:
41 | ```
42 | "CLOSE"
43 | {
44 | "Other" Command(4320)
45 | -"To the left" Call("Scripts::Main", 1, "closeLeftOrRightTabs.js", "-left")
46 | -"To the right" Call("Scripts::Main", 1, "closeLeftOrRightTabs.js")
47 | SEPARATOR
48 | -"Empty unsaved" Call("Scripts::Main", 1, "closeUnsavedTabs.js", "-onlyEmpty=true -askToSave=false -closeCurrent=true")
49 | -"All unsaved" Call("Scripts::Main", 1, "closeUnsavedTabs.js", "-onlyEmpty=false -askToSave=true -closeCurrent=true -stopOnCancel=false")
50 | SEPARATOR
51 | "All" Command(4319)
52 | "All unchanged" Command(4321)
53 | }
54 | ```
55 |
56 | ##### [colorsConverter.js](colorsConverter.js)
57 | Convert color between “#fee” and “rgb(255, 238, 238)” formats
58 |
59 | ##### [converter.js](converter.js)
60 | * Encode/decode HTML entities (& <=> &)
61 | * Convert JavaScript escape sequences like "\u00a9" or "\xa9" (“©” symbol)
62 | * Escape/unescape special RegExp symbols
63 | * Escape/unescape special strings symbols
64 | * Encode/decode Uniform Resource Identifiers (URIs)
65 | * Hexadecimal escape/unescape
66 | * Base64 encode/decode
67 | * Convert charset
68 |
69 |
70 | ##### [convertEscapes.js](convertEscapes.js)
71 | Converts JavaScript escape sequences like "\u00a9" or "\xa9" (“©” symbol)
72 |
[see converter.js]
73 |
74 | ##### [convertHTML.js](convertHTML.js)
75 | Encode/decode HTML entities (& <=> &)
76 |
[see converter.js]
77 |
78 | ##### [copyPath.js](copyPath.js)
79 | Copy path to file in configurable format
80 |
81 | ##### [crypt.js](crypt.js)
82 | Encrypt/decrypt text using AES-256 or/and Blowfish
83 |
84 |
[see cryptExt.js]
85 |
86 | ##### [cryptExt.js](cryptExt.js)
87 | Encrypt/decrypt text using AES-256/Blowfish/Twofish/Serpent
88 |
89 |
90 | ##### [decodeHTML.js](decodeHTML.js)
91 | Decode HTML entities (& => &)
92 |
[see convertHTML.js and converter.js]
93 |
94 | ##### [encodeHTML.js](encodeHTML.js)
95 | Encode HTML entities (& => &)
96 |
[see convertHTML.js and converter.js]
97 |
98 | ##### [executeScript.js](executeScript.js)
99 | \+ [executeScript.vbs](executeScript.vbs)
100 |
Execute selected or all code
101 |
102 | ##### [forceCloneTab.js](forceCloneTab.js)
103 | Force clone tab (even if "Single open file" is turned on)
104 |
105 | ##### [forgetAboutTab.js](forgetAboutTab.js)
106 | Close current tab and remove information about it from recent files
107 |
108 | ##### [fullWindow.js](fullWindow.js)
109 | Just like full screen mode, but preserve window size and position
110 |
111 | ##### [getHash.js](getHash.js)
112 | Calculates hash sum of text
113 |
114 |
115 | ##### [getLinks.js](getLinks.js)
116 | Tries to extract links from any text
117 |
118 | ##### [goToLongestLine.js](goToLongestLine.js)
119 | Go to longest line below or above current
120 |
121 |
122 | ##### [highlighter.js](highlighter.js)
123 | Allow set extension manually for Coder plugin with basic autodetection
124 |
125 | ##### [insertDateTemplateExample.js](insertDateTemplateExample.js)
126 | Insert current date
127 |
128 | ##### [insertEval.js](insertEval.js)
129 | Script like built-in Calculator.js
130 |
131 | ##### [insertTag.js](insertTag.js)
132 | Simplify tags insertion
133 |
134 | ##### [jsBeautifier.js](jsBeautifier.js)
135 | JavaScript unpacker and beautifier
136 |
Also see Include/jsBeautifier_tests.js to run internal tests using `-test` argument
137 |
138 | ##### [measuresConverter.js](measuresConverter.js)
139 | Convert measures (internal) and currency (used cached data from exchange-rates.org, fxexchangerate.com and bitcoincharts.com)
140 |
141 |
142 | ##### [moveResizeWindow.js](moveResizeWindow.js)
143 | Move or/and align AkelPad's main window
144 |
145 | ##### [newFileTemplate.js](newFileTemplate.js)
146 | \+ [newFileTemplate-test.js](newFileTemplate-test.js)
147 |
Create new file from template
148 |
149 | ##### [openFileIn.js](openFileIn.js)
150 | Example for open file in other application
151 |
152 | ##### [openRelativeFile.js](openRelativeFile.js)
153 | Tries to open file with relative path (will be used system association to open binary files).
154 |
Supports Mozilla's chrome.manifest files.
155 |
156 | ##### [punctuationFixer.js](punctuationFixer.js)
157 | Fix some issues in Russian punctuation
158 |
159 | ##### [replaceDiacriticLetters.js](replaceDiacriticLetters.js)
160 | Replace diacritic letters with “simple” latin characters
161 |
162 | ##### [restart.js](restart.js)
163 | Restart AkelPad
164 |
165 | ##### [runScript.js](runScript.js)
166 | Run script from AkelFiles\Plugs\Scripts\ directory with arguments
167 |
168 |
169 | ##### [saveStoreTime.js](saveStoreTime.js)
170 | Temporary check “save file time” option and save current document
171 |
172 | ##### [scriptToBookmarklet.js](scriptToBookmarklet.js)
173 | \+ [scriptToBookmarklet_w2k.js](scriptToBookmarklet_w2k.js)
174 |
Convert JavaScript code to one line bookmarklet (javascript: ...).
175 |
176 | ##### [tabsNextPrevious.js](tabsNextPrevious.js)
177 | Switch between tabs in order of them usage (temporary check “Switch tabs: next-previous” option)
178 |
179 | ##### [tabsRightLeft.js](tabsRightLeft.js)
180 | Switch between tabs in order of them arrangement (temporary check “Switch tabs: right-left” option)
181 |
182 | ##### [tabsSwitchAlt.js](tabsSwitchAlt.js)
183 | Switch between tabs using alternative way (temporary check “Switch tabs: right-left” or “Switch tabs: next-previous” option)
184 |
185 | ##### [TabsToSpaces_mod.js](TabsToSpaces_mod.js)
186 | Convert tabulation to space, modified version of TabsToSpaces.js
187 |
188 | ##### [textStatistics.js](textStatistics.js)
189 | Provide some statistic for English and Russian texts
190 |
191 | ##### [tileTabs.js](tileTabs.js)
192 | Tile current tab with next selected: select first tab, call script and then select second tab
193 |
194 | ##### [toggleComments.js](toggleComments.js)
195 | Adds/removes comments
196 |
197 | ##### [toggleToolbarRows.js](toggleToolbarRows.js)
198 | Toggle multiline toolbar from ToolBar plugin (convert `BREAK` <-> `#BREAK`)
199 |
200 |
201 |
202 |
203 |
204 | ##### [undoableReopen.js](undoableReopen.js)
205 | Reopen file and preserve undo/redo buffer (just replace all text, if it was changed)
206 |
207 | ##### [undoRedoAll.js](undoRedoAll.js)
208 | Undo/redo all changes (or undo/redo to saved state)
209 |
210 | ##### [unixTime.js](unixTime.js)
211 | Convert Unix time
212 |
213 |
214 | ##### [winMergeTabs.js](winMergeTabs.js)
215 | Compare contents of current and next selected tab using WinMerge or any other compare tool
--------------------------------------------------------------------------------
/TabsToSpaces_mod.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=7081#p7081
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/TabsToSpaces_mod.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/TabsToSpaces_mod.js
4 |
5 | //// Convert tabulation to space for AkelPad 4.x.x
6 |
7 | // Modified by Infocatcher
8 | // Version: 2010-12-29
9 | // Author: Shengalts Aleksander aka Instructor, Infocatcher
10 |
11 | var hMainWnd=AkelPad.GetMainWnd();
12 | var hWndEdit=AkelPad.GetEditWnd();
13 | var oSys=AkelPad.SystemFunction();
14 | var pScriptName=WScript.ScriptName;
15 | var pSelText;
16 | var pResult;
17 | var pSpaces;
18 | var nSelStart;
19 | var nSelEnd;
20 | var nTabStop;
21 | var nColumn;
22 | var nSpaceCount;
23 | var a;
24 | var b;
25 |
26 | if (hMainWnd)
27 | {
28 | if (AkelPad.IsAkelEdit())
29 | {
30 | nSelStart=AkelPad.GetSelStart();
31 | nSelEnd=AkelPad.GetSelEnd();
32 | if (nSelStart == nSelEnd)
33 | {
34 | //AkelPad.SetSel(0, -1);
35 | nSelStart = 0;
36 | nSelEnd = -1;
37 | pSelText = AkelPad.GetTextRange(0, -1);
38 | }
39 | else
40 | {
41 | //SelCompleteLine(hWndEdit, nSelStart, nSelEnd);
42 | var sel = GetCompleteLine(hWndEdit, nSelStart, nSelEnd);
43 | nSelStart = sel[0];
44 | nSelEnd = sel[1];
45 | pSelText = AkelPad.GetTextRange(nSelStart, nSelEnd);
46 | }
47 | //nSelStart=AkelPad.GetSelStart();
48 | //nSelEnd=AkelPad.GetSelEnd();
49 | //pSelText=AkelPad.GetSelText();
50 |
51 | nTabStop=AkelPad.SendMessage(hWndEdit, 3239 /*AEM_GETTABSTOP*/, 0, 0);
52 | pResult="";
53 |
54 | if (pSelText.indexOf("\t") == -1)
55 | {
56 | pResult = pSelText.replace(
57 | new RegExp("^( {" + nTabStop + "})+", "mg"),
58 | function(s)
59 | {
60 | return new Array(s.length/nTabStop + 1).join("\t");
61 | }
62 | );
63 | }
64 | else
65 | {
66 | for (a=0, b=0, nColumn=0; b < pSelText.length; ++b)
67 | {
68 | if (pSelText.charAt(b) == '\t')
69 | {
70 | nSpaceCount=nTabStop - nColumn % nTabStop;
71 | nColumn+=nSpaceCount;
72 | for (pSpaces=""; nSpaceCount; --nSpaceCount)
73 | pSpaces=pSpaces + " ";
74 | pResult=pResult + pSelText.substr(a, b - a) + pSpaces;
75 | a=b + 1;
76 | }
77 | else if (pSelText.charAt(b) == '\r')
78 | nColumn=0;
79 | else
80 | ++nColumn;
81 | }
82 | pResult=pResult + pSelText.substr(a, b - a);
83 | }
84 |
85 | //AkelPad.ReplaceSel(pResult);
86 | insertNoScroll(pResult, nSelStart, nSelEnd);
87 | }
88 | }
89 |
90 |
91 | //Functions
92 | function GetCompleteLine(hWnd, nMinSel, nMaxSel)
93 | {
94 | var nMinLine;
95 | var nMaxLine;
96 | var nMinLineIndex;
97 | var nMaxLineIndex;
98 | var nMaxLineLength;
99 |
100 | if (nMinSel < nMaxSel)
101 | {
102 | nMinLine=AkelPad.SendMessage(hWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, nMinSel);
103 | nMaxLine=AkelPad.SendMessage(hWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, nMaxSel);
104 | nMinLineIndex=AkelPad.SendMessage(hWnd, 187 /*EM_LINEINDEX*/, nMinLine, 0);
105 | nMaxLineIndex=AkelPad.SendMessage(hWnd, 187 /*EM_LINEINDEX*/, nMaxLine, 0);
106 | nMaxLineLength=AkelPad.SendMessage(hWnd, 193 /*EM_LINELENGTH*/, nMaxSel, 0);
107 |
108 | if (nMaxLineIndex == nMaxSel) --nMaxLine;
109 | else if (nMaxLineLength) nMaxSel=nMaxLineIndex + nMaxLineLength + 1;
110 | nMinSel=nMinLineIndex;
111 |
112 | //AkelPad.SetSel(nMinSel, nMaxSel);
113 | //return nMaxLine - nMinLine + 1;
114 | return [nMinSel, nMaxSel];
115 | }
116 | //return 0;
117 | throw new Error("GetCompleteLine: nMinSel >= nMaxSel");
118 | }
119 | function insertNoScroll(str, nSelStart, nSelEnd) {
120 | var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
121 | if(!lpPoint)
122 | return;
123 | //var hWndEdit = AkelPad.GetEditWnd();
124 | setRedraw(hWndEdit, false);
125 | AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
126 |
127 | AkelPad.SetSel(nSelStart, nSelEnd);
128 | //var ss = AkelPad.GetSelStart();
129 | AkelPad.ReplaceSel(str, true);
130 | //if(ss != AkelPad.GetSelStart())
131 | // AkelPad.SetSel(ss, ss + str.length);
132 |
133 | AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
134 | setRedraw(hWndEdit, true);
135 | AkelPad.MemFree(lpPoint);
136 | }
137 | function setRedraw(hWnd, bRedraw) {
138 | AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
139 | bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
140 | }
--------------------------------------------------------------------------------
/adblockPlusChecksum.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=18306#p18306
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/adblockPlusChecksum.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/adblockPlusChecksum.js
4 |
5 | // (c) Infocatcher 2012
6 | // Version: 0.1.1 - 2012-06-09
7 | // Author: Infocatcher
8 |
9 | //// Adds checksum to Adblock Plus subscription
10 | // http://adblockplus.org/en/faq_internal#checksum
11 |
12 | // Dependencies:
13 | // getHash.js - https://akelpad.sourceforge.net/forum/viewtopic.php?p=11096#p11096
14 | // converter.js - https://akelpad.sourceforge.net/forum/viewtopic.php?p=11095#p11095
15 |
16 |
17 | var hMainWnd = AkelPad.GetMainWnd();
18 | var hWndEdit = AkelPad.GetEditWnd();
19 | var oSys = AkelPad.SystemFunction();
20 |
21 | var hashesArgs = {
22 | codePage: 65001 // UTF-8 for MD5
23 | };
24 | var convertersArgs = {
25 | codePageBase64: 28591 // ISO-8859-1 for base64
26 | };
27 |
28 | if(
29 | hMainWnd
30 | && hWndEdit
31 | && AkelPad.Include("..\\getHash.js")
32 | && AkelPad.Include("..\\converter.js")
33 | ) {
34 | if(typeof hashes == "undefined")
35 | AkelPad.MessageBox(hMainWnd, "Required getHash.js v.0.2.3 and higher", WScript.ScriptName, 16 /*MB_ICONERROR*/);
36 | else if(typeof converters == "undefined")
37 | AkelPad.MessageBox(hMainWnd, "Required converter.js v.0.2.3 and higher", WScript.ScriptName, 16 /*MB_ICONERROR*/);
38 | else
39 | addChecksum();
40 | }
41 |
42 | function _localize(s) {
43 | var strings = {
44 | "This is not a Adblock Plus subscription!": {
45 | ru: "Это не подписка для Adblock Plus!"
46 | },
47 | "Checksum already added!": {
48 | ru: "Контрольная сумма уже добавлена!"
49 | }
50 | };
51 | var lng = "en";
52 | switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
53 | case 0x19: lng = "ru";
54 | }
55 | _localize = function(s) {
56 | return strings[s] && strings[s][lng] || s;
57 | };
58 | return _localize(s);
59 | }
60 |
61 | function addChecksum() {
62 | // adblock_plus-2.0.3-sm+tb+fn+fx.xpi\modules\Synchronizer.jsm
63 | // function readFilters(subscription, text, errorCallback)
64 |
65 | // adblock_plus-2.0.3-sm+tb+fn+fx.xpi\modules\Utils.jsm
66 | // Checksum is an MD5 checksum (base64-encoded without the trailing "=") of
67 | // all lines in UTF-8 without the checksum line, joined with "\n".
68 |
69 | var text = AkelPad.GetTextRange(0, -1, 2 /*\n*/);
70 | if(!/^\[Adblock(\s*Plus\s*([\d\.]+)?)?\]\n/i.test(text)) {
71 | AkelPad.MessageBox(
72 | hMainWnd,
73 | _localize("This is not a Adblock Plus subscription!"),
74 | WScript.ScriptName,
75 | 48 /*MB_ICONEXCLAMATION*/
76 | );
77 | return;
78 | }
79 | if(/\n[ \t]*![ \t]*checksum[ \t:-]+([\w+\/=]+)\n/i.test(text)) {
80 | var oldChecksum = RegExp.$1;
81 | text = RegExp.leftContext + "\n" + RegExp.rightContext;
82 | var insPosStart = RegExp.leftContext.length + 1;
83 | var insPosEnd = RegExp.leftContext.length + RegExp.lastMatch.length - 1;
84 | var insNoNewLine = true;
85 | }
86 | var newChecksum = generateChecksum(text);
87 | if(oldChecksum && newChecksum == oldChecksum) {
88 | AkelPad.MessageBox(
89 | hMainWnd,
90 | _localize("Checksum already added!"),
91 | WScript.ScriptName,
92 | 64 /*MB_ICONINFORMATION*/
93 | );
94 | return;
95 | }
96 |
97 | if(!insPosStart && /^[^\n\r]*\n/.test(text))
98 | insPosStart = insPosEnd = RegExp.lastMatch.length - 1;
99 |
100 | setRedraw(hWndEdit, false);
101 | AkelPad.SetSel(insPosStart, insPosEnd);
102 | AkelPad.ReplaceSel((insNoNewLine ? "" : "\n") + "! Checksum: " + newChecksum);
103 | setRedraw(hWndEdit, true);
104 | }
105 | function generateChecksum(str) {
106 | str = str.replace(/[\r\n]+/g, "\n");
107 |
108 | // Perl: md5_base64($data)
109 | // PHP: preg_replace('/=+$/', '', base64_encode(pack('H*',md5($data))));
110 | var hash = hashes.md5(str);
111 | var pached = pack(hash);
112 | var base64 = converters.base64.encode(pached);
113 | return base64.replace(/=+$/, "");
114 | }
115 |
116 | function pack(str) {
117 | // Based on code from http://phpjs.org/functions/pack:880 (only for pack("H*", str))
118 | // + String[N] => String.charAt(N)
119 | var result = "";
120 | var quantifier = str.length;
121 | for (var i = 0; i < quantifier; i += 2) {
122 | // Always get per 2 bytes...
123 | var word = str.charAt(i);
124 | if (((i + 1) >= quantifier) || typeof(str.charAt(i + 1)) === 'undefined') {
125 | word += '0';
126 | } else {
127 | word += str.charAt(i + 1);
128 | }
129 | result += String.fromCharCode(parseInt(word, 16));
130 | }
131 | return result;
132 | }
133 |
134 | function setRedraw(hWnd, bRedraw) {
135 | AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
136 | bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
137 | }
--------------------------------------------------------------------------------
/alignWithSpaces-en.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/alignWithSpaces-en.png
--------------------------------------------------------------------------------
/alignWithSpaces-ru.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/alignWithSpaces-ru.png
--------------------------------------------------------------------------------
/autoSaveSession.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=24561#p24561
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/autoSaveSession.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/autoSaveSession.js
4 |
5 | // (c) Infocatcher 2012-2024
6 | // Version: 0.2.3pre3 - 2024-09-16
7 | // Author: Infocatcher
8 |
9 | //// Automatically saves current session after selection or scroll changes
10 | // Required Sessions plugin!
11 |
12 | // Arguments:
13 | // -startupDelay=1500 - (in ms) initial delay to ignore all changes just after startup
14 | // -minDelay=8000 - (in ms) minimum interval between two saves
15 | // -saveDelay=500 - (in ms) minimum delay between change and save
16 | // -session="OnExit" - name of session file
17 | // -sessionBackup="OnExit" - name of session to backup before first write
18 | // -backupInterval=120 - also backup session file (see -session) each N minutes (only if something was changed)
19 | // -maxBackups=5 - max backups to preserve or 0 to disable backups (see -sessionBackup)
20 | // -maxIntervalBackups=5 - max backups to preserve or 0 to disable backups (see -backupInterval)
21 | // will be stored in \Sessions\%SessionName%*_autobackup_%date%.session
22 | // -onTitle="AkelPad" - window title in case of running autoSaveSession.js
23 | // -offTitle="AkelPad !@" - window title in case of not running autoSaveSession.js
24 | // (to indicate, that script is not running in non-primary window instance,
25 | // because Sessions plugin works correctly only with one window)
26 | // or -onTitle="" -offTitle="" to not change window title
27 | // -debug=true - show debug messages in window title
28 |
29 | // Usage:
30 | // In AkelPad.ini or in registry (HKEY_CURRENT_USER\Software\Akelsoft\AkelPad)
31 | // CmdLineBegin=/Call("Scripts::Main", 1, "autoSaveSession.js")
32 | // CmdLineBegin=/Call("Scripts::Main", 1, "autoSaveSession.js", '-startupDelay=2000 -minDelay=12000 -session="AutoSave"')
33 | // (see AkelHelp-Eng.htm#ch4/AkelHelp-Rus.htm#ch4 for manual settings)
34 |
35 | // Known issues:
36 | // Script will be unloaded, if window closing was canceled from usaved tab(s) prompt, see
37 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=35042#p35042
38 |
39 | var isMDI = AkelPad.IsMDI();
40 | if(!isMDI) // Silently ignore SDI mode to allow use the same settings in any mode
41 | WScript.Quit();
42 |
43 | var hMainWnd = AkelPad.GetMainWnd();
44 | if(!hMainWnd)
45 | WScript.Quit();
46 | var oSys = AkelPad.SystemFunction();
47 |
48 | var startupDelay = AkelPad.GetArgValue("startupDelay", 1500);
49 | var minDelay = AkelPad.GetArgValue("minDelay", 8000);
50 | var saveDelay = AkelPad.GetArgValue("saveDelay", 500);
51 | var sessionName = AkelPad.GetArgValue("session", "OnExit");
52 | var sessionBackup = AkelPad.GetArgValue("sessionBackup", "OnExit");
53 | var backupInterval = AkelPad.GetArgValue("backupInterval", 2*60)*60e3;
54 | var maxBackups = AkelPad.GetArgValue("maxBackups", 5);
55 | var maxIntervalBackups = AkelPad.GetArgValue("maxIntervalBackups", 5);
56 | var onTitle = AkelPad.GetArgValue("onTitle", "AkelPad");
57 | var offTitle = AkelPad.GetArgValue("offTitle", "AkelPad !@");
58 | var debug = AkelPad.GetArgValue("debug", false);
59 |
60 | // Deprecated arguments:
61 | var smallDelay = AkelPad.GetArgValue("smallDelay", undefined);
62 | if(smallDelay != undefined && AkelPad.GetArgValue("saveDelay", undefined) == undefined)
63 | saveDelay = smallDelay;
64 |
65 | var bakName = "autobackup"; // Note: will search for "*_%bakName%_*.session" files
66 | var envKey = "__AkelPad:autoSaveSession.js";
67 |
68 | var stopWait = now() + startupDelay;
69 | var timer = 0;
70 | var lastSave = 0;
71 | var lastBackup = 0;
72 |
73 | var lpTimerCallback = 0;
74 | var nIDEvent;
75 | var hWndTimer;
76 | var lastError = "";
77 | var backuped = {};
78 | var tweakTitle = (onTitle || offTitle) && onTitle != offTitle;
79 |
80 | debug && _log("start");
81 |
82 | var hScript = AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/);
83 | if(hScript && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/)) {
84 | // Script is running, second call close it
85 | oSys.Call("kernel32::SetEnvironmentVariable" + _TCHAR, envKey, 0);
86 | tweakTitle && windowText(hMainWnd, offTitle);
87 | debug && _log("second call -> quit");
88 | AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
89 | WScript.Quit();
90 | }
91 |
92 | var MAX_PATH = 0x104;
93 | var lpBuffer = AkelPad.MemAlloc(MAX_PATH*_TSIZE);
94 | if(!lpBuffer)
95 | WScript.Quit();
96 |
97 | var akelDir = AkelPad.GetAkelDir();
98 | var readEnv, newSize, envVal;
99 | (readEnv = function(bufSize) {
100 | newSize = oSys.Call("kernel32::GetEnvironmentVariable" + _TCHAR, envKey, lpBuffer, bufSize);
101 | envVal = newSize && AkelPad.MemRead(lpBuffer, _TSTR);
102 | })(MAX_PATH);
103 | AkelPad.MemFree(lpBuffer);
104 | if(
105 | newSize > MAX_PATH
106 | && (lpBuffer = AkelPad.MemAlloc(newSize*_TSIZE))
107 | ) {
108 | readEnv(newSize);
109 | AkelPad.MemFree(lpBuffer);
110 | }
111 | if(envVal && envVal == akelDir) {
112 | tweakTitle && windowText(hMainWnd, offTitle);
113 | debug && _log("ignore second instance");
114 | WScript.Quit();
115 | }
116 | oSys.Call("kernel32::SetEnvironmentVariable" + _TCHAR, envKey, akelDir);
117 | tweakTitle && windowText(hMainWnd, onTitle);
118 |
119 | if(
120 | AkelPad.WindowSubClass(
121 | 1 /*WSC_MAINPROC*/,
122 | mainCallback,
123 | 0x4E /*WM_NOTIFY*/,
124 | 0x416 /*AKDN_FRAME_ACTIVATE*/,
125 | 0x418 /*AKDN_FRAME_DESTROY*/
126 | //0x436 /*AKDN_OPENDOCUMENT_FINISH*/
127 | //0x406 /*AKDN_MAIN_ONFINISH*/
128 | )
129 | ) {
130 | if(
131 | isMDI != 1 /*WMD_MDI*/
132 | || AkelPad.WindowSubClass(
133 | 3 /*WSC_FRAMEPROC*/,
134 | mainCallback,
135 | 0x4E /*WM_NOTIFY*/
136 | )
137 | ) {
138 | AkelPad.ScriptNoMutex(); // Allow other scripts running
139 | AkelPad.WindowGetMessage(); // Message loop
140 | AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
141 | AkelPad.WindowUnsubClass(3 /*WSC_FRAMEPROC*/);
142 | destroyTimer();
143 | if(sessionBackup != sessionName)
144 | backupSessionOnce();
145 | if(sessionBackup && maxBackups >= 0)
146 | cleanupBackups(sessionBackup, maxBackups);
147 | if((!sessionBackup || sessionBackup != sessionName) && maxIntervalBackups == 0)
148 | cleanupBackups(sessionName, maxIntervalBackups);
149 | oSys.Call("kernel32::SetEnvironmentVariable" + _TCHAR, envKey, 0);
150 | }
151 | else {
152 | AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
153 | lastError = "AkelPad.WindowSubClass(WSC_FRAMEPROC) failed!";
154 | }
155 | }
156 | else {
157 | lastError = "AkelPad.WindowSubClass(WSC_MAINPROC) failed!";
158 | }
159 | lastError && _error(lastError);
160 |
161 | function mainCallback(hWnd, uMsg, wParam, lParam) {
162 | //if(uMsg == 0x406 /*AKDN_MAIN_ONFINISH*/) {
163 | // oSys.Call("user32::PostQuitMessage", 0); // Exit message loop
164 | // return;
165 | //}
166 |
167 | if(timer) // Already scheduled
168 | return;
169 |
170 | if(uMsg == 0x4E /*WM_NOTIFY*/) {
171 | var cmd = AkelPad.MemRead(_PtrAdd(lParam, 8), 3 /*DT_DWORD*/);
172 | switch(cmd) {
173 | case 0x804 /*AEN_HSCROLL*/:
174 | case 0x805 /*AEN_VSCROLL*/:
175 | case 0x81E /*AEN_SELCHANGED*/:
176 | break;
177 | default: return;
178 | }
179 | }
180 |
181 | if(stopWait) {
182 | if(now() < stopWait)
183 | return;
184 | stopWait = 0;
185 | }
186 | if(!AkelPad.GetEditFile(0))
187 | return;
188 |
189 | var delay = now() - lastSave > minDelay ? saveDelay : minDelay;
190 | timer = saveSessionDelayed(delay);
191 | }
192 | function saveSession() {
193 | if(!oSys.Call("user32::IsWindowEnabled", hMainWnd)) {
194 | timer = saveSessionDelayed(minDelay);
195 | return;
196 | }
197 | timer = 0;
198 | lastSave = now();
199 | if(
200 | backupInterval > 0
201 | && maxIntervalBackups > 0
202 | && lastSave > lastBackup + backupInterval
203 | ) {
204 | lastBackup = lastSave;
205 | backupSession(sessionName);
206 | cleanupBackups(sessionName, maxIntervalBackups);
207 | }
208 | if(sessionBackup == sessionName)
209 | backupSessionOnce();
210 | AkelPad.Call("Sessions::Main", 2, sessionName);
211 | debug && _log("saved at " + new Date().toLocaleString());
212 | }
213 | function saveSessionDelayed(delay) {
214 | try { // AkelPad 4.8.8+
215 | lpTimerCallback = oSys.RegisterCallback(saveSessionTimerProc);
216 | }
217 | catch(e) {
218 | lpTimerCallback = oSys.RegisterCallback("saveSessionTimerProc");
219 | }
220 | if(!lpTimerCallback) {
221 | lastError = "oSys.RegisterCallback() failed!\nScript was terminated.";
222 | oSys.Call("user32::PostQuitMessage", 0); // Exit message loop
223 | return 0;
224 | }
225 | nIDEvent = AkelPad.SendMessage(hMainWnd, 1319 /*AKD_UNIQUEID*/, 0, 0) || 10;
226 | hWndTimer = AkelPad.ScriptHandle(0, 17 /*SH_GETSERVICEWINDOW*/) || hMainWnd;
227 | saveSessionDelayed = function(delay) {
228 | return oSys.Call("user32::SetTimer", hWndTimer, nIDEvent, delay, lpTimerCallback);
229 | };
230 | return saveSessionDelayed(delay);
231 | }
232 | function saveSessionTimerProc(hWnd, uMsg, nIDEvent, dwTime) {
233 | oSys.Call("user32::KillTimer", hWndTimer, nIDEvent);
234 | saveSession();
235 | }
236 | function destroyTimer() {
237 | if(!lpTimerCallback)
238 | return;
239 | oSys.Call("user32::KillTimer", hWndTimer, nIDEvent);
240 | oSys.UnregisterCallback(lpTimerCallback);
241 | lpTimerCallback = 0;
242 | }
243 | function sessionsDir() {
244 | var sd = (function() {
245 | var oSet = AkelPad.ScriptSettings();
246 | if(oSet.Begin("Sessions", 0x21 /*POB_READ|POB_PLUGS*/)) {
247 | var inAppData = oSet.Read("SaveSessions", 1 /*PO_DWORD*/) == 2;
248 | oSet.End();
249 | }
250 | if(inAppData) {
251 | var wsh = new ActiveXObject("WScript.Shell");
252 | return wsh.ExpandEnvironmentStrings("%AppData%\\AkelPad\\Sessions\\");
253 | }
254 | return AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\Sessions\\";
255 | })();
256 | sessionsDir = function() {
257 | return sd;
258 | };
259 | return sd;
260 | }
261 | function backupSessionOnce() {
262 | if(sessionBackup && maxBackups > 0 && !backuped[sessionBackup])
263 | backupSession(sessionBackup);
264 | }
265 | function backupSession(sessionName) {
266 | var fileBase = sessionsDir() + sessionName;
267 | var fileExt = ".session";
268 |
269 | var fileBak = fileBase + "_" + bakName + gts() + fileExt;
270 |
271 | var fso = backupSession._fso || (backupSession._fso = new ActiveXObject("Scripting.FileSystemObject"));
272 | try {
273 | fso.CopyFile(fileBase + fileExt, fileBak, true);
274 | backuped[sessionName] = true;
275 | }
276 | catch(e) {
277 | debug && _log("backup failed: " + (e.message || e) + " " + file);
278 | }
279 | }
280 | function gts() {
281 | var d = new Date();
282 | return "_" + d.getFullYear() + "-" + pad(d.getMonth() + 1) + "-" + pad(d.getDate())
283 | + "_" + pad(d.getHours()) + "-" + pad(d.getMinutes()) + "-" + pad(d.getSeconds());
284 | }
285 | function pad(n) {
286 | return n > 9 ? "" + n : "0" + n;
287 | }
288 | function cleanupBackups(sessionName, maxBackups) {
289 | var files = [];
290 | var dir = sessionsDir();
291 | // Based on Instructor's code: https://akelpad.sourceforge.net/forum/viewtopic.php?p=12548#p12548
292 | var lpFindData = AkelPad.MemAlloc(592 /*sizeof(WIN32_FIND_DATAW)*/);
293 | if(!lpFindData)
294 | return;
295 | var hSearch = oSys.Call("kernel32::FindFirstFile" + _TCHAR, dir + sessionName + "_" + bakName + "_*.session", lpFindData)
296 | || AkelPad.MemFree(lpFindData);
297 | if(!hSearch || hSearch == -1) {
298 | AkelPad.MemFree(lpFindData);
299 | return;
300 | }
301 | do {
302 | var fName = AkelPad.MemRead(_PtrAdd(lpFindData, 44 /*offsetof(WIN32_FIND_DATAW, cFileName)*/), _TSTR);
303 | if(fName == "." || fName == "..")
304 | continue;
305 | var dwAttributes = AkelPad.MemRead(_PtrAdd(lpFindData, 0) /*offsetof(WIN32_FIND_DATAW, dwAttributes)*/, 3 /*DT_DWORD*/);
306 | if(dwAttributes & 0x10 /*FILE_ATTRIBUTE_DIRECTORY*/)
307 | continue;
308 | files[files.length] = fName;
309 | }
310 | while(oSys.Call("kernel32::FindNextFile" + _TCHAR, hSearch, lpFindData));
311 | oSys.Call("kernel32::FindClose", hSearch);
312 | AkelPad.MemFree(lpFindData);
313 | files.sort();
314 |
315 | if(files.length <= maxBackups)
316 | return;
317 | var fso = new ActiveXObject("Scripting.FileSystemObject");
318 | var errs = 0;
319 | for(var i = files.length - maxBackups - 1; i >= 0; --i) {
320 | var path = dir + files[i];
321 | try {
322 | fso.DeleteFile(path);
323 | }
324 | catch(e) {
325 | ++errs;
326 | lastError = path + ":\n" + (e.message || e);
327 | }
328 | }
329 | if(errs >= 10) {
330 | _error(
331 | "Failed to cleanup auto-backups, last error:\n" + lastError
332 | + "\n\nPlease, check manually: " + dir + "*_" + bakName + "_*.session"
333 | );
334 | }
335 | }
336 | function now() {
337 | return new Date().getTime();
338 | }
339 | function windowText(hWnd, pText) {
340 | return oSys.Call("user32::SetWindowText" + _TCHAR, hWnd, pText);
341 | }
342 | function _error(e) {
343 | AkelPad.MessageBox(hMainWnd, e, WScript.ScriptName, 16 /*MB_ICONERROR*/);
344 | }
345 | function _log(s) {
346 | windowText(hMainWnd, WScript.ScriptName + ": " + s);
347 | }
--------------------------------------------------------------------------------
/backupVersion.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=10791#p10791
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/backupVersion.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/backupVersion.js
4 |
5 | // (c) Infocatcher 2011-2012, 2014-2015
6 | // Version: 0.1.5 - 2015-01-12
7 | // Author: Infocatcher
8 |
9 | //===================
10 | //// Tries find file version and copy current file to the same directory
11 | // file.js -> file-%version%.js
12 | // file.user.js -> file-%version%.user.js
13 |
14 | // Arguments:
15 | // -forceDate=true - force use last modification date
16 | // -dateType=0 - yyyy-mm-dd (see dateToString())
17 | // =1 - yyyy-mm-dd_hh-mm
18 | // =2 - yyyy-mm-dd_hh-mm-ss
19 | // -openBackup=true - open created backup file
20 | // -warnings=false - skip "Can't detect file version!" warning, just ask for file name
21 |
22 | // Usage:
23 | // Call("Scripts::Main", 1, "backupVersion.js")
24 | // Call("Scripts::Main", 1, "backupVersion.js", "-forceDate=true -dateType=1")
25 | //===================
26 |
27 | //== Settings begin
28 | var getVersionPattern = /(^|[^a-z])(version|ver\.?|v\.?)[ \t]*[-:=|]?[ \t]*(\S+)/i;
29 | var versionBracketsNumber = 3; // We don't use (?:something) for backward compatibility with old JScript
30 | var testVersionPattern = /\d/; // Version string must contain number
31 | var linesLimit = 20; // Check only first 20 lines of file
32 | var addVersionPattern = /(\.user)?(\.[^.\s_-]+)?$/; // {fileName}{versionSeparator}{version}{addVersionPattern}
33 | function getVersionSeparator(version) {
34 | return /-/.test(version) ? "_" : "-";
35 | }
36 | var dateTypesCount = 3;
37 | function dateToString(date, type) {
38 | function pad(n) {
39 | return n < 10 ? "0" + n : n;
40 | }
41 | var ret = date.getFullYear() + "-" + pad(date.getMonth() + 1) + "-" + pad(date.getDate());
42 | if(type == 0)
43 | return ret;
44 | ret += "_" + pad(date.getHours()) + "-" + pad(date.getMinutes());
45 | if(type == 1)
46 | return ret;
47 | ret += "-" + pad(date.getSeconds());
48 | return ret;
49 | }
50 | function trimVersion(version) {
51 | return version
52 | .replace(/^v\.?\s*/i, "")
53 | .replace(/[.,]+$/, "");
54 | }
55 | //== Settings end
56 |
57 | function _localize(s) {
58 | var strings = {
59 | "Save file first!": {
60 | ru: "Сначала сохраните файл!"
61 | },
62 | "Can't detect file version!": {
63 | ru: "Не удалось определить версию файла!"
64 | },
65 | "Can't use original file name!": {
66 | ru: "Нельзя использовать имя исходного файла!"
67 | },
68 | "File “%S” already exists!\nOverwrite?": {
69 | ru: "Файл «%S» уже существует!\nПерезаписать?"
70 | },
71 | "Can't copy current file to “%F”\nError:\n%E": {
72 | ru: "Не удалось копировать текущий файл в «%F»\nОшибка:\n%E"
73 | },
74 | "Backup file was succefully created:\n%S": {
75 | ru: "Файл резервной копии успешно создан:\n%S"
76 | },
77 | "Name of backup file:": {
78 | ru: "Имя файла резервной копии:"
79 | }
80 | };
81 | var lng = "en";
82 | switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
83 | case 0x19: lng = "ru";
84 | }
85 | _localize = function(s) {
86 | return strings[s] && strings[s][lng] || s;
87 | };
88 | return _localize(s);
89 | }
90 |
91 | var hMainWnd = AkelPad.GetMainWnd();
92 | if(!hMainWnd)
93 | WScript.Quit();
94 |
95 | var hWndEdit = AkelPad.GetEditWnd();
96 | var oSys = AkelPad.SystemFunction();
97 | var fso = new ActiveXObject("Scripting.FileSystemObject");
98 | var curPath = AkelPad.GetEditFile(0);
99 | var dialogTitle = WScript.ScriptName.replace(/^[!-\-_]+/, "");
100 | dialogTitle = dialogTitle.charAt(0).toUpperCase() + dialogTitle.substr(1);
101 |
102 | if(!curPath) {
103 | AkelPad.MessageBox(hMainWnd, _localize("Save file first!"), dialogTitle, 48 /*MB_ICONEXCLAMATION*/);
104 | WScript.Quit();
105 | }
106 |
107 | copyFile();
108 |
109 | function copyFile() {
110 | var forceDate = AkelPad.GetArgValue("forceDate", false);
111 |
112 | var curName = fso.GetFileName(curPath);
113 | var curDir = fso.GetParentFolderName(curPath);
114 | var newName;
115 | var overwrite = false;
116 | var exists = function(name) {
117 | var path = curDir + "\\" + name;
118 | //return fso.FileExists(path) || fso.FolderExists(path);
119 | return oSys.Call("kernel32::GetFileAttributes" + _TCHAR, path) != -1;
120 | };
121 | if(!forceDate)
122 | var version = getVersion();
123 | if(version)
124 | newName = addVersion(curName, version);
125 | else {
126 | var dateType = AkelPad.GetArgValue("dateType", 0);
127 |
128 | var askName = curName;
129 | var lastMod = new Date(fso.GetFile(curPath).DateLastModified);
130 | for(var i = dateType; i < dateTypesCount; ++i) {
131 | var lastModStr = dateToString(lastMod, i);
132 | var testName = addVersion(curName, lastModStr);
133 | if(!exists(testName)) {
134 | askName = testName;
135 | break;
136 | }
137 | }
138 | var forceAsk = i > dateType;
139 | if(!forceDate && AkelPad.GetArgValue("warnings", true))
140 | AkelPad.MessageBox(hMainWnd, _localize("Can't detect file version!"), dialogTitle, 48 /*MB_ICONEXCLAMATION*/);
141 | newName = !forceDate || forceAsk
142 | ? askFileName(testName || askName)
143 | : askName;
144 | if(!newName)
145 | return;
146 | }
147 | for(;;) {
148 | if(newName == curName) {
149 | AkelPad.MessageBox(
150 | hMainWnd,
151 | _localize("Can't use original file name!"),
152 | dialogTitle,
153 | 48 /*MB_ICONEXCLAMATION*/
154 | );
155 | }
156 | else {
157 | if(!exists(newName) && _copy(curPath, curDir, newName, overwrite))
158 | break;
159 |
160 | var btn = AkelPad.MessageBox(
161 | hMainWnd,
162 | _localize("File “%S” already exists!\nOverwrite?").replace("%S", newName),
163 | dialogTitle,
164 | 35 /*MB_YESNOCANCEL|MB_ICONQUESTION*/
165 | );
166 | if(btn == 2 /*IDCANCEL*/)
167 | return;
168 | overwrite = btn == 6 /*IDYES*/;
169 | if(overwrite && _copy(curPath, curDir, newName, overwrite))
170 | break;
171 | }
172 | newName = askFileName(newName);
173 | if(!newName)
174 | return;
175 | }
176 | }
177 | function askFileName(fileName) {
178 | return AkelPad.InputBox(hMainWnd, dialogTitle, _localize("Name of backup file:"), fileName);
179 | }
180 | function _copy(curPath, curDir, newName, overwrite) {
181 | try {
182 | fso.CopyFile(curPath, curDir + "\\" + newName, overwrite);
183 | if(AkelPad.GetArgValue("openBackup", false)) {
184 | var lpFrame = AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
185 | AkelPad.OpenFile(curDir + "\\" + newName, 0, AkelPad.GetEditCodePage(hWndEdit), AkelPad.GetEditBOM(hWndEdit));
186 | lpFrame && AkelPad.SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrame);
187 | }
188 | }
189 | catch(e) {
190 | AkelPad.MessageBox(
191 | hMainWnd,
192 | _localize("Can't copy current file to “%F”\nError:\n%E")
193 | .replace("%F", newName)
194 | .replace("%E", e.message || e),
195 | dialogTitle,
196 | 16 /*MB_ICONQUESTION*/
197 | );
198 | return false;
199 | }
200 | //if(overwrite)
201 | // return true;
202 | new ActiveXObject("WScript.Shell").Popup(
203 | _localize("Backup file was succefully created:\n%S").replace("%S", newName),
204 | 2, // Autoclose after 2 seconds
205 | dialogTitle,
206 | 64 /*MB_ICONINFORMATION*/
207 | );
208 | return true;
209 | }
210 | function getVersion() {
211 | var version = "";
212 |
213 | var ww = AkelPad.SendMessage(hWndEdit, 3241 /*AEM_GETWORDWRAP*/, 0, 0);
214 | if(ww) {
215 | setRedraw(hWndEdit, false);
216 | AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);
217 | }
218 |
219 | var lineStart = 0;
220 | var line = 0;
221 | var linesCount = AkelPad.SendMessage(hWndEdit, 3129 /*AEM_GETLINENUMBER*/, 0 /*AEGL_LINECOUNT*/, 0);
222 | var maxLine = Math.min(linesLimit, linesCount) - 1;
223 | for(;;) {
224 | var lineLength = AkelPad.SendMessage(hWndEdit, 193 /*EM_LINELENGTH*/, lineStart, 0);
225 | var lineEnd = lineStart + lineLength;
226 | var lineText = AkelPad.GetTextRange(lineStart, lineEnd);
227 |
228 | lineText = lineText.replace(/(http|ftp)s?:\/\S+/, "");
229 | if(getVersionPattern.test(lineText)) {
230 | var tmp = RegExp["$" + versionBracketsNumber];
231 | if(testVersionPattern.test(tmp)) {
232 | version = trimVersion(tmp);
233 | break;
234 | }
235 | }
236 |
237 | lineStart = lineEnd + 1;
238 | if(++line > maxLine)
239 | break;
240 | }
241 |
242 | if(ww) {
243 | AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);
244 | setRedraw(hWndEdit, true);
245 | }
246 |
247 | return version;
248 | }
249 | function addVersion(name, version) {
250 | return name.replace(addVersionPattern, getVersionSeparator(version) + version + "$&");
251 | }
252 | function setRedraw(hWnd, bRedraw) {
253 | AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
254 | bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
255 | }
--------------------------------------------------------------------------------
/closeLeftOrRightTabs.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=24138#p24138
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/closeLeftOrRightTabs.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/closeLeftOrRightTabs.js
4 |
5 | // (c) Infocatcher 2014
6 | // Version: 0.1.1 - 2014-03-03
7 | // Author: Infocatcher
8 |
9 | //===================
10 | //// Close tabs to the left or right (temporary check "Switch tabs: right-left" option)
11 | // Based on Instructor's code: https://akelpad.sourceforge.net/forum/viewtopic.php?p=4222#p4222
12 |
13 | // Usage:
14 | // Call("Scripts::Main", 1, "closeLeftOrRightTabs.js") - close tabs to the right
15 | // Call("Scripts::Main", 1, "closeLeftOrRightTabs.js", "-left") - close tabs to the left
16 | //===================
17 |
18 | var toRight = WScript.Arguments.length ? WScript.Arguments(0) != "-left" : true;
19 |
20 | var hMainWnd = AkelPad.GetMainWnd();
21 | if(hMainWnd && AkelPad.IsMDI()) {
22 | var tabOpts = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 157 /*MI_TABOPTIONSMDI*/, 0);
23 | var forceRightLeft = !(tabOpts & 0x20000 /*TAB_SWITCH_RIGHTLEFT*/);
24 | if(forceRightLeft)
25 | AkelPad.Command(4311 /*IDM_WINDOW_TABSWITCH_RIGHTLEFT*/);
26 |
27 | closeTabs(toRight);
28 |
29 | if(forceRightLeft)
30 | AkelPad.SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 157 /*MIS_TABOPTIONSMDI*/, tabOpts);
31 | }
32 | else {
33 | AkelPad.MessageBox(hMainWnd, "MDI or PMDI window mode required!", WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
34 | }
35 |
36 | function closeTabs(toRight) {
37 | var nextFrameCmd = toRight ? 4316 /*IDM_WINDOW_FRAMENEXT*/ : 4317 /*IDM_WINDOW_FRAMEPREV*/;
38 | var lpFrameInitial = AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
39 | var frameIndexInitial = AkelPad.SendMessage(hMainWnd, 1294 /*AKD_FRAMEINDEX*/, 0, lpFrameInitial);
40 | for(;;) {
41 | var restoreSelected = true;
42 | AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, nextFrameCmd, 0);
43 | var lpFrame = AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
44 | //if(lpFrame == lpFrameInitial)
45 | // break;
46 | var frameIndex = AkelPad.SendMessage(hMainWnd, 1294 /*AKD_FRAMEINDEX*/, 0, lpFrame);
47 | if(toRight ? frameIndex <= frameIndexInitial : frameIndex >= frameIndexInitial--)
48 | break; // Overflow
49 | if(!AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4318 /*IDM_WINDOW_FRAMECLOSE*/, 0))
50 | return; // Cancel
51 | restoreSelected = false;
52 | AkelPad.SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrameInitial);
53 | }
54 | restoreSelected && AkelPad.SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrameInitial);
55 | }
--------------------------------------------------------------------------------
/closeUnsavedTabs.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=35014#p35014
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/closeUnsavedTabs.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/closeUnsavedTabs.js
4 |
5 | // (c) Infocatcher 2019-2020
6 | // Version: 0.1.1 - 2020-05-30
7 | // Author: Infocatcher
8 |
9 | //// Close unsaved tabs (all or only empty)
10 | // Required MDI or PMDI window mode!
11 |
12 | // Arguments:
13 | // -onlyEmpty=false - close only empty tabs
14 | // -askToSave=true - ask to save (or mark file as not modified to silently close)
15 | // -closeCurrent=true - also close current tab
16 | // -stopOnCancel=true - stop tabs iteration, if pressed Cancel button
17 |
18 | // Usage:
19 | // Call("Scripts::Main", 1, "closeUnsavedTabs.js")
20 | // Call("Scripts::Main", 1, "closeUnsavedTabs.js", "-onlyEmpty=false -askToSave=false -closeCurrent=true -stopOnCancel=true")
21 |
22 | var hMainWnd = AkelPad.GetMainWnd();
23 | var onlyEmpty = AkelPad.GetArgValue("onlyEmpty", false);
24 | var askToSave = AkelPad.GetArgValue("askToSave", true);
25 | var closeCurrent = AkelPad.GetArgValue("closeCurrent", true);
26 | var stopOnCancel = AkelPad.GetArgValue("stopOnCancel", true);
27 |
28 | if(AkelPad.IsMDI())
29 | closeEmptyTabs();
30 | else
31 | AkelPad.MessageBox(hMainWnd, "MDI or PMDI window mode required!", WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
32 |
33 | function closeEmptyTabs() {
34 | var lpFrameInitial = AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
35 | for(; !stop; ) {
36 | AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4316 /*IDM_WINDOW_FRAMENEXT*/, 0);
37 | var lpFrame = AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
38 | var stop = lpFrame == lpFrameInitial;
39 | if((!stop || closeCurrent) && !closeEmptyTab() && stopOnCancel) // Canceled
40 | return;
41 | }
42 | AkelPad.SendMessage(hMainWnd, 1285 /*AKD_FRAMEACTIVATE*/, 0, lpFrameInitial);
43 | }
44 | function closeEmptyTab() {
45 | if(
46 | AkelPad.GetEditFile(0) // Saved
47 | || onlyEmpty && AkelPad.GetTextRange(0, 1) // Not empty
48 | )
49 | return true;
50 | if(!askToSave) { // Force mark as not modified
51 | var hWndEdit = AkelPad.GetEditWnd();
52 | if(AkelPad.SendMessage(hWndEdit, 3086 /*AEM_GETMODIFY*/, 0, 0))
53 | AkelPad.SendMessage(hWndEdit, 3087 /*AEM_SETMODIFY*/, false, 0);
54 | }
55 | return AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4318 /*IDM_WINDOW_FRAMECLOSE*/, 0);
56 | }
--------------------------------------------------------------------------------
/colorsConverter.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=9926#p9926
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/colorsConverter.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/colorsConverter.js
4 |
5 | // (c) Infocatcher 2010-2011
6 | // Version: 0.1.2 - 2011-12-20
7 | // Author: Infocatcher
8 |
9 | //// Convert color between "#fee" and "rgb(255, 238, 238)" formats
10 |
11 | function _localize(s) {
12 | var strings = {
13 | "Color:": {
14 | ru: "Цвет:"
15 | },
16 | "Color from “%S”:": {
17 | ru: "Цвет из «%S»:"
18 | },
19 | "Invalid color format!": {
20 | ru: "Некорректный формат цвета!"
21 | }
22 | };
23 | var lng = "en";
24 | switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
25 | case 0x19: lng = "ru";
26 | }
27 | _localize = function(s) {
28 | return strings[s] && strings[s][lng] || s;
29 | };
30 | return _localize(s);
31 | }
32 |
33 | //var AkelPad = new ActiveXObject("AkelPad.document");
34 | var hMainWnd = AkelPad.GetMainWnd();
35 |
36 | if(hMainWnd)
37 | convColor(AkelPad.GetSelText());
38 |
39 | function convColor(color, forceAsk) {
40 | if(!color || forceAsk)
41 | color = askColor(_localize("Color:"), color);
42 | if(!color)
43 | return;
44 | var newColor;
45 | if(/^\W*#?([0-9a-f]{3}|[0-9a-f]{6})\W*$/i.test(color)) // #aaa or #aaaaaa
46 | newColor = h2d(RegExp.$1);
47 | else if(/^\D*(\d{1,3}\D+\d{1,3}\D+\d{1,3})\D*$/.test(color)) // rgb(170, 170, 170)
48 | newColor = d2h.apply(this, RegExp.$1.split(/\D+/));
49 |
50 | if(!newColor) {
51 | AkelPad.MessageBox(hMainWnd, _localize("Invalid color format!"), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
52 | convColor(color, true);
53 | return;
54 | }
55 | newColor = askColor(_localize("Color from “%S”:").replace("%S", color), newColor);
56 | newColor && convColor(newColor);
57 | }
58 | function askColor(caption, defaultValue) {
59 | return AkelPad.InputBox(
60 | hMainWnd, WScript.ScriptName,
61 | caption,
62 | defaultValue || ""
63 | );
64 | }
65 |
66 | function hex(n) {
67 | var h = (typeof n == "number" ? n : parseInt(n, 10)).toString(16);
68 | if(h.length > 2)
69 | return null;
70 | return "00".substr(h.length) + h;
71 | }
72 | function d2h() {
73 | var i, h, r = [], l = arguments.length;
74 | var same = /^([0-9a-f])\1$/i;
75 | var isSame = true;
76 | for(i = 0; i < l; i++) {
77 | h = hex(arguments[i]);
78 | if(!h)
79 | return null;
80 | if(isSame && !same.test(h))
81 | isSame = false;
82 | r.push(h);
83 | }
84 | if(isSame)
85 | for(i = 0; i < l; i++)
86 | r[i] = r[i].charAt(0);
87 | return /* "#" + */ r.join("");
88 | }
89 | function h2d(h) {
90 | var l = h.length;
91 | var s = l == 3 ? 1 : 2;
92 | var i, r = [], h2;
93 | for(var i = 0; i < l; i += s) {
94 | h2 = h.substr(i, s);
95 | if(s == 1)
96 | h2 += h2;
97 | r.push(parseInt(h2, 16));
98 | }
99 | return r.join(", ");
100 | }
--------------------------------------------------------------------------------
/convertEscapes.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=7716#p7716
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/convertEscapes.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/convertEscapes.js
4 |
5 | // (c) Infocatcher 2010
6 | // Version: 0.1.6 - 2010-12-09
7 | // Author: Infocatcher
8 |
9 | //===================
10 | //// Convert JavaScript escape sequences like "\u00a9" or "\xa9" ((c) symbol)
11 |
12 | // Arguments:
13 | // -mode=0 - (default) auto encode or decode
14 | // -mode=1 - encode
15 | // -mode=2 - decode
16 |
17 | // Usage:
18 | // Call("Scripts::Main", 1, "convertEscapes.js", "-mode=0")
19 | //===================
20 |
21 | function _localize(s) {
22 | var strings = {
23 | "Nothing to recode!": {
24 | ru: "Нечего перекодировать!"
25 | }
26 | };
27 | var lng = "en";
28 | switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
29 | case 0x19: lng = "ru";
30 | }
31 | _localize = function(s) {
32 | return strings[s] && strings[s][lng] || s;
33 | };
34 | return _localize(s);
35 | }
36 |
37 | // Read arguments:
38 | var args = {};
39 | for(var i = 0, argsCount = WScript.Arguments.length; i < argsCount; ++i)
40 | if(/^[-\/](\w+)(=(.+))?$/.test(WScript.Arguments(i)))
41 | args[RegExp.$1.toLowerCase()] = RegExp.$3 ? eval(RegExp.$3) : true;
42 | function getArg(argName, defaultVal) {
43 | return typeof args[argName] == "undefined" // argName in args
44 | ? defaultVal
45 | : args[argName];
46 | }
47 |
48 | var MODE_AUTO = 0;
49 | var MODE_ENCODE = 1;
50 | var MODE_DECODE = 2;
51 |
52 | var mode = getArg("mode", MODE_AUTO);
53 | var auto = mode == MODE_AUTO;
54 | var encode = mode == MODE_ENCODE;
55 | var decode = mode == MODE_DECODE;
56 |
57 |
58 | //var AkelPad = new ActiveXObject("AkelPad.document");
59 | var hMainWnd = AkelPad.GetMainWnd();
60 | var hWndEdit = AkelPad.GetEditWnd();
61 | var oSys = AkelPad.SystemFunction();
62 |
63 | if(hMainWnd && !AkelPad.GetEditReadOnly(hWndEdit))
64 | convertEscapes();
65 |
66 | function convertEscapes() {
67 | var text = AkelPad.GetSelText();
68 | var selectAll = false;
69 | if(!text) {
70 | text = getAllText();
71 | selectAll = true;
72 | }
73 |
74 | var res;
75 | if(encode || auto) {
76 | res = encodeEscapes(text);
77 | if(auto)
78 | decode = res == text; // Can't encode
79 | }
80 | if(decode) {
81 | res = decodeEscapes(text);
82 | if(res == null) // Decode error
83 | return;
84 | }
85 | if(res == text) {
86 | AkelPad.MessageBox(hMainWnd, _localize("Nothing to recode!"), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
87 | return;
88 | }
89 |
90 | insertNoScroll(res, selectAll);
91 | }
92 |
93 | function encodeEscapes(str) {
94 | return str.replace(
95 | /[^!-~ \t\n\r]/ig,
96 | function(s) {
97 | var hex = s.charCodeAt(0).toString(16);
98 | return "\\u" + "0000".substr(hex.length) + hex;
99 | }
100 | );
101 | }
102 | function decodeEscapes(str) {
103 | // Keep some escaped chars inside string literals
104 | // "ab\ncd" => "ab\\ncd" => eval() => "ab\ncd"
105 | var doubleEscape = function(s) {
106 | return s.replace(
107 | /(\\+)([nrt'"])?/g,
108 | function(s, bs, chr) {
109 | if(bs.length % 2 == 0 || chr) // \ => \\ (*2)
110 | return new Array(bs.length + 1).join("\\") + s;
111 | // \\\ => \\ + \ => (\\)*2 + \
112 | return new Array(Math.floor(bs.length/2)*2 + 1).join("\\") + s;
113 | }
114 | );
115 | };
116 | str = str // Single RegExp like /("|')(?:\\\1|[^\1])*\1/g fail
117 | .replace(/"(?:\\"|[^"\n\r])*"/g, doubleEscape)
118 | .replace(/'(?:\\'|[^'\n\r])*'/g, doubleEscape);
119 |
120 | try {
121 | // Stupid, but sample :D
122 | str = eval(
123 | '"' +
124 | str // Make valid string
125 | .replace(
126 | /(\\*)["']/g,
127 | function(s, bs) {
128 | return bs.length % 2 == 0
129 | ? "\\" + s
130 | : s;
131 | }
132 | )
133 | .replace(/\n/g, "\\n")
134 | .replace(/\r/g, "\\r")
135 | .replace(/\u2028/g, "\\u2028")
136 | .replace(/\u2029/g, "\\u2029") +
137 | '"'
138 | );
139 | }
140 | catch(e) {
141 | AkelPad.MessageBox(hMainWnd, e.name + '\neval("string") fail\n' + e.message, WScript.ScriptName, 16 /*MB_ICONERROR*/);
142 | return null;
143 | }
144 |
145 | return str;
146 | }
147 |
148 | function getAllText() {
149 | if(typeof AkelPad.GetTextRange != "undefined")
150 | return AkelPad.GetTextRange(0, -1);
151 | var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
152 | if(!lpPoint)
153 | return "";
154 | setRedraw(hWndEdit, false);
155 | AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
156 |
157 | var columnSel = AkelPad.SendMessage(hWndEdit, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0);
158 | var ss = AkelPad.GetSelStart();
159 | var se = AkelPad.GetSelEnd();
160 |
161 | AkelPad.SetSel(0, -1);
162 | var str = AkelPad.GetSelText();
163 |
164 | AkelPad.SetSel(ss, se);
165 | columnSel && AkelPad.SendMessage(hWndEdit, 3128 /*AEM_UPDATESEL*/, 0x1 /*AESELT_COLUMNON*/, 0);
166 |
167 | AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
168 | AkelPad.MemFree(lpPoint);
169 | setRedraw(hWndEdit, true);
170 | return str;
171 | }
172 | function insertNoScroll(str, selectAll) {
173 | var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
174 | if(!lpPoint)
175 | return;
176 | setRedraw(hWndEdit, false);
177 | AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
178 |
179 | selectAll && AkelPad.SetSel(0, -1);
180 | //var ss = AkelPad.GetSelStart();
181 | AkelPad.ReplaceSel(str, true);
182 | //if(ss != AkelPad.GetSelStart())
183 | // AkelPad.SetSel(ss, ss + str.length);
184 |
185 | AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
186 | setRedraw(hWndEdit, true);
187 | AkelPad.MemFree(lpPoint);
188 | }
189 | function setRedraw(hWnd, bRedraw) {
190 | AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
191 | bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
192 | }
--------------------------------------------------------------------------------
/convertHTML.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=4310#p4310
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/convertHTML.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/convertHTML.js
4 |
5 | // (c) Infocatcher 2009-2010
6 | // Version: 0.4.3 - 2010-12-06
7 | // Author: Infocatcher
8 |
9 | //// Encode/decode HTML entities
10 |
11 | //===================
12 | // Encode HTML entities:
13 | // & => &
14 | // < => <
15 | // > => >
16 | // " => "
17 | // char => code; (see arguments)
18 |
19 | // Decode HTML entities:
20 | // & => &
21 | // < => <
22 | // > => >
23 | // " => "
24 | // code; => char (see arguments)
25 |
26 | // Arguments:
27 | // -mode=0 - (default) auto encode or decode
28 | // -mode=1 - encode
29 | // -mode=2 - decode
30 | // -decodeCharCodes=true - (default: true) decode code; => char
31 | // -encodeChars=false - (default: false) encode char => code;
32 | // -encodeAsHex=false - use hex instead of decimal
33 | // -charsToEncode=/[^!-~ \t\n\rа-яё]/ig - (optional) mask for chars to encode
34 |
35 | // Usage:
36 | // Call("Scripts::Main", 1, "convertHTML.js", "-mode=0")
37 | // Call("Scripts::Main", 1, "convertHTML.js", "-mode=0 -decodeCharCodes=true -encodeChars=true '-charsToEncode=/[^!-~ \t\n\rа-яё]/ig'")
38 | //===================
39 |
40 | function _localize(s) {
41 | var strings = {
42 | "Nothing to recode!": {
43 | ru: "Нечего перекодировать!"
44 | }
45 | };
46 | var lng = "en";
47 | switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
48 | case 0x19: lng = "ru";
49 | }
50 | _localize = function(s) {
51 | return strings[s] && strings[s][lng] || s;
52 | };
53 | return _localize(s);
54 | }
55 |
56 | // Read arguments:
57 | var args = {};
58 | for(var i = 0, argsCount = WScript.Arguments.length; i < argsCount; ++i)
59 | if(/^[-\/](\w+)(=(.+))?$/.test(WScript.Arguments(i)))
60 | args[RegExp.$1.toLowerCase()] = RegExp.$3 ? eval(RegExp.$3) : true;
61 | function getArg(argName, defaultVal) {
62 | argName = argName.toLowerCase();
63 | return typeof args[argName] == "undefined" // argName in args
64 | ? defaultVal
65 | : args[argName];
66 | }
67 |
68 | var MODE_AUTO = 0;
69 | var MODE_ENCODE = 1;
70 | var MODE_DECODE = 2;
71 |
72 | var mode = getArg("mode", MODE_AUTO);
73 | var auto = mode == MODE_AUTO;
74 | var encode = mode == MODE_ENCODE;
75 | var decode = mode == MODE_DECODE;
76 |
77 | var decodeCharCodes = getArg("decodeCharCodes", true);
78 | var encodeChars = getArg("encodeChars", false);
79 | var encodeAsHex = getArg("encodeAsHex", false);
80 | var charsToEncode = getArg("charsToEncode", /[^!-~ \t\n\rа-яё]/ig);
81 | // "!-~" - latin symbols
82 | // " \t\n\r" - spaces
83 | // "а-яё" - cyrillic symbols
84 |
85 |
86 | //var AkelPad = new ActiveXObject("AkelPad.document");
87 | var hMainWnd = AkelPad.GetMainWnd();
88 | var hWndEdit = AkelPad.GetEditWnd();
89 | var oSys = AkelPad.SystemFunction();
90 |
91 | if(hMainWnd && !AkelPad.GetEditReadOnly(hWndEdit))
92 | convertHTML();
93 |
94 | function convertHTML() {
95 | var text = AkelPad.GetSelText();
96 | var selectAll = false;
97 | if(!text) {
98 | text = getAllText();
99 | selectAll = true;
100 | }
101 |
102 | var res;
103 | if(decode || auto) {
104 | res = decodeHTML(text);
105 | if(auto)
106 | encode = res == text; // Can't decode (entities is missing)
107 | }
108 | if(encode)
109 | res = encodeHTML(text);
110 | if(res == text) {
111 | AkelPad.MessageBox(hMainWnd, _localize("Nothing to recode!"), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
112 | return;
113 | }
114 |
115 | insertNoScroll(res, selectAll);
116 | }
117 | function encodeHTML(str) {
118 | str = str
119 | .replace(/&/g, "&")
120 | .replace(//g, ">")
122 | .replace(/"/g, """);
123 | if(encodeChars)
124 | str = str.replace(
125 | charsToEncode,
126 | function(s) {
127 | var code = s.charCodeAt(0);
128 | if(encodeAsHex)
129 | code = "x" + code.toString(16);
130 | return "" + code + ";";
131 | }
132 | );
133 | return str;
134 | }
135 | function decodeHTML(str) {
136 | if(decodeCharCodes)
137 | str = str
138 | .replace(
139 | /(?:x([\da-f]+)|(\d+));/ig,
140 | function(s, hex, dec) {
141 | return String.fromCharCode(
142 | hex
143 | ? parseInt(hex, 16)
144 | : parseInt(dec, 10)
145 | );
146 | }
147 | );
148 | return str
149 | .replace(/</g, "<")
150 | .replace(/>/g, ">")
151 | .replace(/"/g, '"')
152 | .replace(/&/g, "&");
153 | }
154 |
155 | function getAllText() {
156 | if(typeof AkelPad.GetTextRange != "undefined")
157 | return AkelPad.GetTextRange(0, -1);
158 | var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
159 | if(!lpPoint)
160 | return "";
161 | setRedraw(hWndEdit, false);
162 | AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
163 |
164 | var columnSel = AkelPad.SendMessage(hWndEdit, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0);
165 | var ss = AkelPad.GetSelStart();
166 | var se = AkelPad.GetSelEnd();
167 |
168 | AkelPad.SetSel(0, -1);
169 | var str = AkelPad.GetSelText();
170 |
171 | AkelPad.SetSel(ss, se);
172 | columnSel && AkelPad.SendMessage(hWndEdit, 3128 /*AEM_UPDATESEL*/, 0x1 /*AESELT_COLUMNON*/, 0);
173 |
174 | AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
175 | AkelPad.MemFree(lpPoint);
176 | setRedraw(hWndEdit, true);
177 | return str;
178 | }
179 | function insertNoScroll(str, selectAll) {
180 | var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
181 | if(!lpPoint)
182 | return;
183 | setRedraw(hWndEdit, false);
184 | AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
185 |
186 | selectAll && AkelPad.SetSel(0, -1);
187 | //var ss = AkelPad.GetSelStart();
188 | AkelPad.ReplaceSel(str, true);
189 | //if(ss != AkelPad.GetSelStart())
190 | // AkelPad.SetSel(ss, ss + str.length);
191 |
192 | AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
193 | setRedraw(hWndEdit, true);
194 | AkelPad.MemFree(lpPoint);
195 | }
196 | function setRedraw(hWnd, bRedraw) {
197 | AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
198 | bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
199 | }
--------------------------------------------------------------------------------
/converter-en.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/converter-en.png
--------------------------------------------------------------------------------
/converter-ru.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/converter-ru.png
--------------------------------------------------------------------------------
/copyPath.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=9926#p9926
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/copyPath.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/copyPath.js
4 |
5 | // (c) Infocatcher 2010, 2014
6 | // Version: 0.1.0.1 - 2014-07-30
7 | // Author: Infocatcher
8 |
9 | //// Copy path to file in configurable format
10 |
11 | // Usage:
12 | // -"Copy path to file" Call("Scripts::Main", 1, "copyPath.js", `"%f"`)
13 | // Or with template:
14 | // -"Copy path to file" Call("Scripts::Main", 1, "copyPath.js", `"%f" "/."`)
15 | // -"Copy path to file directory" Call("Scripts::Main", 1, "copyPath.js", `"%f" ""`)
16 | // -"Copy file name" Call("Scripts::Main", 1, "copyPath.js", `"%f" "."`)
17 | // -"Copy file name without extension" Call("Scripts::Main", 1, "copyPath.js", `"%f" ""`)
18 |
19 | var argsCount = WScript.Arguments.length;
20 | var arg = argsCount
21 | ? WScript.Arguments(0)
22 | : AkelPad.GetEditFile(0);
23 | if(arg) {
24 | if(argsCount > 1) {
25 | var path = arg, sep = "", file = "", dot ="", ext = "";
26 | if(/([\\/])?([^\\/]*)$/.test(path)) {
27 | sep = RegExp.$1;
28 | file = RegExp.$2;
29 | path = path.substring(0, path.length - RegExp.lastMatch.length);
30 | if(/\.([^.]+)$/.test(file)) {
31 | dot = ".";
32 | ext = RegExp.$1;
33 | file = file.substring(0, file.length - RegExp.lastMatch.length);
34 | }
35 | }
36 | arg = WScript.Arguments(1)
37 | .replace("", path)
38 | .replace("/", sep)
39 | .replace("", file)
40 | .replace(".", dot)
41 | .replace("", ext);
42 | }
43 | AkelPad.SetClipboardText(arg);
44 | }
--------------------------------------------------------------------------------
/crypt-en.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/crypt-en.png
--------------------------------------------------------------------------------
/crypt-ru.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/crypt-ru.png
--------------------------------------------------------------------------------
/cryptExt-en.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/cryptExt-en.png
--------------------------------------------------------------------------------
/cryptExt-ru.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/cryptExt-ru.png
--------------------------------------------------------------------------------
/decodeHTML.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=4272#p4272
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/decodeHTML.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/decodeHTML.js
4 |
5 | // (c) Infocatcher 2009-2010
6 | // Version: 0.1.5.2 - 2010-07-08
7 | // Author: Infocatcher
8 |
9 | //// Decode HTML entities
10 | // & => &
11 | // < => <
12 | // > => >
13 | // " => "
14 |
15 | //var AkelPad = new ActiveXObject("AkelPad.document");
16 |
17 | var hMainWnd = AkelPad.GetMainWnd();
18 | var hWndEdit = AkelPad.GetEditWnd();
19 | var oFunction = AkelPad.SystemFunction();
20 |
21 | if(hMainWnd && !AkelPad.GetEditReadOnly(hWndEdit)) {
22 | var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
23 | if(lpPoint) {
24 | toggleRedraw(hWndEdit, false);
25 | var selParams = getSelParams();
26 | AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
27 | selParams = decodeHTML(selParams);
28 | restoreSelParams(selParams);
29 | AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
30 | toggleRedraw(hWndEdit, true);
31 | AkelPad.MemFree(lpPoint);
32 | }
33 | }
34 |
35 | function decodeHTML(selParams) {
36 | // Get selection or all text
37 | var txt = AkelPad.GetSelText() || AkelPad.SetSel(0, -1) || AkelPad.GetSelText();
38 | var selStart = AkelPad.GetSelStart();
39 |
40 | txt = txt
41 | .replace(/</g, "<")
42 | .replace(/>/g, ">")
43 | .replace(/"/g, '"')
44 | .replace(/&/g, "&");
45 | AkelPad.ReplaceSel(txt);
46 |
47 | return [selStart, selStart + txt.length];
48 | }
49 |
50 | function toggleRedraw(hWnd, bRedraw) {
51 | AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
52 | if(!bRedraw)
53 | return;
54 | oFunction.AddParameter(hWnd);
55 | oFunction.AddParameter(0);
56 | oFunction.AddParameter(true);
57 | oFunction.Call("user32::InvalidateRect");
58 | }
59 | function getSelParams() {
60 | return [AkelPad.GetSelStart(), AkelPad.GetSelEnd()];
61 | }
62 | function restoreSelParams(selParams) {
63 | AkelPad.SetSel(selParams[0], selParams[1]);
64 | }
--------------------------------------------------------------------------------
/encodeHTML.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=4271#p4271
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/encodeHTML.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/encodeHTML.js
4 |
5 | // (c) Infocatcher 2009-2010
6 | // Version: 0.1.5.2 - 2010-07-08
7 | // Author: Infocatcher
8 |
9 | //// Encode HTML entities
10 | // & => &
11 | // < => <
12 | // > => >
13 | // " => "
14 |
15 | //var AkelPad = new ActiveXObject("AkelPad.document");
16 |
17 | var hMainWnd = AkelPad.GetMainWnd();
18 | var hWndEdit = AkelPad.GetEditWnd();
19 | var oFunction = AkelPad.SystemFunction();
20 |
21 | if(hMainWnd && !AkelPad.GetEditReadOnly(hWndEdit)) {
22 | var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
23 | if(lpPoint) {
24 | toggleRedraw(hWndEdit, false);
25 | var selParams = getSelParams();
26 | AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
27 | selParams = encodeHTML(selParams);
28 | restoreSelParams(selParams);
29 | AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
30 | toggleRedraw(hWndEdit, true);
31 | AkelPad.MemFree(lpPoint);
32 | }
33 | }
34 |
35 | function encodeHTML(selParams) {
36 | // Get selection or all text
37 | var txt = AkelPad.GetSelText() || AkelPad.SetSel(0, -1) || AkelPad.GetSelText();
38 | var selStart = AkelPad.GetSelStart();
39 |
40 | txt = txt
41 | .replace(/&/g, "&")
42 | .replace(//g, ">")
44 | .replace(/"/g, """);
45 | AkelPad.ReplaceSel(txt);
46 |
47 | return [selStart, selStart + txt.length];
48 | }
49 |
50 | function toggleRedraw(hWnd, bRedraw) {
51 | AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
52 | if(!bRedraw)
53 | return;
54 | oFunction.AddParameter(hWnd);
55 | oFunction.AddParameter(0);
56 | oFunction.AddParameter(true);
57 | oFunction.Call("user32::InvalidateRect");
58 | }
59 | function getSelParams() {
60 | return [AkelPad.GetSelStart(), AkelPad.GetSelEnd()];
61 | }
62 | function restoreSelParams(selParams) {
63 | AkelPad.SetSel(selParams[0], selParams[1]);
64 | }
--------------------------------------------------------------------------------
/executeScript.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=11863#p11863
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/executeScript.js
3 | // https://infocatcher.ucoz.net/js/akelpad_scripts/executeScript.vbs
4 |
5 | // (c) Infocatcher 2011
6 | // Version: 0.2.2 - 2011-12-20
7 | // Author: Infocatcher
8 |
9 | //===================
10 | //// Execute selected or all code
11 |
12 | // Arguments:
13 | // -useTempFile=true - run script from temp file (useful for tracking errors)
14 | // -onlySelected=true - use only selected text
15 | // -type="js" - don't ask script type
16 |
17 | // Usage:
18 | // Call("Scripts::Main", 1, "executeScript.js")
19 | // Call("Scripts::Main", 1, "executeScript.js", `-type="js"`)
20 | //===================
21 |
22 | function _localize(s) {
23 | var strings = {
24 | "Yes – run as JScript\nNo – run as VBScript": {
25 | ru: "Да – запустить как JScript\nНет – запустить как VBScript"
26 | }
27 | };
28 | var lng = "en";
29 | switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
30 | case 0x19: lng = "ru";
31 | }
32 | _localize = function(s) {
33 | return strings[s] && strings[s][lng] || s;
34 | };
35 | return _localize(s);
36 | }
37 |
38 | // Read arguments:
39 | // getArg(argName, defaultValue)
40 | var useTempFile = getArg("useTempFile", true);
41 | var type = getArg("type");
42 | var fileToDelete = getArg("fileToDelete");
43 | var onlySelected = getArg("onlySelected", false);
44 |
45 | if(fileToDelete) {
46 | var fso = new ActiveXObject("Scripting.FileSystemObject");
47 | if(fso.FileExists(fileToDelete))
48 | fso.DeleteFile(fileToDelete);
49 | WScript.Quit();
50 | }
51 |
52 | var hMainWnd = AkelPad.GetMainWnd();
53 | if(!hMainWnd)
54 | WScript.Quit();
55 | var dialogTitle = WScript.ScriptName.replace(/^[!-\-_]+/, "");
56 | dialogTitle = dialogTitle.charAt(0).toUpperCase() + dialogTitle.substr(1);
57 |
58 | var filePath = AkelPad.GetEditFile(0);
59 |
60 | var isJs = type ? type == "js" : isJsFile(filePath);
61 | var isVbs = type ? type == "vbs" : isVbsFile(filePath);
62 |
63 | if(!isJs && !isVbs) {
64 | var btn = AkelPad.MessageBox(
65 | hMainWnd,
66 | _localize("Yes – run as JScript\nNo – run as VBScript"),
67 | WScript.ScriptName,
68 | 35 /*MB_YESNOCANCEL|MB_ICONQUESTION*/
69 | );
70 | isJs = btn == 6; //IDYES
71 | isVbs = btn == 7; //IDNO
72 | }
73 |
74 | if(useTempFile && (isJs || isVbs)) {
75 | var tmpFile = WScript.ScriptFullName.replace(/\.[^.]+$/, "") + "-exec." + (isJs ? "js" : "vbs");
76 |
77 | var fso = new ActiveXObject("Scripting.FileSystemObject");
78 | var textStream = fso.CreateTextFile(tmpFile, true /*overwrite*/, true /*unicode*/);
79 | textStream.Write(AkelPad.GetSelText() || AkelPad.GetTextRange(0, -1));
80 | textStream.Close();
81 |
82 | AkelPad.Call("Scripts::Main", 1, fso.GetFileName(tmpFile));
83 | AkelPad.Call("Scripts::Main", 1, WScript.ScriptName, "\"-fileToDelete='" + tmpFile.replace(/[\\'"]/g, "\\$&") + "'\"");
84 | }
85 | else if(isJs)
86 | eval(AkelPad.GetSelText() || (onlySelected ? "" : AkelPad.GetTextRange(0, -1)));
87 | else if(isVbs)
88 | AkelPad.Call("Scripts::Main", 1, WScript.ScriptName.replace(/\.[^.]+$/, "") + ".vbs", "-onlySelected=" + onlySelected);
89 |
90 | function getExt(path) {
91 | return /\.([^.]+)$/.test(path) ? RegExp.$1 : "";;
92 | }
93 | function isJsFile(path) {
94 | return /^js(m|on)?$/.test(getExt(path));
95 | }
96 | function isVbsFile(path) {
97 | return /^(bas|vb[s5]?|wbt|frm)$/.test(getExt(path));
98 | }
99 |
100 | function getArg(argName, defaultVal) {
101 | var args = {};
102 | for(var i = 0, argsCount = WScript.Arguments.length; i < argsCount; ++i)
103 | if(/^[-\/](\w+)(=(.+))?$/.test(WScript.Arguments(i)))
104 | args[RegExp.$1.toLowerCase()] = RegExp.$3 ? eval(RegExp.$3) : true;
105 | getArg = function(argName, defaultVal) {
106 | argName = argName.toLowerCase();
107 | return typeof args[argName] == "undefined" // argName in args
108 | ? defaultVal
109 | : args[argName];
110 | };
111 | return getArg(argName, defaultVal);
112 | }
--------------------------------------------------------------------------------
/executeScript.vbs:
--------------------------------------------------------------------------------
1 | ' http://akelpad.sourceforge.net/forum/viewtopic.php?p=11863#11863
2 | ' http://infocatcher.ucoz.net/js/akelpad_scripts/executeScript.js
3 | ' http://infocatcher.ucoz.net/js/akelpad_scripts/executeScript.vbs
4 |
5 | ' Version: 0.1.2 - 2011-04-11
6 | ' Author: Infocatcher
7 |
8 | '' Supplemental script for runScript.js
9 | ' Executes selected or all code
10 |
11 | option explicit
12 | dim onlySelected
13 | if WScript.Arguments.length then
14 | onlySelected = WScript.Arguments(0) = "-onlySelected=true"
15 | else
16 | onlySelected = false
17 | end if
18 |
19 | if onlySelected <> true and AkelPad.GetSelStart = AkelPad.GetSelEnd then
20 | executeGlobal AkelPad.GetTextRange(0, -1)
21 | else
22 | executeGlobal AkelPad.GetSelText
23 | end if
--------------------------------------------------------------------------------
/forceCloneTab.js:
--------------------------------------------------------------------------------
1 | // https://infocatcher.ucoz.net/js/akelpad_scripts/forceCloneTab.js
2 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/forceCloneTab.js
3 |
4 | // (c) Infocatcher 2024
5 | // Version: 0.1.0 - 2024-11-23
6 | // Author: Infocatcher
7 |
8 | //// Force clone tab (even if "Single open file" is turned on)
9 | // Based on Instructor's code: https://akelpad.sourceforge.net/forum/viewtopic.php?p=4222#p4222
10 |
11 | // Usage:
12 | // Call("Scripts::Main", 1, "forceCloneTab.js")
13 |
14 | var hMainWnd = AkelPad.GetMainWnd();
15 | if(!hMainWnd)
16 | WScript.Quit();
17 | var singleOpen = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 152 /*MI_SINGLEOPENFILE*/, 0);
18 | singleOpen && AkelPad.Command(4255 /*IDM_OPTIONS_SINGLEOPEN_FILE*/);
19 | AkelPad.Command(4322 /*IDM_WINDOW_FRAMECLONE*/);
20 | singleOpen && AkelPad.Command(4255 /*IDM_OPTIONS_SINGLEOPEN_FILE*/);
--------------------------------------------------------------------------------
/forgetAboutTab.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=19810#p19810
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/forgetAboutTab.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/forgetAboutTab.js
4 |
5 | // (c) Infocatcher 2012, 2014
6 | // Version: 0.1.0.1 - 2014-04-20
7 | // Author: Infocatcher
8 |
9 | //// Close current tab and remove information about it from recent files
10 |
11 | // Dependencies:
12 | // DeleteRecentFile.js
13 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=10810#p10810
14 |
15 | // Arguments:
16 | // -file='%f' - file to forget (or don't specify to use current)
17 | // -confirm=true - show confirmation dialog
18 |
19 | // Usage in ContextMenu plugin:
20 | // -"Forget about this tab" Call("Scripts::Main", 1, "forgetAboutTab.js") Icon("%a\AkelFiles\Plugs\RecentFiles.dll", 5)
21 | // -"Забыть об этой вкладке" Call("Scripts::Main", 1, "forgetAboutTab.js") Icon("%a\AkelFiles\Plugs\RecentFiles.dll", 5)
22 |
23 | var file = AkelPad.GetArgValue("file", "") || AkelPad.GetEditFile(0);
24 | var ask = AkelPad.GetArgValue("confirm", true);
25 | if(file && (!ask || confirm())) {
26 | WScript.Sleep(50);
27 | AkelPad.Command(4318 /*IDM_WINDOW_FRAMECLOSE*/);
28 | //WScript.Sleep(50);
29 | AkelPad.Call("Scripts::Main", 1, "DeleteRecentFile.js", file);
30 | }
31 |
32 | function confirm() {
33 | return AkelPad.MessageBox(
34 | AkelPad.GetMainWnd(),
35 | getConfirmText(),
36 | WScript.ScriptName,
37 | 33 /*MB_OKCANCEL|MB_ICONQUESTION*/
38 | ) == 1 /*IDOK*/;
39 | }
40 | function getConfirmText() {
41 | switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
42 | case 0x19: /*ru*/ return "Забыть об этой вкладке?";
43 | default: /*en*/ return "Forget about this tab?";
44 | }
45 | }
--------------------------------------------------------------------------------
/fullWindow.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=24434#p24434
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/fullWindow.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/fullWindow.js
4 |
5 | // (c) Infocatcher 2014
6 | // Version: 0.1.0 - 2014-04-03
7 | // Author: Infocatcher
8 |
9 | //// Just like full screen mode, but preserve window size and position
10 | // Required FullScreen plugin!
11 |
12 | var hMainWnd = AkelPad.GetMainWnd();
13 | var oSys = AkelPad.SystemFunction();
14 | var lpRect;
15 |
16 | if(
17 | hMainWnd
18 | && (lpRect = AkelPad.MemAlloc(16 /*sizeof(RECT)*/))
19 | && oSys.Call("user32::GetWindowRect", hMainWnd, lpRect)
20 | ) {
21 | var x = AkelPad.MemRead(_PtrAdd(lpRect, 0), 3 /*DT_DWORD*/);
22 | var y = AkelPad.MemRead(_PtrAdd(lpRect, 4), 3 /*DT_DWORD*/);
23 | var w = AkelPad.MemRead(_PtrAdd(lpRect, 8), 3 /*DT_DWORD*/) - x;
24 | var h = AkelPad.MemRead(_PtrAdd(lpRect, 12), 3 /*DT_DWORD*/) - y;
25 |
26 | AkelPad.Call("FullScreen::Main");
27 | oSys.Call("user32::SetWindowPos", hMainWnd, 0, x, y, w, h, 0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);
28 | }
29 | lpRect && AkelPad.MemFree(lpRect);
--------------------------------------------------------------------------------
/getHash-en.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/getHash-en.png
--------------------------------------------------------------------------------
/getHash-ru.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/getHash-ru.png
--------------------------------------------------------------------------------
/getLinks.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=9926#p9926
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/getLinks.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/getLinks.js
4 |
5 | // (c) Infocatcher 2009-2011
6 | // Version: 0.1.7 - 2011-12-20
7 | // Author: Infocatcher
8 |
9 | //===================
10 | //// Tries to extract links from any text
11 |
12 | // Usage:
13 | // Call("Scripts::Main", 1, "getLinks.js")
14 | //===================
15 |
16 | function _localize(s) {
17 | var strings = {
18 | "Links not found!": {
19 | ru: "Ссылки не найдены!"
20 | }
21 | };
22 | var lng = "en";
23 | switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
24 | case 0x19: lng = "ru";
25 | }
26 | _localize = function(s) {
27 | return strings[s] && strings[s][lng] || s;
28 | };
29 | return _localize(s);
30 | }
31 |
32 | //var AkelPad = new ActiveXObject("AkelPad.document");
33 | var hMainWnd = AkelPad.GetMainWnd();
34 | var oSys = AkelPad.SystemFunction();
35 |
36 | if(hMainWnd) {
37 | var links = getLinks();
38 | if(links.length) {
39 | AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4101 /*IDM_FILE_NEW*/, 0);
40 | AkelPad.SetSel(0, 0);
41 | insertNoScroll(links.join("\n"), true);
42 | }
43 | else {
44 | AkelPad.MessageBox(
45 | hMainWnd,
46 | _localize("Links not found!"),
47 | WScript.ScriptName,
48 | 48 /*MB_ICONEXCLAMATION*/
49 | );
50 | }
51 | }
52 |
53 | function getLinks() {
54 | // Get selection or all text
55 | var txt = AkelPad.GetSelText() || getAllText();
56 |
57 | // [url=http://example.com/]...[/url] => http://example.com/
58 | txt = txt.replace(/\[(\w+)=(['"]?)([^\[\]]+)\2\].*?\[\/\1\]/g, "\t$3\t");
59 |
60 | var links = txt.match(/[a-z]+:\/\/+([^\/\\.\s<>'":*?|\(\)\[\]\{\}]+\.)*[^\/\\.\s<>'":*?|\(\)\[\]\{\}]+(:\d+)?(\/[^\s"<>]*)?|mailto:[^@\s\\\/:*?"<>|]+@[^@.\s\\\/:*?"<>|]+(\.[^@.\s\\\/:*?"<>|]+)+|\\{2,}\w+(\\[^\\\/:*?"<>|\s]+)+\\?/ig);
61 | if(!links)
62 | return [];
63 |
64 | var linksObj = {};
65 | var link;
66 | for(var i = 0, len = links.length; i < len; i++) {
67 | link = links[i].replace(/[\(\{\[+,]$/, "");
68 |
69 | if(count(link, /\(/g) == 0 && count(link, /\)/g))
70 | link = link.replace(/\).*$/, "");
71 | if(count(link, /\[/g) == 0 && count(link, /\]/g))
72 | link = link.replace(/\].*$/, "");
73 | if(count(link, /\{/g) == 0 && count(link, /\}/g))
74 | link = link.replace(/\}.*$/, "");
75 |
76 | linksObj[decodeHTML(link)] = 1;
77 | }
78 |
79 | links = [];
80 | for(var h in linksObj)
81 | links.push(h);
82 |
83 | return links;
84 | }
85 | function count(s, re) {
86 | var m = s.match(re);
87 | return m ? m.length : 0;
88 | }
89 | function decodeHTML(s) {
90 | return s
91 | .replace(/&/g, "&")
92 | .replace(/</g, "<")
93 | .replace(/>/g, ">")
94 | .replace(/"/g, '"');
95 | }
96 |
97 | function getAllText() {
98 | if(typeof AkelPad.GetTextRange != "undefined")
99 | return AkelPad.GetTextRange(0, -1);
100 | var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
101 | if(!lpPoint)
102 | return "";
103 | var hWndEdit = AkelPad.GetEditWnd();
104 | setRedraw(hWndEdit, false);
105 | AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
106 |
107 | var columnSel = AkelPad.SendMessage(hWndEdit, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0);
108 | var ss = AkelPad.GetSelStart();
109 | var se = AkelPad.GetSelEnd();
110 |
111 | AkelPad.SetSel(0, -1);
112 | var str = AkelPad.GetSelText();
113 |
114 | AkelPad.SetSel(ss, se);
115 | columnSel && AkelPad.SendMessage(hWndEdit, 3128 /*AEM_UPDATESEL*/, 0x1 /*AESELT_COLUMNON*/, 0);
116 |
117 | AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
118 | AkelPad.MemFree(lpPoint);
119 | setRedraw(hWndEdit, true);
120 | return str;
121 | }
122 | function insertNoScroll(str, selectAll) {
123 | var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
124 | if(!lpPoint)
125 | return;
126 | var hWndEdit = AkelPad.GetEditWnd();
127 | setRedraw(hWndEdit, false);
128 | AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
129 |
130 | selectAll && AkelPad.SetSel(0, -1);
131 | //var ss = AkelPad.GetSelStart();
132 | AkelPad.ReplaceSel(str, true);
133 | //if(ss != AkelPad.GetSelStart())
134 | // AkelPad.SetSel(ss, ss + str.length);
135 |
136 | AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
137 | setRedraw(hWndEdit, true);
138 | AkelPad.MemFree(lpPoint);
139 | }
140 | function setRedraw(hWnd, bRedraw) {
141 | AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
142 | bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
143 | }
--------------------------------------------------------------------------------
/goToLongestLine-en.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/goToLongestLine-en.png
--------------------------------------------------------------------------------
/goToLongestLine-ru.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/goToLongestLine-ru.png
--------------------------------------------------------------------------------
/insertDateTemplateExample.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=4311#p4311
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/insertDateTemplateExample.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/insertDateTemplateExample.js
4 |
5 | // (c) Infocatcher 2008-2009, 2012
6 | // Version: 0.1.2 - 2012-12-03
7 | // Author: Infocatcher
8 |
9 | //// Insert current date
10 |
11 | //== User settings:
12 | var dateTemplate = "--";
13 | // You can use , , , , , , , , ,
14 | // Days of week:
15 | var daysOfWeek = "sunday,monday,tuesday,wednesday,thursday,friday,saturday";
16 | var monthNames = "jan,feb,mar,apr,may,jun,jul,avg,sep,oct,nov,dec";
17 | // Use "," as separator
18 |
19 | // Or you can specified dateTemplate, daysOfWeek and monthNames in command line arguments:
20 | // Call("Scripts::Main", 1, "insertDate.js", "/t=dateTemplate /w=daysOfWeek /m=monthNames", 0)
21 | // \s - " " (space), \n - line feed
22 | // For example:
23 | // Call("Scripts::Main", 1, "insertDate.js", "/t=,\s /w=su,mo,tu,we,th,fr,sa /m=jan,feb,mar,apr,may,jun,jul,avg,sep,oct,nov,dec", 0)
24 | //== End of user settings
25 |
26 | var argsCount = WScript.Arguments.length;
27 | var args = {};
28 | for(var i = 0; i < argsCount; ++i) // read arguments
29 | if(/^\/([a-z]+)=(.+)$/i.test(WScript.Arguments(i)))
30 | args[RegExp.$1] = RegExp.$2;
31 |
32 | dateTemplate = (args.t && convertArg(args.t)) || dateTemplate;
33 | daysOfWeek = ((args.w && convertArg(args.w)) || daysOfWeek).split(/\s*,\s*/);
34 | monthNames = ((args.m && convertArg(args.m)) || monthNames).split(/\s*,\s*/);
35 |
36 | function convertArg(s) {
37 | return s
38 | .replace(/\\s/g, " ")
39 | .replace(/\\n/g, "\n");
40 | }
41 | function addZero(n) {
42 | return n > 9 ? n : "0" + n;
43 | }
44 | function getTimezone(tzo) {
45 | var m = Math.abs(tzo);
46 | var h = Math.floor(m/60);
47 | m = Math.floor(m - h*60);
48 | return (tzo > 0 ? "-" : "+") + addZero(h) + addZero(m);
49 | }
50 | function getFormattedDate(template, days, months) {
51 | var d = new Date();
52 | var y = d.getFullYear().toString();
53 | var m = d.getMonth();
54 | return template
55 | .replace(//g, days[d.getDay()])
56 | .replace(//g, addZero(d.getDate()))
57 | .replace(//g, addZero(m + 1))
58 | .replace(//g, months[m])
59 | .replace(//g, y)
60 | .replace(//g, y.substring(2, y.length))
61 | .replace(//g, addZero(d.getHours()))
62 | .replace(/|/g, addZero(d.getMinutes()))
63 | .replace(/|/g, addZero(d.getSeconds()))
64 | .replace(//g, getTimezone(d.getTimezoneOffset()));
65 | }
66 |
67 | //var AkelPad = new ActiveXObject("AkelPad.document");
68 | AkelPad.ReplaceSel(getFormattedDate(dateTemplate, daysOfWeek, monthNames));
--------------------------------------------------------------------------------
/insertTag.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=11213#p11213
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/insertTag.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/insertTag.js
4 |
5 | // (c) Infocatcher 2009-2012, 2014
6 | // Version: 0.2.6 - 2014-07-28
7 | // Author: Infocatcher
8 |
9 | //===================
10 | //// Simplify tags insertion
11 | // By default ask user for tag and insert
12 | // {selected_text}
13 |
14 | // Arguments:
15 | // -bbcode=0 - Use
16 | // =1 - Use [tag]
17 | // =-1 - Autodetection
18 | // -xmlExts="[sx]html?|mht(ml)?|xml" - Detect , mask for Coder plugin alias or file extension (for -bbcode=-1)
19 | // -tagExts='{"": "i", "fb2": "em"}' - Detect tag by Coder plugin alias or file extension, for %T variable
20 | // "": "i" - default tag
21 | // "fb2|xhtml?": "em" - regular expression for special files
22 | // "ext": "" - tag not supported in *.ext files
23 | // -clip=true - Use text from clipboard instead of selected text
24 | // -selectMode=0 - Select all inserted text: [text]
25 | // =1 - Select text inside tags: [text]
26 | // -tag="div" - Don't ask tag, you also can use %T with -tagExts
27 | // -template='%%S' - Use template (and ignore all other arguments)
28 | // -saveLastTag=0 - don't save last used tag
29 | // =1 - save only typed (default)
30 | // =2 - always save
31 |
32 | // Special variables in templates:
33 | // %| - selection start or end
34 | // %S - selected text
35 | // %C - clipboard text
36 | // %SC - selected text or clipboard text
37 | // %CS - clipboard text or selected text
38 | // %T - tag (detected using -tagExts)
39 |
40 | // Usage:
41 | // Call("Scripts::Main", 1, "insertTag.js")
42 | // Call("Scripts::Main", 1, "insertTag.js", `-bbcode=1 -tag="quote"`)
43 | // Call("Scripts::Main", 1, "insertTag.js", `-template='%%|%%S%%|'`)
44 | // Call("Scripts::Main", 1, "insertTag.js", `-bbcode=-1 -tag="%%T" -tagExts='{"": "i", "fb2|xhtml?": "em"}'`)
45 | //===================
46 |
47 | function _localize(s) {
48 | var strings = {
49 | "Tag or template:": {
50 | ru: "Тэг или шаблон:"
51 | },
52 | "Tag %T not supported!": {
53 | ru: "Тэг %T не поддерживается!"
54 | },
55 | "Tags %T not supported!": {
56 | ru: "Тэги %T не поддерживаются!"
57 | }
58 | };
59 | var lng = "en";
60 | switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
61 | case 0x19: lng = "ru";
62 | }
63 | _localize = function(s) {
64 | return strings[s] && strings[s][lng] || s;
65 | };
66 | return _localize(s);
67 | }
68 |
69 | // Read arguments:
70 | // getArg(argName, defaultValue)
71 | var useBBCode = getArg("bbcode", -1);
72 | var xmlExts = getArg("xmlExts", "[xs]?html?|mht(ml)?|hta|asp|jsm?|css|xml|axl|dxl|fb2|kml|manifest|msc|ndl|rdf|rss|svg|user|wsdl|xaml|xmp|xsd|xslt?|xul|xbl|resx|v[cbd]proj|csproj|wx[ils]|wixobj|wixout|wixlib|wixpdb|wixmsp|wixmst");
73 | var tagExts = getArg("tagExts", "");
74 | var useClipboard = getArg("clip", false);
75 | var selectMode = getArg("selectMode", 0);
76 | var tag = getArg("tag"); // Override tag prompt
77 | var template = getArg("template"); // Use template and ignore all arguments except -bbcode=-1 (and -xmlExts)
78 | var saveLastTag = getArg("saveLastTag", 1);
79 |
80 |
81 | var hMainWnd = AkelPad.GetMainWnd();
82 | var hWndEdit = AkelPad.GetEditWnd();
83 | var oSys = AkelPad.SystemFunction();
84 |
85 | if(hMainWnd && hWndEdit && !AkelPad.GetEditReadOnly(hWndEdit))
86 | insertTag();
87 |
88 | function insertTag() {
89 | var txt, ss, se;
90 | if(template) {
91 | // Example: %|%S%|
92 | if(useBBCode == -1) {
93 | template = detectBBCode()
94 | ? template.replace(//g, "]")
95 | : template.replace(/\[/g, "<").replace(/\]/g, ">");
96 | }
97 |
98 | var rnd = function() {
99 | return Math.random().toString(36).substr(2) + Math.random().toString(36).substr(2);
100 | };
101 | var posMarker = rnd();
102 | var percent = rnd();
103 |
104 | var sel = /%C?S/.test(template) && AkelPad.GetSelText();
105 | var clip = /%S?C/.test(template) && AkelPad.GetClipboardText();
106 | if(/%T/.test(template)) {
107 | var autoTag = detectTag();
108 | if(tagNotSupported(autoTag))
109 | return;
110 | }
111 |
112 | txt = template
113 | .replace(/%%/g, percent)
114 | .replace(/%\|/g, posMarker)
115 | .replace(/%SC/g, sel || clip)
116 | .replace(/%CS/g, clip || sel)
117 | .replace(/%S/g, sel)
118 | .replace(/%C/g, clip)
119 | .replace(/%T/g, autoTag)
120 | .replace(new RegExp(percent, "g"), "%");
121 |
122 | var posMarkerRe = new RegExp(posMarker);
123 | if(posMarkerRe.test(txt)) {
124 | ss = se = AkelPad.GetSelStart() + RegExp.leftContext.length;
125 | txt = RegExp.leftContext + RegExp.rightContext;
126 | }
127 | if(posMarkerRe.test(txt)) {
128 | se = AkelPad.GetSelStart() + RegExp.leftContext.length;
129 | txt = RegExp.leftContext + RegExp.rightContext;
130 | }
131 | }
132 | else {
133 | txt = useClipboard
134 | ? AkelPad.GetClipboardText()
135 | : AkelPad.GetSelText();
136 | var hasTxt = !!txt;
137 |
138 | if(!tag) {
139 | var tagTyped = true;
140 | tag = AkelPad.InputBox(
141 | hMainWnd,
142 | WScript.ScriptName,
143 | _localize("Tag or template:"),
144 | saveLastTag && pref("lastTag", 3 /*PO_STRING*/) || ""
145 | );
146 | }
147 | if(!tag)
148 | return;
149 | if(saveLastTag && (tagTyped || saveLastTag == 2))
150 | pref("lastTag", 3 /*PO_STRING*/, tag);
151 |
152 | if(tagTyped && /%[%|SC]/.test(tag)) {
153 | template = tag;
154 | useBBCode = tag.charAt(0) == "[";
155 | insertTag();
156 | return;
157 | }
158 |
159 | if(tagTyped) {
160 | var first = tag.charAt(0);
161 | if(first == "<" || first == "[") { // [tag -> tag
162 | useBBCode = first == "[";
163 | tag = tag.substr(1);
164 | if(tag.charAt(tag.length - 1) == (useBBCode ? "]" : ">")) // tag] -> tag
165 | tag = tag.slice(0, -1);
166 | }
167 | }
168 |
169 | if(useBBCode == -1)
170 | useBBCode = detectBBCode();
171 |
172 | var attrs = "";
173 | if(/^[<\[]?[^\s="'<>\[\]]+/.test(tag)) {
174 | tag = RegExp.lastMatch;
175 | attrs = RegExp.rightContext;
176 | }
177 |
178 | if(/%T/.test(tag)) {
179 | var autoTag = detectTag();
180 | if(tagNotSupported(autoTag))
181 | return;
182 | tag = tag.replace(/%T/g, autoTag);
183 | }
184 |
185 | var makeTag = function(tagData) {
186 | return (useBBCode ? "[" : "<") + tagData + (useBBCode ? "]" : ">");
187 | };
188 |
189 | var closeTags = [];
190 | var openedTagPattern = new RegExp((useBBCode ? "\\[" : "<") + "([^/\\s=\"'<>\\[\\]]+)");
191 | for(var part = attrs; part; ) {
192 | if(openedTagPattern.test(part)) {
193 | var openedTag = RegExp.$1;
194 | part = RegExp.rightContext;
195 | closeTags.push(makeTag("/" + openedTag));
196 | continue;
197 | }
198 | break;
199 | }
200 |
201 | var sTag = makeTag(tag + attrs);
202 | var eTag = closeTags.reverse().join("") + makeTag("/" + tag);
203 |
204 | txt = sTag + txt + eTag;
205 |
206 | if(!hasTxt || selectMode == 1) {
207 | var _ss = AkelPad.GetSelStart();
208 | ss = _ss + sTag.length;
209 | se = _ss + txt.length - eTag.length;
210 | }
211 | }
212 | insertNoScroll(txt, ss, se);
213 | }
214 | function detectBBCode() {
215 | return !extPattern(xmlExts).test(getFileType());
216 | }
217 | function detectTag() {
218 | var patterns = getTagData();
219 | if(!patterns)
220 | return undefined;
221 | var fileType = getFileType();
222 | for(var exts in patterns)
223 | if(extPattern(exts).test(fileType))
224 | return patterns[exts];
225 | return patterns[""] || undefined;
226 | }
227 | function getTagData() {
228 | var patterns = tagExts && eval("(" + tagExts + ")");
229 | getTagData = function() {
230 | return patterns;
231 | };
232 | return patterns;
233 | }
234 | function tagNotSupported(tag) {
235 | if(!tag) {
236 | var tags = [];
237 | var patterns = getTagData();
238 | if(patterns) for(var exts in patterns)
239 | if(patterns[exts])
240 | tags.push(patterns[exts]);
241 | AkelPad.MessageBox(
242 | hMainWnd,
243 | _localize(tags.length > 1 ? "Tags %T not supported!" : "Tag %T not supported!")
244 | .replace("%T", tags.join(", ")),
245 | WScript.ScriptName,
246 | 48 /*MB_ICONEXCLAMATION*/
247 | );
248 | }
249 | return !tag;
250 | }
251 | function extPattern(exts) {
252 | return new RegExp("\\.(" + exts + ")$", "i");
253 | }
254 | function getFileType() {
255 | var fileType = getCoderAlias() || AkelPad.GetEditFile(0);
256 | getFileType = function() {
257 | return fileType;
258 | };
259 | return fileType;
260 | }
261 | function getCoderAlias() {
262 | if(
263 | !AkelPad.IsPluginRunning("Coder::HighLight")
264 | && !AkelPad.IsPluginRunning("Coder::CodeFold")
265 | && !AkelPad.IsPluginRunning("Coder::AutoComplete")
266 | )
267 | return "";
268 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=19363#p19363
269 | var hWndEdit = AkelPad.GetEditWnd();
270 | var hDocEdit = AkelPad.GetEditDoc();
271 | var pAlias = "";
272 | if(hWndEdit && hDocEdit) {
273 | var lpAlias = AkelPad.MemAlloc(256 * 2 /*sizeof(wchar_t)*/);
274 | if(lpAlias) {
275 | AkelPad.CallW("Coder::Settings", 18 /*DLLA_CODER_GETALIAS*/, hWndEdit, hDocEdit, lpAlias, 0);
276 | pAlias = AkelPad.MemRead(lpAlias, 1 /*DT_UNICODE*/);
277 | AkelPad.MemFree(lpAlias);
278 | }
279 | }
280 | return pAlias;
281 | }
282 |
283 | function insertNoScroll(str, ss, se) {
284 | var nFirstLine = saveLineScroll(hWndEdit);
285 |
286 | //var ss = AkelPad.GetSelStart();
287 | AkelPad.ReplaceSel(str, true);
288 | //if(ss != AkelPad.GetSelStart())
289 | // AkelPad.SetSel(ss, ss + str.length);
290 |
291 | if(ss != undefined || se != undefined) {
292 | if(ss == undefined) ss = AkelPad.GetSelStart();
293 | if(se == undefined) se = AkelPad.GetSelEnd();
294 | AkelPad.SetSel(ss, se);
295 | }
296 |
297 | restoreLineScroll(hWndEdit, nFirstLine);
298 | }
299 | // From Instructor's SearchReplace.js
300 | function saveLineScroll(hWnd)
301 | {
302 | AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, false, 0);
303 | return AkelPad.SendMessage(hWnd, 3129 /*AEM_GETLINENUMBER*/, 4 /*AEGL_FIRSTVISIBLELINE*/, 0);
304 | }
305 | function restoreLineScroll(hWnd, nBeforeLine)
306 | {
307 | if (AkelPad.SendMessage(hWnd, 3129 /*AEM_GETLINENUMBER*/, 4 /*AEGL_FIRSTVISIBLELINE*/, 0) != nBeforeLine)
308 | {
309 | var lpScrollPos;
310 | var nPosY=AkelPad.SendMessage(hWnd, 3198 /*AEM_VPOSFROMLINE*/, 0 /*AECT_GLOBAL*/, nBeforeLine);
311 |
312 | if (lpScrollPos=AkelPad.MemAlloc(_X64?16:8 /*sizeof(POINT64)*/))
313 | {
314 | AkelPad.MemCopy(_PtrAdd(lpScrollPos, 0) /*offsetof(POINT64, x)*/, -1, 2 /*DT_QWORD*/);
315 | AkelPad.MemCopy(_PtrAdd(lpScrollPos, _X64?8:4) /*offsetof(POINT64, y)*/, nPosY, 2 /*DT_QWORD*/);
316 | AkelPad.SendMessage(hWnd, 3180 /*AEM_SETSCROLLPOS*/, 0, lpScrollPos);
317 | AkelPad.MemFree(lpScrollPos);
318 | }
319 | }
320 | AkelPad.SendMessage(hWnd, 3377 /*AEM_UPDATECARET*/, 0, 0);
321 | AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, true, 0);
322 | oSys.Call("user32::InvalidateRect", hWnd, 0, true);
323 | }
324 |
325 | function getArg(argName, defaultVal) {
326 | var args = {};
327 | for(var i = 0, argsCount = WScript.Arguments.length; i < argsCount; ++i)
328 | if(/^[-\/](\w+)(=(.+))?$/.test(WScript.Arguments(i)))
329 | args[RegExp.$1.toLowerCase()] = RegExp.$3 ? eval(RegExp.$3) : true;
330 | getArg = function(argName, defaultVal) {
331 | argName = argName.toLowerCase();
332 | return typeof args[argName] == "undefined" // argName in args
333 | ? defaultVal
334 | : args[argName];
335 | };
336 | return getArg(argName, defaultVal);
337 | }
338 | function pref(name, type, val) {
339 | var oSet = AkelPad.ScriptSettings();
340 | if(arguments.length == 3) {
341 | if(!oSet.Begin(WScript.ScriptBaseName, 0x2 /*POB_SAVE*/))
342 | return false;
343 | var ok = oSet.Write(name, type, val);
344 | oSet.End();
345 | return ok;
346 | }
347 | if(!oSet.Begin(WScript.ScriptBaseName, 0x1 /*POB_READ*/))
348 | return undefined;
349 | var ret = oSet.Read(name, type || 1 /*PO_DWORD*/);
350 | oSet.End();
351 | return ret;
352 | }
--------------------------------------------------------------------------------
/measuresConverter-en.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/measuresConverter-en.png
--------------------------------------------------------------------------------
/measuresConverter-ru.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/measuresConverter-ru.png
--------------------------------------------------------------------------------
/moveResizeWindow-ru.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/moveResizeWindow-ru.png
--------------------------------------------------------------------------------
/moveResizeWindow.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=17270#p17270
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/moveResizeWindow.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/moveResizeWindow.js
4 |
5 | // (c) Infocatcher 2012-2020
6 | // Version: 0.1.3 - 2020-07-27
7 | // Author: Infocatcher
8 |
9 | //// Move or/and align AkelPad's main window
10 |
11 | // Icons for context menu:
12 | // https://infocatcher.ucoz.net/js/akelpad_scripts/moveResizeWindow_icons.zip
13 | // or https://github.com/Infocatcher/AkelPad_menu/tree/master/icons window_*.ico + window.xcf
14 | // (based on Actual Window Manager's icons: http://www.actualtools.com/windowmanager/)
15 |
16 | // Arguments:
17 | // -resize={width}*{height}
18 | // =800*600 - resize window to 800 x 600
19 | // =100%* - resize window to 100% of work area width
20 | // =*100% - resize window to 100% of work area height
21 | // =100%*100% - resize window to work area (like maximize)
22 | // -move={x}*{y}
23 | // =center*center - move window to center of work area
24 | // =left*top - move window to top left corner of work area
25 | // =right*top - move window to top right corner of work area
26 | // =left*bottom - move window to bottom left corner of work area
27 | // =right*bottom - move window to bottom right corner of work area
28 | // =left* - move window to left side of work area
29 | // =50%* - move window to 50% of work area width
30 | // =*50% - move window to 50% of work area height
31 | // =10*150 - move to x=10, y=150
32 | // -allowRestore=true - allow save last used size and position and restore them after second call
33 |
34 | // Note: use "%%" to specify "%" in ContextMenu ant Toolbar
35 |
36 | // Usage:
37 | // -"Stretch to width" Call("Scripts::Main", 1, "moveResizeWindow.js", "-resize=100%%* -move=left*")
38 | // -"Move down and left + 1280x720" Call("Scripts::Main", 1, "moveResizeWindow.js", "-resize=1280*720 -move=left*bottom")
39 |
40 | var hMainWnd = AkelPad.GetMainWnd();
41 | var oSys = AkelPad.SystemFunction();
42 |
43 | if(hMainWnd && !AkelPad.IsInclude()) {
44 | var resize = AkelPad.GetArgValue("resize", "");
45 | var move = AkelPad.GetArgValue("move", "");
46 |
47 | var allowRestore = AkelPad.GetArgValue("allowRestore", true);
48 | if(allowRestore)
49 | var pos = getWindowPos(hMainWnd);
50 | var changed = false;
51 | if(resize)
52 | resizeWindow(hMainWnd, resize) && (changed = true);
53 | if(move)
54 | moveWindow(hMainWnd, move) && (changed = true);
55 | if(allowRestore) {
56 | if(changed)
57 | saveWindowPos("main", hMainWnd, pos);
58 | else
59 | restoreWindowPos("main", hMainWnd);
60 | }
61 | }
62 |
63 | function resizeWindow(hWnd, resize, hWndParent) {
64 | var tokens = resize.split("*");
65 | var rsW = tokens[0];
66 | var rsH = tokens[1];
67 |
68 | var rcWnd = getWindowRect(hWnd);
69 | var rcWork = hWndParent
70 | ? getWindowRect(hWndParent)
71 | : getWorkArea(hWnd);
72 | if(!rcWnd || !rcWork)
73 | return;
74 |
75 | var shadow = getShadow(rcWnd);
76 |
77 | var ww = rcWork.right - rcWork.left - (shadow.right - shadow.left);
78 | var wh = rcWork.bottom - rcWork.top - (shadow.bottom - shadow.top);
79 |
80 | var w = rcWnd.right - rcWnd.left;
81 | var h = rcWnd.bottom - rcWnd.top;
82 |
83 | if(isPersent(rsW))
84 | rsW = Math.round(parseFloat(rsW)/100*ww);
85 | else if(!rsW)
86 | rsW = w;
87 | else
88 | rsW = parseInt(rsW);
89 |
90 | if(isPersent(rsH))
91 | rsH = Math.round(parseFloat(rsH)/100*wh);
92 | else if(!rsH)
93 | rsH = h;
94 | else
95 | rsH = parseInt(rsH);
96 |
97 | rsW = Math.min(ww, rsW);
98 | rsH = Math.min(wh, rsH);
99 |
100 | if(rsW == w && rsH == h)
101 | return false;
102 | return setWindowPos(hWnd, null, null, rsW, rsH);
103 | }
104 | function moveWindow(hWnd, move, hWndParent) {
105 | var tokens = move.split("*");
106 | var mvX = tokens[0];
107 | var mvY = tokens[1];
108 |
109 | var rcWnd = getWindowRect(hWnd);
110 | var rcWork = hWndParent
111 | ? getWindowRect(hWndParent)
112 | : getWorkArea(hWnd);
113 | if(!rcWnd || !rcWork)
114 | return;
115 |
116 | var shadow = getShadow(rcWnd);
117 |
118 | var w = rcWnd.right - rcWnd.left;
119 | var h = rcWnd.bottom - rcWnd.top;
120 |
121 | if (mvX == "left") mvX = rcWork.left - shadow.left;
122 | else if(mvX == "center") mvX = centerX(rcWnd, rcWork);
123 | else if(mvX == "right") mvX = rcWork.right - w - shadow.right;
124 | else if(!mvX) mvX = rcWnd.left;
125 | else if(isPersent(mvX)) mvX = parseFloat(mvX)/100*(rcWork.right - rcWork.left);
126 | else mvX = parseInt(mvX);
127 |
128 | if (mvY == "top") mvY = rcWork.top - shadow.top;
129 | else if(mvY == "center") mvY = centerY(rcWnd, rcWork);
130 | else if(mvY == "bottom") mvY = rcWork.bottom - h - shadow.bottom;
131 | else if(!mvY) mvY = rcWnd.top;
132 | else if(isPersent(mvY)) mvY = parseFloat(mvY)/100*(rcWork.bottom - rcWork.top);
133 | else mvY = parseInt(mvY);
134 |
135 | mvX = Math.round(Math.max(rcWork.left - shadow.left, Math.min(rcWork.right - w - shadow.right, mvX)));
136 | mvY = Math.round(Math.max(rcWork.top - shadow.top, Math.min(rcWork.bottom - h - shadow.bottom, mvY)));
137 |
138 | if(mvX == rcWnd.left && mvY == rcWnd.top)
139 | return false;
140 | return setWindowPos(hWnd, mvX, mvY, null, null);
141 | }
142 | function centerX(rcWnd, rcWndParent) {
143 | return rcWndParent.left + ((rcWndParent.right - rcWndParent.left)/2 - (rcWnd.right - rcWnd.left)/2);
144 | }
145 | function centerY(rcWnd, rcWndParent) {
146 | return rcWndParent.top + ((rcWndParent.bottom - rcWndParent.top)/2 - (rcWnd.bottom - rcWnd.top)/2);
147 | }
148 | function isPersent(s) {
149 | return s.slice(-1) == "%";
150 | }
151 |
152 | function getWindowPos(hWnd) {
153 | var rcWnd = getWindowRect(hWnd);
154 | if(!rcWnd)
155 | return false;
156 | if(oSys.Call("user32::IsZoomed", hWnd))
157 | return "maximized";
158 | return rcWnd.left + "x" + rcWnd.top + "|"
159 | + (rcWnd.right - rcWnd.left) + "x" + (rcWnd.bottom - rcWnd.top);
160 | }
161 | function saveWindowPos(windowId, hWnd, pos) {
162 | if(!pos)
163 | pos = getWindowPos(hWnd);
164 | if(!pos)
165 | return;
166 |
167 | var oSet = AkelPad.ScriptSettings();
168 | if(!oSet.Begin(WScript.ScriptBaseName, 0x2 /*POB_SAVE*/))
169 | return false;
170 |
171 | oSet.Write(windowId, 3 /*PO_STRING*/, pos);
172 | return oSet.End();
173 | }
174 | function restoreWindowPos(windowId, hWnd) {
175 | var oSet = AkelPad.ScriptSettings();
176 | if(!oSet.Begin(WScript.ScriptBaseName, 0x1 /*POB_READ*/))
177 | return false;
178 |
179 | var pos = oSet.Read(windowId, 3 /*PO_STRING*/, "");
180 | oSet.End();
181 |
182 | if(pos == "maximized")
183 | return oSys.Call("user32::ShowWindow", hWnd, 3 /*SW_MAXIMIZE*/);
184 | if(!/^(-?\d+)x(-?\d+)\|(\d+)x(\d+)$/.test(pos))
185 | return false;
186 |
187 | var x = +RegExp.$1;
188 | var y = +RegExp.$2;
189 | var w = +RegExp.$3;
190 | var h = +RegExp.$4;
191 | return setWindowPos(hWnd, x, y, w, h);
192 | }
193 |
194 | function getWorkArea(hWnd) {
195 | var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
196 | if(!lpRect)
197 | return null;
198 | oSys.Call("user32::GetWindowRect", hWnd, lpRect);
199 |
200 | var hMonitor = oSys.Call("user32::MonitorFromRect", lpRect, 0x2 /*MONITOR_DEFAULTTONEAREST*/);
201 |
202 | if(hMonitor) {
203 | //typedef struct tagMONITORINFO {
204 | // DWORD cbSize;
205 | // RECT rcMonitor;
206 | // RECT rcWork;
207 | // DWORD dwFlags;
208 | //} MONITORINFO, *LPMONITORINFO;
209 | var sizeofMonitorInfo = 4 + 16 + 16 + 4;
210 | var lpMi = AkelPad.MemAlloc(sizeofMonitorInfo);
211 | if(lpMi) {
212 | AkelPad.MemCopy(lpMi, sizeofMonitorInfo, 3 /*DT_DWORD*/);
213 | oSys.Call("user32::GetMonitorInfo" + _TCHAR, hMonitor, lpMi);
214 | var rcWork = parseRect(_PtrAdd(lpMi, 4 + 16));
215 | AkelPad.MemFree(lpMi);
216 | }
217 | }
218 | else { //?
219 | oSys.Call("user32::SystemParametersInfo" + _TCHAR, 48 /*SPI_GETWORKAREA*/, 0, lpRect, 0);
220 | var rcWork = parseRect(lpRect);
221 | }
222 | AkelPad.MemFree(lpRect);
223 | return rcWork;
224 | }
225 | function setWindowPos(hWnd, x, y, w, h) {
226 | var flags = 0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/
227 | | (x === null || y === null ? 0x2 /*SWP_NOMOVE*/ : 0)
228 | | (w === null || h === null ? 0x1 /*SWP_NOSIZE*/ : 0);
229 | ensureRestored(hWnd);
230 | return oSys.Call("user32::SetWindowPos", hWnd, 0, x, y, w, h, flags);
231 | }
232 | function ensureRestored(hWnd) {
233 | // Also exit from Windows 7+ docked to half screen state
234 | //if(oSys.Call("user32::IsZoomed", hWnd))
235 | oSys.Call("user32::ShowWindow", hWnd, 9 /*SW_RESTORE*/);
236 | }
237 | function getWindowRect(hWnd, hWndParent) {
238 | var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
239 | getRect: if(lpRect) {
240 | if(!oSys.Call("user32::GetWindowRect", hWnd, lpRect))
241 | break getRect;
242 | if(hWndParent && !oSys.Call("user32::ScreenToClient", hWndParent, lpRect))
243 | break getRect;
244 | var rcWnd = parseRect(lpRect);
245 | if(!oSys.Call("dwmapi::DwmGetWindowAttribute", hWnd, 9 /*DWMWA_EXTENDED_FRAME_BOUNDS*/, lpRect, 16 /*sizeof(RECT)*/)) {
246 | var rcWndNS = parseRect(lpRect);
247 | if(rcWndNS.left || rcWndNS.right) {
248 | rcWnd.shadow = {
249 | left: rcWndNS.left - rcWnd.left,
250 | top: rcWndNS.top - rcWnd.top,
251 | right: rcWndNS.right - rcWnd.right,
252 | bottom: rcWndNS.bottom - rcWnd.bottom
253 | };
254 | }
255 | }
256 | }
257 | lpRect && AkelPad.MemFree(lpRect);
258 | return rcWnd;
259 | }
260 | function getShadow(rcWnd) {
261 | return rcWnd.shadow || {
262 | left: 0,
263 | top: 0,
264 | right: 0,
265 | bottom: 0
266 | };
267 | }
268 | function parseRect(lpRect) {
269 | return {
270 | left: AkelPad.MemRead(_PtrAdd(lpRect, 0), 3 /*DT_DWORD*/),
271 | top: AkelPad.MemRead(_PtrAdd(lpRect, 4), 3 /*DT_DWORD*/),
272 | right: AkelPad.MemRead(_PtrAdd(lpRect, 8), 3 /*DT_DWORD*/),
273 | bottom: AkelPad.MemRead(_PtrAdd(lpRect, 12), 3 /*DT_DWORD*/)
274 | };
275 | }
--------------------------------------------------------------------------------
/newFileTemplate-test.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=9926#p9926
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/newFileTemplate-test.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/newFileTemplate-test.js
4 |
5 | // (c) Infocatcher 2009-2011
6 | // Version: 0.3.2 - 2011-12-20
7 | // Author: Infocatcher
8 |
9 | //// Create new file from template
10 | // Works with ShowMenuEx.js https://akelpad.sourceforge.net/forum/viewtopic.php?p=8153#p8153
11 |
12 | // Usage:
13 | // Call("Scripts::Main", 1, "newFileTemplate.js", "html")
14 | // - use template for "html"
15 | // Call("Scripts::Main", 1, "newFileTemplate.js")
16 | // - use template for extension of current file
17 | // Call("Scripts::Main", 1, "newFileTemplate.js", "?")
18 | // - ask user about extension
19 | // Call("Scripts::Main", 1, "newFileTemplate.js", `"%f"`)
20 | // - use active file (e.g. in ContextMenu plugin)
21 | // - or `"c:\\path\to\my\file\myFile.ext"` instead of `"%f"`
22 | // Call("Scripts::Main", 1, "newFileTemplate.js", "?edit")
23 | // - edit template
24 | // Call("Scripts::Main", 1, "newFileTemplate.js", "?edit:html")
25 | // - edit template for "html"
26 |
27 | //== Settings begin
28 | var templatesDir = "%a\\AkelFiles\\Plugs\\Scripts\\Params\\" + getScriptDirName();
29 | // For "script.js" getScriptDirName() return "script".
30 | var templateFileName = "template";
31 | var selFlag = "%|";
32 | var selTextFlag = "%s";
33 | //== Settings end
34 |
35 | function _localize(s) {
36 | var strings = {
37 | "Extension of new file:": {
38 | ru: "Расширение нового файла:"
39 | },
40 | "Edit template for extension:": {
41 | ru: "Редактировать шаблон для расширения:"
42 | }
43 | };
44 | var lng = "en";
45 | switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
46 | case 0x19: lng = "ru";
47 | }
48 | _localize = function(s) {
49 | return strings[s] && strings[s][lng] || s;
50 | };
51 | return _localize(s);
52 | }
53 |
54 | var argAsk = "?";
55 | var argEdit = "?edit";
56 |
57 | //var AkelPad = new ActiveXObject("AkelPad.document");
58 | var hMainWnd = AkelPad.GetMainWnd();
59 | var oSys = AkelPad.SystemFunction();
60 | var wsh = new ActiveXObject("WScript.Shell");
61 | var fso = new ActiveXObject("Scripting.FileSystemObject");
62 |
63 | function TemplateMaker(tDir, tFileName, selFlag, selTextFlag, argAsk, argEdit) {
64 | this.tDir = tDir;
65 | this.tFileName = tFileName;
66 | this.selFlag = selFlag;
67 | this.selTextFlag = selTextFlag;
68 | this.argAsk = argAsk;
69 | this.argEdit = argEdit;
70 | }
71 | TemplateMaker.prototype = {
72 | initTemplate: function() {
73 | this.ext = this.getExt();
74 | return this.getTemplate();
75 | },
76 | getExt: function() {
77 | var ext;
78 | if(WScript.Arguments.length) {
79 | ext = this.parseSpecialExts(WScript.Arguments(0));
80 | return ext && ext.toLowerCase();
81 | }
82 | ext = ext || this.getCurrentExt() || this.askUserExt();
83 | return ext && ext.toLowerCase();
84 | },
85 | parseSpecialExts: function(ext, retExt) {
86 | if(ext == this.argAsk)
87 | return this.askUserExtInput();
88 | else if(ext && ext.indexOf(this.argEdit) == 0) {
89 | this.createTemplate(ext.substr(this.argEdit.length + 1));
90 | return "";
91 | }
92 | else if(ext && /\\.*\.([^.]+)$/.test(ext)) { // ...\filename.ext
93 | this.tPath = ext;
94 | ext = RegExp.$1;
95 | this.precessTemplate = false;
96 | return ext && ext.toLowerCase();
97 | }
98 | return retExt ? ext : "";
99 | },
100 | askUserExt: function() {
101 | if(this.asked)
102 | return "";
103 | var ext;
104 | var showMenuPath = AkelPad.GetAkelDir() + "\\AkelFiles\\Plugs\\Scripts\\ShowMenuEx.js";
105 | if(fso.FileExists(showMenuPath)) {
106 | eval(AkelPad.ReadFile(showMenuPath));
107 | ext = getSelectedMenuItem(POS_CURSOR, "INI", 0);
108 | ext = this.parseSpecialExts(ext, true);
109 | }
110 | else {
111 | ext = this.askUserExtInput();
112 | }
113 | return ext && ext.toLowerCase();
114 | },
115 | asked: false,
116 | askUserExtInput: function(newFlag) {
117 | this.asked = true;
118 | var ext = AkelPad.InputBox(
119 | hMainWnd, WScript.ScriptName,
120 | _localize(
121 | newFlag
122 | ? "Edit template for extension:"
123 | : "Extension of new file:"
124 | ),
125 | this.getCurrentExt() || regVal("lastExt") || ""
126 | );
127 | return ext && ext.toLowerCase();
128 | },
129 | getCurrentExt: function() {
130 | if(!this._getCurrentExt) {
131 | var cFile = AkelPad.GetEditFile(0);
132 | this._getCurrentExt = cFile && /\.([^.]+)$/i.test(cFile) && RegExp.$1;
133 | }
134 | return this._getCurrentExt;
135 | },
136 | createTemplate: function(ext) {
137 | ext = ext || this.askUserExtInput(true /* newFlag */);
138 | if(!ext)
139 | return;
140 | var path = this.getTemplatePath(ext);
141 |
142 | var dir = fso.GetParentFolderName(path);
143 | if(!fso.FolderExists(dir))
144 | fso.CreateFolder(dir);
145 |
146 | AkelPad.OpenFile(path);
147 | },
148 | tPath: "",
149 | tmpl: "",
150 | precessTemplate: true,
151 | selParams: null,
152 | getTemplate: function() {
153 | if(!this.ext)
154 | return false;
155 | var pFile = this.tPath || this.getTemplatePath(this.ext);
156 | if(!fso.FileExists(pFile))
157 | return true;
158 | this.tmpl = AkelPad.ReadFile(pFile)
159 | .replace(/\r\n/g, "\n"); // For AkelPad 4.4.4+
160 | if(!this.precessTemplate)
161 | return true;
162 | if(this.tmpl.indexOf(this.selTextFlag) != -1)
163 | this.tmpl = this.tmpl.replace(this.selTextFlag, AkelPad.GetSelText());
164 | var selStart = this.tmpl.indexOf(this.selFlag);
165 | this.delFlag(selStart);
166 | var selEnd = this.tmpl.lastIndexOf(this.selFlag);
167 | this.delFlag(selEnd);
168 | if(selStart != -1 && selEnd == -1)
169 | selEnd = selStart;
170 | this.selParams = selStart != -1
171 | ? [selStart, selEnd]
172 | : null;
173 | return true;
174 | },
175 | getTemplatePath: function(ext) {
176 | return wsh.ExpandEnvironmentStrings(
177 | this.tDir
178 | .replace(/^%a/, AkelPad.GetAkelDir())
179 | .replace(/\\$/, "")
180 | + "\\" + this.tFileName + "." + ext
181 | );
182 | },
183 | delFlag: function(pos) {
184 | if(pos != -1)
185 | this.tmpl = this.tmpl.substring(0, pos)
186 | + this.tmpl.substring(pos + this.selFlag.length, this.tmpl.length);
187 | },
188 | insTemplate: function() {
189 | AkelPad.ReplaceSel(this.tmpl);
190 | this.formatTemplate();
191 | regVal("lastExt", this.ext);
192 | },
193 | formatTemplate: function() {
194 | var ext = this.ext;
195 | if (ext && AkelPad.IsPluginRunning("Coder::HighLight") == true) {
196 | AkelPad.Call("Coder::Settings", 1, ext);
197 | }
198 | var sp = this.selParams;
199 | if(sp)
200 | AkelPad.SetSel(sp[0], sp[1]);
201 | else
202 | AkelPad.SetSel(0, 0);
203 | }
204 | };
205 |
206 | if(hMainWnd) {
207 | var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
208 | if(lpPoint) {
209 | var tm = new TemplateMaker(templatesDir, templateFileName, selFlag, selTextFlag, argAsk, argEdit);
210 | if(tm.initTemplate()) {
211 | AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4101 /*IDM_FILE_NEW*/, 0);
212 | var hWndEditNew = AkelPad.GetEditWnd();
213 | setRedraw(hWndEditNew, false);
214 | AkelPad.SendMessage(hWndEditNew, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
215 |
216 | tm.insTemplate();
217 |
218 | AkelPad.SendMessage(hWndEditNew, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
219 | setRedraw(hWndEditNew, true);
220 | AkelPad.MemFree(lpPoint);
221 | }
222 | }
223 | }
224 |
225 | function setRedraw(hWnd, bRedraw) {
226 | AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
227 | bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
228 | }
229 | function getScriptDirName() {
230 | return WScript.ScriptName.replace(/\.js$/i, "");
231 | }
232 | function regVal(name, val) {
233 | name = "HKCU\\Software\\Akelsoft\\AkelPad\\Plugs\\Scripts\\newFileTemplate\\" + name;
234 | if(arguments.length == 2)
235 | return wsh.RegWrite(name, val, "REG_SZ");
236 | try { return wsh.RegRead(name); }
237 | catch(e) { return ""; }
238 | }
--------------------------------------------------------------------------------
/newFileTemplate.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=9926#p9926
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/newFileTemplate.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/newFileTemplate.js
4 |
5 | // (c) Infocatcher 2009
6 | // Version: 0.2.5 - 2010-06-21
7 | // Author: Infocatcher
8 |
9 | //// Create new file from template
10 |
11 | // Usage:
12 | // Call("Scripts::Main", 1, "newFileTemplate.js", "html", 0)
13 | // - use template for "html"
14 | // Call("Scripts::Main", 1, "newFileTemplate.js", "", 0)
15 | // - use template for extension of current file
16 | // Call("Scripts::Main", 1, "newFileTemplate.js", "?", 0)
17 | // - ask user about extension
18 | // Call("Scripts::Main", 1, "newFileTemplate.js", `"%f"`, 0)
19 | // - use active file (e.g. in ContextMenu plugin)
20 | // - or `"c:\\path\to\my\file\myFile.ext"` instead of `"%f"`
21 |
22 | // Settings begin
23 | var templatesDir = "%a\\AkelFiles\\Plugs\\Scripts\\Params\\" + getScriptDirName();
24 | // For "script.js" getScriptDirName() return "script".
25 | var templateFileName = "template";
26 | var selFlag = "%|";
27 | var selTextFlag = "%s";
28 | // Settings end
29 |
30 | //var AkelPad = new ActiveXObject("AkelPad.document");
31 | var hMainWnd = AkelPad.GetMainWnd();
32 | var oSys = AkelPad.SystemFunction();
33 |
34 | var locale = {
35 | lng: null,
36 | strings: {
37 | extRequired: {
38 | ru: "Расширение нового файла: ",
39 | en: "Extension of new file: "
40 | }
41 | },
42 | getStr: function(name) {
43 | if(!this.lng) {
44 | var nLangID = oSys.Call("kernel32::GetUserDefaultLangID");
45 | nLangID = nLangID & 0x3ff; //PRIMARYLANGID
46 | switch(nLangID) {
47 | case 0x19: this.lng = "ru"; break;
48 | default: this.lng = "en";
49 | }
50 | }
51 | return this.strings[name][this.lng];
52 | }
53 | };
54 |
55 | function TemplateMaker(tDir, tFileName, selFlag, selTextFlag) {
56 | this.tDir = tDir;
57 | this.tFileName = tFileName;
58 | this.selFlag = selFlag;
59 | this.selTextFlag = selTextFlag;
60 | }
61 | TemplateMaker.prototype = {
62 | initTemplate: function() {
63 | this.ext = this.getExt();
64 | return this.getTemplate();
65 | },
66 | getExt: function() {
67 | var ext;
68 | if(WScript.Arguments.length) {
69 | ext = WScript.Arguments(0);
70 | if(ext == "?")
71 | return this.ackUserExt();
72 | else if(ext && /\\.*\.([^.]+)$/.test(ext)) { // ...\filename.ext
73 | this.tPath = ext;
74 | ext = RegExp.$1;
75 | this.precessTemplate = false;
76 | }
77 | }
78 | ext = ext || this.getCurrentExt() || this.ackUserExt();
79 | return ext && ext.toLowerCase();
80 | },
81 | ackUserExt: function() {
82 | var ext = AkelPad.InputBox(
83 | hMainWnd, WScript.ScriptName,
84 | locale.getStr("extRequired"),
85 | this.getCurrentExt() || regVal("lastExt") || ""
86 | );
87 | return ext && ext.toLowerCase();
88 | },
89 | getCurrentExt: function() {
90 | if(!this._getCurrentExt) {
91 | var cFile = AkelPad.GetEditFile(0);
92 | this._getCurrentExt = cFile && /\.([^.]+)$/i.test(cFile) && RegExp.$1;
93 | }
94 | return this._getCurrentExt;
95 | },
96 | tPath: null,
97 | tmpl: "",
98 | precessTemplate: true,
99 | selParams: null,
100 | getTemplate: function() {
101 | if(!this.ext)
102 | return false;
103 | var pFile = this.tPath
104 | || this.tDir
105 | .replace("%a", AkelPad.GetAkelDir())
106 | .replace(/\\?$/, "\\")
107 | + this.tFileName + "." + this.ext;
108 | if(!this.fileExist(pFile))
109 | return true;
110 | this.tmpl = AkelPad.ReadFile(pFile)
111 | .replace(/\r\n/g, "\n"); // For AkelPad 4.4.4
112 | if(!this.precessTemplate)
113 | return true;
114 | if(this.tmpl.indexOf(this.selTextFlag) != -1)
115 | this.tmpl = this.tmpl.replace(this.selTextFlag, AkelPad.GetSelText());
116 | var selStart = this.tmpl.indexOf(this.selFlag);
117 | this.delFlag(selStart);
118 | var selEnd = this.tmpl.lastIndexOf(this.selFlag);
119 | this.delFlag(selEnd);
120 | if(selStart != -1 && selEnd == -1)
121 | selEnd = selStart;
122 | this.selParams = selStart != -1
123 | ? [selStart, selEnd]
124 | : null;
125 | return true;
126 | },
127 | fileExist: function(fName) {
128 | return new ActiveXObject("Scripting.FileSystemObject")
129 | .FileExists(fName);
130 | },
131 | delFlag: function(pos) {
132 | if(pos != -1)
133 | this.tmpl = this.tmpl.substring(0, pos)
134 | + this.tmpl.substring(pos + this.selFlag.length, this.tmpl.length);
135 | },
136 | insTemplate: function() {
137 | AkelPad.ReplaceSel(this.tmpl);
138 | this.formatTemplate();
139 | regVal("lastExt", this.ext);
140 | },
141 | formatTemplate: function() {
142 | var ext = this.ext;
143 | if(ext) {
144 | //AkelPad.Call("HighLight::Main", 1, ext);
145 | //AkelPad.Call("AutoComplete::Main", 1, ext);
146 | AkelPad.Call("Coder::Settings", 1, ext);
147 | }
148 | var sp = this.selParams;
149 | if(sp)
150 | AkelPad.SetSel(sp[0], sp[1]);
151 | else
152 | AkelPad.SetSel(0, 0);
153 | }
154 | };
155 |
156 | if(hMainWnd) {
157 | var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
158 | if(lpPoint) {
159 | var tm = new TemplateMaker(templatesDir, templateFileName, selFlag, selTextFlag);
160 | if(tm.initTemplate()) {
161 | AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4101 /*IDM_FILE_NEW*/, 0);
162 | var hWndEditNew = AkelPad.GetEditWnd();
163 | setRedraw(hWndEditNew, false);
164 | AkelPad.SendMessage(hWndEditNew, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
165 |
166 | tm.insTemplate();
167 |
168 | AkelPad.SendMessage(hWndEditNew, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
169 | setRedraw(hWndEditNew, true);
170 | AkelPad.MemFree(lpPoint);
171 | }
172 | }
173 | }
174 |
175 | function setRedraw(hWnd, bRedraw) {
176 | AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
177 | if(bRedraw)
178 | oSys.Call("user32::InvalidateRect", hWnd, 0, true);
179 | }
180 | function getScriptDirName() {
181 | return WScript.ScriptName.replace(/\.js$/i, "");
182 | }
183 | function regVal(name, val) {
184 | name = "HKCU\\Software\\Akelsoft\\AkelPad\\Plugs\\Scripts\\newFileTemplate\\" + name;
185 | var ws = new ActiveXObject("WScript.shell");
186 | if(typeof val != "undefined")
187 | return ws.RegWrite(name, val, "REG_SZ");
188 | try { return ws.RegRead(name); }
189 | catch(e) { return ""; }
190 | }
--------------------------------------------------------------------------------
/openFileIn-options.jsm:
--------------------------------------------------------------------------------
1 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/openFileIn-options.js
2 | // Additional options for openFileIn.js
3 |
4 | appsData["Basilisk"] = {
5 | paths: [
6 | "",
7 | "%ProgramFiles%\\Basilisk\\basilisk.exe",
8 | "%COMMANDER_PATH%\\..\\Basilisk_Portable\\FirefoxPortable.exe",
9 | "%AkelDir%\\..\\Basilisk_Portable\\FirefoxPortable.exe"
10 | ],
11 | args: "%f",
12 | isBrowser: true
13 | };
--------------------------------------------------------------------------------
/openFileIn.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=9927#p9927
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/openFileIn.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/openFileIn.js
4 |
5 | // (c) Infocatcher 2010-2021
6 | // Version: 0.2.0.1 - 2021-08-15
7 | // Author: Infocatcher
8 |
9 | //===================
10 | //// Open file in other application
11 |
12 | // Usage (see "var appsData = { ... }" for appID):
13 | // Call("Scripts::Main", 1, "openFileIn.js", '"appID" "%f" "%u"')
14 | // Disable mappings:
15 | // Call("Scripts::Main", 1, "openFileIn.js", '"appID" "%f" "%u" -mappings=false')
16 | // Trick to not open archive-like files in Total Commander:
17 | // Call("Scripts::Main", 1, "openFileIn.js", '"Total Commander" "%f\:"')
18 | //===================
19 |
20 | //== Settings begin
21 | // You can use openFileIn-options.jsm file to override or tweak settings
22 | // Override:
23 | // var appsData = { ... };
24 | // Tweak:
25 | // appsData["App"] = { ... }; - add application
26 | // appsData["App"].paths = [ ... ] - change paths
27 | var mappings = {
28 | // Only for applications marked as 'isBrowser: true'
29 | // Example:
30 | // "D:\\Site\\": "http://localhost/",
31 | // "D:\\AnotherSite\\": "http://example.com/"
32 | };
33 | var appsData = {
34 | // Example:
35 | // "appID": {
36 | // paths: [
37 | // "c:\\path\\to\\app.exe",
38 | // "%EnvVar%\\another\\path\\to\\app.exe",
39 | // // Special: %AkelDir% - path to AkelPad directory (e.g. C:\Soft\AkelPad),
40 | // // %AkelDrive% - path to AkelPad drive (e.g. C:)
41 | // "app.exe",
42 | // "?x64?...\\app64.exe", // Check only on x64 system
43 | // "?x86?...\\app32.exe" // Check only on x86 system
44 | // ],
45 | // args: "-file:%f -line:%l",
46 | // isBrowser: true
47 | // }
48 | "Total Commander": {
49 | paths: [
50 | "%COMMANDER_EXE%",
51 | "%COMMANDER_PATH%\\TOTALCMD.EXE",
52 | "?x64?%COMMANDER_PATH%\\TOTALCMD64.EXE",
53 | "%AkelDir%\\..\\totalcmd\\TOTALCMD.EXE",
54 | "%AkelDir%\\..\\Total Commander\\TOTALCMD.EXE",
55 | "%AkelDir%\\..\\..\\TOTALCMD.EXE",
56 | "%__portable__%\\totalcmd\\TOTALCMD.EXE",
57 | "?x64?\\TOTALCMD64.EXE",
58 | "\\TOTALCMD.EXE",
59 | "%ProgramFiles%\\totalcmd\\TOTALCMD.EXE",
60 | "%ProgramFiles%\\Total Commander\\TOTALCMD.EXE"
61 | ],
62 | args: "/O /S /T %f"
63 | },
64 |
65 | "Notepad": {
66 | paths: [
67 | "%SystemRoot%\\notepad.exe"
68 | ],
69 | args: "%f"
70 | },
71 | "Notepad++": {
72 | paths: [
73 | "%COMMANDER_PATH%\\..\\Notepad++\\notepad++.exe",
74 | "%AkelDir%\\..\\Notepad++\\notepad++.exe",
75 | "%__portable__%\\Notepad++\\notepad++.exe",
76 | "%ProgramFiles%\\Notepad++\\notepad++.exe"
77 | ],
78 | args: "%f -n%l"
79 | },
80 | "PSPad": {
81 | paths: [
82 | "%COMMANDER_PATH%\\..\\PSPad\\PSPad.exe",
83 | "%COMMANDER_PATH%\\..\\PSPad editor\\PSPad.exe",
84 | "%AkelDir%\\..\\PSPad\\PSPad.exe",
85 | "%AkelDir%\\..\\PSPad editor\\PSPad.exe",
86 | "%ProgramFiles%\\PSPad\\PSPad.exe",
87 | "%ProgramFiles%\\PSPad editor\\PSPad.exe"
88 | ],
89 | args: "%f"
90 | },
91 | "EmEditor": {
92 | paths: [
93 | "%COMMANDER_PATH%\\..\\EmEditor\\EmEditor.exe",
94 | "%AkelDir%\\..\\EmEditor\\EmEditor.exe",
95 | "%ProgramFiles%\\EmEditor\\EmEditor.exe"
96 | ],
97 | args: "%f"
98 | },
99 |
100 | "Internet Explorer": {
101 | paths: [
102 | "%ProgramFiles%\\Internet Explorer\\iexplore.exe"
103 | ],
104 | args: "%f",
105 | isBrowser: true
106 | },
107 | "Edge": {
108 | paths: [
109 | "",
110 | "%ProgramFiles%\\Microsoft\\Edge\\Application\\msedge.exe",
111 | "%ProgramFiles(x86)%\\Microsoft\\Edge\\Application\\msedge.exe"
112 | ],
113 | args: "%f",
114 | isBrowser: true
115 | },
116 | "Firefox": {
117 | paths: [
118 | "",
119 | "%ProgramFiles%\\Mozilla Firefox\\firefox.exe",
120 | "%COMMANDER_PATH%\\..\\FirefoxPortable\\FirefoxPortable.exe",
121 | "%AkelDir%\\..\\FirefoxPortable\\FirefoxPortable.exe"
122 | ],
123 | args: "%f",
124 | isBrowser: true
125 | },
126 | "Opera": {
127 | paths: [
128 | "\\opera.exe",
129 | "%ProgramFiles%\\Opera\\opera.exe",
130 | "%COMMANDER_PATH%\\..\\OperaUSB\\opera.exe",
131 | "%COMMANDER_PATH%\\..\\Opera\\opera.exe",
132 | "%AkelDir%\\..\\OperaUSB\\opera.exe",
133 | "%AkelDir%\\..\\Opera\\opera.exe"
134 | ],
135 | args: "%f",
136 | isBrowser: true
137 | },
138 | "Vivaldi": {
139 | paths: [
140 | "\\Application\\vivaldi.exe",
141 | "%ProgramFiles%\\Vivaldi\\Application\\vivaldi.exe",
142 | "%LocalAppData%\\Vivaldi\\Application\\vivaldi.exe",
143 | "%COMMANDER_PATH%\\..\\Vivaldi\\Application\\vivaldi.exe",
144 | "%AkelDir%\\..\\Vivaldi\\Application\\vivaldi.exe"
145 | ],
146 | args: "%f",
147 | isBrowser: true
148 | },
149 | "Google Chrome": {
150 | paths: [
151 | "",
152 | "",
153 | "%LocalAppData%\\Google\\Chrome\\Application\\chrome.exe",
154 | "%UserProfile%\\Local Settings\\Application Data\\Google\\Chrome\\Application\\chrome.exe",
155 | "%UserProfile%\\Local Settings\\Application Data\\Bromium\\Application\\chrome.exe",
156 | "%COMMANDER_PATH%\\..\\GoogleChromePortable\\GoogleChromePortable.exe",
157 | "%AkelDir%\\..\\GoogleChromePortable\\GoogleChromePortable.exe"
158 | ],
159 | args: "%f",
160 | isBrowser: true
161 | },
162 | "Safari": {
163 | paths: [
164 | "%ProgramFiles%\\Safari\\Safari.exe",
165 | "%COMMANDER_PATH%\\..\\SafariPortable\\SafariPortable.exe",
166 | "%AkelDir%\\..\\SafariPortable\\SafariPortable.exe"
167 | ],
168 | args: "%f",
169 | isBrowser: true
170 | }
171 | };
172 | //== Settings end
173 |
174 | var fso = new ActiveXObject("Scripting.FileSystemObject");
175 | var optionsPath = WScript.ScriptFullName.replace(/\.[^.]+$/, "") + "-options.jsm";
176 | (function loadOptions(legacy) {
177 | if(fso.FileExists(optionsPath))
178 | AkelPad.Include(".." + optionsPath.replace(/^.*(\\|\/)/, "$1"));
179 | else if(!legacy) {
180 | optionsPath = optionsPath.slice(0, -1); // Try legacy ...-options.js
181 | loadOptions(true);
182 | }
183 | })();
184 |
185 | var allowMappings = AkelPad.GetArgValue("mappings", true);
186 |
187 | var wsh = new ActiveXObject("WScript.Shell");
188 | var akelDir = AkelPad.GetAkelDir();
189 |
190 | var argsl = WScript.Arguments.length;
191 | if(argsl >= 2) {
192 | var app = WScript.Arguments(0);
193 | var file = WScript.Arguments(1);
194 | var url = argsl >= 3 && WScript.Arguments(2);
195 | if(url && url.substr(0, 10) != "-mappings=")
196 | file = url;
197 | if(app in appsData) {
198 | var appData = appsData[app];
199 | var path = getPath(appData.paths);
200 | if(path) {
201 | if(appData.isBrowser && allowMappings) {
202 | for(var p in mappings) {
203 | var pl = p.length;
204 | if(file.substr(0, pl) == p) {
205 | file = mappings[p] + file.substr(pl).replace(/\\/g, "/");
206 | break;
207 | }
208 | }
209 | }
210 | var args = appData.args;
211 | if(file) {
212 | if(/%f/.test(args))
213 | args = args.replace(/%f/g, '"' + file + '"');
214 | if(/%l/.test(args))
215 | args = args.replace(/%l/g, getLine());
216 | }
217 | else {
218 | args = args
219 | .replace(/\s*\S*%f\S*\s*/g, " ")
220 | .replace(/\s*\S*%l\S*\s*/g, " ");
221 | }
222 | var cmdLine = ('"' + path + '" ' + args).replace(/\s+$/, "");
223 | try {
224 | wsh.Exec(cmdLine);
225 | }
226 | catch(e) {
227 | // Windows Vista/7 and admin rights required
228 | //WScript.Echo(e.name + "\n" + e.message);
229 | new ActiveXObject("Shell.Application").ShellExecute(path, args, "" /*directory*/, "runas");
230 | }
231 | }
232 | else {
233 | warn(app + " not found!\n\n" + appData.paths.join("\n"));
234 | }
235 | }
236 | else {
237 | warn("Application with \"" + app + "\" id not found in the database!");
238 | }
239 | }
240 | else {
241 | warn('Wrong arguments!\nUsage:\nCall("Scripts::Main", 1, "' + WScript.ScriptName + '", \'"appID" "%f"\')');
242 | }
243 | function getPath(paths) {
244 | for(var i = 0, l = paths.length; i < l; ++i) {
245 | var path = paths[i];
246 | if(path.charAt(0) == "?") {
247 | if(path.substr(0, 5) != (_X64 ? "?x64?" : "?x86?"))
248 | continue;
249 | path = path.substr(5);
250 | }
251 | var path = expandVariables(paths[i]);
252 | //WScript.Echo(paths[i] + "\n=>\n" + path);
253 | if(fso.FileExists(path))
254 | return path;
255 | }
256 | return "";
257 | }
258 | function expandVariables(s) {
259 | return expandEnvironmentVariables(expandRegistryVariables(s));
260 | }
261 | function expandEnvironmentVariables(s) {
262 | if(s.substr(0, 5) == "%Akel") {
263 | s = s
264 | .replace(/^%AkelDir%/, akelDir)
265 | .replace(/^%AkelDrive%/, fso.GetDriveName(akelDir));
266 | }
267 | return wsh.ExpandEnvironmentStrings(s);
268 | }
269 | function expandRegistryVariables(s) { // \foo.exe
270 | return s.replace(/<(.+?)>/g, function(s, path) {
271 | var val = getRegistryValue(path);
272 | if(val)
273 | return val;
274 | return s;
275 | });
276 | }
277 | function getRegistryValue(path) {
278 | try {
279 | return wsh.RegRead(path);
280 | }
281 | catch(e) {
282 | }
283 | return "";
284 | }
285 | function getLine() {
286 | var hWndEdit = AkelPad.GetEditWnd();
287 | var wrpLine = AkelPad.SendMessage(hWndEdit, 1078 /*EM_EXLINEFROMCHAR*/, 0, AkelPad.GetSelStart());
288 | var unwrpLine = AkelPad.SendMessage(hWndEdit, 3143 /*AEM_GETUNWRAPLINE*/, wrpLine, 0);
289 | return unwrpLine + 1;
290 | }
291 | function warn(msg) {
292 | AkelPad.MessageBox(AkelPad.GetMainWnd(), msg, WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
293 | }
--------------------------------------------------------------------------------
/openRelativeFile.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=11346#p11346
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/openRelativeFile.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/openRelativeFile.js
4 |
5 | // (c) Infocatcher 2011, 2014
6 | // Version: 0.1.7 - 2014-08-01
7 | // Author: Infocatcher
8 |
9 | //===================
10 | //// Tries to open file with relative path
11 | // (will be used system association to open binary files)
12 | // Supports Mozilla's chrome.manifest files (https://developer.mozilla.org/en/chrome_registration)
13 | // Priorities: selected path (if any) or autodetected path (you can just place caret anywhere inside path)
14 |
15 | // Usage:
16 | // Call("Scripts::Main", 1, "openRelativeFile.js")
17 | // Also you can use -showPath argument for debug purposes:
18 | // Call("Scripts::Main", 1, "openRelativeFile.js", "-showPath=true")
19 | //===================
20 |
21 | //== Settings begin
22 | // You can use openRelativeFile-options.jsm file to override settings
23 |
24 | //var paths = ["%ProgramFiles%\\Something"];
25 | var paths = [];
26 |
27 | var delimitersStart = {
28 | '"': true,
29 | "'": true,
30 | "<": true,
31 | "[": true,
32 | "(": true,
33 | ">": true,
34 | "=": true,
35 | "\n": true,
36 | "\r": true,
37 | "": true
38 | };
39 | var delimitersEnd = {
40 | '"': true,
41 | "'": true,
42 | ">": true,
43 | "]": true,
44 | ")": true,
45 | "<": true,
46 | "\n": true,
47 | "\r": true,
48 | "": true
49 | };
50 | var delimitersSpaces = {
51 | " ": true,
52 | "\t": true,
53 | "\n": true,
54 | "\r": true,
55 | "\0": true,
56 | "\u00a0": true, //
57 | "\u2002": true, //
58 | "\u2003": true, //
59 | "\u2009": true //
60 | };
61 | var delimitersStop = {
62 | "\n": true,
63 | "\r": true,
64 | "\0": true,
65 | "" : true
66 | };
67 |
68 | var maxLength = 2000;
69 | //== Settings end
70 |
71 | var hMainWnd = AkelPad.GetMainWnd();
72 | var fso = new ActiveXObject("Scripting.FileSystemObject");
73 | var wsh = new ActiveXObject("WScript.Shell");
74 |
75 | var optionsPath = WScript.ScriptFullName.replace(/\.[^.]+$/, "") + "-options.jsm";
76 | (function loadOptions(legacy) {
77 | if(fso.FileExists(optionsPath))
78 | AkelPad.Include(".." + optionsPath.replace(/^.*(\\|\/)/, "$1"));
79 | else if(!legacy) {
80 | optionsPath = optionsPath.slice(0, -1); // Try legacy ...-options.js
81 | loadOptions(true);
82 | }
83 | })();
84 |
85 | var showPath = AkelPad.GetArgValue("showPath", false);
86 | if(hMainWnd)
87 | openRelative();
88 |
89 | function openRelative() {
90 | var pathStarts = [];
91 | var pathEnds = [];
92 |
93 | var ss = AkelPad.GetSelStart();
94 | var se = AkelPad.GetSelEnd();
95 |
96 | if(ss != se) {
97 | checkPrefix(ss);
98 | var relPath = decodePathURI(AkelPad.GetSelText());
99 | if(openRelativePath(relPath))
100 | return true;
101 | ++ss, --se;
102 | }
103 |
104 | var cnt = 0;
105 | for(;;) {
106 | var chr = --ss < 0 ? "" : AkelPad.GetTextRange(ss, ss + 1);
107 | if(chr in delimitersSpaces && !pathStarts.length)
108 | pathStarts.push(ss + 1);
109 | else if(chr in delimitersStart) {
110 | pathStarts.push(ss + 1);
111 | break;
112 | }
113 | if(chr in delimitersStop)
114 | break;
115 | if(++cnt > maxLength)
116 | break;
117 | }
118 | if(!pathStarts.length)
119 | return false;
120 |
121 | for(var i = 0, l = pathStarts.length; i < l; ++i)
122 | if(checkPrefix(pathStarts[i]))
123 | break;
124 |
125 | cnt = 0;
126 | for(;;) {
127 | var chr = AkelPad.GetTextRange(se, ++se);
128 | if(chr in delimitersSpaces && !pathEnds.length)
129 | pathEnds.push(se - 1);
130 | else if(chr in delimitersEnd) {
131 | pathEnds.push(se - 1);
132 | break;
133 | }
134 | if(chr in delimitersStop)
135 | break;
136 | if(++cnt > maxLength)
137 | break;
138 | }
139 | if(!pathEnds.length)
140 | return false;
141 |
142 | for(var i = Math.max(pathStarts.length, pathEnds.length) - 1; i >= 0; --i) {
143 | // Use corresponding points: 1 - delimitersStart/End, 0 - delimitersSpaces
144 | var pathStart = pathStarts[i] || pathStarts[pathStarts.length - 1];
145 | var pathEnd = pathEnds[i] || pathEnds[pathEnds.length - 1];
146 | var relPathRaw = AkelPad.GetTextRange(pathStart, pathEnd);
147 | var relPath = decodePathURI(relPathRaw);
148 | if(openRelativePath(relPath, pathStart, pathEnd))
149 | return true;
150 | }
151 | return false;
152 | }
153 | function checkPrefix(pathStart) {
154 | if(pathStart > 0) { // Detect AkelPad.Include()
155 | var before = AkelPad.GetTextRange(Math.max(0, pathStart - 40), pathStart);
156 | if(/\bAkelPad\s*\.\s*Include\s*\(\s*["']$/.test(before)) {
157 | var includeDir = AkelPad.GetAkelDir(6 /*ADTYPE_INCLUDE*/);
158 | if(arrayIndexOf(paths, includeDir) == -1)
159 | paths.push(includeDir);
160 | return true;
161 | }
162 | }
163 | return false;
164 | }
165 | function arrayIndexOf(arr, item) {
166 | for(var i = 0, l = arr.length; i < l; ++i)
167 | if(arr[i] === item)
168 | return i;
169 | return -1;
170 | }
171 | function openRelativePath(relPath, pathStart, pathEnd) {
172 | var path;
173 |
174 | var curPath = AkelPad.GetEditFile(0);
175 | var curDir = fso.GetParentFolderName(curPath);
176 | var tmp = curDir + "\\" + relPath;
177 | if(fso.FileExists(tmp))
178 | path = tmp;
179 | else {
180 | tmp = wsh.ExpandEnvironmentStrings(relPath);
181 | if(fso.FileExists(tmp))
182 | path = tmp;
183 | if(!path && /^(chrome|resource):\/\//.test(relPath)) {
184 | tmp = parseChromePath(curDir, relPath);
185 | if(tmp)
186 | path = tmp;
187 | }
188 | if(!path && /^\w+:\//.test(relPath)) {
189 | var tokens = relPath.replace(/^\w+:/, "").split(/[\\\/]+/);
190 | for(;;) {
191 | tmp = getFile(curDir, tokens.concat());
192 | if(tmp) {
193 | path = tmp;
194 | break;
195 | }
196 | var newDir = getParentDir(curDir);
197 | if(!newDir || newDir == curDir)
198 | break;
199 | curDir = newDir;
200 | }
201 | }
202 | if(!path) {
203 | for(var i = 0, l = paths.length; i < l; ++i) {
204 | tmp = wsh.ExpandEnvironmentStrings(paths[i]) + "\\" + relPath;
205 | if(fso.FileExists(tmp)) {
206 | path = tmp;
207 | break;
208 | }
209 | }
210 | }
211 | }
212 | if(!path)
213 | return false;
214 |
215 | if(showPath) {
216 | var msg = "Relative path:\n" + relPath
217 | + "\nDetected path:";
218 | path = AkelPad.InputBox(hMainWnd, WScript.ScriptName, msg, path);
219 | if(!path)
220 | return false;
221 | }
222 |
223 | if(pathStart && pathEnd)
224 | AkelPad.SetSel(pathStart, pathEnd);
225 | if(isFileBinary(path)) // Use system association for binary files
226 | wsh.Exec('rundll32.exe shell32.dll,ShellExec_RunDLL "' + path + '"');
227 | else
228 | AkelPad.OpenFile(path);
229 |
230 | return true;
231 | }
232 | function decodePathURI(path) {
233 | path = path
234 | .replace(/^file:\/+/i, "")
235 | .replace(/[?#].*$/, "");
236 | try {
237 | path = decodeURIComponent(path);
238 | }
239 | catch(e) {
240 | }
241 | return path;
242 | }
243 | function parseChromePath(curDir, chromePath) {
244 | if(/^(resource):\/+([^\/]+)(\/.*)?/.test(chromePath)) {
245 | var protocol = RegExp.$1;
246 | var domain = RegExp.$2;
247 | var path = RegExp.$3;
248 | }
249 | else if(/^(\w+):\/+([^\/]+)\/([^\/]+)(\/.*)?/.test(chromePath)) {
250 | var protocol = RegExp.$1;
251 | var domain = RegExp.$2;
252 | var type = RegExp.$3;
253 | var path = RegExp.$4;
254 | }
255 | else
256 | return false;
257 |
258 | for(;;) { // See https://developer.mozilla.org/en/chrome_registration
259 | var tmp = curDir + "\\chrome.manifest";
260 | if(fso.FileExists(tmp)) {
261 | var manifest = AkelPad.ReadFile(tmp);
262 | break;
263 | }
264 | var newDir = getParentDir(curDir);
265 | if(!newDir || newDir == curDir)
266 | return false;
267 | curDir = newDir;
268 | }
269 | if(!manifest)
270 | return false;
271 |
272 | var pattern;
273 | switch(protocol) {
274 | case "chrome":
275 | switch(type) {
276 | case "content":
277 | // content extensionname chrome/content/
278 | pattern = new RegExp("(^|[\\n\\r])content[ \\t]+" + escapeRegExp(domain) + "[ \\t]+(\\S+)");
279 | break;
280 | case "skin":
281 | // skin extensionname classic/1.0 chrome/skin/
282 | pattern = new RegExp("(^|[\\n\\r])skin[ \\t]+" + escapeRegExp(domain) + "[ \\t]+\\S+[ \\t]+(\\S+)");
283 | break;
284 | case "locale":
285 | // locale extensionname en-US chrome/locale/en-US/
286 | pattern = new RegExp("(^|[\\n\\r])locale[ \\t]+" + escapeRegExp(domain) + "[ \\t]+\\S+[ \\t]+(\\S+)");
287 | }
288 | break;
289 | case "resource":
290 | // resource extensionname resource/
291 | pattern = new RegExp("(^|[\\n\\r])resource[ \\t]+" + escapeRegExp(domain) + "[ \\t]+(\\S+)");
292 | }
293 |
294 | if(!pattern)
295 | return false;
296 |
297 | tmp = getManifestInfo(pattern, manifest, curDir, path);
298 | if(tmp)
299 | return tmp;
300 |
301 | // https://developer.mozilla.org/en/chrome_registration#manifest
302 | var lines = manifest.split(/[\n\r]+/);
303 | for(var i = 0, l = lines.length; i < l; ++i) {
304 | var line = lines[i];
305 | if(!/^manifest[ \t]+(\S+)/.test(line))
306 | continue;
307 | var manifestPath = curDir + "\\" + RegExp.$1;
308 | if(!fso.FileExists(manifestPath))
309 | continue;
310 | manifest = AkelPad.ReadFile(manifestPath);
311 | tmp = getManifestInfo(pattern, manifest, fso.GetParentFolderName(manifestPath), path);
312 | if(tmp)
313 | return tmp;
314 | }
315 |
316 | return false;
317 | }
318 | function getManifestInfo(pattern, manifest, curDir, path) {
319 | if(!pattern.test(manifest))
320 | return false;
321 | var fullPath = curDir + "\\" + unwrapChromePath(RegExp.$2) + path;
322 | if(fso.FileExists(fullPath))
323 | return fullPath;
324 | return false;
325 | }
326 | function unwrapChromePath(path) {
327 | if(/^jar:/.test(path))
328 | path = path.substr(4).replace(/[^\/]+!\//, "");
329 | return path;
330 | }
331 | function escapeRegExp(str) {
332 | return str.replace(/[\\\/.^$+*?|()\[\]{}]/g, "\\$&");
333 | }
334 | function getFile(curDir, tokens) {
335 | var parts = [];
336 | for(;;) {
337 | parts.unshift(tokens.pop());
338 | var tmp = curDir + "\\" + parts.join("\\");
339 | if(fso.FileExists(tmp))
340 | return tmp;
341 | if(!tokens.length)
342 | break;
343 | }
344 | return null;
345 | }
346 | function getParentDir(dir) {
347 | return dir.replace(/[\\\/]+[^\\\/]+$/, "");
348 | }
349 | function isFileBinary(pFile) {
350 | // Thanks to Instructor
351 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=11344#p11344
352 | var lpDetectCodepage;
353 | var bResult=false;
354 |
355 | if (lpDetectCodepage=AkelPad.MemAlloc(_X64?24:20 /*sizeof(DETECTCODEPAGEW)*/))
356 | {
357 | AkelPad.MemCopy(_PtrAdd(lpDetectCodepage, 0 /*offsetof(DETECTCODEPAGEW, pFile)*/), AkelPad.MemStrPtr(pFile), 2 /*DT_QWORD*/);
358 | AkelPad.MemCopy(_PtrAdd(lpDetectCodepage, _X64 ? 8 : 4 /*offsetof(DETECTCODEPAGEW, dwBytesToCheck)*/), 1024, 3 /*DT_DWORD*/);
359 | AkelPad.MemCopy(_PtrAdd(lpDetectCodepage, _X64 ? 12 : 8 /*offsetof(DETECTCODEPAGEW, dwFlags)*/), 0x11 /*ADT_BINARY_ERROR|ADT_NOMESSAGES*/, 3 /*DT_DWORD*/);
360 | if (AkelPad.SendMessage(hMainWnd, 1177 /*AKD_DETECTCODEPAGEW*/, 0, lpDetectCodepage) == -4 /*EDT_BINARY*/)
361 | bResult=true;
362 |
363 | AkelPad.MemFree(lpDetectCodepage);
364 | }
365 | return bResult;
366 | }
--------------------------------------------------------------------------------
/punctuationFixer.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=9926#p9926
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/punctuationFixer.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/punctuationFixer.js
4 |
5 | // (c) Infocatcher 2008-2009, 2014
6 | // Version: 0.0.3.1 - 2014-10-18
7 | // Author: Infocatcher
8 |
9 | //// Tries to fix some punctuation issues
10 |
11 | //== Settings
12 | var fixerDash = "–";
13 | var fixerForceUpperCase = true;
14 | // Use
15 | // Call("Scripts::Main", 1, "punctuationFixer.js", "-ignorecase", 0)
16 | // to override this setting
17 | var fixerCommas = ["«", "»"]; // var fixerCommas = null;
18 | var fixerSaveSelPos = true;
19 | //== End of settings
20 |
21 | if(WScript.Arguments.length && WScript.Arguments(0) == "-ignorecase")
22 | fixerForceUpperCase = false;
23 |
24 | //var AkelPad = new ActiveXObject("AkelPad.document");
25 | var hMainWnd = AkelPad.GetMainWnd();
26 | var hWndEdit = AkelPad.GetEditWnd();
27 | var oSys = AkelPad.SystemFunction();
28 |
29 | function PunctuationFixer(dash, forceUpper, commas) {
30 | this.dash = dash || "-";
31 | this.forceUpper = forceUpper;
32 | this.convCommas = commas instanceof Array;
33 | if(this.convCommas) {
34 | this.openComma = commas[0];
35 | this.closeComma = commas[1];
36 | }
37 | }
38 | PunctuationFixer.prototype = {
39 | notConv: [],
40 | subst: "",
41 | init: function() { // Get random string for replacing exclusions
42 | function rnd() {
43 | return Math.random().toString().substr(2);
44 | }
45 | this.subst = "_" + rnd() + rnd() + "_";
46 | },
47 | getSubst: function(n) {
48 | return this.subst + n + "_";
49 | },
50 | convert: function(txt) {
51 | if(!txt)
52 | return "";
53 | this.init();
54 |
55 | var _this = this;
56 |
57 | //== Exclusions:
58 | var excCnt = -1;
59 | var subst;
60 | // URLs like http://example.com/
61 | this.notConv[++excCnt] = [], subst = this.getSubst(excCnt);
62 | txt = txt.replace(
63 | /[a-z]+:\/\/+([^\/\\.\s'"<>]+[.\/])+[^\/\\.\s'"<>]+/ig,
64 | function() {
65 | var a = arguments;
66 | _this.notConv[excCnt].push(a[0]);
67 | return subst;
68 | }
69 | );
70 | // Time "10:43:01"
71 | this.notConv[++excCnt] = [], subst = this.getSubst(excCnt);
72 | txt = txt.replace(
73 | /(^|\D)([0-2]?\d:[0-6]?\d(:[0-6]?\d)?)(\D|$)/mg,
74 | function() {
75 | var a = arguments;
76 | _this.notConv[excCnt].push(a[2]);
77 | return a[1] + subst + a[4];
78 | }
79 | );
80 | // Dates "19.03.2009"
81 | this.notConv[++excCnt] = [], subst = this.getSubst(excCnt);
82 | txt = txt.replace(
83 | /(^|\D)([0-3]?\d\.[0-1]\d\.\d\d(\d\d)?|\d\d(\d\d)?\.[0-1]\d\.[0-3]?\d)(\D|$)/mg,
84 | function() {
85 | var a = arguments;
86 | _this.notConv[excCnt].push(a[2]);
87 | return a[1] + subst + a[5];
88 | }
89 | );
90 | // Numbers like "10.9" or "10,9"
91 | this.notConv[++excCnt] = [], subst = this.getSubst(excCnt);
92 | txt = txt.replace(
93 | /(^|[^\d.,])(\d+[.,]\d+)([^\d.,]|$)/g,
94 | function() {
95 | var a = arguments;
96 | _this.notConv[excCnt].push(a[2]);
97 | return a[1] + subst + a[3];
98 | }
99 | );
100 | // Smileys like ":)"
101 | this.notConv[++excCnt] = [], subst = this.getSubst(excCnt);
102 | txt = txt.replace(
103 | /[ \t]*(:-?[D\(\)\\\/][\(\)]{0,2})[\(\)]*[ \t]*/g,
104 | function() {
105 | var a = arguments;
106 | _this.notConv[excCnt].push(" " + a[1] + " ");
107 | return subst;
108 | }
109 | );
110 | // "->", "=>", "<=>"
111 | this.notConv[++excCnt] = [], subst = this.getSubst(excCnt);
112 | txt = txt.replace(
113 | /[-=]+>/g,
114 | function() {
115 | var a = arguments;
116 | _this.notConv[excCnt].push(a[0]);
117 | return subst;
118 | }
119 | );
120 | // Acronyms
121 | this.notConv[++excCnt] = [], subst = this.getSubst(excCnt);
122 | txt = txt.replace(
123 | /([^а-яёa-z]([а-яёa-z]\.[ \t]*[а-яёa-z]\.|[а-яёa-z]{2}\.))/g,
124 | function() {
125 | var a = arguments;
126 | _this.notConv[excCnt].push(a[1].replace(/[ \t]+/, " "));
127 | return subst;
128 | }
129 | );
130 | //== End of exclusions
131 |
132 | // Del spaces:
133 | txt = txt.replace(/(\S)([ \t])[ \t]+/g, "$1$2"); // "\t " -> "\t", " \t\t" -> " "
134 |
135 | // Fix punctuation:
136 | txt = txt
137 | .replace(/((\) ?){1,3})(\) ?)*/g, "$1 ") // ")))))" -> ")))"
138 | .replace(/[\t ]*([.?!])([^"])/g, "$1 $2") // " ! ! ! " -> "! ! ! "
139 | .replace(/[\t ]*([:,;])[\t ]*/g, "$1 ") // " , " -> ", "
140 | .replace(/([,;:]) ?([,;:] ?)+/g, "$1 ") // ",, ,, " -> ", "
141 | .replace(
142 | /(([.?!] *){1,3})([.?!] *)*(.|$)/mg, // "! !! ! " -> "!!! "
143 | function($0, $1, $2, $3, $4) {
144 | var noSp = $3 && /\S$/.test($3) && $4 == '"';
145 | return $1.replace(/\s+/g, "") + (noSp ? "" : " ") + $4;
146 | }
147 | )
148 | .replace(/([\(\{\[<])[\t ]+/, "$1")
149 | .replace(/[\t ]+([\)\}\]>])/, "$1")
150 | .replace(/[\t ]*([+=])[\t ]*/g, " $1 ");
151 |
152 | // Fix brackets:
153 | txt = txt
154 | .replace(/(\S)[\t ]*\([\t ]*/g, "$1 (") // text(text -> text (text
155 | .replace(/[\t ]*\)[\t ]*([^.!?:;,()])/g, ") $1"); // text)text -> text) text
156 |
157 | // Fix lower case letters:
158 | if(this.forceUpper) { // end. begin -> end. Begin
159 | txt = txt.replace(
160 | /(^|[^.][.?!] )([а-яёa-z])/mg,
161 | function($0, $1, $2) { return $1 + $2.toUpperCase(); }
162 | );
163 | }
164 |
165 | // Fix dashes:
166 | txt = txt // " -", "- " -> " - "
167 | .replace(/"[\t ]*-[\t ]*/g, "\" - ") // text"-text -> text" - text
168 | .replace(/([^\s-])[\t ]*-[\t ]*"/g, "$1 - \"") // text-"text -> text - "text
169 | .replace(/([^\s-])[\t ]*-\([\t ]*/g, "$1 - (") // text-(text -> text - (text
170 | .replace(/([^\s-])[\t ]*\)-[\t ]*/g, "$1) - ") // text)-text -> text) - text
171 | .replace(/([^\s-])[\t ]*-[\t ]+/g, "$1 - ") // text- text -> text - text
172 | .replace(/([^\s-])[\t ]+-[\t ]*/g, "$1 - ") // text -text -> text - text
173 | .replace(/^([\t ]*)-{1,3}[\t ]*/mg, "$1- ") // \n-text -> \n- text
174 | .replace(/([^\s-])[\t ]*---?[\t ]*/g, "$1 - ") // text--text -> text - text
175 | .replace(/ - /g, " " + this.dash + " ");
176 |
177 | // Fix commas:
178 | if(this.convCommas) {
179 | txt = txt
180 | .replace(/^[\t ]*"[\t ]*/mg, this.openComma) // \n" -> \n«
181 | .replace(/[\t ]*"[\t ]*$/mg, this.closeComma) // "\n -> »\n
182 | .replace(/([.?!])"(\s)/g, "$1" + this.closeComma + "$2") // 'text!" ' -> 'text!» '
183 | .replace(/([а-яёa-z])"([-+\s.?!,;:\)\}\]\>]|$)/img, "$1" + this.closeComma + "$2") // text". -> text».
184 | .replace(/[\t ]*"[\t ]*([-+.?!,;:\)\}\]\>]|$)/mg, this.closeComma + "$1") // ' " .' -> '».'
185 | .replace(/(^|[\s\(\{\[<])"[\t ]*/mg, "$1" + this.openComma)
186 | .replace(new RegExp(this.openComma + "[\\t ]+", "g"), this.openComma)
187 | .replace(new RegExp("[\\t ]+" + this.closeComma, "g"), this.closeComma);
188 | }
189 |
190 | // Fix dashes (end):
191 | txt = txt.replace(/- /g, this.dash + " ");
192 |
193 | // Replace exclusions:
194 | while(excCnt > -1) {
195 | txt = txt.replace(
196 | new RegExp(this.subst + excCnt + "_", "g"),
197 | function() {
198 | return _this.notConv[excCnt].shift();
199 | }
200 | );
201 | excCnt--;
202 | }
203 |
204 | // Del spaces:
205 | txt = txt
206 | .replace(/(\S)([ \t])[ \t]+/g, "$1$2") // "\t " -> "\t", " \t\t" -> " "
207 | .replace(/[ \t]+$/mg, ""); // "text \n" -> "text\n"
208 |
209 | return txt;
210 | }
211 | };
212 |
213 | if(hMainWnd && !AkelPad.GetEditReadOnly(hWndEdit)) {
214 | var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
215 | if(lpPoint) {
216 | setRedraw(hWndEdit, false);
217 | var selParams = getSelParams();
218 | AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
219 |
220 | // Get selection or all text and save fullTxt flag:
221 | var txt = AkelPad.GetSelText();
222 | var fullTxt = !txt;
223 | if(fullTxt)
224 | txt = AkelPad.SetSel(0, -1) || AkelPad.GetSelText();
225 |
226 | var selStart = AkelPad.GetSelStart();
227 | var err;
228 | try {
229 | var fixer = new PunctuationFixer(fixerDash, fixerForceUpperCase, fixerCommas);
230 | txt = fixer.convert(txt);
231 | AkelPad.ReplaceSel(txt);
232 | if(!fixerSaveSelPos || !fullTxt)
233 | selParams = [selStart, selStart + txt.length];
234 | }
235 | catch(e) {
236 | err = e;
237 | }
238 |
239 | restoreSelParams(selParams);
240 | AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
241 | setRedraw(hWndEdit, true);
242 | AkelPad.MemFree(lpPoint);
243 |
244 | if(err)
245 | throw err;
246 | }
247 | }
248 |
249 | function setRedraw(hWnd, bRedraw) {
250 | AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
251 | if(bRedraw)
252 | oSys.Call("user32::InvalidateRect", hWnd, 0, true);
253 | }
254 | function getSelParams() {
255 | return [AkelPad.GetSelStart(), AkelPad.GetSelEnd()];
256 | }
257 | function restoreSelParams(selParams) {
258 | AkelPad.SetSel(selParams[0], selParams[1]);
259 | }
--------------------------------------------------------------------------------
/replaceDiacriticLetters.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=11240#p11240
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/replaceDiacriticLetters.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/replaceDiacriticLetters.js
4 |
5 | // (c) Infocatcher 2008, 2011-2012
6 | // Version: 0.1.2 - 2012-12-11
7 | // Author: Infocatcher
8 |
9 | //// Replace diacritic letters with ASCII equivalents
10 |
11 | var map = {
12 | "à": "a",
13 | "À": "A",
14 | "á": "a",
15 | "Á": "A",
16 | "â": "a",
17 | "Â": "A",
18 | "ã": "a",
19 | "Ã": "A",
20 | "ä": "a",
21 | "Ä": "A",
22 | "å": "a",
23 | "Å": "A",
24 | "æ": "ae",
25 | "Æ": "AE",
26 | "ç": "c",
27 | "Ç": "C",
28 | "È": "E",
29 | "è": "e",
30 | "é": "e",
31 | "É": "E",
32 | "ê": "e",
33 | "Ê": "E",
34 | "ë": "e",
35 | "Ë": "E",
36 | "Ì": "I",
37 | "ì": "i",
38 | "í": "i",
39 | "Í": "I",
40 | "î": "i",
41 | "Î": "I",
42 | "Ï": "I",
43 | "ï": "i",
44 | "Ð": "D",
45 | "ð": "d",
46 | "ñ": "n",
47 | "Ñ": "N",
48 | "Ò": "O",
49 | "ò": "o",
50 | "Ó": "O",
51 | "Ó": "O",
52 | "ó": "o",
53 | "ó": "o",
54 | "ô": "o",
55 | "Ô": "O",
56 | "Õ": "O",
57 | "õ": "o",
58 | "ö": "o",
59 | "Ö": "O",
60 | "ù": "u",
61 | "Ù": "U",
62 | "Ú": "U",
63 | "ú": "u",
64 | "û": "u",
65 | "Û": "U",
66 | "ü": "u",
67 | "Ü": "U",
68 | "ý": "y",
69 | "Ý": "Y",
70 | "ÿ": "y",
71 | "Ÿ": "Y",
72 | "ā": "a",
73 | "Ā": "A",
74 | "ă": "a",
75 | "Ă": "A",
76 | "Ą": "A",
77 | "Ą": "A",
78 | "ą": "a",
79 | "ą": "a",
80 | "Ć": "C",
81 | "ć": "c",
82 | "Ć": "C",
83 | "ć": "c",
84 | "ĉ": "c",
85 | "Ĉ": "C",
86 | "Ċ": "C",
87 | "ċ": "c",
88 | "č": "c",
89 | "Č": "C",
90 | "ď": "d",
91 | "Ď": "D",
92 | "Đ": "D",
93 | "đ": "d",
94 | "Ē": "E",
95 | "ē": "e",
96 | "ĕ": "e",
97 | "Ĕ": "E",
98 | "ė": "e",
99 | "Ė": "E",
100 | "ę": "e",
101 | "Ę": "E",
102 | "Ę": "E",
103 | "ę": "e",
104 | "Ě": "E",
105 | "ě": "e",
106 | "ĝ": "g",
107 | "Ĝ": "G",
108 | "ğ": "g",
109 | "Ğ": "G",
110 | "ġ": "g",
111 | "Ġ": "G",
112 | "ģ": "g",
113 | "Ģ": "G",
114 | "Ĥ": "H",
115 | "ĥ": "h",
116 | "ħ": "h",
117 | "Ħ": "H",
118 | "ĩ": "i",
119 | "Ĩ": "I",
120 | "ī": "i",
121 | "Ī": "I",
122 | "Ĭ": "I",
123 | "ĭ": "i",
124 | "Į": "I",
125 | "į": "i",
126 | "İ": "I",
127 | "ı": "i",
128 | "ij": "ij",
129 | "IJ": "IJ",
130 | "ĵ": "j",
131 | "Ĵ": "J",
132 | "ķ": "k",
133 | "Ķ": "K",
134 | "ĸ": "k",
135 | "ĺ": "l",
136 | "Ĺ": "L",
137 | "Ļ": "L",
138 | "ļ": "l",
139 | "Ľ": "L",
140 | "ľ": "l",
141 | "Ŀ": "L",
142 | "ŀ": "l",
143 | "Ł": "L",
144 | "ł": "l",
145 | "Ł": "L",
146 | "ł": "l",
147 | "ń": "n",
148 | "Ń": "N",
149 | "ń": "n",
150 | "Ń": "N",
151 | "ņ": "n",
152 | "Ņ": "N",
153 | "ň": "n",
154 | "Ň": "N",
155 | "ʼn": "n",
156 | "Ō": "O",
157 | "ō": "o",
158 | "Ŏ": "O",
159 | "ŏ": "o",
160 | "ő": "o",
161 | "Ő": "O",
162 | "œ": "oe",
163 | "Œ": "OE",
164 | "Ŕ": "R",
165 | "ŕ": "r",
166 | "ŗ": "r",
167 | "Ŗ": "R",
168 | "ř": "r",
169 | "Ř": "R",
170 | "Ś": "S",
171 | "ś": "s",
172 | "ś": "s",
173 | "Ś": "S",
174 | "ŝ": "s",
175 | "Ŝ": "S",
176 | "ş": "s",
177 | "Ş": "S",
178 | "š": "s",
179 | "Š": "S",
180 | "Ţ": "T",
181 | "ţ": "t",
182 | "ť": "t",
183 | "Ť": "T",
184 | "ŧ": "t",
185 | "Ŧ": "T",
186 | "ũ": "u",
187 | "Ũ": "U",
188 | "Ū": "U",
189 | "ū": "u",
190 | "ŭ": "u",
191 | "Ŭ": "U",
192 | "ů": "u",
193 | "Ů": "U",
194 | "Ű": "U",
195 | "ű": "u",
196 | "Ų": "U",
197 | "ų": "u",
198 | "ŵ": "w",
199 | "Ŵ": "W",
200 | "ŷ": "Y",
201 | "Ŷ": "Y",
202 | "Ź": "Z",
203 | "Ź": "Z",
204 | "ź": "z",
205 | "ź": "z",
206 | "ż": "z",
207 | "Ż": "Z",
208 | "Ż": "Z",
209 | "ż": "z",
210 | "ž": "z",
211 | "Ž": "Z",
212 | "ƀ": "b",
213 | "ƈ": "c",
214 | "Ƈ": "C",
215 | "ƒ": "f",
216 | "Ƒ": "F",
217 | "Ƙ": "K",
218 | "ƙ": "k",
219 | "ơ": "o",
220 | "Ơ": "O",
221 | "ƥ": "p",
222 | "Ƥ": "P",
223 | "ƫ": "t",
224 | "ƭ": "t",
225 | "Ƭ": "T",
226 | "Ư": "U",
227 | "ư": "u",
228 | "Ƶ": "Z",
229 | "ƶ": "z",
230 | "DŽ": "DZ",
231 | "Dž": "Dz",
232 | "dž": "dz",
233 | "Lj": "Lj",
234 | "LJ": "LJ",
235 | "lj": "lj",
236 | "Nj": "Nj",
237 | "nj": "nj",
238 | "NJ": "NJ",
239 | "ǎ": "a",
240 | "Ǎ": "A",
241 | "ǐ": "i",
242 | "Ǐ": "I",
243 | "Ǒ": "O",
244 | "ǒ": "o",
245 | "Ǔ": "U",
246 | "ǔ": "u",
247 | "ǖ": "u",
248 | "Ǖ": "U",
249 | "ǘ": "u",
250 | "Ǘ": "U",
251 | "Ǚ": "U",
252 | "ǚ": "u",
253 | "Ǜ": "U",
254 | "ǜ": "u",
255 | "ǝ": "e",
256 | "ǟ": "a",
257 | "Ǟ": "A",
258 | "ǡ": "a",
259 | "Ǡ": "A",
260 | "ǣ": "ae",
261 | "Ǣ": "AE",
262 | "ǥ": "g",
263 | "Ǥ": "G",
264 | "ǧ": "g",
265 | "Ǧ": "G",
266 | "ǩ": "k",
267 | "Ǩ": "K",
268 | "ǫ": "o",
269 | "Ǫ": "O",
270 | "ǭ": "o",
271 | "Ǭ": "O",
272 | "Ǯ": "Z",
273 | "ǰ": "J",
274 | "ǯ": "z",
275 | "DZ": "DZ",
276 | "Dz": "Dz",
277 | "dz": "dz",
278 | "Ǵ": "G",
279 | "ǵ": "g",
280 | "Ǻ": "A",
281 | "ǻ": "a",
282 | "Ǽ": "AE",
283 | "ǽ": "ae",
284 | "Ǿ": "O",
285 | "ǿ": "o",
286 | "Ȁ": "A",
287 | "ȁ": "a",
288 | "Ȃ": "A",
289 | "ȃ": "a",
290 | "Ȅ": "E",
291 | "ȅ": "e",
292 | "Ȇ": "E",
293 | "ȇ": "e",
294 | "ȉ": "i",
295 | "Ȉ": "I",
296 | "Ȋ": "I",
297 | "ȋ": "i",
298 | "Ȍ": "O",
299 | "ȍ": "o",
300 | "ȏ": "o",
301 | "Ȏ": "O",
302 | "Ȑ": "R",
303 | "ȑ": "r",
304 | "Ȓ": "R",
305 | "ȓ": "r",
306 | "ȕ": "u",
307 | "Ȕ": "U",
308 | "ȗ": "u",
309 | "Ȗ": "U",
310 | "ɐ": "a",
311 | "ɑ": "a",
312 | "ɒ": "a",
313 | "Ɓ": "B",
314 | "Ɖ": "D",
315 | "ɖ": "d",
316 | "Ɗ": "D",
317 | "ɗ": "d",
318 | "ɛ": "e",
319 | "Ɠ": "G",
320 | "Ʀ": "R",
321 | "Ʈ": "T",
322 | "ʤ": "dz",
323 | "ʣ": "dz",
324 | "ʥ": "dz",
325 | "ʦ": "ts",
326 | "ʧ": "tf",
327 | "ΐ": "i",
328 | "Ά": "A",
329 | "Έ": "E",
330 | "Ή": "H",
331 | "Ί": "I",
332 | "ϊ": "i",
333 | "ϋ": "u",
334 | "Ό": "O",
335 | "ό": "o",
336 | "ύ": "u",
337 | "Ύ": "Y",
338 | "і": "i",
339 | "ї": "i",
340 | "ј": "j",
341 | "ќ": "k",
342 | "ў": "y",
343 | "ӑ": "a",
344 | "Ӑ": "A",
345 | "Ӓ": "A",
346 | "ӓ": "a",
347 | "ӕ": "ae",
348 | "Ӕ": "AE",
349 | "Ӗ": "E",
350 | "ӗ": "e"
351 | };
352 |
353 | function replaceLetters(str) {
354 | for(var s in map)
355 | str = str.replace(new RegExp(s, "g"), map[s]);
356 | return str;
357 | }
358 |
359 | var hMainWnd = AkelPad.GetMainWnd();
360 | var hWndEdit = AkelPad.GetEditWnd();
361 | var oSys = AkelPad.SystemFunction();
362 |
363 | if(hMainWnd && !AkelPad.GetEditReadOnly(hWndEdit)) {
364 | var text = AkelPad.GetSelText();
365 | if(!text) {
366 | var selectAll = true;
367 | text = AkelPad.GetTextRange(0, -1);
368 | }
369 | var res = replaceLetters(text);
370 | if(res != text)
371 | insertNoScroll(res, selectAll);
372 | }
373 |
374 | function insertNoScroll(str, selectAll) {
375 | var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
376 | if(!lpPoint)
377 | return;
378 | setRedraw(hWndEdit, false);
379 | AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
380 |
381 | selectAll && AkelPad.SetSel(0, -1);
382 | //var ss = AkelPad.GetSelStart();
383 | AkelPad.ReplaceSel(str, true);
384 | //if(ss != AkelPad.GetSelStart())
385 | // AkelPad.SetSel(ss, ss + str.length);
386 |
387 | AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
388 | setRedraw(hWndEdit, true);
389 | AkelPad.MemFree(lpPoint);
390 | }
391 | function setRedraw(hWnd, bRedraw) {
392 | AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
393 | bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
394 | }
--------------------------------------------------------------------------------
/restart.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=18433#p18433
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/restart.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/restart.js
4 |
5 | // (c) Infocatcher 2012-2014
6 | // Version: 0.1.1+ - 2014-03-29
7 | // Author: Infocatcher
8 |
9 | //// Restart AkelPad
10 |
11 | // Dependencies:
12 | // Sessions plugin
13 | // NirCmd utility - http://www.nirsoft.net/utils/nircmd.html
14 |
15 | // Arguments:
16 | // -nirCmd="path\to\nircmd.exe" - you can use environment variables like %ProgramFiles%
17 | // -session="OnExit" - name of autosaved session in Sessions plugin
18 | // -sessionAutoSave=false - checked state of "save on exit" in Sessions plugin settings
19 | // -sessionAutoLoad=false - checked state of "open on start" in Sessions plugin settings
20 |
21 | // Usage:
22 | // Call("Scripts::Main", 1, "restart.js")
23 | // Call("Scripts::Main", 1, "restart.js", '-nirCmd="%a\..\NirCmd\nircmd.exe" -session="OnExit"')
24 |
25 | var oSys = AkelPad.SystemFunction();
26 | var akelDir = AkelPad.GetAkelDir();
27 | var nirCmdPath = AkelPad.GetArgValue("nirCmd", "%a\\AkelFiles\\Utils\\nircmd.exe");
28 | var nirCmd = expandEnvironmentVariables(nirCmdPath);
29 | if(oSys.Call("kernel32::GetFileAttributes" + _TCHAR, nirCmd) == -1) {
30 | error(
31 | "NirCmd utility not found!\nYou can download it here: http://www.nirsoft.net/utils/nircmd.html\n\n"
32 | + (nirCmd == nirCmdPath ? nirCmd : nirCmdPath + "\n=> " + nirCmd)
33 | );
34 | WScript.Quit();
35 | }
36 | var session = AkelPad.GetArgValue("session", "OnExit");
37 | var sessionAutoSave = AkelPad.GetArgValue("sessionAutoSave", false);
38 | var sessionAutoLoad = AkelPad.GetArgValue("sessionAutoLoad", false);
39 | var pid = oSys.Call("kernel32::GetCurrentProcessId");
40 |
41 | // Get real AkelPad executable
42 | var MAX_PATH = 0x104;
43 | var lpBuffer = AkelPad.MemAlloc(MAX_PATH*_TSIZE);
44 | if(lpBuffer) {
45 | if(oSys.Call("kernel32::GetModuleFileName" + _TCHAR, null, lpBuffer, MAX_PATH))
46 | var akelExe = AkelPad.MemRead(lpBuffer, _TSTR);
47 | else
48 | failed("GetModuleFileName");
49 | AkelPad.MemFree(lpBuffer);
50 | }
51 | if(!akelExe)
52 | akelExe = akelDir + "\\AkelPad.exe";
53 |
54 | // Get current directory
55 | var nBufferLength = oSys.Call("kernel32::GetCurrentDirectory" + _TCHAR, 0, 0);
56 | if(nBufferLength) {
57 | var lpBuffer = AkelPad.MemAlloc(nBufferLength*_TSIZE);
58 | if(lpBuffer) {
59 | if(oSys.Call("kernel32::GetCurrentDirectory" + _TCHAR, nBufferLength, lpBuffer))
60 | var curDir = AkelPad.MemRead(lpBuffer, _TSTR);
61 | else
62 | failed("GetCurrentDirectory");
63 | AkelPad.MemFree(lpBuffer);
64 | }
65 | }
66 | if(!curDir)
67 | curDir = akelDir;
68 |
69 | if(!sessionAutoSave || !AkelPad.IsPluginRunning("Sessions::Main"))
70 | AkelPad.Call("Sessions::Main", 2, session);
71 |
72 | AkelPad.Exec('"%nirCmd%" killprocess "%nirCmd%"'.replace(/%nirCmd%/g, nirCmd)); //~ todo: check process command line
73 |
74 | var cmd = '"%nirCmd%" waitprocess /%pid% exec2 show "%workDir%" "%akelExe%"';
75 | if(!sessionAutoLoad)
76 | cmd += ' /Call("Sessions::Main", 1, "%session%")';
77 | cmd = cmd
78 | .replace(/%nirCmd%/g, nirCmd)
79 | .replace(/%pid%/g, pid)
80 | .replace(/%workDir%/g, curDir)
81 | .replace(/%akelExe%/g, akelExe)
82 | .replace(/%session%/g, session);
83 | oSys.Call("kernel32::SetEnvironmentVariable" + _TCHAR, "__AkelPad:autoSaveSession.js", "");
84 | AkelPad.Exec(cmd, akelDir);
85 | AkelPad.Command(4109); // Exit
86 |
87 | function expandEnvironmentVariables(s) {
88 | if(/^%a[\\\/]/.test(s))
89 | s = akelDir + s.substr(2);
90 | if(s.indexOf("%") == -1)
91 | return s;
92 | return new ActiveXObject("WScript.Shell").ExpandEnvironmentStrings(s);
93 | }
94 | function error(s) {
95 | AkelPad.MessageBox(
96 | AkelPad.GetMainWnd(),
97 | s,
98 | WScript.ScriptName,
99 | 16 /*MB_ICONERROR*/
100 | );
101 | }
102 | function failed(func) {
103 | error(func + "() failed!\nError: " + oSys.Call("kernel32::GetLastError"));
104 | }
--------------------------------------------------------------------------------
/runScript-en.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/runScript-en.png
--------------------------------------------------------------------------------
/runScript-ru.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/runScript-ru.png
--------------------------------------------------------------------------------
/saveStoreTime.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=10403#p10403
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/saveStoreTime.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/saveStoreTime.js
4 |
5 | // (c) Infocatcher 2010-2011, 2014
6 | // Version: 0.1.4 - 2014-03-03
7 | // Author: Infocatcher
8 |
9 | //// Save file and don't update modification time
10 | // Based on Instructor's code: https://akelpad.sourceforge.net/forum/viewtopic.php?p=4222#p4222
11 |
12 | // Usage:
13 | // Call("Scripts::Main", 1, "saveStoreTime.js")
14 |
15 | var hMainWnd = AkelPad.GetMainWnd();
16 |
17 | if(hMainWnd) {
18 | var saveTime = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 148 /*MI_SAVETIME*/, 0);
19 | if(!saveTime)
20 | AkelPad.Command(4252 /*IDM_OPTIONS_SAVETIME*/);
21 | AkelPad.Command(4105 /*IDM_FILE_SAVE*/);
22 | if(!saveTime)
23 | AkelPad.SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 148 /*MIS_SAVETIME*/, saveTime);
24 | }
--------------------------------------------------------------------------------
/scriptToBookmarklet.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=9927#p9927
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/scriptToBookmarklet.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/scriptToBookmarklet.js
4 |
5 | // (c) Infocatcher 2008-2011
6 | // Version: 0.3.0 - 2011-12-20
7 | // Author: Infocatcher
8 | // Windows XP +
9 |
10 | //===================
11 | //// Convert JavaScript code to one line bookmarklet
12 | // http://en.wikipedia.org/wiki/Bookmarklet
13 | // http://ru.wikipedia.org/wiki/Букмарклет
14 |
15 | // Arguments:
16 | // -saveSpaces=0 - replace multiple spaces with one
17 | // =1 - don't replace spaces inside lines
18 | // =2 - only replace new lines
19 | // -removeNewLines=true - remove new lines instead of replace them with space
20 | // -saveComments=0 - sum of flags: 1 - save block comments, 2 - save line comments
21 |
22 | // Usage:
23 | // Call("Scripts::Main", 1, "converter.js")
24 | // Call("Scripts::Main", 1, "converter.js", "-saveSpaces=0 -removeNewLines=true -saveComments=3")
25 | //===================
26 |
27 | function _localize(s) {
28 | var strings = {
29 | "Code of bookmarklet (OK - copy):": {
30 | ru: "Код букмарклета (ОК - копировать):"
31 | }
32 | };
33 | var lng = "en";
34 | switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
35 | case 0x19: lng = "ru";
36 | }
37 | _localize = function(s) {
38 | return strings[s] && strings[s][lng] || s;
39 | };
40 | return _localize(s);
41 | }
42 |
43 | var saveSpaces = getArg("saveSpaces", 0);
44 | var removeNewLines = getArg("removeNewLines", true);
45 | var saveComments = getArg("saveComments", 0);
46 |
47 | //var AkelPad = new ActiveXObject("AkelPad.document");
48 | var hMainWnd = AkelPad.GetMainWnd();
49 | var hWndEdit = AkelPad.GetEditWnd();
50 | var oSys = AkelPad.SystemFunction();
51 |
52 | if(hMainWnd && hWndEdit)
53 | scriptToBookmarklet();
54 |
55 | function scriptToBookmarklet() {
56 | var text = getText();
57 |
58 | var excludes = {};
59 | var rnd = function() {
60 | return "<#" + Math.random().toString(36).substr(2) + Math.random().toString(36).substr(2) + "#>";
61 | };
62 |
63 | text = text
64 | // Remove "strings" and 'strings'
65 | .replace(
66 | /"(\\.|[^"\\\n\r])*"|'(\\.|[^'\\\n\r])*'/g,
67 | function(s) {
68 | var r = rnd();
69 | excludes[r] = s;
70 | return r;
71 | }
72 | )
73 | // Try remove regular expressions like /x*/ and /\/*x/
74 | // We search for invalid divisions:
75 | // x = /./; -> =
76 | // if(/a/.test(b)) -> (
77 | // a = [/a/, /b/] -> [ ,
78 | // x = a && /b/.test(c) -> & |
79 | // x = a ? /b/ : /c/ -> ? :
80 | // x = !/a/.test(b) -> !
81 | .replace(
82 | /([=(\[,&|?:!]\s*((\/\/[^\n\r]*[\n\r]+|\/\*[\s\S]*?\*\/)\s*)*)\/([^*+?\\\/\n\r]|\\[^\n\r])(\\\/|[^\/\n\r])*\//g,
83 | // special chars line comments block comments regexp begin regexp end
84 | function(s, prefix) {
85 | var r = rnd();
86 | excludes[r] = s.substr(prefix.length);
87 | return prefix + r;
88 | }
89 | );
90 |
91 |
92 | if(!(saveComments & 1))
93 | text = text.replace(/\/\*[\s\S]*?\*\//g, ""); // /*comment*/
94 | if(!(saveComments & 2))
95 | text = text.replace(/(^|[\t ]+|([^:\\]))\/\/[^\n\r]*$/mg, "$2"); // //comment
96 | else
97 | text = text
98 | .replace(/(^|[\t ]+|[^:\\])\/\/([ \t]?)[ \t]*([^\n\r]*)$/mg, "$1/*$2$3*/") // //comment -> /*comment*/
99 | .replace(/\*\/[\n\r]+\/\*/g, " ");
100 |
101 | text = text
102 | .replace(/^\s*javascript:\s*/i, "")
103 | .replace(/^\s+|\s+$/g, "");
104 |
105 | var newLinesReplacement = removeNewLines ? "" : " ";
106 |
107 | if(saveSpaces == 0)
108 | text = text.replace(/\s+/g, " ");
109 | else if(saveSpaces == 1)
110 | text = text
111 | .replace(/^[ \t]+|[ \t]+$/mg, "")
112 | .replace(/[\n\r]+/g, newLinesReplacement);
113 | else if(saveSpaces >= 2)
114 | text = text.replace(/[\n\r]+/g, newLinesReplacement);
115 |
116 |
117 | text = text.replace(/<#[a-z0-9]{2,}#>/g, function(s) {
118 | if(s in excludes)
119 | return excludes[s];
120 | return s;
121 | });
122 |
123 | if(
124 | !/^\(function\s*\(\)\s*\{.+\}\)\s*\(\);?$/.test(text) // (function(){ ... })();
125 | && !/^alert\s*\(([^()]*\([^()]+\))*[^()]*\);?$/.test(text) // alert( ... );
126 | && !/\Walert\s*\(\s*[^)]+\s*\);?$/.test(text) // ... alert(x);
127 | )
128 | text += " void 0;";
129 |
130 | text = "javascript: " + text;
131 |
132 | text = AkelPad.InputBox(
133 | hMainWnd,
134 | WScript.ScriptName,
135 | _localize("Code of bookmarklet (OK - copy):"),
136 | text
137 | );
138 | if(text)
139 | AkelPad.SetClipboardText(text);
140 | }
141 | function getText() {
142 | // Get selection or all text
143 | var text = AkelPad.GetSelText();
144 | if(text)
145 | return text;
146 | if(typeof AkelPad.GetTextRange != "undefined")
147 | return AkelPad.GetTextRange(0, -1);
148 | var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
149 | if(lpPoint) {
150 | setRedraw(hWndEdit, false);
151 | AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
152 |
153 | var columnSel = AkelPad.SendMessage(hWndEdit, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0);
154 | var ss = AkelPad.GetSelStart();
155 | var se = AkelPad.GetSelEnd();
156 |
157 | AkelPad.SetSel(0, -1);
158 | text = AkelPad.GetSelText();
159 |
160 | AkelPad.SetSel(ss, se);
161 | columnSel && AkelPad.SendMessage(hWndEdit, 3128 /*AEM_UPDATESEL*/, 0x1 /*AESELT_COLUMNON*/, 0);
162 |
163 | AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
164 | AkelPad.MemFree(lpPoint);
165 | setRedraw(hWndEdit, true);
166 | }
167 | return text;
168 | }
169 |
170 | function setRedraw(hWnd, bRedraw) {
171 | AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
172 | bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
173 | }
174 | function getArg(argName, defaultVal) {
175 | var args = {};
176 | for(var i = 0, argsCount = WScript.Arguments.length; i < argsCount; ++i)
177 | if(/^[-\/](\w+)(=(.+))?$/.test(WScript.Arguments(i)))
178 | args[RegExp.$1.toLowerCase()] = RegExp.$3 ? eval(RegExp.$3) : true;
179 | getArg = function(argName, defaultVal) {
180 | argName = argName.toLowerCase();
181 | return typeof args[argName] == "undefined" // argName in args
182 | ? defaultVal
183 | : args[argName];
184 | };
185 | return getArg(argName, defaultVal);
186 | }
--------------------------------------------------------------------------------
/scriptToBookmarklet_w2k.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=9927#p9927
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/scriptToBookmarklet_w2k.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/scriptToBookmarklet_w2k.js
4 |
5 | // (c) Infocatcher 2008-2011
6 | // Version: 0.3.0 - 2011-12-20
7 | // Author: Infocatcher
8 | // Windows 2000 SP2 +
9 |
10 | //===================
11 | //// Convert JavaScript code to one line bookmarklet
12 | // http://en.wikipedia.org/wiki/Bookmarklet
13 | // http://ru.wikipedia.org/wiki/Букмарклет
14 |
15 | // Arguments:
16 | // -saveSpaces=0 - replace multiple spaces with one
17 | // =1 - don't replace spaces inside lines
18 | // =2 - only replace new lines
19 | // -removeNewLines=true - remove new lines instead of replace them with space
20 | // -saveComments=0 - sum of flags: 1 - save block comments, 2 - save line comments
21 |
22 | // Usage:
23 | // Call("Scripts::Main", 1, "converter.js")
24 | // Call("Scripts::Main", 1, "converter.js", "-saveSpaces=0 -removeNewLines=true -saveComments=3")
25 | //===================
26 |
27 | function _localize(s) {
28 | var strings = {
29 | "Code of bookmarklet (OK - copy):": {
30 | ru: "Код букмарклета (ОК - копировать):"
31 | }
32 | };
33 | var lng = "en";
34 | switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
35 | case 0x19: lng = "ru";
36 | }
37 | _localize = function(s) {
38 | return strings[s] && strings[s][lng] || s;
39 | };
40 | return _localize(s);
41 | }
42 |
43 | var saveSpaces = getArg("saveSpaces", 1);
44 | var removeNewLines = getArg("removeNewLines", false);
45 | var saveComments = getArg("saveComments", 0);
46 |
47 | //var AkelPad = new ActiveXObject("AkelPad.document");
48 | var hMainWnd = AkelPad.GetMainWnd();
49 | var hWndEdit = AkelPad.GetEditWnd();
50 | var oSys = AkelPad.SystemFunction();
51 |
52 | if(hMainWnd && hWndEdit)
53 | scriptToBookmarklet();
54 |
55 | function scriptToBookmarklet() {
56 | var txt = getText();
57 |
58 | if(!(saveComments & 1))
59 | txt = txt.replace(/\/\*[\s\S]*\*\//g, ""); // /*comment*/
60 |
61 | if(!(saveComments & 2)) {
62 | var lines = txt.split("\r");
63 | for(var i = 0, l = lines.length; i < l; i++)
64 | lines[i] = lines[i].replace(/(^|[\t ]+|([^:\\]))\/\/[^\n\r]*$/, "$2"); // //comment
65 | txt = lines.join("\r");
66 | }
67 | else {
68 | // //comment -> /*comment*/
69 | var lines = txt.split("\r");
70 | for(var i = 0, l = lines.length; i < l; i++)
71 | lines[i] = lines[i].replace(/(^|[\t ]+|[^:\\])\/\/([ \t]?)[ \t]*([^\n\r]*)$/, "$1/*$2$3*/");
72 | txt = lines.join("\r")
73 | .replace(/\*\/[\n\r]+\/\*/g, "");
74 | }
75 |
76 | var newLinesReplacement = removeNewLines ? "" : " ";
77 |
78 | txt = txt
79 | .replace(/^\s*javascript:\s*/i, "")
80 | .replace(/^\s+|\s+$/g, "");
81 |
82 | if(saveSpaces == 0)
83 | txt = txt.replace(/[\n\r\t\s]+/g, " ");
84 | else if(saveSpaces == 1)
85 | txt = txt
86 | .replace(/^[ \t]+|[ \t]+$/mg, "")
87 | .replace(/[\n\r]+/g, newLinesReplacement);
88 | else if(saveSpaces >= 2)
89 | txt = txt.replace(/[\n\r]+/g, newLinesReplacement);
90 |
91 | if(
92 | !/^\(function\s*\(\)\s*\{.+\}\)\s*\(\);?$/.test(txt) // (function(){ ... })();
93 | && !/^alert\s*\(([^()]*\([^()]+\))*[^()]*\);?$/.test(txt) // alert( ... );
94 | && !/\Walert\s*\(\s*[^)]+\s*\);?$/.test(txt) // ... alert(x);
95 | )
96 | txt += " void 0;";
97 |
98 | txt = "javascript: " + txt;
99 |
100 | txt = AkelPad.InputBox(
101 | hMainWnd,
102 | WScript.ScriptName,
103 | _localize("Code of bookmarklet (OK - copy):"),
104 | txt
105 | );
106 | if(txt)
107 | AkelPad.SetClipboardText(txt);
108 | }
109 | function getText() {
110 | // Get selection or all text
111 | var txt = AkelPad.GetSelText();
112 | if(txt)
113 | return txt;
114 | if(typeof AkelPad.GetTextRange != "undefined")
115 | return AkelPad.GetTextRange(0, -1);
116 | var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
117 | if(lpPoint) {
118 | setRedraw(hWndEdit, false);
119 | AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
120 |
121 | var columnSel = AkelPad.SendMessage(hWndEdit, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0);
122 | var ss = AkelPad.GetSelStart();
123 | var se = AkelPad.GetSelEnd();
124 |
125 | AkelPad.SetSel(0, -1);
126 | txt = AkelPad.GetSelText();
127 |
128 | AkelPad.SetSel(ss, se);
129 | columnSel && AkelPad.SendMessage(hWndEdit, 3128 /*AEM_UPDATESEL*/, 0x1 /*AESELT_COLUMNON*/, 0);
130 |
131 | AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
132 | AkelPad.MemFree(lpPoint);
133 | setRedraw(hWndEdit, true);
134 | }
135 | return txt;
136 | }
137 |
138 | function setRedraw(hWnd, bRedraw) {
139 | AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
140 | bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
141 | }
142 | function getArg(argName, defaultVal) {
143 | var args = {};
144 | for(var i = 0, argsCount = WScript.Arguments.length; i < argsCount; ++i)
145 | if(/^[-\/](\w+)(=(.+))?$/.test(WScript.Arguments(i)))
146 | args[RegExp.$1.toLowerCase()] = RegExp.$3 ? eval(RegExp.$3) : true;
147 | getArg = function(argName, defaultVal) {
148 | argName = argName.toLowerCase();
149 | return typeof args[argName] == "undefined" // argName in args
150 | ? defaultVal
151 | : args[argName];
152 | };
153 | return getArg(argName, defaultVal);
154 | }
--------------------------------------------------------------------------------
/silentlyReloader.js:
--------------------------------------------------------------------------------
1 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/silentlyReloader.js
2 |
3 | // (c) Infocatcher 2021
4 | // Version: 0.1a1 - 2021-08-25
5 | // Author: Infocatcher
6 |
7 | //// Automatically reload log-like file
8 |
9 | // Required timer.js library
10 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=24559#p24559
11 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/Include/timer.js
12 |
13 | var delay = 2e3; // In milliseconds
14 | var noUndo = false;
15 |
16 |
17 | var hMainWnd = AkelPad.GetMainWnd();
18 | var oSys = AkelPad.SystemFunction();
19 | var hWndEdit = AkelPad.GetEditWnd();
20 |
21 | var hScript = AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/);
22 | if(hScript && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/)) {
23 | // Script is running, second call close it
24 | //WScript.Echo("Try to close");
25 | AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
26 | WScript.Quit();
27 | }
28 |
29 | if(
30 | !hMainWnd || !hWndEdit || !AkelPad.GetEditFile(0)
31 | || !AkelPad.Include("timer.js")
32 | )
33 | WScript.Quit();
34 |
35 | var reloadTimer = setInterval(reloadSilently, delay);
36 |
37 | //Allow other scripts running and unlock main thread from waiting this script.
38 | AkelPad.ScriptNoMutex(0x3 /*ULT_UNLOCKSCRIPTSQUEUE|ULT_UNLOCKPROGRAMTHREAD*/);
39 | AkelPad.WindowGetMessage(); // Message loop
40 |
41 |
42 | function reloadSilently() {
43 | if(!AkelPad.SetEditWnd(hWndEdit)) {
44 | clearInterval(reloadTimer);
45 | reloadTimer = 0;
46 | oSys.Call("user32::PostQuitMessage", 0); // Exit message loop
47 | return;
48 | }
49 |
50 | // See https://github.com/Infocatcher/AkelPad_scripts/blob/master/undoableReopen.js
51 | var file = AkelPad.GetEditFile(hWndEdit);
52 | if(!file)
53 | return;
54 |
55 | var text = AkelPad.ReadFile(file, 0, AkelPad.GetEditCodePage(0), AkelPad.GetEditBOM(0));
56 | if(text == AkelPad.GetTextRange(0, -1, 4 - AkelPad.GetEditNewLine(0))) {
57 | AkelPad.SendMessage(hMainWnd, 1229 /*AKD_SETMODIFY*/, hWndEdit, false);
58 | noUndo && AkelPad.SendMessage(hWndEdit, 3079 /*AEM_EMPTYUNDOBUFFER*/ , 0, 0);
59 | return;
60 | }
61 |
62 | // Based on code from built-in RenameFile.js
63 | var lpPoint64 = AkelPad.MemAlloc(_X64 ? 16 : 8 /*sizeof(POINT64)*/);
64 | if(!lpPoint64)
65 | return;
66 | function cleanup() {
67 | AkelPad.MemFree(lpPoint64);
68 | lpSel && AkelPad.MemFree(lpSel);
69 | lpCaret && AkelPad.MemFree(lpCaret);
70 | }
71 | var lpSel = AkelPad.MemAlloc(_X64 ? 56 : 32 /*sizeof(AESELECTION)*/);
72 | if(!lpSel)
73 | return cleanup();
74 | var lpCaret = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
75 | if(!lpCaret)
76 | return cleanup();
77 | AkelPad.SendMessage(hWndEdit, 3179 /*AEM_GETSCROLLPOS*/, 0, lpPoint64);
78 | AkelPad.SendMessage(hWndEdit, 3125 /*AEM_GETSEL*/, lpCaret, lpSel);
79 |
80 | AkelPad.SendMessage(hWndEdit, 11 /*WM_SETREDRAW*/, false, 0);
81 | AkelPad.SetSel(0, -1);
82 | AkelPad.ReplaceSel(text);
83 | AkelPad.SendMessage(hMainWnd, 1229 /*AKD_SETMODIFY*/, hWndEdit, false);
84 | noUndo && AkelPad.SendMessage(hWndEdit, 3079 /*AEM_EMPTYUNDOBUFFER*/ , 0, 0);
85 | AkelPad.SendMessage(hWndEdit, 11 /*WM_SETREDRAW*/, true, 0);
86 | oSys.Call("user32::InvalidateRect", hWndEdit, 0, true);
87 |
88 | var lpOffset = _PtrAdd(lpSel, _X64 ? 48 : 24 /*AESELECTION.dwFlags*/);
89 | var dwFlags = AkelPad.MemRead(lpOffset, 3 /*DT_DWORD*/);
90 | AkelPad.MemCopy(lpOffset, dwFlags | 0x808 /*AESELT_LOCKSCROLL|AESELT_INDEXUPDATE*/, 3 /*DT_DWORD*/);
91 | AkelPad.SendMessage(hWndEdit, 3126 /*AEM_SETSEL*/, lpCaret, lpSel);
92 | AkelPad.SendMessage(hWndEdit, 3180 /*AEM_SETSCROLLPOS*/, 0, lpPoint64);
93 | cleanup();
94 | }
--------------------------------------------------------------------------------
/tabsNextPrevious.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=11387#p11387
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/tabsNextPrevious.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/tabsNextPrevious.js
4 |
5 | // (c) Infocatcher 2011, 2014
6 | // Version: 0.1.2 - 2014-03-03
7 | // Author: Infocatcher
8 |
9 | //===================
10 | //// Switch between tabs in order of them usage (temporary check "Switch tabs: next-previous" option)
11 | // Based on Instructor's code: https://akelpad.sourceforge.net/forum/viewtopic.php?p=4222#p4222
12 | // Proposed hotkeys: Ctrl+PageDown and Ctrl+PageUp
13 |
14 | // Usage:
15 | // Call("Scripts::Main", 1, "tabsNextPrevious.js") - switch to next tab
16 | // Call("Scripts::Main", 1, "tabsNextPrevious.js", "-prev") - switch to previous tab
17 | //===================
18 |
19 | var next = WScript.Arguments.length ? WScript.Arguments(0) != "-prev" : true;
20 |
21 | var hMainWnd = AkelPad.GetMainWnd();
22 |
23 | if(hMainWnd && AkelPad.IsMDI()) {
24 | var tabOpts = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 157 /*MI_TABOPTIONSMDI*/, 0);
25 | var forceNextPrev = !(tabOpts & 0x10000 /*TAB_SWITCH_NEXTPREV*/);
26 | if(forceNextPrev)
27 | AkelPad.Command(4310 /*IDM_WINDOW_TABSWITCH_NEXTPREV*/);
28 |
29 | selectTab(next);
30 |
31 | if(forceNextPrev)
32 | AkelPad.SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 157 /*MIS_TABOPTIONSMDI*/, tabOpts);
33 | }
34 | else {
35 | AkelPad.MessageBox(hMainWnd, "MDI or PMDI window mode required!", WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
36 | }
37 |
38 | function selectTab(next) {
39 | var cmd = next ? 4316 /*IDM_WINDOW_FRAMENEXT*/ : 4317 /*IDM_WINDOW_FRAMEPREV*/;
40 | AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, cmd, 0);
41 | }
--------------------------------------------------------------------------------
/tabsRightLeft.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=11387#p11387
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/tabsRightLeft.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/tabsRightLeft.js
4 |
5 | // (c) Infocatcher 2011, 2014
6 | // Version: 0.1.3 - 2014-03-03
7 | // Author: Infocatcher
8 |
9 | //===================
10 | //// Switch between tabs in order of them arrangement (temporary check "Switch tabs: right-left" option)
11 | // Based on Instructor's code: https://akelpad.sourceforge.net/forum/viewtopic.php?p=4222#p4222
12 | // Proposed hotkeys: Ctrl+PageDown and Ctrl+PageUp
13 |
14 | // Usage:
15 | // Call("Scripts::Main", 1, "tabsRightLeft.js") - switch to next tab
16 | // Call("Scripts::Main", 1, "tabsRightLeft.js", "-prev") - switch to previous tab
17 | //===================
18 |
19 | var next = WScript.Arguments.length ? WScript.Arguments(0) != "-prev" : true;
20 |
21 | var hMainWnd = AkelPad.GetMainWnd();
22 |
23 | if(hMainWnd && AkelPad.IsMDI()) {
24 | var tabOpts = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 157 /*MI_TABOPTIONSMDI*/, 0);
25 | var forceRightLeft = !(tabOpts & 0x20000 /*TAB_SWITCH_RIGHTLEFT*/);
26 | if(forceRightLeft)
27 | AkelPad.Command(4311 /*IDM_WINDOW_TABSWITCH_RIGHTLEFT*/);
28 |
29 | selectTab(next);
30 |
31 | if(forceRightLeft)
32 | AkelPad.SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 157 /*MIS_TABOPTIONSMDI*/, tabOpts);
33 | }
34 | else {
35 | AkelPad.MessageBox(hMainWnd, "MDI or PMDI window mode required!", WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
36 | }
37 |
38 | function selectTab(next) {
39 | var cmd = next ? 4316 /*IDM_WINDOW_FRAMENEXT*/ : 4317 /*IDM_WINDOW_FRAMEPREV*/;
40 | AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, cmd, 0);
41 | }
--------------------------------------------------------------------------------
/tabsSwitchAlt.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=11387#p11387
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/tabsSwitchAlt.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/tabsSwitchAlt.js
4 |
5 | // (c) Infocatcher 2011, 2014
6 | // Version: 0.1.2 - 2014-03-03
7 | // Author: Infocatcher
8 |
9 | //===================
10 | //// Switch between tabs using alternative way
11 | // (temporary check "Switch tabs: right-left" or "Switch tabs: next-previous" option)
12 | // Based on Instructor's code: https://akelpad.sourceforge.net/forum/viewtopic.php?p=4222#p4222
13 | // Proposed hotkeys: Ctrl+PageDown and Ctrl+PageUp
14 |
15 | // Usage:
16 | // Call("Scripts::Main", 1, "tabsSwitchAlt.js") - switch to next tab
17 | // Call("Scripts::Main", 1, "tabsSwitchAlt.js", "-prev") - switch to previous tab
18 | //===================
19 |
20 | var next = WScript.Arguments.length ? WScript.Arguments(0) != "-prev" : true;
21 |
22 | var hMainWnd = AkelPad.GetMainWnd();
23 |
24 | if(hMainWnd && AkelPad.IsMDI()) {
25 | var tabOpts = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 157 /*MI_TABOPTIONSMDI*/, 0);
26 | var isNextPrev = tabOpts & 0x10000 /*TAB_SWITCH_NEXTPREV*/;
27 | AkelPad.Command(isNextPrev ? 4311 /*IDM_WINDOW_TABSWITCH_RIGHTLEFT*/ : 4310 /*IDM_WINDOW_TABSWITCH_NEXTPREV*/);
28 | selectTab(next);
29 | AkelPad.SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 157 /*MIS_TABOPTIONSMDI*/, tabOpts);
30 | }
31 | else {
32 | AkelPad.MessageBox(hMainWnd, "MDI or PMDI window mode required!", WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
33 | }
34 |
35 | function selectTab(next) {
36 | var cmd = next ? 4316 /*IDM_WINDOW_FRAMENEXT*/ : 4317 /*IDM_WINDOW_FRAMEPREV*/;
37 | AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, cmd, 0);
38 | }
--------------------------------------------------------------------------------
/tileTabs.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=17271#p17271
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/tileTabs.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/tileTabs.js
4 |
5 | // (c) Infocatcher 2012-2022
6 | // Version: 0.1.5 - 2022-03-21
7 | // Author: Infocatcher
8 |
9 | //// Tile current tab with next selected
10 | // select first tab, call script and then select second tab.
11 | // Required MDI window mode and timer.js library!
12 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/Include/timer.js
13 | // (or use -noBlink=true argument to work without timer.js)
14 |
15 | // Arguments:
16 | // h - tile horizontal
17 | // o - preserve tabs order
18 | // -noBlink=true - disable blink in status bar (and just show "Select tab!" text)
19 | // -item="%m:%i" - set checked state of toolbar button or menu item
20 |
21 | // Usage:
22 | // Call("Scripts::Main", 1, "tileTabs.js") - tile vertical
23 | // Call("Scripts::Main", 1, "tileTabs.js", "o") - tile vertical and preserve tabs order
24 | // Call("Scripts::Main", 1, "tileTabs.js", "h") - tile horizontal
25 | // Call("Scripts::Main", 1, "tileTabs.js", "h o") - tile horizontal and preserve tabs order
26 | // Example for Toolbar or ContextMenu plugins:
27 | // Call("Scripts::Main", 1, "tileTabs.js", 'h o -item="%m:%i"')
28 |
29 | function _localize(s) {
30 | var strings = {
31 | "No tabs!": {
32 | ru: "Отсутствуют вкладки!"
33 | },
34 | "MDI window mode required!": {
35 | ru: "Требуется оконный режим MDI!"
36 | },
37 | "Select tab!": {
38 | ru: "Выберите вкладку!"
39 | }
40 | };
41 | var lng = "en";
42 | switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
43 | case 0x19: lng = "ru";
44 | }
45 | _localize = function(s) {
46 | return strings[s] && strings[s][lng] || s;
47 | };
48 | return _localize(s);
49 | }
50 |
51 | var hScript = AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/);
52 | if(hScript && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/)) {
53 | // Script is running, second call close it
54 | AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
55 | WScript.Quit();
56 | }
57 |
58 | var hMainWnd = AkelPad.GetMainWnd();
59 | var oSys = AkelPad.SystemFunction();
60 |
61 | if(
62 | hMainWnd
63 | && AkelPad.IsMDI() == 1 /*WMD_MDI*/
64 | ) {
65 | var hMdiClient = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 12 /*MI_WNDMDICLIENT*/, 0);
66 | if(!hMdiClient) {
67 | AkelPad.MessageBox(hMainWnd, "Can't get hMdiClient!", WScript.ScriptName, 16 /*MB_ICONERROR*/);
68 | WScript.Quit();
69 | }
70 | var lpFrame = AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
71 | var lpFrame2;
72 | if(!lpFrame) {
73 | AkelPad.MessageBox(hMainWnd, _localize("No tabs!"), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
74 | WScript.Quit();
75 | }
76 |
77 | var item = new Item();
78 | item.check(true);
79 |
80 | var statusbar = new Statusbar();
81 | statusbar.save();
82 | var statusMsg = _localize("Select tab!");
83 | statusbar.set(statusMsg);
84 |
85 | if(
86 | !AkelPad.GetArgValue("noBlink", false)
87 | && AkelPad.Include("timer.js")
88 | ) {
89 | var showDelay = 600;
90 | var hideDelay = 150;
91 | // show -> [showDelay] -> hide -> [hideDelay] -> show -> [showDelay] -> hide
92 | var timerHide = setTimeout(function() {
93 | statusbar.set("");
94 | clearTimeout(timerHide);
95 | timerHide = setInterval(function() {
96 | statusbar.set("");
97 | }, showDelay + hideDelay, timerHide);
98 | }, showDelay);
99 | var timerShow = setInterval(function() {
100 | statusbar.set(statusMsg);
101 | }, showDelay + hideDelay);
102 | var stopTimers = function() {
103 | clearInterval(timerHide);
104 | clearInterval(timerShow);
105 | };
106 | }
107 |
108 | if(
109 | AkelPad.WindowSubClass(
110 | 1 /*WSC_MAINPROC*/,
111 | mainCallback,
112 | 0x416 /*AKDN_FRAME_ACTIVATE*/,
113 | 0x418 /*AKDN_FRAME_DESTROY*/
114 | )
115 | ) {
116 | AkelPad.ScriptNoMutex(); // Allow other scripts running
117 | AkelPad.WindowGetMessage(); // Message loop
118 | AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
119 |
120 | stopTimers && stopTimers();
121 | statusbar.restore();
122 | if(lpFrame2) {
123 | var tileHorizontal, useTabsOrder;
124 | for(var i = 0, l = WScript.Arguments.length; i < l; ++i) {
125 | switch(WScript.Arguments(i)) {
126 | case "h": tileHorizontal = true; break;
127 | case "o": useTabsOrder = true;
128 | }
129 | }
130 | tileTabs(lpFrame, lpFrame2, tileHorizontal, useTabsOrder);
131 | }
132 | }
133 | else {
134 | stopTimers && stopTimers();
135 | statusbar && statusbar.restore();
136 | AkelPad.MessageBox(hMainWnd, "AkelPad.WindowSubClass(WSC_MAINPROC) failed!", WScript.ScriptName, 16 /*MB_ICONERROR*/);
137 | }
138 | item.check(false);
139 | }
140 | else {
141 | AkelPad.MessageBox(hMainWnd, _localize("MDI window mode required!"), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
142 | }
143 | function mainCallback(hWnd, uMsg, wParam, lParam) {
144 | if(uMsg == 0x416 /*AKDN_FRAME_ACTIVATE*/) {
145 | if(lParam != lpFrame) {
146 | lpFrame2 = lParam;
147 | oSys.Call("user32::PostQuitMessage", 0); // Exit message loop
148 | }
149 | }
150 | else if(uMsg == 0x418 /*AKDN_FRAME_DESTROY*/) {
151 | if(lParam == lpFrame)
152 | oSys.Call("user32::PostQuitMessage", 0); // Exit message loop
153 | }
154 | }
155 |
156 | function tileTabs(lpFrame, lpFrame2, tileHorizontal, useTabsOrder, _lpRect) {
157 | var hWndMdi = AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 1 /*FI_WNDEDITPARENT*/, lpFrame);
158 | var hWndMdi2 = AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 1 /*FI_WNDEDITPARENT*/, lpFrame2);
159 |
160 | if(useTabsOrder) {
161 | var pos = AkelPad.SendMessage(hMainWnd, 1294 /*AKD_FRAMEINDEX*/, 0, lpFrame);
162 | var pos2 = AkelPad.SendMessage(hMainWnd, 1294 /*AKD_FRAMEINDEX*/, 0, lpFrame2);
163 | if(pos2 < pos) {
164 | var tmp = hWndMdi;
165 | hWndMdi = hWndMdi2;
166 | hWndMdi2 = tmp;
167 | }
168 | }
169 |
170 | AkelPad.SendMessage(hMdiClient, 0x0223 /*WM_MDIRESTORE*/, hWndMdi2, 0);
171 | AkelPad.SendMessage(hMdiClient, 0x0223 /*WM_MDIRESTORE*/, hWndMdi, 0);
172 |
173 | var lpRect = _lpRect || AkelPad.MemAlloc(16 /*sizeof(RECT)*/);
174 | if(!lpRect)
175 | return;
176 | var rcClient = oSys.Call("user32::GetClientRect", hMdiClient, lpRect)
177 | && parseRect(lpRect);
178 | if(!rcClient) {
179 | AkelPad.MemFree(lpRect);
180 | return;
181 | }
182 |
183 | var w = rcClient.right - rcClient.left;
184 | var h = rcClient.bottom - rcClient.top;
185 |
186 | if(h < 2)
187 | h = 2;
188 | if(w < 2)
189 | w = 2;
190 |
191 | if(tileHorizontal) {
192 | var h1 = Math.floor(h/2);
193 | var h2 = h - h1;
194 | moveMdiWindow(hWndMdi, rcClient.left, rcClient.top, w, h1);
195 | moveMdiWindow(hWndMdi2, rcClient.left, rcClient.top + h1, w, h2);
196 | }
197 | else {
198 | var w1 = Math.floor(w/2);
199 | var w2 = w - w1;
200 | moveMdiWindow(hWndMdi, rcClient.left, rcClient.top, w1, h);
201 | moveMdiWindow(hWndMdi2, rcClient.left + w1, rcClient.top, w2, h);
202 | }
203 | oSys.Call("user32::InvalidateRect", AkelPad.GetEditWnd(), 0, true);
204 |
205 | var maxWait = 250, step = 10, maxN = (maxWait/step)|0;
206 | if(!_lpRect) for(var i = 1; i <= maxN; ++i) {
207 | WScript.Sleep(step); // Wait for changes...
208 |
209 | var rcClient2 = oSys.Call("user32::GetClientRect", hMdiClient, lpRect)
210 | && parseRect(lpRect);
211 | if(!rcClient2)
212 | break;
213 | var w2 = rcClient2.right - rcClient2.left;
214 | var h2 = rcClient2.bottom - rcClient2.top;
215 |
216 | if(w2 != w || h2 != h) {
217 | tileTabs(lpFrame, lpFrame2, tileHorizontal, useTabsOrder, lpRect);
218 | break;
219 | }
220 | }
221 | AkelPad.MemFree(lpRect);
222 | }
223 | function moveMdiWindow(hWndMdi, x, y, w, h) {
224 | oSys.Call("user32::MoveWindow", hWndMdi, x, y, w, h, true /*bRepaint*/);
225 | }
226 | function parseRect(lpRect) {
227 | return {
228 | left: AkelPad.MemRead(_PtrAdd(lpRect, 0), 3 /*DT_DWORD*/),
229 | top: AkelPad.MemRead(_PtrAdd(lpRect, 4), 3 /*DT_DWORD*/),
230 | right: AkelPad.MemRead(_PtrAdd(lpRect, 8), 3 /*DT_DWORD*/),
231 | bottom: AkelPad.MemRead(_PtrAdd(lpRect, 12), 3 /*DT_DWORD*/)
232 | };
233 | }
234 |
235 | function Item() {
236 | this.check = function() {};
237 | // "%m:%i" (legacy: "menu:%m:%i" or "toolbar:%m:%i")
238 | var itemData = AkelPad.GetArgValue("item", "").split(":");
239 | if(itemData[0] == "menu" || itemData[0] == "toolbar") // Legacy
240 | itemData.shift();
241 | if(itemData.length != 2)
242 | return;
243 | var hHandle = +itemData[0];
244 | var nItemID = +itemData[1];
245 | if(!hHandle || !nItemID)
246 | return;
247 | this.check = function(checked) {
248 | if(oSys.Call("User32::IsMenu", hHandle)) {
249 | var cmd = checked ? 0x8 /*MF_BYCOMMAND|MF_CHECKED*/ : 0 /*MF_BYCOMMAND|MF_UNCHECKED*/;
250 | oSys.call("user32::CheckMenuItem", hHandle, nItemID, cmd);
251 | }
252 | else {
253 | AkelPad.SendMessage(hHandle, 1026 /*TB_CHECKBUTTON*/, nItemID, checked);
254 | }
255 | };
256 | }
257 | function Statusbar() {
258 | // Note: destroy() don't used since 2024-10-06
259 | this.get = this.set = this.save = this.restore = this.destroy = function() {};
260 |
261 | // Based on Instructor's code: https://akelpad.sourceforge.net/forum/viewtopic.php?p=13656#p13656
262 | var hWndStatus = oSys.Call("user32::GetDlgItem", hMainWnd, 10002 /*ID_STATUS*/);
263 | if(!hWndStatus || !oSys.Call("user32::IsWindowVisible", hWndStatus))
264 | return;
265 | var nParts = AkelPad.SendMessage(hWndStatus, 1030 /*SB_GETPARTS*/, 0, 0);
266 | if(nParts <= 5)
267 | return;
268 |
269 | var _origStatus, _customStatus;
270 | this.get = function() {
271 | var lenType = AkelPad.SendMessage(hWndStatus, _TSTR ? 1036 /*SB_GETTEXTLENGTHW*/ : 1027 /*SB_GETTEXTLENGTHA*/, nParts - 1, 0);
272 | var len = lenType & 0xffff; // low word
273 | var lpTextBuffer = AkelPad.MemAlloc((len + 1)*_TSIZE);
274 | if(!lpTextBuffer)
275 | return "";
276 | AkelPad.SendMessage(hWndStatus, _TSTR ? 1037 /*SB_GETTEXTW*/ : 1026 /*SB_GETTEXTA*/, nParts - 1, lpTextBuffer);
277 | var text = AkelPad.MemRead(lpTextBuffer, _TSTR);
278 | AkelPad.MemFree(lpTextBuffer);
279 | return text;
280 | };
281 | this.set = function(pStatusText) {
282 | _customStatus = pStatusText;
283 | AkelPad.SendMessage(hWndStatus, _TSTR ? 1035 /*SB_SETTEXTW*/ : 1025 /*SB_SETTEXTA*/, nParts - 1, pStatusText);
284 | };
285 | this.save = function() {
286 | _origStatus = this.get();
287 | };
288 | this.restore = function() {
289 | if(_origStatus != undefined && this.get() == _customStatus)
290 | this.set(_origStatus);
291 | };
292 | }
--------------------------------------------------------------------------------
/toggleToolbarRows-en-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/toggleToolbarRows-en-1.png
--------------------------------------------------------------------------------
/toggleToolbarRows-en-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/toggleToolbarRows-en-2.png
--------------------------------------------------------------------------------
/toggleToolbarRows-ru-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/toggleToolbarRows-ru-1.png
--------------------------------------------------------------------------------
/toggleToolbarRows-ru-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/toggleToolbarRows-ru-2.png
--------------------------------------------------------------------------------
/toggleToolbarRows.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=36081#p36081
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/toggleToolbarRows.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/toggleToolbarRows.js
4 |
5 | // (c) Infocatcher 2022
6 | // Version: 0.1.0 - 2022-08-07
7 | // Author: Infocatcher
8 |
9 | //// Toggle multiline toolbar from ToolBar plugin (convert BREAK <-> #BREAK)
10 |
11 | // Arguments:
12 | // -toolBarName="ToolBar2" - specify file name of ToolBar plugin
13 |
14 | // Usage:
15 | // Call("Scripts::Main", 1, "toggleToolbarRows.js")
16 | // Call("Scripts::Main", 1, "toggleToolbarRows.js", '-toolBarName="ToolBar2"')
17 |
18 | var tbPlugName = AkelPad.GetArgValue("toolBarName", "ToolBar");
19 |
20 | function _localize(s) {
21 | var strings = {
22 | "ToolBarText data in %P plugin is empty!": {
23 | ru: "Содержимое ToolBarText плагина %P пустое!"
24 | },
25 | "ToolBarText data in %P plugin not recognized:\n%S": {
26 | ru: "Содержимое ToolBarText плагина %P не распознано:\n%S"
27 | },
28 | "Failed to read settings of %P plugin": {
29 | ru: "Не удалось прочитать настройки плагина %P"
30 | },
31 | "Failed to write settings of %P plugin": {
32 | ru: "Не удалось записать настройки плагина %P"
33 | },
34 | "Failed to toggle multiline toolbar from %P plugin: BREAK item not found": {
35 | ru: "Не удалось переключить многострочность панели инструментов плагина %P: элемент BREAK не найден"
36 | }
37 | };
38 | var lng = "en";
39 | switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
40 | case 0x19: lng = "ru";
41 | }
42 | _localize = function(s) {
43 | return strings[s] && strings[s][lng] || s;
44 | };
45 | return _localize(s);
46 | }
47 | function _str(s) {
48 | return _localize(s).replace("%P", tbPlugName);
49 | }
50 |
51 | var oSet = AkelPad.ScriptSettings();
52 | var hMainWnd = AkelPad.GetMainWnd();
53 | var isHex = AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 5 /*MI_SAVESETTINGS*/, 0) == 2 /*SS_INI*/;
54 |
55 | if(oSet.Begin(tbPlugName, 0x21 /*POB_READ|POB_PLUGS*/)) {
56 | var tbData = oSet.Read("ToolBarText", 3 /*PO_STRING*/);
57 | oSet.End();
58 | if(
59 | !tbData
60 | || isHex && (tbData.length % 4 || /[^\dA-F]/i.test(tbData))
61 | ) {
62 | error(
63 | tbData
64 | ? _str("ToolBarText data in %P plugin not recognized:\n%S")
65 | .replace("%S", tbData.substr(0, 100))
66 | : _str("ToolBarText data in %P plugin is empty!")
67 | );
68 | WScript.Quit();
69 | }
70 | }
71 | else {
72 | error(_str("Failed to read settings of %P plugin"));
73 | }
74 |
75 | if(tbData && oSet.Begin(tbPlugName, 0x22 /*POB_SAVE|POB_PLUGS*/)) {
76 | var tbText = isHex ? hexToStr(tbData) : tbData;
77 | var changed;
78 | tbText = tbText.replace(/\r(#?)BREAK\r/g, function(s, commented) {
79 | changed = true;
80 | return "\r" + (commented ? "" : "#") + "BREAK\r";
81 | });
82 | if(changed) {
83 | tbData = isHex ? strToHex(tbText) : tbText;
84 | oSet.Write("ToolBarText", 3 /*PO_STRING*/, tbData);
85 | }
86 | else {
87 | error(_str("Failed to toggle multiline toolbar from %P plugin: BREAK item not found"), 48 /*MB_ICONEXCLAMATION*/);
88 | }
89 | oSet.End();
90 |
91 | if(changed && AkelPad.IsPluginRunning(tbPlugName + "::Main")) {
92 | AkelPad.Call(tbPlugName + "::Main");
93 | AkelPad.Call(tbPlugName + "::Main");
94 | }
95 | }
96 | else {
97 | tbData && error(_str("Failed to write settings of %P plugin"));
98 | }
99 |
100 | function hexToStr(h) {
101 | return h.replace(/[\dA-F]{4}/ig, function(h) {
102 | var n = parseInt(reorder(h), 16);
103 | return String.fromCharCode(n);
104 | });
105 | }
106 | function strToHex(s) {
107 | return s.replace(/[\s\S]/g, function(c) {
108 | var h = c.charCodeAt(0).toString(16).toUpperCase();
109 | h = "0000".substr(h.length) + h;
110 | return reorder(h);
111 | });
112 | }
113 | function reorder(h) { // LE <-> BE
114 | var b1 = h.substr(0, 2);
115 | var b2 = h.substr(2);
116 | return b2 + b1;
117 | }
118 |
119 | function error(msg, icon) {
120 | AkelPad.MessageBox(hMainWnd, msg, WScript.ScriptName, icon || 16 /*MB_ICONERROR*/);
121 | }
--------------------------------------------------------------------------------
/undoRedoAll.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=9927#p9927
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/undoRedoAll.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/undoRedoAll.js
4 |
5 | // (c) Infocatcher 2010, 2014
6 | // Version: 0.1.1 - 2014-04-04
7 | // Author: Infocatcher
8 |
9 | //// Undo/redo all changes
10 |
11 | // Arguments:
12 | // -mode=0 - undo
13 | // -mode=1 - redo
14 | // -stopOnSaved
15 |
16 | // Usage:
17 | // Call("Scripts::Main", 1, "undoRedoAll.js", "-mode=0 -stopOnSaved=true")
18 |
19 | var AEM_CANUNDO = 3075;
20 | var AEM_CANREDO = 3076;
21 | var AEM_UNDO = 3077;
22 | var AEM_REDO = 3078;
23 |
24 | var MODE_UNDO = 0;
25 | var MODE_REDO = 1;
26 |
27 | // Read arguments:
28 | var mode = AkelPad.GetArgValue("mode", MODE_UNDO);
29 | var stopOnSaved = AkelPad.GetArgValue("stopOnSaved", false);
30 |
31 | var CAN_ACTION = AEM_CANUNDO;
32 | var ACTION = AEM_UNDO;
33 | if(mode == MODE_REDO) {
34 | CAN_ACTION = AEM_CANREDO;
35 | ACTION = AEM_REDO;
36 | }
37 |
38 | var hWndEdit = AkelPad.GetEditWnd();
39 | var oSys = AkelPad.SystemFunction();
40 |
41 | if(
42 | AkelPad.GetMainWnd()
43 | && AkelPad.IsAkelEdit()
44 | && canAction()
45 | ) {
46 | var nFirstLine = saveLineScroll(hWndEdit);
47 |
48 | do action();
49 | while(canAction());
50 |
51 | restoreLineScroll(hWndEdit, nFirstLine);
52 | }
53 | function canAction() {
54 | return (stopOnSaved ? AkelPad.SendMessage(hWndEdit, 3086 /*AEM_GETMODIFY*/, 0, 0) : true)
55 | && AkelPad.SendMessage(hWndEdit, CAN_ACTION, 0, 0);
56 | }
57 | function action() {
58 | AkelPad.SendMessage(hWndEdit, ACTION, 0, 0);
59 | }
60 |
61 | // From Instructor's SearchReplace.js
62 | function saveLineScroll(hWnd)
63 | {
64 | AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, false, 0);
65 | return AkelPad.SendMessage(hWnd, 3129 /*AEM_GETLINENUMBER*/, 4 /*AEGL_FIRSTVISIBLELINE*/, 0);
66 | }
67 | function restoreLineScroll(hWnd, nBeforeLine)
68 | {
69 | if (AkelPad.SendMessage(hWnd, 3129 /*AEM_GETLINENUMBER*/, 4 /*AEGL_FIRSTVISIBLELINE*/, 0) != nBeforeLine)
70 | {
71 | var lpScrollPos;
72 | var nPosY=AkelPad.SendMessage(hWnd, 3198 /*AEM_VPOSFROMLINE*/, 0 /*AECT_GLOBAL*/, nBeforeLine);
73 |
74 | if (lpScrollPos=AkelPad.MemAlloc(_X64?16:8 /*sizeof(POINT64)*/))
75 | {
76 | AkelPad.MemCopy(_PtrAdd(lpScrollPos, 0) /*offsetof(POINT64, x)*/, -1, 2 /*DT_QWORD*/);
77 | AkelPad.MemCopy(_PtrAdd(lpScrollPos, _X64?8:4) /*offsetof(POINT64, y)*/, nPosY, 2 /*DT_QWORD*/);
78 | AkelPad.SendMessage(hWnd, 3180 /*AEM_SETSCROLLPOS*/, 0, lpScrollPos);
79 | AkelPad.MemFree(lpScrollPos);
80 | }
81 | }
82 | AkelPad.SendMessage(hWnd, 3377 /*AEM_UPDATECARET*/, 0, 0);
83 | AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, true, 0);
84 | oSys.Call("user32::InvalidateRect", hWnd, 0, true);
85 | }
--------------------------------------------------------------------------------
/undoableReopen.js:
--------------------------------------------------------------------------------
1 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/undoableReopen.js
2 |
3 | // (c) Infocatcher 2012, 2014
4 | // Version: 0.1.0pre3 - 2014-04-18
5 | // Author: Infocatcher
6 |
7 | //// Reopen file and preserve undo/redo buffer (just replace all text, if it was changed)
8 |
9 | var hMainWnd = AkelPad.GetMainWnd();
10 | var oSys = AkelPad.SystemFunction();
11 | var hWndEdit = AkelPad.GetEditWnd();
12 | if(hMainWnd && hWndEdit)
13 | undoableReopen();
14 | function undoableReopen() {
15 | var file = AkelPad.GetEditFile(0);
16 | if(!file)
17 | return;
18 |
19 | var text = AkelPad.ReadFile(file, 0, AkelPad.GetEditCodePage(0), AkelPad.GetEditBOM(0));
20 | if(text == AkelPad.GetTextRange(0, -1, 4 - AkelPad.GetEditNewLine(0))) {
21 | AkelPad.SendMessage(hMainWnd, 1229 /*AKD_SETMODIFY*/, hWndEdit, false);
22 | return;
23 | }
24 |
25 | // Based on code from built-in RenameFile.js
26 | var lpPoint64 = AkelPad.MemAlloc(_X64 ? 16 : 8 /*sizeof(POINT64)*/);
27 | if(!lpPoint64)
28 | return;
29 | function cleanup() {
30 | AkelPad.MemFree(lpPoint64);
31 | lpSel && AkelPad.MemFree(lpSel);
32 | lpCaret && AkelPad.MemFree(lpCaret);
33 | }
34 | var lpSel = AkelPad.MemAlloc(_X64 ? 56 : 32 /*sizeof(AESELECTION)*/);
35 | if(!lpSel)
36 | return cleanup();
37 | var lpCaret = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
38 | if(!lpCaret)
39 | return cleanup();
40 | AkelPad.SendMessage(hWndEdit, 3179 /*AEM_GETSCROLLPOS*/, 0, lpPoint64);
41 | AkelPad.SendMessage(hWndEdit, 3125 /*AEM_GETSEL*/, lpCaret, lpSel);
42 |
43 | AkelPad.SendMessage(hWndEdit, 11 /*WM_SETREDRAW*/, false, 0);
44 | AkelPad.SetSel(0, -1);
45 | AkelPad.ReplaceSel(text);
46 | AkelPad.SendMessage(hMainWnd, 1229 /*AKD_SETMODIFY*/, hWndEdit, false);
47 | AkelPad.SendMessage(hWndEdit, 11 /*WM_SETREDRAW*/, true, 0);
48 | oSys.Call("user32::InvalidateRect", hWndEdit, 0, true);
49 |
50 | var lpOffset = _PtrAdd(lpSel, _X64 ? 48 : 24 /*AESELECTION.dwFlags*/);
51 | var dwFlags = AkelPad.MemRead(lpOffset, 3 /*DT_DWORD*/);
52 | AkelPad.MemCopy(lpOffset, dwFlags | 0x808 /*AESELT_LOCKSCROLL|AESELT_INDEXUPDATE*/, 3 /*DT_DWORD*/);
53 | AkelPad.SendMessage(hWndEdit, 3126 /*AEM_SETSEL*/, lpCaret, lpSel);
54 | AkelPad.SendMessage(hWndEdit, 3180 /*AEM_SETSCROLLPOS*/, 0, lpPoint64);
55 | cleanup();
56 | }
--------------------------------------------------------------------------------
/unixTime.js:
--------------------------------------------------------------------------------
1 | // https://akelpad.sourceforge.net/forum/viewtopic.php?p=12600#p12600
2 | // https://infocatcher.ucoz.net/js/akelpad_scripts/unixTime.js
3 | // https://github.com/Infocatcher/AkelPad_scripts/blob/master/unixTime.js
4 |
5 | // (c) Infocatcher 2011-2012
6 | // Version: 0.1.3 - 2012-12-03
7 | // Author: Infocatcher
8 |
9 | //// Convert Unix time
10 |
11 | var TU_AUTO = 0;
12 | var TU_S = 1;
13 | var TU_MS = 2;
14 |
15 | var treatAsUTC = getArg("treatAsUTC", true);
16 | var timeUnit = getArg("timeUnit", TU_AUTO);
17 |
18 | var date = AkelPad.GetSelText().replace(/^\s+|\s+$/g, "");
19 | if(/^(\d+|0x[0-9a-f]+)$/i.test(date)) {
20 | date = Number(date);
21 | if(timeUnit == TU_S || timeUnit == TU_AUTO && date < 3e9)
22 | date *= 1000;
23 | }
24 | else if(/^([0-3]?\d)\D([01]?\d)\D(\d{4})(\s+([0-2]?\d)\D([0-6]?\d)(\D([0-6]?\d))?)?$/.test(date)) {
25 | // dd.MM.yyyy[ HH:mm[:ss]]
26 | with(RegExp)
27 | date = new Date($3, $2 - 1, $1, $5, $6, $8);
28 | }
29 | else if(/^(\d{4})\D([01]?\d)\D([0-3]?\d)(\s+([0-2]?\d)\D([0-6]?\d)(\D([0-6]?\d))?)?$/.test(date)) {
30 | // yyyy.MM.dd[ HH:mm[:ss]]
31 | with(RegExp)
32 | date = new Date($1, $2 - 1, $3, $5, $6, $8);
33 | }
34 | else if(/^([0-2]?\d)\D([0-6]?\d)(\D([0-6]?\d))?\s+([0-3]?\d)\D([01]?\d)\D(\d{4})$/.test(date)) {
35 | // HH:mm[:ss] dd.MM.yyyy
36 | with(RegExp)
37 | date = new Date($7, $6 - 1, $5, $1, $2, $4);
38 | }
39 | if(!(date instanceof Date))
40 | date = new Date(date);
41 | else if(treatAsUTC) {
42 | var tzo = date.getTimezoneOffset();
43 | date.setMinutes(date.getMinutes() - tzo);
44 | }
45 | var tzo = date.getTimezoneOffset();
46 | var ms = date.getTime();
47 | var s = Math.round(ms/1000);
48 | var tf = function(funcName) {
49 | if(treatAsUTC)
50 | return funcName.substr(0, 3) + "UTC" + funcName.substr(3);
51 | return funcName;
52 | };
53 | var dates = [
54 | date.toLocaleString(),
55 | date[tf("getFullYear")]() + "-" + padLeft(date[tf("getMonth")]() + 1) + "-" + padLeft(date[tf("getDate")]()) + " "
56 | + padLeft(date[tf("getHours")]()) + ":" + padLeft(date[tf("getMinutes")]()) + ":" + padLeft(date[tf("getSeconds")]())
57 | + " UTC" + (treatAsUTC ? "" : getTimezone(tzo)),
58 | date.toUTCString(),
59 | date.toString(),
60 | ms,
61 | s,
62 | (s < 0 ? "-" : "") + "0x" + Math.abs(s).toString(16)
63 | ].join("\n");
64 | AkelPad.MessageBox(AkelPad.GetMainWnd(), dates, WScript.ScriptName, 64 /*MB_ICONINFORMATION*/);
65 |
66 | function padLeft(n) {
67 | var chr = "0";
68 | var cnt = 2;
69 | n = String(n);
70 | var l = n.length;
71 | return l < cnt
72 | ? new Array(cnt - n.length + 1).join(chr) + n
73 | : n;
74 | }
75 | function getTimezone(tzo) {
76 | var m = Math.abs(tzo);
77 | var h = Math.floor(m/60);
78 | m = Math.floor(m - h*60);
79 | return (tzo > 0 ? "-" : "+") + padLeft(h) + padLeft(m);
80 | }
81 | function getArg(argName, defaultVal) {
82 | var args = {};
83 | for(var i = 0, argsCount = WScript.Arguments.length; i < argsCount; ++i)
84 | if(/^[-\/](\w+)(=(.+))?$/.test(WScript.Arguments(i)))
85 | args[RegExp.$1.toLowerCase()] = RegExp.$3 ? eval(RegExp.$3) : true;
86 | getArg = function(argName, defaultVal) {
87 | argName = argName.toLowerCase();
88 | return typeof args[argName] == "undefined" // argName in args
89 | ? defaultVal
90 | : args[argName];
91 | };
92 | return getArg(argName, defaultVal);
93 | }
--------------------------------------------------------------------------------
/unixTime.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/AkelPad_scripts/c796038f40d62ebb991bec17305861112aafa482/unixTime.png
--------------------------------------------------------------------------------