2015年4月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
無料ブログはココログ

« 欲しくて作った - 「手書き縮小貼り付けシール 」 | トップページ | 欲しくて作った - 「ペン周りまとめて設定シール 」 »

2014年6月28日 (土)

欲しくて作った - 「Evernote すぐアップシール 」

欲しくて作った第二弾

前回以上に安直ですが、個人的に欲しかったので作りました。(というより、パクったに近い)

Skylabβができたので、初期リリースからプリインストールされている Evernote アップロードシールの需要はなくなっているのかもしれませんが、個人的には捨てがたいものがあります。

将来の夢は別として、今現在 MOON をメモ端末として使うなら、メモの出口の一つとして有用です。しかし、プリインストール版には、以下の不満があり今一つでした。

  • 気軽にアップしたいのに、「貼って」「タップして」「剥がす」というのが面倒。
  • アップロードしたイメージにシールの画像が含まれてしまうこと。

この二つだけ改善すれば気軽に多用できそうなので、ブリインのシールを改造(不要部分を削除したくらい、改造のうちにも入らない)しました。

ダウンロード : 「Evernote すぐアップシール 」

使い方

そのままです。

アップロードしたいページにシールを貼りつけると、すぐにアップロードします。プリインシールの派手なエフェクトは省略しました。アップロードに成功すると自動でシールを剥がして終了します。

それだけ。

一つだけ難点なのは、三本指キャンセルすると、表示されない(透明の)シールがページ上に残ってしまうこと。申し訳ありませんが、手動で剥がしてください。

与太話

ほとんど、キュー○ー 3 分ハッキングレベルの改造ですが、それでも思うところはありました。

まず、ver.2.8.0 までで使えた、シールを剥がしてから、ondetach でイベントを catch して実行するテクニック (以前、Issue Tracker で教えてもらったやつ) が使えなくなってるみたいです。

シールを手動で剥がすと、ondetach で catch できるのですが、プログラム中から MOON.peel() で剥がすと、catch できません。MOONPhase ver.2.9.0 以降、イベントの伝播が変わってしまったのかもしれません。このギミックが生きていれば、途中で実行をキャンセルしても透明シールがページに残らずに済むのですが。

また、将来のバージョンで実装してほしいのですが、MOON.alert() が "OK" しか返せないのが残念です。同じスタイルで、[YES], [NO] とか、[Cancel] まで返せるような、複数選択肢のあるダイアログとして使える API を用意して欲しいですね。

ソース

今回はあまりにもソースが短いので、久々に載せておきます。この程度のもんです。

hack.js

importJS(["lib/stickerlib.min.js", "lib/infoutil.js", "main.js"], function() {
    enchant();

    var sticker = Sticker.create();

    sticker.ondetach = function(event) {
        MOON.finish();
    };

    sticker.onattach = function(event) {
        main();
//        MOON.finish();
    };

    sticker.ontap = function(event) {
        main();
//        MOON.finish();
    };

    sticker.register();
});

/*
*  onattch, ontap で MOON.peel() を実行し、ondetach で
*  シールが剥がれたことを catch して Evernote への upload を実行すれば
*  途中で実行を中止しても、シールがページに残らないのでスマートだが
*  MOONPhase ver.2.8.0 までで有効だった、このテクニックが ver.2.9.0 以降は
*  無効になっている?
*  シールを手動で剥がした場合は、ondetach で catch できるが、プログラム中から
*  MOON.peel() で剥がすと、ondetach にイベントが伝わらない ?
*/

main.js

function main() {
    var stickerId = InfoUtil.getStickerId(),
        stickerInfo = MOON.getPaperJSON( stickerId );

    /*
    *  シールが Evernote に残るのが不細工なので、シールの背景画像を
    *  消去してから upload 作業に入る。
    *  但し、シールの実行を三本指キャンセルで停止させると、
    *  透明のシールが剥がされずに残ってしまう
    */
    stickerInfo.image = "";
    MOON.setPaperJSON( stickerId, stickerInfo );

    /*
    *  uploadCurrentPageToEvernote() 自体が confirm message を出力するので、
    *  シール独自での confirm message は出さない
    */
    uploadEvernote( function( result ){
        if ( result ) {
            MOON.peel();
        } else {
            stickerInfo.image = "background.png";
            MOON.setPaperJSON( stickerId, stickerInfo );
            MOON.finish();
        }
    });
}

function uploadEffect() {
}

function uploadEvernote( callback ) {
    var _callback = callback;
    var UPLOAD_SUCCESS_MESSAGE, UPLOAD_FAILURE_MESSAGE;
    switch (navigator.language) {
    case 'en-us':
        UPLOAD_SUCCESS_MESSAGE = 'Successfully stored the page\n' + 'in your Evernote account.';
        UPLOAD_FAILURE_MESSAGE = 'Failed to store the page\n' + 'in your Evernote account.';
        break;
    case 'ja-jp':
        /* falls through */
    default:
        UPLOAD_SUCCESS_MESSAGE = 'Evernoteに保存しました';
        UPLOAD_FAILURE_MESSAGE = 'Evernoteへの\n' + 'アップロードに失敗しました';
        break;
    }
    MOON.uploadCurrentPageToEvernote(function() {
        MOON.alert(UPLOAD_SUCCESS_MESSAGE, function() {
            uploadEffect();
            _callback( true );
        });
    }, function() {
        MOON.alert(UPLOAD_FAILURE_MESSAGE, function() { _callback( false ); });

    });
}

lib/infoutil.js

/*
*  InfoUtil
*   by @H_Kuruno - http://kuruno.cocolog-nifty.com/blog/
*/
(function(global) {
    function relDirectories( i ){
        var relURL = location.href;
        relURL = relURL.slice( relURL.search( /\/data\//i ) +1 );
        return relURL.split( "/" )[i];
    }

    var Me = {

        //MOONPhase v 2.8.0 での window.location に対応
        getStickerId: function(){ return relDirectories( 3 ); },
        getPageId: function(){ return relDirectories( 2 ); },
        getNoteId: function() { return relDirectories( 1 ); },

        // JSON から、tag で指定した値を読み込む。
        // tag が存在しなかった場合の戻り値を指定できる。
        //
        getObjFromJSON: function( json, tag, nullDefault ) {
            var obj = json[ tag ];
            if ( nullDefault == null ) {
                return obj;
            } else {
                return ( obj == null ) ? nullDefault : obj;
            }
        },
        // JSON に、値 obj を 名 tag で登録する。
        // 但し、値が null, {}, [] の場合は削除する。
        //
        setObjToJSON: function( json, tag, obj ) {
            if ( (obj == null)
              || ( (typeof obj).match( /object/i ) && Object.keys( obj ).length <= 0 )
            ) {
                if ( json[ tag ] ) delete json[ tag ];
            } else {
                    json[ tag ] = obj;
            }
            return json;
        },
        /*
        * MOONPhase ver.2.9.0 以降の世代別 JSON における、全ストローク消去処理
        *
        *  backingId : paperJSON.backing を渡すとページのストロークを、stickerId
        *   を渡すと、シールのストロークを消去する。
        *
        *  戻り値 : 消去前の externalStrokes
        *
        *                                       last modified on 2014/06/13
        */
        clearStrokes: function( backingId ){
            var nullExtStrokes = [],
                extStrokes = MOON.getStrokeJSON( backingId );
            for ( var i = 0, eLen = extStrokes.length; i < eLen; i++ ) {
                nullExtStrokes.push( {strokes:[]} );
            }
            MOON.setStrokeJSON( backingId, nullExtStrokes );
            return extStrokes;
        },
        /*
        * ページにストロークが一本もない場合、とりあえずページ全体のサイズで
        * ストローク情報を作っておく. (for MOONPhase ver.2.9.0 or later)
        *
        *                                       last modified on 2014/06/13
        */
        confirmExtStrokesNotEmpty: function( backingId ) {
            var backingInfo = MOON.getPaperJSON( backingId );
            if ( backingInfo.externalStrokes.length === 0 ) {
                backingInfo.externalStrokes = [
                    { x: 0, y: 0, width: backingInfo.width,
                    height: backingInfo.height, size: 0, name: 'stroke1.json' }
                ];
                MOON.setPaperJSON( backingId, backingInfo );
            }
        }
    };

    global.InfoUtil = Me;
})(this);


/*
*  StorageUtil
*   by @H_Kuruno - http://kuruno.cocolog-nifty.com/blog/
*/
(function(global) {
    var Me = {
        // localStorage から、tag で指定した値を読み込む。
        // tag が存在しなかった場合の戻り値を指定できる。
        //
        get: function( tag, nullDefault ) {
            var obj = localStorage[ tag ];
            if ( nullDefault == null ) {
                return obj;
            } else {
                return ( obj == null ) ? nullDefault : obj;
            }
        },
        // localStorage に、値 obj を 名 tag で登録する。
        // 但し、値が null, {}, [] の場合は削除する。
        //
        set: function( tag, obj ) {
            if ( (obj == null)
              || ( (typeof obj).match( /object/i ) && Object.keys( obj ).length <= 0 )
            ) {
                if ( localStorage[ tag ] ) localStorage.removeItem( tag );
            } else {
                localStorage[ tag ] = obj;
            }
        }
    };

    global.StorageUtil = Me;
})(this);

« 欲しくて作った - 「手書き縮小貼り付けシール 」 | トップページ | 欲しくて作った - 「ペン周りまとめて設定シール 」 »

enchantMOON」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1527616/56635134

この記事へのトラックバック一覧です: 欲しくて作った - 「Evernote すぐアップシール 」:

« 欲しくて作った - 「手書き縮小貼り付けシール 」 | トップページ | 欲しくて作った - 「ペン周りまとめて設定シール 」 »