text2applink ver.1.2—URL スキームによる出力に対応

2013-08-09-001

iPhone などのアプリを紹介するリンクタグをテキストエディタだけで取得できる自作スクリプト、text2applink をアップデートしました。今回は URL スキームを使った出力に対応。従来のポップアップによるタグ取得に加え、当該のエディタアプリや連携アプリに直接タグを受け渡しできるようになりました。

目次

  1. アップデート内容
  2. URL スキーム出力の仕組み
  3. 設定方法
  4. 具体例1: DraftPad でリンクタグを直接出力する
  5. 具体例2: Byword で特定のファイルにリンクタグを追記する
  6. 具体例3: Drafts でリンクタグをコピーする
  7. 具体例4: Drafts をコピー専用のハブにする
  8. 具体例5: Rowline でリンクタグを並べ替えてコピーする
  9. Mac との併用も可能
  10. 予約語の追加
  11. コード

アップデート内容

今回のアップデートの内容は次の2点です。バグフィックスはありませんので、URL スキーム出力を必要としない方はこれまでのスクリプトをそのままお使いいただくことも可能です。

  • あらかじめ指定した URL スキームで出力可能に
  • 予約語を追加

URL スキーム出力の仕組み

まず、URL スキーム出力でできることを動画にまとめてみました。動画の中で紹介している具体例は、この後で順番に取り上げていきます。

これまではアプリを検索して「リンクを取得」ボタンを押すか、複数のリンクを取得後に「複数リンクを出力」ボタンを押すとポップアップでリンクタグが表示されました。その際の「全選択」→「コピー」の手間をなくすのが URL スキーム出力です。

今回のバージョンでは、あらかじめスクリプトの中で URL スキームを指定しておくと、これらのボタンを押した際に「URLスキームで出力します。」と表示されます。「OK」を押すとスキームを実行。キャンセルしてポップアップ出力を選ぶこともできます。

私が愛用している Drafts の場合、Drafts 自らに向けた URL スキームを登録しておくと、このように「OK」を押してすぐにリンクタグが新規メモに入力されます。

設定方法

URL スキームの指定は、スクリプトの前半部分にある次のコードを編集して行います。

/* リンクタグの出力をポップアップ形式からURLスキーム形式に変更する場合は、出力先のURLスキームを''の中に入力してください。 */
var urlscheme='';

/* URLスキームに渡すリンクタグに続けて、コールバックなどのパラメータを指定したい場合は''の中に入力してください。 */
var suffix='';

まず、var urlscheme='';'' の間に、実行したい URL スキームを入力します。たとえば取得したリンクタグを Drafts に渡すケースでは次のようになります。

var urlscheme='drafts://x-callback-url/create?text=';

スクリプトを実行し、「URLスキームで出力します。」で「OK」を押すと、次の URL スキームが実行されます。先ほどのスクリーンショットは、この URL スキームを使ったものです。

drafts://x-callback-url/create?text=URLエンコードしたリンクタグ

アプリによっては、受け渡すテキストの後にさらにパラメータを続けることができるので、そういったケースでは var suffix='';'' の間にパラメータを入力します。たとえばここに &hogehoge と入力しておくと、実行される URL スキームは次のように変わります。

drafts://x-callback-url/create?text=URLエンコードしたリンクタグ&hogehoge

具体例1: DraftPad でリンクタグを直接出力する

ここからは、URL スキームを使った出力の具体例を紹介します。まずは DraftPad で、text2applink を実行→リンクタグを新規メモとして出力といった流れをやってみます。

/* ・・・省略・・・ */
var urlscheme='draftpad:///webdelegate?load=draftpad.replace(\'';

/* ・・・省略・・・ */
var suffix='\')';

あらかじめスクリプトをこのようにカスタマイズしておくと、次の URL スキームが実行されます。

draftpad:///webdelegate?load=draftpad.replace(\'URLエンコードしたリンクタグ\')

実際にやってみます。プレビュー画面から、URL スキームで出力。

すると、リンクタグが入力された新たなメモが作られます。

1点注意が必要なのは、DraftPad で text2applink を実行し、プレビュー画面から DraftPad 自身に向けた URL スキームを実行するには、よく見かける通常の URL スキームではなく WebDelegate という機能を使わなければいけないという点です。そのため、先ほど掲載した URL スキームのコードはちょっと複雑な形になっています。

これが仮に、別のアプリで text2applink を実行→結果を DraftPad に出力といった流れであれば、次のような簡単なコードになります。

/* ・・・省略・・・ */
var urlscheme='draftpad:///insert?text=';

/* ・・・省略・・・ */
var suffix='';

具体例2: Byword で特定のファイルにリンクタグを追記する

次は Byword のように、あらかじめ指定したファイルの末尾にテキストを追記するスキームを持っているアプリの場合です。

/* ・・・省略・・・ */
var urlscheme='byword://append?location=icloud&name=Blog.txt&text=';

/* ・・・省略・・・ */
var suffix='';

この設定で実行される URL スキームは次の通り。

byword://append?location=icloud&name=Blog.txt&text=URLエンコードしたリンクタグ

iCloud にある(location=icloud)、Blog.txt というファイルに(name=Blog.txt)リンクタグを追記(append)します。

Blog.txt ファイルに記事を下書きしているとします。

別のファイルでスクリプトを実行し、URL スキームで出力します。

Blog.txt ファイルに自動的に切り替わり、リンクタグが追記されています。

具体例3: Drafts でリンクタグをコピーする

ブログの下書きに Drafts を使う人は、リンクタグでただ単に新規メモを作るのではなく、すぐにクリップボードにコピーしてしまうのがいいです。

/* ・・・省略・・・ */
var urlscheme='drafts://x-callback-url/create?text=';

/* ・・・省略・・・ */
var suffix='&action=Copy%20to%20Clipboard&afterSuccess=Delete';

こうすると次の URL スキームが実行されます。

drafts://x-callback-url/create?text=URLエンコードしたリンクタグ&action=Copy%20to%20Clipboard&afterSuccess=Delete

リンクタグをテキストとした新規メモを作成(create)し、そのメモに対してクリップボードにコピーするアクションを実行(action=Copy%20to%20Clipboard)、メモ自体は削除(afterSuccess=Delete)という流れです。

URL スキームを実行。

新規メモの作成、クリップボードへのコピーが一瞬にして行われ、真っさらな画面になります。あとはリンクタグを張り付けたいメモにアクセスし、ペーストするだけです。

具体例4: Drafts をコピー専用のハブにする

Drafts はメモに対するアクションを行った後、さらに URL スキームを実行することができます。これを使えば、Drafts でリンクタグをクリップボードに格納し、直ちに別のアプリを開くことも可能です。つまり、Drafts をコピー専用のハブアプリとして使えます。

/* ・・・省略・・・ */
var urlscheme='drafts://x-callback-url/create?text=';

/* ・・・省略・・・ */
var suffix='&action=Copy%20to%20Clipboard&afterSuccess=Delete&x-success=draftpad://';

これで次の URL スキームが実行されます。

drafts://x-callback-url/create?text=URLエンコードしたリンクタグ&action=Copy%20to%20Clipboard&afterSuccess=Delete&x-success=draftpad://

Drafts で新規メモを作成し、リンクタグをクリップボードにコピーするところまでは先ほどと一緒ですが、その後で自動的に DraftPad が起動します。

具体例5: Rowline でリンクタグを並べ替えてコピーする

text2applink は複数アプリのリンクを取得することができるので、行の入れ替えが可能な HTML プレビューエディタ Rowline と組み合わせると、複数リンクを Rowline に出力→Rowline で並び替え→別のアプリに出力といった流れが可能になります。

/* ・・・省略・・・ */
var urlscheme='rowline:///set?text=';

/* ・・・省略・・・ */
var suffix='&&loc=whole&view=lines&callback=draftpad://';

URL スキームは次のようになります。

rowline:///set?text=URLエンコードしたリンクタグ&&loc=whole&view=lines&callback=draftpad://

意味としては、取得したリンクタグを Rowline の画面全体に張り付け(loc=whole)、ラインビューモードで表示(view=lines)、Rowline の「戻る」ボタンをタップすると DraftPad が起動(callback=draftpad://)、となります。

URL スキームを実行。

リンクタグが Rowline に渡り、プレビュー画面が表示されます。ここで並べ替えもできます。右上の「戻る」ボタンをタップすると、リンクタグ(並べ替えた場合は並べ替え後のもの)がクリップボードにコピーされた状態で、Draftpad が起動します。

最後の部分を callback=drafts:// とか、callback=byword:// といった具合に変更すれば他のアプリを起動させることもできます。もちろん、Rowline の画面左上にある矢印マークのボタンで、Rowline に組み込まれている連携機能を呼び出すことも可能です。

ただし、Rowline 上で直接 text2applink を実行することは、プレビューの仕様が違うのか私が試した限りではできませんでした。

Mac との併用も可能

text2applink のスクリプトに iPhone アプリと連携するための URL スキームを設定すると、Mac でスクリプトを実行する時に支障がないかと心配される人もいるかもしれません。でも、この点は心配無用(のはず)です。

スクリプトを実行した端末が iPhone と iPad、iPod touch の場合のみ URL スキームで出力され、それ以外の場合は URL スキームの設定を無効化するようにコードを記述してあります。

予約語の追加

今回のバージョンアップで、出力フォーマットをカスタマイズする際に使える予約語も一部追加しました。

追加した予約語
変数記述方法情報
version‘+version+’バージョン
release‘+release+’リリース日
genres‘+genres+’カテゴリー
size‘+size+’サイズ

フォーマットの詳しいカスタマイズ方法については、次の記事をご覧ください。

コード

最後に、アップデート後のコードを掲載します。このままコピペして使ってください。出力フォーマットをカスタマイズしている人は、これまでと同じように format='・・・';・・・ の部分にカスタマイズ後のコードを挿入してください。

<meta charset="utf-8">
<script>

/* text2applink */

/* リンクシェアのIDを''の中に入力してください。利用していない人はそのままで結構です。 */
var linkshareid='';

/* 検索対象にするアプリと検索件数を設定します。デフォルトではiPhone、iPad、Macアプリすべてが対象、検索件数はそれぞれ3件となっています。 */
var entities=new Array();

entities[entities.length]='software'; /* iPhoneアプリを検索対象から外す場合、先頭の'e'の前に'//'を入れてください。 */

entities[entities.length]='iPadSoftware'; /* iPadアプリを検索対象から外す場合、先頭の'e'の前に'//'を入れてください。 */

entities[entities.length]='macSoftware'; /* Macアプリを検索対象から外す場合、先頭の'e'の前に'//'を入れてください。 */

var limit=3; /* iPhoneアプリ、iPadアプリ、Macアプリそれぞれの検索件数です。 */

/* リンクタグの出力をポップアップ形式からURLスキーム形式に変更する場合は、出力先のURLスキームを''の中に入力してください。 */
var urlscheme='';

/* URLスキームに渡すリンクタグに続けて、コールバックなどのパラメータを指定したい場合は''の中に入力してください。 */
var suffix='';

/* これ以降は基本的に修正する必要はありません。スタイルをCSSで制御する場合は後半部分にあるコメントをお読みください。 */

var ua=navigator.userAgent;
if(ua.indexOf('iPhone')==-1&&ua.indexOf('iPad')==-1&&ua.indexOf('iPod')==-1)
{
urlscheme='';
suffix='';
}

var term=prompt('アプリ名を入力してください。');
if(term)
{
var products;
var newlimit=limit;
main(limit);
}

function main(arg)
{
var buttons='<div style="margin:10px 0;text-align:center"><input type="button" value="再検索" onclick="anothersearch()" style="margin-right:10px"><input type="button" value="複数選択モード" onclick="multiplemode()" style="margin-right:10px"><input type="button" value="複数リンクを出力" onclick="multipleoutput()"></div>';
document.write(buttons);
var morebutton='<div style="margin:20px 0 10px;text-align:center"><input type="button" value="続きを読み込む" onclick="more()"></div>';
if(newlimit!=limit)
{
document.write(morebutton);
}
for(var i=0;i<entities.length;i++)
{
var entity=entities[i];
var type;
if(entity=='software')
{
type='iPhone';
}
else if(entity=='iPadSoftware')
{
type='iPad';
}
else
{
type='Mac';
}
var title='<div style="background:#37709c;color:#fff;margin-bottom:5px;text-align:center">'+type+'</div>';
document.write(title);
appsearch(entity,arg);
}
document.write(morebutton);
var topbutton='<div style="margin-top:20px;text-align:center"><input type="button" value="ページトップへ戻る" onclick="scrollTo(0,screenTop)"></div>';
document.write(topbutton);
document.close();
}

function appsearch(arg1,arg2)
{
var searchurl='http://itunes.apple.com/search?term='+term+'&country=jp&entity='+arg1+'&limit='+arg2;
var xmlhttp=new XMLHttpRequest();
xmlhttp.open('get',searchurl,false);
xmlhttp.send();
var response=xmlhttp.responseText;
var results=JSON.parse(response).results;
rendering(arg1,results);
}

function rendering(arg1,arg2)
{
if(newlimit!=limit)
{
arg2=arg2.reverse();
}
for(var i=0;i<arg2.length;i++)
{
var app=arg2[i];
var icon60=app.artworkUrl60;
var icon150=app.artworkUrl512.replace(/512x512-75.\w*$|\w*$/, '150x150-75.png');
var developer=app.artistName;
var version=app.version;
var genres=app.genres.join(', ');
var release=app.releaseDate.replace(/T.*$/,'');
var name=app.trackName;
var price=app.formattedPrice;
var size=(app.fileSizeBytes/1000000).toFixed(1).replace(/$/,' MB');
var storeurl=app.trackViewUrl;
var universal='';
if(arg1!='macSoftware')
{
var features=app.features;
var check=features.indexOf('iosUniversal');
if(check!=-1)
{
universal='iOS Universal';
}
}
var linkshareurl=storeurl;
if(linkshareid.length==11)
{
linkshareurl='http://click.linksynergy.com/fs-bin/stat?id='+linkshareid+'&offerid=94348&type=3&subid=0&tmpid=2192&RD_PARM1='+storeurl+'&partnerId=30';
}
var format='<div style="border:1px dashed #ccc;margin:10px;overflow:hidden;padding:15px"><img src="'+icon150+'" alt="'+name+'" style="border-radius:13px;float:left;height:75px;margin-bottom:5px;margin-right:15px;width:75px"><ul style="list-style:none;margin:0;padding:0"><li style="margin:0;padding:0"><span style="color:#37709c;font-size:larger;font-weight:bold">'+name+'</span></li><li style="margin:0;padding:0">カテゴリ: '+genres+'</li><li style="margin:0;padding:0">価格: '+price+'(記事掲載時)</li><li style="margin:0;padding:0">開発元: '+developer+'</li></ul><a href="'+linkshareurl+'" target="_blank" rel="nofollow" style="font-size:larger;font-weight:bold">App Store</a></div>';

/* スタイルをHTMLに記述せず、CSSで制御する場合は次のコードの先頭、'format'の前にある'//'を削除し、フォーマットを自由に編集してください。CSSのサンプルは末尾にあります。 */

//format='<div class="app-link"><img src="'+icon150+'" alt="'+name+'"><ul><li><span>'+name+'</span></li><li>カテゴリ: '+genres+'</li><li>価格: '+price+'(記事掲載時)</li><li>開発元: '+developer+'</li></ul><a href="'+linkshareurl+'" target="_blank" rel="nofollow">App Store</a></div>';

var product=encodeURIComponent(format);
product=product.replace(/\'/g,'%27');
var preview='<div style="border:1px dashed #ccc;margin-bottom:10px;overflow:hidden;padding:10px"><img src="'+icon60+'" style="border-radius:10px;float:left;height:57px;margin-right:10px;width:57px">'+name+' ('+price+')<br>'+developer+'<br><input type="button" value="リンクを取得" onclick="output(\''+product+'\')" style="float:right"><span style="color:#37709c;float:right;margin-right:10px">'+universal+'</span></div>';
document.write(preview);
}
}

function output(arg)
{
if(products==undefined)
{
if(urlscheme=='')
{
arg=decodeURIComponent(arg);
prompt('以下のタグを全選択してコピーしてください。',arg);
}
else if(urlscheme.indexOf('draftpad:///webdelegate')==-1)
{
var answer=confirm('URLスキームで出力します。');
if(answer==true)
{
location.href=urlscheme+arg+suffix;
}
else
{
answer=confirm('ポップアップで出力しますか?')
if(answer==true)
{
arg=decodeURIComponent(arg);
prompt('以下のタグを全選択してコピーしてください。',arg);
}
}
}
else
{
var answer=confirm('URLスキームで出力します。');
if(answer==true)
{
arg=arg.replace(/%27/g, '\\\'');
location.href=urlscheme+arg+suffix;
}
else
{
answer=confirm('ポップアップで出力しますか?')
if(answer==true)
{
arg=decodeURIComponent(arg);
prompt('以下のタグを全選択してコピーしてください。',arg);
}
}
}
}
else
{
products[products.length]=arg;
alert('リンクを取得しました。');
}
}

function anothersearch()
{
term=prompt('アプリ名を入力してください。');
if(term)
{
newlimit=limit;
main(limit);
}
}

function multiplemode()
{
if(products==undefined)
{
products=new Array();
alert('複数選択モードに切り替えました。');
}
else
{
var answer=confirm('通常モードに戻しますか?(すでに取得したリンクはクリアされます。)');
if(answer==true)
{
products=undefined;
}
}
}

function multipleoutput()
{
if(products==undefined)
{
alert('複数のリンクを取得するには、まず「複数選択モード」を押してください。');
}
else if(products.length==0)
{
alert('取得されたリンクがありません。')
}
else
{
if(urlscheme=='')
{
var join=products.join('%0a%0a');
join=decodeURIComponent(join);
prompt('以下のタグを全選択してコピーしてください。',join);
}
else if(urlscheme.indexOf('draftpad:///webdelegate')==-1)
{
var join=products.join('%0a%0a');
var answer=confirm('URLスキームで出力します。');
if(answer==true)
{
location.href=urlscheme+join+suffix;
}
else
{
answer=confirm('ポップアップで出力しますか?')
if(answer==true)
{
prompt('以下のタグを全選択してコピーしてください。',decodeURIComponent(join));
}
}
}
else
{
var answer=confirm('URLスキームで出力します。');
if(answer==true)
{
var join=products.join('\\n\\n');
join=join.replace(/%27/g, '\\\'');
location.href=urlscheme+join+suffix;
}
else
{
answer=confirm('ポップアップで出力しますか?')
if(answer==true)
{
var join=products.join('%0a%0a');
prompt('以下のタグを全選択してコピーしてください。',decodeURIComponent(join));
}
}
}
}
}

function more()
{
newlimit+=5;
main(newlimit);
scrollTo(0,screenTop);
}

/* CSSのサンプルです。

.app-link {
 border: 1px dashed #ccc;
 margin: 10px;
 overflow: hidden;
 padding: 15px;
}

.app-link img {
 border-radius: 13px;
 float: left;
 height: 75px;
 margin-bottom: 5px;
 margin-right: 15px;
 width: 75px;
}

.app-link ul {
 list-style: none;
 margin: 0;
 padding: 0;
}

.app-link li {
 margin: 0;
 padding: 0;
}

.app-link span {
 color: #37709c;
 font-size: larger;
 font-weight: bold;
}

.app-link a {
 font-size: larger;
 font-weight: bold;
}

サンプルはここまでです。 */

</script>

4 thoughts on “text2applink ver.1.2—URL スキームによる出力に対応

  1. Pingback: Drafts上でJavaScriptを動作させる | hal’s Playground

  2. Pingback: [凛]text2applinkとアプリ連携でモブログでも快適アプリ紹介!PHG対応済み! | りんろぐ。

  3. Pingback: text2applinkとテキストエディターを使ったアプリリンクの貼り付け方法 | 工学博士のLifelog Diary

  4. Pingback: iPhoneだけで「iPhoneアプリ紹介記事」を爆速で書きあげる方法【text2applink】

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です