Chrome 拡張機能は、この機能を自動化できます。このスケルトン機能をさらに拡張して、あらゆる可能性を実現できます。
次のスケルトンは、選択イベント1のマウスの右クリック イベントのコンテキスト メニューを追加します。
このスクリーン ショットに示すように、メニューが Chrome ブラウザーに追加され、選択が行われるとアクティブになります。
テキスト選択後のコンテキスト メニューの外観
1 -マウス クリックによってテキストが選択されると、選択コンテキスト イベントが発生します。
デモンストレーション
jsfiddleを見てください。クロム拡張機能のインストール後、ユーザー定義のタグで注釈が付けられます
前の HTML コード
選択後の HTML コード
<li>
Chrome ブラウザに追加されたコンテキスト メニューから jsfiddle の出力コンソールからテキストを選択すると、 DOM も変更されていることがわかります。
コード リファレンス
マニフェスト.json
マニフェスト ファイルはcontent script(s)
、およびbackground page(s)
拡張子にバインドします。
{
"name": "Annotation Tool",
"description": "http://stackoverflow.com/questions/14244498/web-page-source-annotation-tool",
"version": "1",
"manifest_version": 2,
"content_scripts": [
{
"matches": [
"<all_urls>"
],
"js": [
"myscript.js"
],
"all_frames": true
}
],
"permissions": [
"contextMenus",
"<all_urls>",
"tabs"
],
"background": {
"scripts": [
"background.js"
]
},
"icons": {
"16": "screen.png",
"48": "screen.png",
"128": "screen.png"
}
}
background.js
コンテキスト メニューを作成してブラウザにバインドし、メッセージ パッシングを通じてコンテキスト メニューの実行をアクティブにします。
var _selection_univ = chrome.contextMenus.create({
"title": "Add <univ> tag for %s ",
"id": "_selection_univ",
"onclick": reportclick,
"contexts": ["selection"]
}, function () {
console.log("Context Menu 2 Created");
});
var _selection_address = chrome.contextMenus.create({
"title": "Add <address> tag for %s ",
"id": "_selection_address",
"onclick": reportclick,
"contexts": ["selection"]
}, function () {
console.log("Context Menu 2 Created");
});
//Add number of variables here for your functionality
function reportclick(info, tab) {
switch (info.menuItemId) {
case "_selection_univ":
chrome.tabs.sendMessage(tab.id, "univ");//Notify Content Script for univ
break;
case "_selection_address":
chrome.tabs.sendMessage(tab.id, "address");//Notify Content Script for address
break;
default:
console.log("Handle default case..");
}
}
myscript.js
//Handle DOM Changes here
chrome.extension.onMessage.addListener(function (message, sender, response) {
switch (message) {
//Hanlde [univ] tag
case "univ":
if (document.getSelection().baseNode != null) document.getSelection().baseNode.parentNode.innerHTML = "[univ]" + document.getSelection().baseNode.parentNode.innerHTML + "[/univ]";
break;
//Hanlde [address] tag
case "address":
if (document.getSelection().baseNode != null) document.getSelection().baseNode.parentNode.innerHTML = "[address]" + document.getSelection().baseNode.parentNode.innerHTML + "[/address]";
break;
default:
console.log("Handle default case..");
}
});
さらなる拡張
さらにいくつかのコンテキストメニューを追加したい場合
1) ここに示すように、コンテキスト メニューの変数を作成します。background.js
var _selection_Some_Tag = chrome.contextMenus.create({
"title": "Add [SOME TAG] tag for %s ",
"id": "_selection_univ",
"onclick": reportclick,
"contexts": ["selection"]
}, function () {
console.log("Context Menu for Some Tag Created");//In Call Back
});
2) ここに示すように、バックグラウンド ページにスイッチのケースを追加します。
case "_selection_your_case":
chrome.tabs.sendMessage(tab.id, "_your_tag_content"); //Notify Content Script for address
break;
3) ここに示すようにコードを追加して、コンテンツ スクリプトでカスタム タグを処理します。
//Hanlde [your custom] tag
case "univ":
if (document.getSelection().baseNode != null) document.getSelection().baseNode.parentNode.innerHTML = "[your tag]" + document.getSelection().baseNode.parentNode.innerHTML + "[/your tag]";
break;
拡張機能のテストと読み込み
このスクリプトのテストと拡張については、拡張機能のロード方法を確認してください。
参考文献
編集1
クロム拡張の次のコードを使用できます
- コンテキスト メニューの代わりのツールバー
- 選択したテキストのみを置き換える
- ファイルをサンド ボックスの場所に保存する
このコードを使用するには、お気に入りのアイコンのいずれかを使用し、それらをすべてのタグの chrome ディレクトリに配置し、ここで[univ]
対応する名前を使用しますcss file
background-image: url(chrome-extension:// MSG_@@extension_id /YOUR_ICON_NAME.png);
マニフェスト.json
に登録css and java script
していannotation tool
ます。
{
"name": "Annotation Tool",
"description": "http://stackoverflow.com/questions/14244498/web-page-source-annotation-tool",
"version": "1",
"manifest_version": 2,
"content_scripts": [
{
"matches": [
"<all_urls>"
],
"css": [
"myscript.css"
],
"js": [
"jquery.js",
"myscript.js"
],
"all_frames": true
}
],
"permissions": [
"contextMenus",
"<all_urls>",
"tabs"
],
"icons": {
"16": "screen.png",
"48": "screen.png",
"128": "screen.png"
},
"web_accessible_resources": [
"icon1.png",
"icon2.png"
]
}
myscript.css
ここにアイコンをバインドします。
#root #univ {
display: inline-block;
z-index: 100000;
height: 22px;
width: 26px;
background-image: url(chrome-extension://__MSG_@@extension_id__/icon1.png);
}
#root #addr {
display: inline-block;
z-index: 100000;
height: 22px;
width: 26px;
background-image: url(chrome-extension://__MSG_@@extension_id__/icon2.png);
}
myscript.js
選択したテキストをカスタム タグで更新するためのコード。
//Intialize counters to default values
clicking = false;
selecting = false;
//Set the toolbar to some invalid position so it will not appear unless a selection is made
var currentMousePos = {
x: -100,
y: -100
};
$(document).mousedown(function () {
//Click is started
clicking = true;
});
//Tool bar to add
$('body').append("<div id='root' style='position: absolute; left:" + currentMousePos.x + "px; top:" + currentMousePos.y + "px; display: block;'><a id='univ' href='javascript:void(0);'> </a><a id='addr' href='javascript:void(0);' > </a></div>");
$(document).mouseup(function (event) {
if (selecting) {
//He is selecting text
$("#root").attr("style", "position: absolute; left:" + currentMousePos.x + "px; top:" + currentMousePos.y + "px; display: block;");
} else {
//He just clicked
$("#root").attr("style", "display: none;");
}
//Reset counters
clicking = false;
selecting = false;
});
$(document).mousemove(function () {
if (clicking) {
//He did not simply click , but he is selecting some text
selecting = true;
//Track current position to put toolbar
currentMousePos.x = event.pageX;
currentMousePos.y = event.pageY;
}
});
$("div #addr").click(function () {
//Get Selected text
var selection = document.getSelection();
//Add your tags and prepare replacing content
var html = "[addr]" + selection + "[/addr]";
if (selection.getRangeAt && selection.rangeCount) {
//Chrome supports only one range fire fox supports multiple ranges
range = document.getSelection().getRangeAt(0);
//remove selection
range.deleteContents();
//Create a node
node = range.createContextualFragment(html);
//Add the custom node
range.insertNode(node);
}
});
$("div #univ").click(function () {
//Get Selected text
var selection = document.getSelection();
//Add your tags and prepare replacing content
var html = "[univ]" + selection + "[/univ]";
if (selection.getRangeAt && selection.rangeCount) {
//Chrome supports only one range fire fox supports multiple ranges
range = document.getSelection().getRangeAt(0);
//remove selection
range.deleteContents();
//Create a node
node = range.createContextualFragment(html);
//Add the custom node
range.insertNode(node);
}
});
出力1
テキストの任意の部分を置き換えることができるようになりました
アウトプット 2
Web ページを置き換える
選択した場所にファイルを保存する
chrome.pageCapture APIを使用してページをダウンロードすることは可能ですが、特定のsand boxed
場所にダウンロードする必要があります。
pageCapture API を使用した実装例
マニフェスト.json
{
"name": "Page Capture Demo",
"description": "This demos Page Capture MHTML Functionality",
"permissions": [
"pageCapture"
],
"browser_action": {
"default_icon": "screen.png",
"default_popup": "popup.html"
},
"manifest_version": 2,
"version": "1"
}
popup.html
<html>
<head>
<script src="popup.js"></script>
</head>
<body>
<div id="pushhere"></div>
</body>
</html>
popup.js
function capture() {
chrome.tabs.query({
"active": true,
"currentWindow": true,
"status": "complete"
}, function (tabs) {
chrome.pageCapture.saveAsMHTML({
"tabId": tabs[0].id
}, function (data) {
var reader = new FileReader();
reader.onload = function (eventt) {
console.log(eventt.target.result);
document.getElementById('pushhere').innerHTML = eventt.target.result;
//window.open(eventt.target.result);
};
reader.readAsText(data);
//window.open(data);
});
});
}
window.onload = capture;
選択したアイコンを選択して、上記の手順を使用してこのコードをテストします。これが役立つことを願っています:)
編集 2
- HTML ファイルのコンテンツへのアクセス
images
、js
およびcss
ファイルは chrome 拡張機能から可能です
- ローカル ディスク システムへのアクセス (データの読み取りと保存) は、Chrome 拡張機能からはサポートされていません (セキュリティ上の理由から)。
- ファイルをサンドボックス化された場所に保存できますが、一般的なアクセスではアクセスできません。