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 | } |