AkelFiles\Plugs\Scripts\getLinks.js AkelFiles\Plugs\Scripts\getLinks2.js
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 
11function _localize(s) { 11function _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");
29var hMainWnd = AkelPad.GetMainWnd(); 29var hMainWnd = AkelPad.GetMainWnd();
30var oSys = AkelPad.SystemFunction(); 30var oSys = AkelPad.SystemFunction();
31  31 
32if(hMainWnd) { 32if(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 
49function getLinks() { 49function 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}
81function count(s, re) { 83function 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}
85function decodeHTML(s) { 87function decodeHTML(s) {
86    return s 88    return s
87        .replace(/&amp;/g, "&") 89        .replace(/&amp;/g, "&")
88        .replace(/&lt;/g, "<") 90        .replace(/&lt;/g, "<")
89        .replace(/&gt;/g, ">") 91        .replace(/&gt;/g, ">")
90        .replace(/&quot;/g, '"'); 92        .replace(/&quot;/g, '"');
91} 93}
92  94 
93function getAllText() { 95function 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}
118function insertNoScroll(str, selectAll) { 120function 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}
136function setRedraw(hWnd, bRedraw) { 138function 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}