[Chrome] 拡張機能『Taberareloo』開発のメモ:パッチ、本体のカスタマイズ【プログラミング】

パッチ

基本的に、各Webサービスへのデータ送信時の処理をカスタマイズする。

本体のlib/extractors.jsの記述をコピペして、部分的に書き換えていけばいい。

送信データのカスタマイズ

addAround(Models['Twitter'], 'createStatus',
	function (proceed, args, target, methodName) {
		// ps: 送信データのオブジェクト(HTMLページの情報)
	    var ps = update({}, args[0]);
	    
	    // ここで自前の処理
	    oukalib.convertAllDataToString(ps);
	    
	    return proceed([ps]).then(function (status) {
	      return status;
	    });
	}
);

送信時データ

【例】(Chromeのコンソール出力)

以下の( )部分は筆者による説明

body(引用 *現在は使われない?)
:
""
description(ユーザーによるコメント)
:
""
enabledPosters
:
(3) [{…}, {…}, {…}]
flavors
:
{html: "変速機やエンジンがなくなれば2兆円近く売上高が減る"}(引用)
https
:
itemUrl(URL)
:
(2) [false, "http://newswitch.jp/p/10165"]
pageUrl
:
(2) [false, "http://newswitch.jp/p/10165"]
__proto__
:
Object
item(タイトル *なぜか使われない)
:
"最も厳しい変革を突きつけられるアイシン、ピークアウトはいつ?"
itemUrl(URL *なぜか空。pageUrlのほうを使う)
:
""
page(Webページのタイトル)
:
"最も厳しい変革を突きつけられるアイシン、ピークアウトはいつ?"
pageUrl(WebページのURL)
:
"http://newswitch.jp/p/10165"
tags
:
(2) ["経済", "自動車"]
type(投稿のタイプ)
:
"quote"

【注意点】

項目の意味内容が重複している部分や、ほとんど使われないものがある。

送信処理そのものの変更

下記のように、lib/model.jsにある内容を上書きしていく形。

  update(Models['Delicious'], {
    LOGIN_URL : 'https://delicious.com/',

    getUserTags : function () {
      return request('https://avosapi.delicious.com/api/v1/posts/you/tags', {
        queryString :  {
          tags     : '',
          keywords : '',
          limit    : 10,
          anchor   : -1,
          index    : 0,
          '_' : (new Date()).getTime()
        },
        responseType : 'json'
      }).then(function (res) {
        var json = res.response;
        if (json.error) {
          return [];
        }
        return Object.keys(json.pkg.tags).reduce(function (memo, tag) {
          if (tag) {
            memo.push({
              name      : tag,
              frequency : json.pkg.tags[tag]
            });
          }
          return memo;
        }, []);
      });
    },

    getRecommendedTags : function(url) {
      return request('https://avosapi.delicious.com/api/v1/posts/compose', {
        queryString :  {
          url : url,
          '_' : (new Date()).getTime()
        },
        responseType : 'json'
      }).then(function (res) {
        var json = res.response;
        if (json.error) {
          return {
            recommended : [],
            duplicated  : false
          };
        }
        return {
          recommended : json.pkg.suggested_tags || [],
          duplicated  : false
        };
      });
    },

    post : function (ps) {
      var self = this;
      return request('https://avosapi.delicious.com/api/v1/posts/compose', {
        queryString :  {
          url : ps.itemUrl,
          '_' : (new Date()).getTime()
        },
        responseType : 'json'
      }).then(function (res){
        var json = res.response;
        if (json.error) {
          throw new Error(chrome.i18n.getMessage('error_notLoggedin', self.name));
        }
        return request('https://avosapi.delicious.com/api/v1/posts/addoredit', {
          queryString : {
            description : ps.item,
            url         : ps.itemUrl,
            note        : joinText([ps.body, ps.description], ' ', true),
            tags        : joinText(ps.tags, ','),
            private     : !!ps.private ? 'on' : '',
            replace     : json.pkg.previously_saved,
            '_'         : (new Date()).getTime()
          }
        });
      });
    }
  });

Taberarelooのドキュメント用コメント

以下の形式に則って書くことによって、オプション画面のパッチ欄で情報が表示されるようになる。

// ==Taberareloo==
// {
//   "name"        : "New Delicious Model"
// , "namespace"   : "https://github.com/taberareloo/patches-for-taberareloo"
// , "description" : "New Delicious Model for new design/API"
// , "include"     : ["background"]
// , "version"     : "2.0.0"
// , "downloadURL" : "https://raw.github.com/taberareloo/patches-for-taberareloo/master/patches/patch.model.delicious.tbrl.js"
// }
// ==/Taberareloo==

downloadURL:自動更新用URL

ファイル名

基本的にどんな名前でも構わないが、末尾を拡張子を含めて「.tbrl.js」とすることで、パッチのソースコードが表示されたWebページの右クリックから、簡単にインストールできるようになる。

【命名規約】

サードパーティが開発したものも「patch.model.delicious.tbrl.js」という形式になっていることが多い。

本体

パッチで対応できない場合は、以下のファイルの内容を直接書き換えて本体をカスタマイズするしかない。

lib/model.js

各Webサービスへの実際の通信処理が書かれている。

lib/extractors.js

特定Webサービスへの特殊なデータ送信処理について書かれている。

lib/patch.js

各パッチの読み込みの処理。