diff options
-rw-r--r-- | auto_detect_link.js | 152 | ||||
-rw-r--r-- | command_menu.js | 94 | ||||
-rw-r--r-- | readcatlater.js | 95 |
3 files changed, 162 insertions, 179 deletions
diff --git a/auto_detect_link.js b/auto_detect_link.js index 02294ed..0e7ec5c 100644 --- a/auto_detect_link.js +++ b/auto_detect_link.js @@ -65,14 +65,14 @@ // // License: // http://creativecommons.org/licenses/by-sa/2.1/jp/ -// http://creativecommons.org/licenses/by-sa/2.1/jp/deed.en_CA +// http://creativecommons.org/licenses/by-sa/2.1/jp/deed // // TODO: // input / form // history -(function () { try{ +(function () { try { liberator.log('auto_detect_link.js loading'); //////////////////////////////////////////////////////////////// @@ -81,13 +81,15 @@ let defaultSetting = { nextPatterns: [ - /NEXT/, /next/, /Next/, - /^次(へ|の)/, /つぎへ/, /つづく/, /続/, /次/, /つぎ/, /next/i, /進む/, - /^>$/, />>/, />/ + /[NnNn][EeEe][XxXx][TtTt]/, + /[FfFf](?:[OoOo][RrRr])?[WwWw](?:[AaAa][RrRr])?[DdDd]/, + /^\s*(?:次|つぎ)[への]/, /つづく|続/, /次|つぎ/, /進む/, + /^\s*>\s*$/, />+|≫/ ], backPatterns: [ - /back/i, /back/i, /BACK/, /PREV/, - /^前(へ|の)/, /前/, /戻る/, /^<$/, /<</, /</ + /[BbBb][AaAa][CcCc][KkKk]/, /[PpPp][RrRr][EeEe][VvVv]/, + /^\s*前[への]/, /前/, /戻る/, + /^\s*<\s*$/, /<+|≪/ ], nextMappings: [']]'], backMappings: ['[['], @@ -97,7 +99,7 @@ //clickButton: true, force: false, useAutoPagerize: true, - } + }; //////////////////////////////////////////////////////////////// // setting @@ -107,7 +109,7 @@ // 評価を遅延するために関数にしておく function gv () { - if (_gv) + if (_gv) return _gv; if (liberator.globalVariables) { @@ -128,8 +130,8 @@ let ap_cache = eval(Application.prefs.getValue(APPREF, null)); for each (let cache in ap_cache) { - cache.info = cache.info.filter(function(i) { return ('url' in i) }) - cache.info.sort(function(a, b) { return (b.url.length - a.url.length) }) + cache.info = cache.info.filter(function (i) 'url' in i); + cache.info.sort(function (a, b) b.url.length - a.url.length); } @@ -139,8 +141,8 @@ // Array#find function find (ary, f) { - let func = (typeof f == 'function') ? f : function (v) v == f; - for (var i = 0; i < ary.length; i++) { + var func = (typeof f == 'function') ? f : function (v) v == f; + for (let i = 0, l = ary.length; i < l; i++) { if (func(ary[i])) { return ary[i]; } @@ -153,14 +155,14 @@ function clickElement (elem) { liberator.log('click: ' + elem); var e = content.document.createEvent('MouseEvents'); - e.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null); - elem.dispatchEvent(e); + e.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null); + elem.dispatchEvent(e); } // 開いたURIなどの表示 function displayOpened (link) { - let msg = 'open: ' + link.type + ' <' + link.text + '> ' + link.uri; + var msg = 'open: ' + link.type + ' <' + link.text + '> ' + link.uri; setTimeout(function () liberator.echo(msg, commandline.FORCE_SINGLELINE), 1000); liberator.log(msg); } @@ -172,22 +174,21 @@ if (link.element) { clickElement(link.element); } else if (link.uri) { - link.frame.location.href = link.uri + link.frame.location.href = link.uri; } displayOpened(link); } // 元の文字列、詰め込む文字、長さ - function padChar (s, c, n) { - return s.replace(new RegExp('^(.{0,'+(n-1)+'})$'), function(s)padChar(c+s,c,n)); - } + function padChar (s, c, n) + s.replace(new RegExp('^(.{0,'+(n-1)+'})$'), function (s) padChar(c+s, c, n)); // (次|前)の数字文字列リストを取得 function succNumber (n, next) { - let m = (parseInt(n.replace(/^0*(.)/,'$1')||0) + (next ? 1 : -1)).toString(); - let result = [m]; + var m = (parseInt(n.replace(/^0*(?=.)/, '') || 0) + (next ? 1 : -1)).toString(); + var result = [m]; if (m.length < n.length) result.unshift(padChar(m.toString(), '0', n.length)); return result; @@ -196,8 +197,8 @@ // (次|前)の文字列リストを取得 function succString (s, next) { - let result = [], d = next ? 1 : -1; - let c = String.fromCharCode(s.charCodeAt(0) + d); + var result = [], d = next ? 1 : -1; + var c = String.fromCharCode(s.charCodeAt(0) + d); if (('a' <= c && c <= 'z') || 'A' <= c && c <= 'Z') result.push(c); return result; @@ -206,33 +207,31 @@ // (次|前)のURIリストを取得 function succURI (uri, next) { - let urim = uri.match(/^(.+\/)([^\/]+)$/); + var urim = uri.match(/^(.+\/)([^\/]+)$/); if (!urim) return []; - let [_, dir, file] = urim, result = []; + var [_, dir, file] = urim, result = []; // succ number - let (dm, succs, file = file, left = '', temp = []) { + let (dm, file = file, left = '', temp = []) { while (file && (dm = file.match(/\d+/))) { let [rcontext, lcontext, lmatch] = [RegExp.rightContext, RegExp.leftContext, RegExp.lastMatch]; left += lcontext; - succs = succNumber(lmatch, next); - for each (let succ in succs) { + succNumber(lmatch, next).forEach(function (succ) { temp.push(dir + left + succ + rcontext); - } + }); left += lmatch; file = rcontext; } result = result.concat(temp.reverse()); } // succ string - let (dm, succs, file = file, left = '', temp = []) { + let (dm, file = file, left = '', temp = []) { while (file && (dm = file.match(/(^|[^a-zA-Z])([a-zA-Z])([^a-zA-Z]|$)/))) { let [rcontext, lcontext] = [RegExp.rightContext, RegExp.leftContext]; left += lcontext + dm[1]; - succs = succString(dm[2], next); - for each (let succ in succs) { + succString(dm[2], next).forEach(function (succ) { temp.push(dir + left + succ + dm[3] + rcontext); - } + }); left += dm[1]; file = dm[3] + rcontext; } @@ -243,22 +242,19 @@ // パターンマッチング - function match (pattern, link) { - if (pattern instanceof Function) - return pattern(link); - if (!link.text) - return; - if (pattern instanceof RegExp) - return pattern.test(link.text); - return link.text.toLowerCase().indexOf(pattern.toString().toLowerCase()) >= 0; - } + function match (pattern, link) + pattern instanceof Function ? pattern(link) : + !link.text ? null : + pattern instanceof RegExp ? pattern.test(link.text) : + link.text.toLowerCase().indexOf(pattern.toString().toLowerCase()) >= 0; // 要素が表示されているか? function isVisible (element) { + var st; try { - let st = content.document.defaultView.getComputedStyle(element, null); - return !(st.display && st.display.match(/none/)) && (!element.parentNode || isVisible(element.parentNode)) + st = content.document.defaultView.getComputedStyle(element, null); + return !(st.display && st.display.indexOf('none') >= 0) && (!element.parentNode || isVisible(element.parentNode)) } catch (e) { return true; } @@ -266,9 +262,8 @@ // リンクのフィルタ - function linkElementFilter (elem) { - return isVisible(elem) && elem.href && !elem.href.match(/@/) && elem.href.match(/^((https?|file|ftp):\/\/|javascript:)/) && elem.textContent; - } + function linkElementFilter (elem) + isVisible(elem) && elem.href && elem.href.indexOf('@') < 0 && /^(?:(?:https?|f(?:ile|tp)):\/\/|javascript:)/.test(elem.href) && elem.textContent; // 全てのリンクを取得 @@ -276,7 +271,9 @@ function getAllLinks (content) { var result = []; // Anchor - for each (let it in content.document.links) { + var elements = content.document.links; + for (let i = 0, l = elements.length; i < l; i++) { + let it = elements[i]; if (linkElementFilter(it)) result.push({ type: 'link', @@ -287,21 +284,22 @@ }); } // Form - for each (let input in content.document.getElementsByTagName('input')) { + elements = content.document.getElementsByTagName('input'); + for (let i = 0, l = elements.length; i < l; i++) { (function (input) { result.push({ type: 'input', - frame: content, - uri: input.form && input.form.action, + frame: content, + uri: input.form && input.form.action, text: input.value, click: input.click, element: input, }); - })(input); + })(elements[i]); } // Frame if (content.frames) { - for (let i = 0; i < content.frames.length; i++) { + for (let i = 0, l = content.frames.length; i < l; i++) { result = result.concat(getAllLinks(content.frames[i])); } } @@ -332,10 +330,11 @@ if (!ap_cache) return; - let info = (function () { - let uri = buffer.URL; + var info = (function () { + var uri = buffer.URL; for each (let cache in ap_cache) { - for each (let info in cache.info) { + for (let i = 0, l = cache.info.length; i < l; i++) { + let info = cache.info[i]; if (uri.match(info.url)) return info; } @@ -345,8 +344,8 @@ if (!info) return; - let doc = content.document; - let result = doc.evaluate(info.nextLink, doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); + var doc = content.document; + var result = doc.evaluate(info.nextLink, doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); if (result.singleNodeValue) return result.singleNodeValue; } @@ -382,25 +381,27 @@ // keywords if (1) { - for each (let pattern in patterns) { - let link = find(links, function (link) match(pattern, link)); - if (link) - return link; - } + let link; + if (patterns.some(function (pattern) { + link = find(links, function (link) match(pattern, link)); + return link ? true : false; + })) + return link; } // succ let succs = succURI(uri, next); if (setting.useSuccPattern) { - for each (succ in succs) { - let link = find(links, function (link) (link.uri && (link.uri.indexOf(succ) >= 0))); - if (link) - return link; - } + let link; + if (succs.some(function (succ) { + link = find(links, function (link) link.uri && (link.uri.indexOf(succ) >= 0)); + return link ? true : false; + })) + return link; } // force - if (setting.force && succs.length) + if (setting.force && succs.length) return { type: 'force', uri: succs[0], @@ -425,7 +426,7 @@ return; } - let link = detect(next, setting); + var link = detect(next, setting); if (link) open(link); } @@ -442,7 +443,7 @@ if (gv().nextMappings.length) { mappings.addUserMap( - [modes.NORMAL], + [modes.NORMAL], gv().nextMappings, 'Go next', function () go(true) @@ -452,7 +453,7 @@ if (gv().backMappings.length) { mappings.addUserMap( - [modes.NORMAL], + [modes.NORMAL], gv().backMappings, 'Go back', function () go(false) @@ -462,7 +463,4 @@ liberator.log('auto_detect_link.js loaded'); -}catch(e){liberator.log(e)} -})(); - - +} catch (e) { liberator.log(e); } })(); diff --git a/command_menu.js b/command_menu.js index 4c95088..4cabb55 100644 --- a/command_menu.js +++ b/command_menu.js @@ -19,38 +19,37 @@ // // License: // http://creativecommons.org/licenses/by-sa/2.1/jp/ -// http://creativecommons.org/licenses/by-sa/2.1/jp/deed.en_CA +// http://creativecommons.org/licenses/by-sa/2.1/jp/deed -(function(){ +(function () { const migemo = Components .classes['@piro.sakura.ne.jp/xmigemo/factory;1'] .getService(Components.interfaces.pIXMigemoFactory) .getService("ja"); - function id (v) v; - function equal (x) function (y) x == y; - function cloneArray (src) src.map(id); + function cloneArray (src) src.map(function (id) id); function matchPath (elem, path, getName) { - for (let i = 0; i < path.length; i++) { + var i = 0; + for (let l = path.length; i < l; i++) { if (!path[i](getName(elem))) break; } if (i) { let res = []; - for (let j = i; j < path.length; j++) + for (let j = i, l = path.length; j < l; j++) res.push(path[j]); return res; } } function getElementsByPath (elem, path, getName, isTarget, isEnabled) { - try{ + try { function get (point, elem, path) { - let m = path[0](getName(elem, true)); + var m = path[0](getName(elem, true)); if (isTarget(elem)) { if (!isEnabled(elem)) @@ -65,11 +64,11 @@ } //elem.containerOpen = true; - let res, cs = elem.childNodes, result = []; + var res, cs = elem.childNodes, result = []; if (cs && cs.length) { - for (let i = 0; i < cs.length; i++) { + for (let i = 0, l = cs.length; i < l; i++) { if (res = get(m + point, cs[i], path)) - res.map(function(it) it && result.push(it)); + res.map(function (it) it && result.push(it)); } } //elem.containerOpen = false; @@ -78,26 +77,21 @@ } return get(0, elem, path).sort().map(function (it) it[1]); - }catch(e){ liberator.log(e); } + } catch (e) { liberator.log(e); } } - function getPathMatchers (args) { - return args.split('-').map(function(it){ - let n = it.toLowerCase(); - let s = migemo.getRegExp(it.replace(/^\s+|\s+$/, '')); - let re = new RegExp(s, 'i'); - return function (l) { - if (!l) return 0; - if (l == it) return 1; - if (l.toLowerCase().indexOf(n) >= 0) return 2; - if (re.test(l)) return 3; - return 0; - } - }); - } + function getPathMatchers (args) + args.split('-').map(function (it) + function (l) + !l ? 0 : + l == it ? 1 : + l.toLowerCase().indexOf(it.toLowerCase()) >= 0 ? 2 : + new RegExp(migemo.getRegExp(it.replace(/^\s+|\s+$/, '')), + 'i').test(l) ? 3 : + 0); function getPathString (elem, isRoot, getName, isTarget) { - let res = []; + var res = []; while (!isRoot(elem)) { isTarget(elem) && res.unshift(getName(elem)); elem = elem.parentNode; @@ -116,32 +110,27 @@ const toolbox = document.getElementById('navigator-toolbox'); const contextmenu = document.getElementById('contentAreaContextMenu'); - function fixName (name) { - return name ? name.replace(/^\s+|\s+$/, '').replace(/[\-\s]+/g, '_') : ''; - } + function fixName (name) + name ? name.replace(/^\s+|\s+$/, '').replace(/[-\s]+/g, '_') : ''; - function getElementName (elem, multi) { - const f = function (it) { return fixName(it) || ''; } - return multi ? [elem.label, elem.tooltipText].map(f).join('-') - : fixName(elem.label || elem.tooltipText || '') ; - } + function getElementName (elem, multi) + multi ? [elem.label, elem.tooltipText].map(function (it) fixName(it) || '') + .join('-') + : fixName(elem.label || elem.tooltipText || ''); - function isNotHidden (elem) { - return !elem.hidden; - } + function isNotHidden (elem) + !elem.hidden ? true : false; - function isClickable (elem) { - const re = /^(menu(item)?|toolbarbutton)$/i; - return elem.nodeName.match(re); - } + function isClickable (elem) + /^(?:menu(?:item)?|toolbarbutton)$/.test(elem.nodeName.toLowerCase()); - function addCommand(cmds, name, root, action) { + function addCommand (cmds, name, root, action) { function _find (args, single) { - let result = getElementsByPath(root, - getPathMatchers(args), - getElementName, - isClickable, - isNotHidden); + var result = getElementsByPath(root, + getPathMatchers(args), + getElementName, + isClickable, + isNotHidden); return single ? result[0] : result; } @@ -161,7 +150,7 @@ // for HEAD (2) if (args.string != undefined) args = args.string; - let res = _find(args.replace(/-\s*$/,''), true); + var res = _find(args.replace(/-\s*$/,''), true); if (!(res && action(res))) liberator.echoerr('menu not found'); }, @@ -178,8 +167,8 @@ addCommand(['me[nu]'], 'Command MainMenu', mainMenubar); addCommand(['toolbar', 'tb'], 'Command Toolbar', toolbox); addCommand(['conme', 'contextmenu'], - 'Context Menu', - contextmenu, + 'Context Menu', + contextmenu, function (elem) { //contextmenu.openPopup(null, null, 0, 0, true); //contextmenu.hidePopup(); @@ -190,4 +179,3 @@ ); })(); - diff --git a/readcatlater.js b/readcatlater.js index 0d0c2ca..97c545a 100644 --- a/readcatlater.js +++ b/readcatlater.js @@ -17,39 +17,39 @@ // // License: // http://creativecommons.org/licenses/by-sa/2.1/jp/ -// http://creativecommons.org/licenses/by-sa/2.1/jp/deed.en_CA +// http://creativecommons.org/licenses/by-sa/2.1/jp/deed // // Link: // http://d.hatena.ne.jp/nokturnalmortum/20080918#1221729188 -(function () { try{ +(function () { try { liberator.log('readcatlater.js loading'); - + // このプラグインでブックマークしたときに必ずつくタグ - const RCL_TAG = 'readcatlater'; + const RCL_TAG = 'readcatlater'; // このプラグインが保存するブックマークのフォルダ名 // 変更しても良いし、場所を移動しても平気である。 const FOLDER_NAME = 'L'; // 逆順表示 const REVERSE = eval(liberator.globalVariables.readcatlater_reverse || 'false'); - var prefs = { + let prefs = { prefix: 'extensions.vimperator.plugins.readcatlater.', prefs: Components.classes["@mozilla.org/preferences-service;1"]. getService(Components.interfaces.nsIPrefBranch), get: function (name, def) { + var name, type; try { - var name = this.prefix + name; - var type = this.prefs.getPrefType(name); - const nsIPrefBranch = Components.interfaces.nsIPrefBranch; + const nsIPrefBranch = Components.interfaces.nsIPrefBranch; + name = this.prefix + name; + type = this.prefs.getPrefType(name); switch (type) { case nsIPrefBranch.PREF_STRING: try { return this.prefs.getComplexValue(name, Components.interfaces.nsISupportsString).data; - } - catch (e) { + } catch (e) { this.prefs.getCharPref(name); } break; @@ -70,7 +70,7 @@ var name = this.prefix + name; switch (type || typeof value) { case 'string': - var str = Cc['@mozilla.org/supports-string;1']. + let str = Cc['@mozilla.org/supports-string;1']. createInstance(Ci.nsISupportsString); str.data = value; return this.prefs.setComplexValue(name, Components.interfaces.nsISupportsString, str); @@ -98,21 +98,21 @@ const history = Cc["@mozilla.org/browser/nav-history-service;1"]. getService(Ci.nsINavHistoryService); - var [folderId, folderGUID] = [prefs.get('folderId', false), prefs.get('folderGUID', false)]; + let [folderId, folderGUID] = [prefs.get('folderId', false), prefs.get('folderGUID', false)]; if (!(folderGUID && folderId && (folderId == bookmarks.getItemIdForGUID(folderGUID)))) { - folderId = bookmarks.createFolder(bookmarks.toolbarFolder, FOLDER_NAME, bookmarks.DEFAULT_INDEX); + folderId = bookmarks.createFolder(bookmarks.toolbarFolder, FOLDER_NAME, bookmarks.DEFAULT_INDEX); prefs.set('folderId', folderId); prefs.set('folderGUID', bookmarks.getItemGUID(folderId)); } /* // Get an array of tags for a URI - var myTags = tagssvc.getTagsForURI(myURI, {}); + let myTags = tagssvc.getTagsForURI(myURI, {}); // Get an array of URIs for a tag - var taggedURIs = tagssvc.getURIsForTag("mozilla"); + let taggedURIs = tagssvc.getURIsForTag("mozilla"); // Get an array of all tags - var arrayOfAllTags = tagssvc.allTags; + let arrayOfAllTags = tagssvc.allTags; // Remove tags from a URI tagssvc.untagURI(myURI, ["mozilla", "firefox"]); */ @@ -146,44 +146,41 @@ } function splitBySpaces (str) { - return [it for each (it in str.split(/\s+/)) if (it.match && it.match(/\w+/))]; + return [it for each (it in str.split(/\s+/)) if (/\w/.test(it))]; } - function RCL_Bookmarks (terms) { try{ - var query = history.getNewQuery(); + function RCL_Bookmarks (terms) { try { + let query = history.getNewQuery(); query.setFolders([folderId], 1); + let m; if (terms) { - var ts = splitBySpaces(terms).map(function (it) { + let ts = splitBySpaces(terms).map(function (it) { var re = new RegExp(migemo.getRegExp(it), 'i'); var f = function (it) re.exec(it); return {s: it, r: f}; }); - var m = function (it) { - for each (var t in ts) { - if ((it.URI.indexOf(t.s) >= 0) || - (it.title.indexOf(t.s) >= 0) || - (t.r(it.URI)) || - (t.r(it.title)) ) - return true; - } - }; + m = function (it) + ts.some(function (t) + (it.URI.indexOf(t.s) >= 0 || it.title.indexOf(t.s) >= 0 || + t.r(it.URI) || t.r(it.title)) + ? true : false); } else { - var m = function () true; + m = function () true; } - var result = []; - var qres = history.executeQueries([query], 1, history.getNewQueryOptions()); - var folderNode = qres.root; + let result = []; + let qres = history.executeQueries([query], 1, history.getNewQueryOptions()); + let folderNode = qres.root; - var closeOriginally = !folderNode.containerOpen; + let closeOriginally = !folderNode.containerOpen; if (closeOriginally) folderNode.containerOpen = true; - for (var i = 0; i < folderNode.childCount; ++i) { - var node = folderNode.getChild(i); + for (let i = 0; i < folderNode.childCount; ++i) { + let node = folderNode.getChild(i); if (PlacesUtils.nodeIsBookmark(node)) { - var it = {id: node.itemId, + let it = {id: node.itemId, title: node.title, URI: node.uri }; if (m(it)) @@ -195,18 +192,19 @@ folderNode.containerOpen = false; return liberator.globalVariables.readcatlater_reverse ? result.reverse() : result; - }catch(e){ liberator.log(e); }} + } catch (e) { liberator.log(e); } } function completer (args) { - try{ - var cs = [ [it.URI, bookmarks.getItemTitle(it.id)] for each (it in RCL_Bookmarks(args)) if (it.id) ]; + var cs; + try { + cs = [ [it.URI, bookmarks.getItemTitle(it.id)] for each (it in RCL_Bookmarks(args)) if (it.id) ]; return [0, cs] - } catch(e) { liberator.log(e); } - } + } catch (e) { liberator.log(e); } + } function removeItems (uri) { var removed = false; - for each (var id in bookmarks.getBookmarkIdsForURI(makeURI(uri), {})) + for each (let id in bookmarks.getBookmarkIdsForURI(makeURI(uri), {})) if (folderId == bookmarks.getFolderIdForItem(id)) { removed = true; bookmarks.removeItem(id); @@ -243,9 +241,9 @@ uri = uri.string; openURI(uri); if (!bang && removeItems(uri)) - liberator.echo('"' + uri + '" was removed.'); + liberator.echo('"' + uri + '" was removed.'); }, - { + { completer: completer } ); @@ -255,14 +253,13 @@ 'delete cat now', function (uri, bang, num, extra) { if (removeItems(uri)) - liberator.echo('"' + uri + '" was removed.'); + liberator.echo('"' + uri + '" was removed.'); }, - { + { completer: completer } ); liberator.log('readcatlater.js loaded'); -}catch(e){ liberator.log(e); }})(); - +} catch (e) { liberator.log(e); } })(); |