├── 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 |
Screenshot: alignWithSpaces.js 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 (& <=> &amp;) 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 |
Screenshot: converter.js 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 (& <=> &amp;) 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 |
Screenshot: crypt.js 84 |
[see cryptExt.js] 85 | 86 | ##### [cryptExt.js](cryptExt.js) 87 | Encrypt/decrypt text using AES-256/Blowfish/Twofish/Serpent 88 |
Screenshot: cryptExt.js 89 | 90 | ##### [decodeHTML.js](decodeHTML.js) 91 | Decode HTML entities (&amp; => &) 92 |
[see convertHTML.js and converter.js] 93 | 94 | ##### [encodeHTML.js](encodeHTML.js) 95 | Encode HTML entities (& => &amp;) 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 |
Screenshot: getHash.js 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 |
Screenshot: goToLongestLine.js 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 |
Screenshot: measuresConverter.js 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 |
Screenshot: runScript.js 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 |
Screenshot: toggleToolbarRows.js (before) 201 |
202 |
Screenshot: toggleToolbarRows.js (after) 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 |
Screenshot: unixTime.js 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 --------------------------------------------------------------------------------