/*** BEGIN LICENSE BLOCK {{{ Copyright (c) 2008 suVene distributable under the terms of an MIT-style license. http://www.opensource.jp/licenses/mit-license.html }}} END LICENSE BLOCK ***/ // PLUGIN_INFO//{{{ var PLUGIN_INFO = nextlink mapping "[[", "]]" by AutoPagerize XPath. AutoPagerize 用の XPath より "[[", "]]" をマッピングします。 suVene hogelog 0.3.9 MIT 1.2 2.0pre http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/nextlink.js || let g:nextlink_followlink = "true" ||< と設定することにより、"[[", "]]" の動作は、カレントのタブに新しくページを読み込むようになります。 >|| let g:nextlink_prevmap = "[n" let g:nextlink_nextmap = "]n" ||< のように設定することにより、"[[", "]]" 以外のキーに割り当てることができます。 SITEINFOが無い場合の処理を >|| let g:nextlink_nositeinfo_act = "f" ||< のように設定できます。現在は f: Vimperatorの"[[", "]]"の動作 e: マッチするSITEINFOが無いことを知らせる(デフォルト設定) n: 何もしない が設定可能です /info//nextlink-local-siteinfo に >|| [ { "url": "^http://[^.]+\\.google\\.(?:[^.]+\\.)?[^./]+/search\\b", "nextLink": 'id("navbar")//td[last()]/a', "pageElement": 'id("res")/div', "exampleUrl": "http://www.google.com/search?q=nsIObserver", }, ] ||< のような JSON を置くことでローカルで SITEINFO を設定できます == TODO == ]]> ; //}}} liberator.plugins.nextlink = (function() { // initialize //{{{ if (!liberator.plugins.libly) { liberator.log("nextlink: needs _libly.js"); return; } var libly = liberator.plugins.libly; var $U = libly.$U; var logger = $U.getLogger("nextlink"); var $H = Cc["@mozilla.org/browser/global-history;2"].getService(Ci.nsIGlobalHistory2); const HTML_NAMESPACE = "http://www.w3.org/1999/xhtml"; const UUID = "{3b72c049-a347-4777-96f6-b128fc76ed6a}"; // siteinfo cache key const DEFAULT_PREVMAP = "[["; const DEFAULT_NEXTMAP = "]]"; var prevMap = liberator.globalVariables.nextlink_prevmap || DEFAULT_PREVMAP; var nextMap = liberator.globalVariables.nextlink_nextmap || DEFAULT_NEXTMAP; var isFollowLink = typeof liberator.globalVariables.nextlink_followlink == "undefined" ? false : $U.eval(liberator.globalVariables.nextlink_followlink); const MICROFORMAT = { url: "^https?://.", nextLink: '//a[translate(nomalize-space(@rel), "ENTX", "entx")="next"] | //link[translate(normalize-space(@rel), "ENTX", "entx")="next"]', insertBefore: '//*[contains(concat(" ", @class, " "), " autopagerize_insert_before ")]', pageElement: '//*[contains(concat(" ", @class, " "), " autopagerize_page_element ")]', } const nositeinfoActions = { // vimperator [[, ]] action f: function(doc, count) { if (count < 0) { return buffer.followDocumentRelationship("previous"); } return buffer.followDocumentRelationship("next"); }, e: function(doc, count) { var url = doc.location.href; return liberator.echo("No SITEINFO match " + url); }, n: function() true, }; var actpattern = liberator.globalVariables.nextlink_nositeinfo_act || "e"; var nositeinfoAct = nositeinfoActions[actpattern]; var localSiteinfo = storage.newMap("nextlink-local-siteinfo", false); if (localSiteinfo) localSiteinfo = [ info for ([ i, info ] in localSiteinfo) ]; var pageNaviCss = ; //}}} var NextLink = function() {//{{{ this.initialize.apply(this, arguments); }; NextLink.prototype = { initialize: function(pager) { this.initialized = false; this.siteinfo = []; this.pager = pager; this.browserModes = config.browserModes || [ modes.NORMAL, modes.VISUAL ]; this.is2_0later = config.autocommands.some(function ([ k, v ]) k == "DOMLoad"); // toriaezu var wedata = new libly.Wedata("AutoPagerize"); wedata.getItems(24 * 60 * 60 * 1000, null, $U.bind(this, function(isSuccess, data) { if (!isSuccess) return; this.siteinfo = data.map(function(item) item.data); }) ); if (localSiteinfo) this.siteinfo = this.siteinfo.concat(localSiteinfo); this.siteinfo = this.siteinfo.sort(function(a, b) b.url.length - a.url.length); // sort url.length desc this.initialized = true; this.customizeMap(this); }, initDoc: function(context, doc) { var value = doc[UUID] = {}; value.siteinfo = this.getSiteinfo(doc); this.pager.initDoc(context, doc); }, getSiteinfo: function(doc) { var url = doc.location.href; for (let i = 0, len = this.siteinfo.length; i < len; i++) { if (url.match(this.siteinfo[i].url) && this.siteinfo[i].url != "^https?://.") { return this.siteinfo[i]; } } function valid(prop) $U.getNodesFromXPath(MICROFORMAT[prop], doc).length > 0; if (!valid("nextLink") || !valid("pageElement")) return null; return MICROFORMAT; }, nextLink: function(count) { if (!this.initialized) { liberator.echo("before initialized."); return false; } var doc = window.content.document; if (!doc[UUID]) this.initDoc(this, doc); this.pager.nextLink(doc, count); }, customizeMap: function(context) { mappings.addUserMap(context.browserModes, [ prevMap ], "customize by nextlink.js",
// ==VimperatorPlugin==
// @name           Google-Kanji
// @description-ja グーグルを使って漢字を検索
// @license        Creative Commons 2.1 (Attribution + Share Alike)
// @version        1.1
// ==/VimperatorPlugin==
//
// Usage:
//    :gkanji うぶめ
//    のようにひらがななどで読みを入力します。
//    すると、
//    :gkcopy
//    が開き、補完が可能になるので、正しそうな漢字を選びます。
//    すると、クリップボードにその漢字がコピーされます。

(function () {

  var copycompl = [];

  function getKanji (word) {
    var re = /[\u4e00-\u9fa0]+/g; // 一-龠
    var ignore = /\u691c\u7d22|\u95a2\u9023/; // 検索|関連
    var req = new XMLHttpRequest();
    var word = encodeURIComponent(word);
    req.open('GET', 'http://www.google.co.jp/search?hl=ja&q=' + word + '&lr=lang_ja', true);
    var f = function () {
      var cnt = {};
      for each (let it in req.responseText.match(re)) {
        if (ignore.test(it))
          continue;
        if (cnt[it])
          cnt[it] += 1;
        else
          cnt[it] = 1;
      }
      var cnta = [];
      for (let i in cnt) {
        if (cnt[i] < 3)
          continue;
        cnta.push([i, cnt[i]]);
      }
      cnta.sort(function (a, b) b[1] - a[1]);
      copycompl = cnta;
      commandline.open(":", "gkcopy ", modes.EX);
    };
    req.onreadystatechange = function (aEvt) {
      if (req.readyState == 4 && req.status == 200) {
        f();
      }
    };
    req.send(null);
  }

  commands.addUserCommand(
    ['gkanji', 'googlekanji'],
    'Google kanji',
    function (arg) getKanji(arg.string),
    {},
    true
  );

  function copyToClipboard (copytext) {
    const supstr = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
    const trans  = Cc["@mozilla.org/widget/transferable;1"].createInstance(Ci.nsITransferable);
    const clipid = Ci.nsIClipboard;
    const clip   = Cc["@mozilla.org/widget/clipboard;1"].getService(clipid);

    supstr.data = copytext;
    trans.addDataFlavor("text/unicode");
    trans.setTransferData("text/unicode", supstr, copytext.length * 2);

    clip.setData(trans, null, clipid.kGlobalClipboard);
  }

  commands.addUserCommand(
    ['gkcopy'],
    'Google kanji',
    copyToClipboard,
    {
      completer: function (context) {
        context.title = ['kanji', 'count'];
        context.items = copycompl;
      }
    },
    true
  );


})();