- 更新日時
- 2009-02-12 19:06
- 永続的 URI
- http://www.code-404.net/articles/browsers/copy-url-lite
- タグ
概要
Days on the Moon で紹介されている Copy URL Lite を Copy 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%
- 改行
スクリーンショット
使い方
以下のソースコードを 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, "&");
text = text.replace(/>/g, ">");
text = text.replace(/</g, "<");
text = text.replace(/"/g, """);
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を取得できる変数は出来ませんか?
直リンクのバナーリンクをする時などに活用できるかと思ったんですが…。
よろしければご検討ください。
便利なスクリプトをありがとうございます。
- シンヤ
- 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