Firefox用のすばらしいプラグイン-Ubiquityに関するHabrに関する記事がすでにありました 。 非常に実験的なプラグイン。 少なくともそれを見ることをお勧めします。
だから、私は彼が本当に好きで、私の拡張機能を書きました-mapia.uaマップで住所を検索します 私が記事について書いたもの。
プレビュー
このユビキタスで注目すべき点は何ですか?
- まず、このプラグインは1つのコマンドライン (!)上のWebサービスの束です。Google[Calculator、Mail、Maps、Translate、...]、Twitter、delicious、Wiki、Digg、tinyurl、Yahoo、Flickrなど。 参加者のリストは常に更新されます。 そして、ここでのポイントは、提供されるWebサービスの量と質すらありません。 重要なのは、Ubiquity自体を使用することの利便性です。今では、貧弱なFirefoxに何百もの素晴らしいツールバーとプラグインをすべて1か所で重み付けする必要はありません。 とても便利です
- 第二に、それはそれを開発した人ではありませんが、ユーザビリティの偉大な(この言葉を恐れない)専門家の息子であるアザ・ラスキン自身、 ジェフ・ラスキン (彼に安らぎを)ユーザーインターフェースを扱っているのは誰ですか。 Aza Raskinは現在、Mozilla Labsの主要なユーザビリティスペシャリストです。 彼を尊重し、尊敬してください:-)
プラグインの作者からの紹介ビデオです。
すべてのアクションは、ブラウザーのコマンドラインで実行されます。 Ctrl +スペースを押すだけです。 ことわざにあるように、POSIXのすべての愛好家に捧げます。 しかし、すべてが非常にシンプルで明確であるため、サルはそれを習得します。コマンドを完全に入力する必要はありません(提案)。 デフォルトでは、コマンドの最初の引数はページ上でマウスで選択されたものです。 実際、これは、たとえば、ドイツ語から記事を翻訳するときに大きなプラスです(ちなみに、Enterキーを押すと、選択したテキストがページ上で直接翻訳されます)。 または、友人の石鹸にテキストを投げます。 一般的に、Azaは素晴らしい仕事をしました。
自転車
独自の奇跡サービスを作成するには、実際、 UbiquityがインストールされたFirefoxが必要です。 ありますか 始めましょう。
カード、カード、あなたが恋しい
Ubiquityには既にGoogleマップがプリインストールされています。 しかし、キエフの栄光の都市の居住者として、私は他の人を使用していました-http://mapia.uaはい、そして例として-降りてくる:-)
はい、特にmultibukafが好きでない人のために- 既製のプラグインへのリンクがあります 。
編集を開始するには、[編集]をクリックします。 ありがとうキャップ!
Ctrl + Spaceを押してhelpと入力し、Ubiquity設定ページに移動し、「Hack Ubiquity」を見つけてクリックします。 エディタにいます。 textareaでコーディングするのがあまり便利でない場合は、外部エディターを接続して作業することができます(たとえば、 notepad ++が望ましい)。
最初のステップ
CmdUtils.CreateCommand({
names: [ "mapia" , "mpi" ],
icon: "http://mapia.ua/favicon.ico" ,
description: _( "Kiev map powered by mapia.ua" ),
author: {name: "Kottenator" , email: "kottenator@gmail.com" },
license: "MIT"
});
* This source code was highlighted with Source Code Highlighter .
ここではすべてが非常に簡単です。
- 名前 、 アイコン 、 説明 、作成者 、 ライセンス -明らかに:-)
-
_(...)
-i18nのメソッド
そして、すでに実行してコマンドを確認できます。
Ctrl +スペース->「mapia」または「mpi」と入力->これが表示されます。
彼は彼の行為に誇りを持っています! :)しかし続けましょう:
CmdUtils.CreateCommand({
names: [ "mapia" , "mpi" ],
icon: "http://mapia.ua/favicon.ico" ,
description: _( "Kiev map powered by mapia.ua" ),
author: {name: "Kottenator" , email: "kottenator@gmail.com" },
license: "MIT" ,
arguments: [
{role: 'object' , nountype: noun_arb_text, label: _( 'address' )}
],
preview: function preview(pblock, args) {
var msg = "You'd just typed \"${text}\"" ;
pblock.innerHTML = _(msg, { text: args. object .text });
},
execute: function execute(args) {
var msg = "You choose address: \"${text}\"" ;
displayMessage(_(msg, { text: args. object .text }));
}
});
* This source code was highlighted with Source Code Highlighter .
私たちは何をしましたか?
-
arguments: [arg1, arg2, ...]
-チームの引数の説明(ありがとう、Cap!)。
たとえば、{role: 'object' , nountype: noun_arb_text, label: _( 'address' )}
:
role: 'object'
は、これがコマンド名の直後に予期される最初の引数であることを意味します。nountype
は、この変数の型のようなものを意味します。label
は、コマンドの説明で表示されるものです(例: "mpi (address) " )。 コマンドの引数について詳しくはこちらをご覧ください。 preview: function preview(pblock, args) {
var msg = "You'd just typed \"${text}\"" ;
pblock.innerHTML = _(msg, { text: args. object .text });
}
pblock
コンテナプレビュー、pblock
コマンドの現在の引数。args. object .text
args. object .text
は、role: 'object'
持つ同じ引数role: 'object'
。
ご覧のとおり、_(...)
メソッドはi18nだけでなく、テンプレート内のパラメーターを置き換えることもできます。execute: function execute(args) {
var msg = "You choose address: \"${text}\"" ;
displayMessage(_(msg, { text: args. object .text }));
}
displayMessage(...)
は、小さなスライドアップ通知を表示します。
保存、再生、美しさ:
実際、カードはどこにありますか? Mapia Static APIから始めましょう-これは単なる地図領域の写真です。 コードを続けましょう:
arguments: [
{role: 'object' , nountype: noun_arb_text, label: _( 'address' )},
{role: 'goal' , nountype: noun_arb_text, label: _( 'zoom' )},
{role: 'source' , nountype: noun_arb_text, label: _( 'map size' )}
],
previewDelay: 800,
getStaticURL: function (address, zoom, size) {
var mapUrl = "http://mapia.ua/static?" ;
address = address || '' ;
zoom = parseInt(zoom, 10) || 15;
zoom = Math.min(18, Math.max(zoom, 6));
size = size || '400x300' ;
var params = {
address: address,
zoom: zoom,
size: size
};
return mapUrl + jQuery.param( params );
},
preview: function preview(pblock, args) {
var img = '<img src="${url}" />' ;
var url = this .getStaticURL(args. object .text, args.goal.text, args.source.text);
pblock.innerHTML = _(img, { url: url });
},
* This source code was highlighted with Source Code Highlighter .
- 最初に、さらに2つの引数を追加しました。
{role: 'goal' , nountype: noun_arb_text, label: _( 'zoom' )},
{role: 'source' , nountype: noun_arb_text, label: _( 'map size' )}
* This source code was highlighted with Source Code Highlighter .
1つ目はズームマップを担当し、2つ目は画像のサイズを担当します。
role: 'goal'
は、 「mapia Address to 16」のようなものを書くことを期待します。 この「16に」とは、args.goal.text == '16'
を意味し、これがズームになります。 可能な値は6〜18です。
同様に、 「300x200のmapiaアドレス」は、args.source.text == '300x200'
を意味し、これが画像のサイズになります。 -
getStaticURL(address, zoom, size)
メソッドは、マップのアドレスバーを返します。 -
preview(...)
メソッドは賢明なことをするようになりました:)-マップを表示します -
previewDelay: 800
(各キーストロークの要求で)異常な負荷でmapia.uaサーバーを強制終了しないように、800ミリ秒の要求の前に遅延を導入します
結果は次のとおりです。
まあ、それで終わりかもしれませんが、私は本当に便利なものを作りたかったのです。 静的な図面は私のニーズには十分ではありません。 そして、これが私がやったことです...
第二段階
実際、序文。 Mapiaは、番地を検索するためのオープンなWebサービスを提供していません。 しかし、彼らのサイトでは機能します! そして、私は思った-結局のところ、私はXSSを介して彼らの検索を使用するという事実に犯罪者は何もありませんか? 最後に、これは脆弱性ではなく、私は害を与えません、私は何も盗みませんが、 これらの人のために追加の広告を作成するだけです ;-)
このメソッドを追加します。
loadDetails: function (pblock, args, page_num) {
var baseUrl = "http://mapia.ua/search" ;
var params = {city: "%u041A%u0438%u0435%u0432" , "search[query]" : args. object .text};
var self = this ;
jQuery.ajax({
type: "GET" ,
url: baseUrl,
data: params ,
dataType: 'html' ,
error: function () { },
success: function (html) {
$( '#content' , pblock).html(html);
}
});
},
preview: function preview(pblock, args) {
var img = '<img src="${url}" /><div id="content"></div>' ;
var url = this .getStaticURL(args. object .text, args.goal.text, args.source.text);
pblock.innerHTML = _(img, { url: url });
this .loadDetails(pblock, args);
}
* This source code was highlighted with Source Code Highlighter .
ご覧のとおり、UbiquityはjQueryをサポートしています。 これは素晴らしい!
そして、これがまさにmapiaの検索です- “ mapia.ua/search?city= Kiev&search [query] = 入力された住所 ”
loadDetails(...)
メソッド
loadDetails(...)
何を
loadDetails(...)
ますか? 検索結果をプレビューに読み込むだけです。 コードは明確で説明できないと思います。
検索結果は次のとおりです。 しかし、何らかの理由でどこにも行けません。 リンクが機能しない、すべてが悪い。 実際、これは正常です:)上で述べたように、このメカニズムは私たちのためではなく、mapia.uaウェブサイト自体のためのものです。 しかし、Ubiquityを使用すると、クロスドメインクエリを実行できます。
したがって、ファイルを操作する必要があります(RegExpプレフィックス+ jQueryポストフィックス):
mapiaURL: "http://mapia.ua/#popup_class=${cat}&popup_id=${sid}" ,
clearSearchResultsCode: function (html) {
html = html.replace(/<div id="search_bar_title">((?:.|\s)*?)<\/div>/i, '<h3 class="search_bar_title">$1</h3>')
.replace(/<p>.*?<\/p>/i, '<p><small>( mapia.ua)</small></p>')
.replace(/(<div class="buildings_info")[^>]*>/gi, '$1>')
.replace(/<a href="\/center\/street\/(\d+)[^>]*>/i, '<a href="' + _(this.mapiaURL, {cat: 'Street', sid: "$1"}) + '">')
.replace(/<a[^<>]+onclick="\$\('street_\d+_buildings'\).*?<\/a>/i, '')
.replace(/<a href="\/center\/address\/(\d+)[^>]*>/gi, '<a href="' + _(this.mapiaURL, {cat: 'Address', sid: "$1"}) + '">')
.replace(/<a href="\/center\/feature\/(\d+)[^>]*>/gi, '<a href="' + _(this.mapiaURL, {cat: 'Feature', sid: "$1"}) + '">')
.replace(/<a href="\/center\/station\/(\d+)[^>]*>/gi, '<a href="' + _(this.mapiaURL, {cat: 'Station', sid: "$1"}) + '">')
.replace(/<a href="\/center\/city\/(\d+)[^>]*>/gi, '<a href="' + _(this.mapiaURL, {cat: 'City', sid: "$1"}) + '">')
.replace(/(<div id="search_bar_title"(?:.|\s)*?)<span(?:.|\s)*?<\/span>/i, '$1')
.replace(/(<div id="search_bar_title"(?:.|\s)*?)<span(?:.|\s)*?<\/span>/i, '$1') /* not a duplicate */
.replace(/href="\/search?[^"]*pages_feature=(\d+)[^"]*"/gi, 'page_num="$1"')
.replace(/<p><a[^<>]*onclick="load_content(?:.|\s)*?<\/p>/i, '')
.replace(/<script>(?:.|\s)*?<\/script>/i, '');
return html;
},
loadDetails: function (pblock, args, page_num) {
var baseUrl = "http://mapia.ua/search" ;
var params = {city: "%u041A%u0438%u0435%u0432" , "search[query]" : args. object .text};
if (page_num)
params.pages_feature = page_num;
var self = this ;
jQuery.ajax({
type: "GET" ,
url: baseUrl,
data: params,
dataType: 'html' ,
error: function () {},
success: function (html) {
// Pre-fixes via RegExp
html = self.clearSearchResultsCode(html);
$( '#content' , pblock).html(html);
// After-fixes via jQuery
$( 'div.pagination a' , pblock).click( function (e){
self.loadDetails(pblock, args, $( this ).attr( 'page_num' ));
e.preventDefault();
return false ;
})
}
});
}
* This source code was highlighted with Source Code Highlighter .
ここでは、それがどのように機能するかを長い間説明します:) htmlを不要なものから削除し、リンクをクリック可能にするだけです。
外観は次のとおりです。
できた!
それだけです、患者は健康で退院することができます。 誰かがこれまでに行を読んでくれてうれしいです:)
ここでは、一緒にアセンブルされたコードをダウンロードできます 。