| 1 | // (c) Infocatcher 2009-2010 |
1 | // (c) Infocatcher 2009-2010 |
| 2 | // version 0.1.6 - 2010-12-23 |
2 | // version 0.1.6 - 2010-12-23 |
| 3 | |
3 | |
| 4 | //=================== |
4 | //=================== |
| 5 | // Tries to extract links from any text |
5 | // Tries to extract links from any text |
| 6 | |
6 | |
| 7 | // Usage: |
7 | // Usage: |
| 8 | // Call("Scripts::Main", 1, "getLinks.js") |
8 | // Call("Scripts::Main", 1, "getLinks.js") |
| 9 | //=================== |
9 | //=================== |
| 10 | |
10 | |
| 11 | function _localize(s) { |
11 | function _localize(s) { |
| 12 | var strings = { |
12 | var strings = { |
| 13 | "Links not found!": { |
13 | "Links not found!": { |
| 14 | ru: "Ссылки не найдены!" |
14 | ru: "Ссылки не найдены!" |
| 15 | } |
15 | } |
| 16 | }; |
16 | }; |
| 17 | var lng; |
17 | var lng; |
| 18 | switch(AkelPad.SystemFunction().Call("kernel32::GetUserDefaultLangID") & 0x3ff /*PRIMARYLANGID*/) { |
18 | switch(AkelPad.SystemFunction().Call("kernel32::GetUserDefaultLangID") & 0x3ff /*PRIMARYLANGID*/) { |
| 19 | case 0x19: lng = "ru"; break; |
19 | case 0x19: lng = "ru"; break; |
| 20 | default: lng = "en"; |
20 | default: lng = "en"; |
| 21 | } |
21 | } |
| 22 | _localize = function(s) { |
22 | _localize = function(s) { |
| 23 | return strings[s] && strings[s][lng] || s; |
23 | return strings[s] && strings[s][lng] || s; |
| 24 | }; |
24 | }; |
| 25 | return _localize(s); |
25 | return _localize(s); |
| 26 | } |
26 | } |
| 27 | |
27 | |
| 28 | //var AkelPad = new ActiveXObject("AkelPad.document"); |
28 | //var AkelPad = new ActiveXObject("AkelPad.document"); |
| 29 | var hMainWnd = AkelPad.GetMainWnd(); |
29 | var hMainWnd = AkelPad.GetMainWnd(); |
| 30 | var oSys = AkelPad.SystemFunction(); |
30 | var oSys = AkelPad.SystemFunction(); |
| 31 | |
31 | |
| 32 | if(hMainWnd) { |
32 | if(hMainWnd) { |
| 33 | var links = getLinks(); |
33 | var links = getLinks(); |
| 34 | if(links.length) { |
34 | if(links.length) { |
| 35 | AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4101 /*IDM_FILE_NEW*/, 0); |
35 | AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4101 /*IDM_FILE_NEW*/, 0); |
| 36 | AkelPad.SetSel(0, 0); |
36 | AkelPad.SetSel(0, 0); |
| 37 | insertNoScroll(links.join("\n"), true); |
37 | insertNoScroll(links.join("\n"), true); |
| 38 | } |
38 | } |
| 39 | else { |
39 | else { |
| 40 | AkelPad.MessageBox( |
40 | AkelPad.MessageBox( |
| 41 | hMainWnd, |
41 | hMainWnd, |
| 42 | _localize("Links not found!"), |
42 | _localize("Links not found!"), |
| 43 | WScript.ScriptName, |
43 | WScript.ScriptName, |
| 44 | 48 /*MB_ICONEXCLAMATION*/ |
44 | 48 /*MB_ICONEXCLAMATION*/ |
| 45 | ); |
45 | ); |
| 46 | } |
46 | } |
| 47 | } |
47 | } |
| 48 | |
48 | |
| 49 | function getLinks() { |
49 | function getLinks() { |
| 50 | // Get selection or all text |
50 | // Get selection or all text |
| 51 | var txt = AkelPad.GetSelText() || getAllText(); |
51 | var txt = AkelPad.GetSelText() || getAllText(); |
| 52 | |
52 | |
| 53 | // [url=http://example.com/]...[/url] => http://example.com/ |
53 | // [url=http://example.com/]...[/url] => http://example.com/ |
| 54 | txt = txt.replace(/\[(\w+)=(['"]?)([^\[\]]+)\2\].*?\[\/\1\]/g, "\t$3\t"); |
54 | //txt = txt.replace(/\[(\w+)=(['"]?)([^\[\]]+)\2\].*?\[\/\1\]/g, "\t$3\t"); |
| 55 | |
55 | |
| 56 | var links = txt.match(/[a-z]+:\/\/+([^\/\\.\s<>'":*?|&#\(\)\[\]\{\}]+\.)*[^\/\\.\s<>'":*?|&#\(\)\[\]\{\}]+(:\d+)?(\/[^\s"<>]*)?|mailto:[^@\s\\\/:*?"<>|]+@[^@.\s\\\/:*?"<>|&#]+(\.[^@.\s\\\/:*?"<>|&#]+)+|\\{2,}\w+(\\[^\\\/:*?"<>|\s]+)+\\?/ig); |
56 | var links = txt.match(/([a-z]+:\/\/+([^\/\\.\s<>'":*?|&#\(\)\[\]\{\}]+\.)*[^\/\\.\s<>'":*?|&#\(\)\[\]\{\}]+(:\d+)?(\/[^\s"<>]*)?|mailto:[^@\s\\\/:*?"<>|]+@[^@.\s\\\/:*?"<>|&#]+(\.[^@.\s\\\/:*?"<>|&#]+)+|\\{2,}\w+(\\[^\\\/:*?"<>|\s]+)+\\?)[^\n\r]*$/img); |
| 57 | if(!links) |
57 | if(!links) |
| 58 | return []; |
58 | return []; |
| 59 | |
59 | |
| 60 | var linksObj = {}; |
60 | var linksObj = {}; |
| 61 | var link; |
61 | var link; |
| 62 | for(var i = 0, len = links.length; i < len; i++) { |
62 | for(var i = 0, len = links.length; i < len; i++) { |
| 63 | link = links[i].replace(/[\(\{\[+,]$/, ""); |
63 | link = links[i].replace(/[\(\{\[+,]$/, ""); |
| 64 | |
64 | |
| |
65 | /* |
| 65 | if(count(link, /\(/g) == 0 && count(link, /\)/g)) |
66 | if(count(link, /\(/g) == 0 && count(link, /\)/g)) |
| 66 | link = link.replace(/\).*$/, ""); |
67 | link = link.replace(/\).*$/, ""); |
| 67 | if(count(link, /\[/g) == 0 && count(link, /\]/g)) |
68 | if(count(link, /\[/g) == 0 && count(link, /\]/g)) |
| 68 | link = link.replace(/\].*$/, ""); |
69 | link = link.replace(/\].*$/, ""); |
| 69 | if(count(link, /\{/g) == 0 && count(link, /\}/g)) |
70 | if(count(link, /\{/g) == 0 && count(link, /\}/g)) |
| 70 | link = link.replace(/\}.*$/, ""); |
71 | link = link.replace(/\}.*$/, ""); |
| |
72 | */ |
| 71 | |
73 | |
| 72 | linksObj[decodeHTML(link)] = 1; |
74 | linksObj[decodeHTML(link)] = 1; |
| 73 | } |
75 | } |
| 74 | |
76 | |
| 75 | links = []; |
77 | links = []; |
| 76 | for(var h in linksObj) |
78 | for(var h in linksObj) |
| 77 | links.push(h); |
79 | links.push(h); |
| 78 | |
80 | |
| 79 | return links; |
81 | return links; |
| 80 | } |
82 | } |
| 81 | function count(s, re) { |
83 | function count(s, re) { |
| 82 | var m = s.match(re); |
84 | var m = s.match(re); |
| 83 | return m ? m.length : 0; |
85 | return m ? m.length : 0; |
| 84 | } |
86 | } |
| 85 | function decodeHTML(s) { |
87 | function decodeHTML(s) { |
| 86 | return s |
88 | return s |
| 87 | .replace(/&/g, "&") |
89 | .replace(/&/g, "&") |
| 88 | .replace(/</g, "<") |
90 | .replace(/</g, "<") |
| 89 | .replace(/>/g, ">") |
91 | .replace(/>/g, ">") |
| 90 | .replace(/"/g, '"'); |
92 | .replace(/"/g, '"'); |
| 91 | } |
93 | } |
| 92 | |
94 | |
| 93 | function getAllText() { |
95 | function getAllText() { |
| 94 | if(typeof AkelPad.GetTextRange != "undefined") |
96 | if(typeof AkelPad.GetTextRange != "undefined") |
| 95 | return AkelPad.GetTextRange(0, -1); |
97 | return AkelPad.GetTextRange(0, -1); |
| 96 | var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/, true); |
98 | var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/, true); |
| 97 | if(!lpPoint) |
99 | if(!lpPoint) |
| 98 | return ""; |
100 | return ""; |
| 99 | var hWndEdit = AkelPad.GetEditWnd(); |
101 | var hWndEdit = AkelPad.GetEditWnd(); |
| 100 | setRedraw(hWndEdit, false); |
102 | setRedraw(hWndEdit, false); |
| 101 | AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint); |
103 | AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint); |
| 102 | |
104 | |
| 103 | var columnSel = AkelPad.SendMessage(hWndEdit, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0); |
105 | var columnSel = AkelPad.SendMessage(hWndEdit, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0); |
| 104 | var ss = AkelPad.GetSelStart(); |
106 | var ss = AkelPad.GetSelStart(); |
| 105 | var se = AkelPad.GetSelEnd(); |
107 | var se = AkelPad.GetSelEnd(); |
| 106 | |
108 | |
| 107 | AkelPad.SetSel(0, -1); |
109 | AkelPad.SetSel(0, -1); |
| 108 | var str = AkelPad.GetSelText(); |
110 | var str = AkelPad.GetSelText(); |
| 109 | |
111 | |
| 110 | AkelPad.SetSel(ss, se); |
112 | AkelPad.SetSel(ss, se); |
| 111 | columnSel && AkelPad.SendMessage(hWndEdit, 3128 /*AEM_UPDATESEL*/, 0x1 /*AESELT_COLUMNON*/, 0); |
113 | columnSel && AkelPad.SendMessage(hWndEdit, 3128 /*AEM_UPDATESEL*/, 0x1 /*AESELT_COLUMNON*/, 0); |
| 112 | |
114 | |
| 113 | AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint); |
115 | AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint); |
| 114 | AkelPad.MemFree(lpPoint, true); |
116 | AkelPad.MemFree(lpPoint, true); |
| 115 | setRedraw(hWndEdit, true); |
117 | setRedraw(hWndEdit, true); |
| 116 | return str; |
118 | return str; |
| 117 | } |
119 | } |
| 118 | function insertNoScroll(str, selectAll) { |
120 | function insertNoScroll(str, selectAll) { |
| 119 | var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/, true); |
121 | var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/, true); |
| 120 | if(!lpPoint) |
122 | if(!lpPoint) |
| 121 | return; |
123 | return; |
| 122 | var hWndEdit = AkelPad.GetEditWnd(); |
124 | var hWndEdit = AkelPad.GetEditWnd(); |
| 123 | setRedraw(hWndEdit, false); |
125 | setRedraw(hWndEdit, false); |
| 124 | AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint); |
126 | AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint); |
| 125 | |
127 | |
| 126 | selectAll && AkelPad.SetSel(0, -1); |
128 | selectAll && AkelPad.SetSel(0, -1); |
| 127 | //var ss = AkelPad.GetSelStart(); |
129 | //var ss = AkelPad.GetSelStart(); |
| 128 | AkelPad.ReplaceSel(str, true); |
130 | AkelPad.ReplaceSel(str, true); |
| 129 | //if(ss != AkelPad.GetSelStart()) |
131 | //if(ss != AkelPad.GetSelStart()) |
| 130 | // AkelPad.SetSel(ss, ss + str.length); |
132 | // AkelPad.SetSel(ss, ss + str.length); |
| 131 | |
133 | |
| 132 | AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint); |
134 | AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint); |
| 133 | setRedraw(hWndEdit, true); |
135 | setRedraw(hWndEdit, true); |
| 134 | AkelPad.MemFree(lpPoint, true); |
136 | AkelPad.MemFree(lpPoint, true); |
| 135 | } |
137 | } |
| 136 | function setRedraw(hWnd, bRedraw) { |
138 | function setRedraw(hWnd, bRedraw) { |
| 137 | AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0); |
139 | AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0); |
| 138 | bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true); |
140 | bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true); |
| 139 | } |
141 | } |