1. 概要
    1. スクリーンショット
  2. 使い方
    1. バージョン
    2. ソースコード
  3. コメント (3)
  4. トラックバック (1)
更新日時
2009-02-12 19:06
永続的 URI
http://www.code-404.net/articles/browsers/copy-url-lite
タグ

概要

Days on the Moon で紹介されている Copy URL LiteCopy URL+ と同じような動作をするように拡張した userChrome.js 用スクリプトです。

また、バージョン 1.1.4 より、 Copy URL+ に似た書式でフォーマットを指定出来るようになりました。以下に使える書式を示します。

%TITLE%
ページタイトル
%TITLE_HTMLIFIED%
HTML エンコードされたページタイトル
%URL%
URI
%URL_HTMLIFIED%
HTML エンコードされた URI
%SEL%
選択範囲の文字列
%SEL_HTMLIFIED%
HTML エンコードされた選択範囲の文字列
%RLINK%
リンクアンカー先の URI
%RLINK_HTMLIFIED%
HTML エンコードされたリンクアンカー先の URI
%IMAGE_URL%
画像の URI
%IMAGE_URL_HTMLIFIED%
HTML エンコードされた画像の URI
%IMAGE_ALT%
画像の alt 属性
%IMAGE_ALT_HTMLIFIED%
HTML エンコードされた画像の alt 属性
%IMAGE_TITLE%
画像の title 属性
%IMAGE_TITLE_HTMLIFIED%
HTML エンコードされた画像の title 属性
%EOL%
改行

スクリーンショット

Copy URL Lite+

使い方

以下のソースコードを userChrome.js に貼り付けるだけです。サブスクリプトローダーを使用している場合は、 "任意の名前.uc.js" とし、 chrome フォルダに置くだけです。

バージョン

1.0 - 2007-07-15
公開
1.1.4 - 2007-07-17
Copy URL+ に似た書式で記述可能に
1.1.5 - 2007-07-17
区切り(罫線)を表示可能に
1.2 - 2007-07-17
アイコンを追加・ Firefox のロケールに ja が含まれていない場合は英語表記に・日本語ラベルの修正
1.3.3 - 2007-08-17
%RLINK%, %RLINK_HTMLIFIED% 変数の追加
1.4.0 - 2008-06-25
%IMAGE_URL%, %IMAGE_URL_HTMLIFIED%, %IMAGE_ALT%, %IMAGE_ALT_HTMLIFIED%, %IMAGE_TITLE%, %IMAGE_TITLE_HTMLIFIED% 変数の追加・ condition 値の変更と追加

ソースコード

// ==UserScript==
// @name           Copy URL Lite+
// @version        1.4.0
// @description    Like Copy URL+ extention.
// @author         Shinya
// @homepage       http://www.code-404.net/article/2007/07/15/copy-url-lite
// @namespace      http://www.code-404.net/
// @compatibility  Firefox 2.0 3.0
// @include        chrome://browser/content/browser.xul
// @note           
// ==/UserScript==

/* Copy URL Lite
 *   nanto_vi (TOYAMA Nao), 2006-12-26
 *
 * Copy URL and extra informations from the context menu.
 *
 * http://nanto.asablo.jp/blog/2006/12/31/1083170
 */

(function(){
  
  var locale = Components.classes["@mozilla.org/preferences-service;1"].
    getService(Components.interfaces.nsIPrefBranch);
  locale = locale.getCharPref("general.useragent.locale");
  
  var mMenus = [
    {
      // タイトルと URI
      label: locale.indexOf("ja") == -1 ? "Title, URI" : "\u30bf\u30a4\u30c8\u30eb\u3068 URI",
      accesskey: "C",
      text: '%TITLE%%EOL%%URL%%EOL%'
    },
    {
      // タイトルと選択した部分と URI
      label: locale.indexOf("ja") == -1 ? "Title, Selection, URI" :
        "\u30bf\u30a4\u30c8\u30eb\u3068\u9078\u629e\u3057\u305f\u90e8\u5206\u3068 URI",
      accesskey: "S",
      text: '%TITLE%%EOL%"%SEL%"%EOL%%URL%%EOL%',
      condition: "select"
    },
    {
      // 選択した部分とリンク先 URI
      label: locale.indexOf("ja") == -1 ? "Selection, Link URI" :
        "\u9078\u629e\u3057\u305f\u90e8\u5206\u3068\u30ea\u30f3\u30af\u5148 URI",
      accesskey: "S",
      text: '"%SEL%"%EOL%%RLINK%%EOL%',
      condition: "select-link"
    },
    {
      // 区切り
      label: "separator",
    },
    {
      // タイトル
      label: locale.indexOf("ja") == -1 ? "Title" : "\u30bf\u30a4\u30c8\u30eb",
      accesskey: "T",
      text: '%TITLE%'
    },
    {
      // URI
      label: "URI",
      accesskey: "U",
      text: '%URL%'
    },
    {
      // タイトル - URI
      label: locale.indexOf("ja") == -1 ? "Title - URI" : "\u30bf\u30a4\u30c8\u30eb - URI",
      accesskey: "I",
      text: '%TITLE% - %URL%%EOL%'
    },
    {
      // リンク先 URI
      label: locale.indexOf("ja") == -1 ? "Link URI" :
        "\u30ea\u30f3\u30af\u5148 URI",
      accesskey: "L",
      text: '%RLINK%',
      condition: "link"
    },
    {
      // 区切り
      label: "separator",
    },
    {
      // HTML
      label: "HTML",
      accesskey: "H",
      text: '<a href="%URL_HTMLIFIED%">%TITLE_HTMLIFIED%</a>'
    },
    {
      // HTML(title)
      label: "HTML(title)",
      accesskey: "A",
      text: '<a href="%URL_HTMLIFIED%" title="%TITLE_HTMLIFIED%"></a>'
    },
    {
      // リンク先エンコード URI
      label: locale.indexOf("ja") == -1 ? "Encoded Link URI" :
        "\u30ea\u30f3\u30af\u5148\u30a8\u30f3\u30b3\u30fc\u30c9 URI",
      accesskey: "E",
      text: '%RLINK_HTMLIFIED%',
      condition: "link"
    },
    {
      // 選択時の区切り
      label: "separator",
      condition: "select"
    },
    {
      // 引用
      label: locale.indexOf("ja") == -1 ? "Block Quote" : "\u5f15\u7528",
      accesskey: "B",
      text: '<blockquote cite="%URL_HTMLIFIED%" title="%TITLE_HTMLIFIED%">%EOL%<p>%SEL_HTMLIFIED%</p>%EOL%</blockquote>%EOL%',
      condition: "select"
    },
    {
      // インライン引用
      label: locale.indexOf("ja") == -1 ? "Inline Quote" : "\u30a4\u30f3\u30e9\u30a4\u30f3\u5f15\u7528",
      accesskey: "Q",
      text: '<q cite="%URL_HTMLIFIED%" title="%TITLE_HTMLIFIED%">%SEL_HTMLIFIED%</q>',
      condition: "select"
    },
    {
      // 画像時の区切り
      label: "separator",
      condition: "link-image"
    },
    {
      // 画像リンク
      label: locale.indexOf("ja") == -1 ? "Image Link" : "\u753b\u50cf\u30ea\u30f3\u30af",
      accesskey: "B",
      text: '<a href="%RLINK_HTMLIFIED%"><img src="%IMAGE_URL_HTMLIFIED%" alt="%IMAGE_ALT_HTMLIFIED%" /></a>',
      condition: "link-image"
    }
  ];
  
  init: {
    var contextMenu = document.getElementById("contentAreaContextMenu");
    var separator = document.getElementById("context-sep-properties");
    
    var menu = document.createElement("menu");
    menu.id = "copyurllite";
    menu.setAttribute("label", "Copy URL Lite+");
    menu.setAttribute("accesskey", "U");
    menu.className = "menu-iconic";
    menu.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAABGdBTUEAALGPC%2FxhBQAAAAlwSFlzAAAnEAAAJxABlGlRGQAAAAd0SU1FB9QGGAEvLH6QQPAAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCBWMy4wOKSzs%2BUAAALoSURBVDhPjZJLTBNRFIYHiAaMIT4CiogLF0ajcWUwrjXiwrgDhGhMfCFWIyQaDZGIhBhBkTdYRUyDIYIgzzSIiAYQsRRoLa%2FSlvJomRampQItBWbu750xEFlAPJkz58zi%2F%2Bb8516fgoqpxG2Bm%2Fb6b2aC%2Ff19g7YG%2BO3keYQ5XItTIL7R0RE7BpmNorKZqxUEAkIIlngC%2BmCZvpp%2FsCiudfbnfOCPbQjIKzPHspwXYoiAhSVKoFH%2FZRiP89VIyeu2MszNoHUh9591h7X1OhZEmYeK5yjLaOfR0DGD900WlFSPIl1ubGzp8bysapmpK22YvrYWti9zS%2B1Xa6eXB1wegtlFoFmzgF69FyJ0cRmYdQvSZGOsG2VKK1Eo3Q9TW%2BG3AvJ5V28ompolmOQIuHlAZVpGu3YOgiCsWvNSkHNuEU%2BKupD%2BZhh3M1SJjE%2BbjwQpKNPKtKZ5WDhgfEqA2giUNjphc3ilpbrp3%2Be9BM55AV06Fp3aMbyrMwxFXG4LlAApuR0RrT12sC7gdaEN2Vl25FZOw2DxUDG1Rjck2rO7aF2gp0Tn%2Bq51keT83oMSIPb2h3Blm0UoltvBHICUV2VGdPb9BjcHsDPUmhuYpHWC2rQ4ALXejdTC7gsS4MiptEPln0Y5eaZ5FSCL06P8MwurQ4CJFTA6TWC2ExgnBRho9o3weJTz84UEOLpHef9evIqTJ7SvApJi23Envgcl8kmYbAT6CTEFjIgQ%2Bj0wRvD0lVrJHA%2FrvL4y9nq1KN%2BGgXGCX2YCnVlAP%2B21JoJshUb3X4D8XBt0VKTW81AN8ug20H6YILdUw0oWdu1nz4fst8ZEhlQ8WJlCFpyXce5ETfXzDCtUQwJ6zaBCujx6xCr938xWaLHmVp4JVSasAMT%2B7KWCKy1qD9p1Ar5plvCxhUNxlQlZCq2HXqi%2BuKTqhjWAf%2Fch9iejMmIepDcN3EquqYqRKdKibry9GHn1Tfjp2JxQv92R2xnmcMAftGCCCifLktsAAAAASUVORK5CYII%3D");
    contextMenu.insertBefore(menu, separator);
    
    var menuPopup = document.createElement("menupopup");
    menu.appendChild(menuPopup);
    
    for(var i = 0, menu; menu = mMenus[i]; i++){
      var menuItem;
      if(menu.label == "separator"){
        menuItem = document.createElement("menuseparator");
      }
      else{
        menuItem = document.createElement("menuitem");
        menuItem.setAttribute("label", menu.label);
        if("accesskey" in menu) menuItem.setAttribute("accesskey", menu.accesskey);
        menuItem.culMenu = menu;
        menuItem.addEventListener("command", copyText, false);
      }
      menuItem.id = "copyurllite-menu-" + i;
      menuPopup.appendChild(menuItem);
    }
  
    contextMenu.addEventListener("popupshowing", setMenuDisplay, false);
  }
  
  function copyText(aEvent){
    
    function htmlEscape(text) {
      text = text.replace(/&/g, "&amp;");
      text = text.replace(/>/g, "&gt;");
      text = text.replace(/</g, "&lt;");
      text = text.replace(/"/g, "&quot;");
      return text;
    }
    
    function convertText(text){
      text = text.replace(/%URL_HTMLIFIED%/g, url_html);
      text = text.replace(/%URL%/g, url);
      text = text.replace(/%TITLE_HTMLIFIED%/g, title_html);
      text = text.replace(/%TITLE%/g, title);
      if(gContextMenu.isTextSelected){
        text = text.replace(/%SEL_HTMLIFIED%/g, sel_html);
        text = text.replace(/%SEL%/g, sel);
      }
      if(gContextMenu.onLink){
        text = text.replace(/%RLINK_HTMLIFIED%/g, link_html);
        text = text.replace(/%RLINK%/g, link);
      }
      if(gContextMenu.onImage){
        text = text.replace(/%IMAGE_URL_HTMLIFIED%/g, imageUriHtml);
        text = text.replace(/%IMAGE_URL%/g, imageUri);
        text = text.replace(/%IMAGE_ALT_HTMLIFIED%/g, imageAltHtml);
        text = text.replace(/%IMAGE_ALT%/g, imageAlt);
        text = text.replace(/%IMAGE_TITLE_HTMLIFIED%/g, imageTitleHtml);
        text = text.replace(/%IMAGE_TITLE%/g, imageTitle);
      }
      text = text.replace(/%EOL%/g, eol);
      return text;
    }
    
    var text = aEvent.target.culMenu.text;
    var win = content.document;
    var title = win.title;
    var title_html = htmlEscape(title);
    var url = win.location.href;
    var url_html = htmlEscape(url);
    if(gContextMenu.isTextSelected){
      var sel = content.getSelection().toString();
      var sel_html = htmlEscape(sel);
    }
    if(gContextMenu.onLink){
      var link = gContextMenu.getLinkURL().toString();
      var link_html = htmlEscape(link);
    }
    if(gContextMenu.onImage){
      var imageUri = gContextMenu.imageURL;
      var imageUriHtml = htmlEscape(imageUri);
      var imageAlt = gContextMenu.target.alt;
      var imageAltHtml = htmlEscape(imageAlt);
      var imageTitle = gContextMenu.target.title;
      var imageTitleHtml = htmlEscape(imageTitle);
    }
    var eol = "\r\n";
    
    Cc["@mozilla.org/widget/clipboardhelper;1"]
      .getService(Ci.nsIClipboardHelper).copyString(convertText(text));
  }
  
  function setMenuDisplay(){
    for (var i = 0, menu; menu = mMenus[i]; i++)
      document.getElementById("copyurllite-menu-" + i).hidden =
        menu.condition == "select" ?
          !gContextMenu.isTextSelected :
        menu.condition == "link" ?
          !gContextMenu.onLink :
        menu.condition == "image" ?
          !gContextMenu.onImage :
        menu.condition == "select-link" ?
          !(gContextMenu.isTextSelected && gContextMenu.onLink) :
        menu.condition == "select-image" ?
          !(gContextMenu.isTextSelected && gContextMenu.onImage) :
        menu.condition == "link-image" ?
          !(gContextMenu.onLink && gContextMenu.onImage) :
        menu.condition == "select-link-image" ?
          !(gContextMenu.isTextSelected && gContextMenu.onLink && gContextMenu.onImage) : false;
  }
  
})();

コメント

火狐 - 2008-06-25 11:03

はじめまして。CopyUrlLitePlus.uc.jsを使わせてもらってます。Fx 3で拡張のほうのCopyUrlPlusが使えなくなったので重宝しています。

質問と言うか要望と言うかなのですが、画像のURLを取得できる変数は出来ませんか?

直リンクのバナーリンクをする時などに活用できるかと思ったんですが…。

よろしければご検討ください。

便利なスクリプトをありがとうございます。

シンヤAuthor Profile Page - 2008-06-25 20:21

あまりに特殊なケースで利用する機会が少ないとは思いますが…。

バージョン 1.4.0 にて実装しましたので、該当ファイルを入れ替えてください。プリセットに期待すると思われるものを加えておきました。

正直、「選択した部分のソースを表示」からコピーした方が正確で良いと思います。

火狐 - 2008-06-26 11:52

こんなに早くレスがつくとは思ってなかったので嬉しいです。

ver1.4.0を入れてみましたが期待通り、というか期待以上の動作で感動しました!

これからも使わせていただきます!

ありがとうございました。

トラックバック

userChromeでMakeLink(CopyUrlLitePlus.uc.jsの改造) - 2009-08-19 03:31

userChromeJSでMakeLinkをする方法はいくつかあるだろうが、 CopyUrlLitePlus.uc.jsを利用させて頂きました。 アンカ...

トラックバック URI
http://www.code-404.net/cms/trackback/8
関連記事
検索

情報