アナログ
RSS  

PDFをGoogle docs Viewer経由で開くアイコンを挿入してみた2009/10/13 23:00

Google docs Viewerで開くアイコンを挿入
アイコンをクリックするとGoogle docs Viewer経由でPDFが開くようになります。

快適!PDFのリンクをGoogle docs Viewer経由に置き換えるgreasemonkey - Koonies/こりゃいいな!
がとてもよさげだったのですが、これをやってしまうとPDFをダウンロードして開きたい時は(Google docs Viewerを開いてからというのはなし)その都度スクリプトを無効にしてリロードしないといけないので、どうしたものかと考えてました。

JavaScript知らないしGreasemonkey入れたことないし……などと思いながらググってると
Greasemonkeyによるアプリケーション開発:第1回 Greasemonkeyによるアプリケーション開発の準備|gihyo.jp … 技術評論社
の参考資料に
「2.DIVE INTO GREASEMONKEY」の日本語訳ドキュメントもこちらのページに添付されています。
日本語の説明があるなら見てみようかと思ったのが運の尽き。悪戦苦闘してました。(^^;

で、このありさまw
(function(){
  if (location.href.indexOf("http://docs.google.com/") == -1) {
    var l = document.getElementsByTagName("a");
    var i = l.length;
    while (i--) {
      if (l[i].href.match(/^[^?]+\.(pdf|ppt|tif)$/)) {
        var logo = document.createElement("img");
        logo.src = 'data:image/gif;base64,R0lGODlhEAAQAPUAAP///wAAAN0AAdoEAfgAAN4NBgB1PAF8PtYXFAGBPTZpLO0UEgGHOwCLOypfoxZkugGNOhBmwhiDMyJ/M9smIwCSOgGUN9otKN8uLNQ7OyCYSy52xiebTPA5Ofo5OXt7e1Ofdd1jYmib0HWi0tiGg4ajxna4k/t8eZWnxPCGg4mv15O+otudm+izFO+xI+24Ee+zLN25ab/EuOTIesjIycDO3MfU5MLfycrb6+7OzerXrO7csu3kx+Ls5+zn7Pr5+SH5BAEAAAEALAAAAAAQABAAAAZ4wIBwSCwWP8jkp1h7iHILggAA+NCWQ1xk47sUBtQP4Dq0jVSriUQRppIDjlKPY6k0wkohSsa7aSAMAD9UYUIzLy07JgwJACeEVUIxLjA6IAcGAB6QWERiVAicRp8YIRQYGSydQ2IpJJCRRwAdsLGetYVHSrtGvUVBADs=';
        logo.border = 0;
        var gglpdf = document.createElement("a");
        gglpdf.insertBefore(logo, gglpdf.firstChild);
        gglpdf.href = 'http://docs.google.com/viewer?url=' + l[i].href;
        gglpdf.target = '_blank';
        l[i].parentNode.insertBefore(gglpdf, l[i].nextSibling);
      }
    }
  }
})();
差し替え 10/13 23:27
アイコン変更・gglpdf.target = '_blank';追加 10/15 18:26
logo.border = 0;が消えてた (^^; ↓少しアイコンを大きくしてみました。10/18 0:44
    logo.src = 'data:image/gif;base64,R0lGODlhEAAQAPUAAP///wAAAKgAALcAAMIAAMUAANIAAARxLgN7MgFdvAN9MyJuLdgXFgBfwQNfvwOBNAKDNQOGNgWGNQpkwQOJOAmGNt0mJRZtxzqAQeEvLtY9PfI7OyubWPw7O3t7ez6nZkeM002kb1GS1d9jY+lfXu53dm6k29mGhf18e+CmCvKGheOpC+erDOmtDuawHN2dnOOzLpS85eS5RKDK0uHIbsjJyr3O3vTWh+XYs+vZn87m2Nnlz9fl897v5OLr8fv7+yH5BAEAAAEALAAAAAAQABAAAAaHwIDQQywWhcghYMn01DxJW8LBIxkIAoAH8ET6Eo1YyVAYaJfdAM90mWEqj4XWKJyAfh8KJQJhLqEBFyI+PRx8DwA/TUI5Li03OhAKCgAoiwEyKSssOw8KCAAdlzgyMDQhnwcADJdKfqutAVtLGRoZI7UvgK4qJ69aSbMbv8BIs8TFQ0bLRAFBADs=';

注意:私はJavaScriptを知りませんのでとんでもない間違いがあるかもしれません。
おかしな点があれば教えてもらえると助かります。

もしかすると、リンクとアイコンの機能は逆の方が良かったかも……つうことで
// ==UserScript==
// @name           PDF/PPT/TIF viewer with Google docs
// @namespace      http://puppet.asablo.jp/blog/2009/10/13/4631429
// @include        http://*
// @exclude        http://docs.google.com/*
// ==/UserScript==
// Based on script by Koonies (http://d.hatena.ne.jp/Koonies/): http://userscripts.org/scripts/show/59557

(function(){
  if (location.href.indexOf("http://docs.google.com/") == -1) {
    var l = document.getElementsByTagName("a");
    var i = l.length;
    while (i--) {
      if (l[i].href.match(/^[^?]+\.(pdf|ppt|tif)$/)) {
	var logo = document.createElement("img");
	logo.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAYFBMVEX////r6+vi4uLf39/m5ubb29vV1dXY19fu7u7jtLXQzs3kRUjFxcXjTlPlVFngeHvhmpro6OjoXWHMqKjYTE/FW13KYWTZb2+vrq2seHnHd3i3ioq8kpOopqa4uLfl0M9dhQjzAAAAAXRSTlMAQObYZgAAAJNJREFUeF5lj0cSwzAMxMKi3t3T///LiJr4ZB4x2BF0ux43AGanSBltYgcNrLUuFCKljO8ABNS8I4rzBzCHwohdOYEPtbEo58Qn10QZEyE1TchdOQFOr8fknDNj0gBqLnlZQkiuAwtc8/o8jvd9W2cp/ea0RZKMGCUMy54iYD+i8QqVMOPoVkqLoeJH08jW2vvr539EgwaIZZTTdAAAAABJRU5ErkJggg==';
	logo.border = 0;
	logo.align = 'absbottom';
	var orgpdf = document.createElement("a");
	orgpdf.href = l[i].href;
	orgpdf.target = l[i].target;
	orgpdf.insertBefore(logo, orgpdf.firstChild);
	l[i].href = 'http://docs.google.com/viewer?url=' + l[i].href;
	l[i].target = '_blank';
	l[i].parentNode.insertBefore(orgpdf, l[i].nextSibling);
      }
    }
  }
})();
リンク新規タブにGoogle docs Viewer経由で開き、元のURLアイコンに保持します。
PDF icon アイコンはこんな感じ。(userContent.jsでも動作しました)

09/12/04 「orgpdf.target = l[i].target」にセミコロン忘れてたので修正。orz
10/03/22 微調整版でmarginやpaddingを0にしてCSSに影響されないように。

はてなブックマークにPDFを直リンされている場合
if (l[i].href.match(/^[^?]+\.(pdf|ppt|tif)$/)) {
    ↓
if ((l[i].href.match(/^[^?]+\.(pdf|ppt|tif)$/)) && (l[i].href.indexOf("http://b.hatena.ne.jp/entry/") == -1)) {
のように変更すればリンクを置き換えなくなります。


ところで、Google docs Viewer経由で開く場合、PDF内のJavaScriptはどう処理されるのでしょうか?
セキュリティ的にはかえって不味いのかなぁ。


もうPDF/PPT/TIF viewer with Google Docs (Event Driven) for Greasemonkeyでいいや。
リンクを左クリックでGoogle docs Viewer経由、右クリックの「名前を付けてリンク先を保存」で直接ダウンロードされます。


Google docs Viewer経由を新しいタブで開く方法が分からなくて、アイコン挿入に戻しました。
どう書けば別タブで開くのだろう……JavaScriptもオブジェクト指向も知らないです。^^;

関連?
PDFの表示あれこれ