4
<ul class="contact">
<li class="first">Carnegie Mellon University</li>
<li>5000 Forbes Avenue, Pittsburgh, PA 15213</li>
</ul>

=>

<ul class="contact">
<li class="first">[univ]Carnegie Mellon University[/univ]</li>
<li>[address]5000 Forbes Avenue, Pittsburgh, PA 15213[/address]</li>
</ul>

何千もの Web ページに対して実行したいセマンティック アノテーション プロセスを示します。私の意図を明確にするために、これらの Web ページをすべてダウンロードして、ユーザー定義のタグ (例: 、 ) で注釈を付けたいと思いunivますaddress。注釈が付けられたページは、後で処理に使用されます。

私が使ってきた最も単純な方法は、ページをダウンロードし、ページ ファイルを開き、テキスト エディターでファイルを編集して保存することです。それはあまりにも面倒です。

私が使用してきたより良いアプローチは、ブラウザから注釈を付けるターゲット テキストを選択し、Firebug などのツールでターゲットを検査し、検査したビュー内でターゲット テキストを編集し、編集したページを保存することです。これにより多少の負担は軽減されますが、まだ改善の余地がたくさんあります。

私が持っていたい理想的なツールは、ブラウザー内のページからターゲット テキストを選択し、対応する注釈タグを選択し (使用可能なすべてのタグを表示するツールバーから選択することが望ましい)、編集したページを保存できるツールです。ボタン一つで。

誰かがそのようなツールを知っていれば、それは素晴らしいことです。しかし、そのようなツールが存在するとは思えません。そのようなツールを自分で書かなければならない可能性があります。問題は、どのように始めればよいかということです。Web アプリケーションの開発経験はほとんどありません。

ブラウザー拡張機能を作成する必要がありますか? スタンドアロン アプリケーションを作成する必要がありますか? どの言語で?

編集: 質問のより単純なバージョンは、ここにあります。完全な作業ソリューションが優先されます。この問題は、経験豊富な Web 開発者にとっては大した問題ではないと思いますが、私にとっては時間がかかる可能性があり、できるだけ早く機能を実装する必要があります。

EDIT:また、右クリック後のドロップダウンリストよりも、選択直後のツールバーを好みます。chrome拡張用のツールバーDiigo Web Collectorはかなりクールだと思います。 ここに画像の説明を入力

さらに、save編集したページをコンピュータ上のデフォルトまたはユーザー指定の場所に保存するには、ツールバーにボタンが必要です。ツールバーのボタンは次の順序である必要があります: univ address tag3 tag4... tagn save. 保存ボタンは最後です。

EDIT : Javascript を使用して、編集したページをローカル ファイル システムにダウンロードすることはできないようです。Chrome または Firefox では、検査済みビューでページのソース コードを編集した後、編集したページをローカル ファイル システムに保存するための保存ボタンがあります。それはどのように実装されましたか?その保存ボタンについて私が望んでいないのは、ディレクトリがページをダウンロードするように常に要求することです。独自の保存ボタンを備えたデフォルトのディレクトリにしたいと思います。

4

2 に答える 2

9

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);'>&nbsp;</a><a id='addr' href='javascript:void(0);' >&nbsp;</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 ファイルのコンテンツへのアクセスimagesjsおよびcssファイルは chrome 拡張機能から可能です
  • ローカル ディスク システムへのアクセス (データの読み取りと保存) は、Chrome 拡張機能からはサポートされていません (セキュリティ上の理由から)。
  • ファイルをサンドボックス化された場所に保存できますが、一般的なアクセスではアクセスできません。
于 2013-01-12T09:23:10.937 に答える
0

ブラウザ拡張機能で問題ありません。スタンドアロン アプリケーションは、面倒な本格的なブラウザーを利用する必要があります。

(ブックマークレットとは対照的に) ブラウザー拡張機能を使用する場合にのみ、結果をファイルシステムに直接保存する権限があります。ブラウザ(G)UIにも「注釈」ボタンを追加できます。

ただし、何千もの HTML ファイルをハードディスクに保存することは目的ではないかもしれません。代わりに、アノテーションの結果を投稿する単純なデータベース サーバーをセットアップできます。その場合、クライアント側では、いくつかの ajax コードを含む小さなブックマークレットで十分です。

于 2013-01-11T07:29:05.253 に答える