Hatena::Groupnadesiko

そっとなでしこ RSSフィード


メインのブログに書くまでもない、なでしこ学習帳【記事一覧】 【このブログは何?】


特設!→【目次】なでしこ用Twitter 連携ライブラリ「なこったー」で遊ぶ


2010-06-27

twitter&はてなハイク/ブックマーク引用HTMLを生成する、なでしこスクリプト

| twitter&はてなハイク/ブックマーク引用HTMLを生成する、なでしこスクリプト - そっとなでしこ を含むブックマーク はてなブックマーク - twitter&はてなハイク/ブックマーク引用HTMLを生成する、なでしこスクリプト - そっとなでしこ

 とりあえず、当初の目標であるtwitter、はてなハイク、はてなブックマークという3つのつぶやきサービスからつぶやきを引用するHTMLを生成するスクリプトが形になりました(やっぱり色々不具合が残っている悪寒がしますが…)。

■使い方

 スクリプトを起動すると表示されるメモ欄に、引用したいtwitterや、はてなハイクのステータスURLを改行区切りで入力して「決定」ボタンを押します。

 例えば、以下のURLを入力すると、

http://twitter.com/mametanuki/status/16340857818

http://h.hatena.ne.jp/mame-tanuki/9236538674340364601

http://b.hatena.ne.jp/mame-tanuki/20100529#bookmark-21909447

下のような表示をするHTML文が出力されます。

  


mametanuki

はてなのサービスが盛大に落ちまくってる。メンテナンスの犬画面すら出ず、「Internal Server Error」になるのは久々に見た http://i.hatena.ne.jp/idea/27496
(2010/06/17 07:41:35)

link


mame-tanuki

三文字

(2007/12/21 21:29:44)

link


mame-tanuki

/
サンプル→b:id:entry:21909451
(2010/05/29 )

link

■ソースコード

#-----------------------------------------------------------------------
# 出力HTMLテンプレート
#-----------------------------------------------------------------------
テンプレートヘッダーは「<table border="1" bgcolor="#FFFFFF">」。
テンプレートは「<tr>
<td width="32" height="32">
★ファビコン★<img src="★ユーザーアイコン★" width="32" height="32">
</td>
<td><a href="★サービスURL★★id★">★id★</a></td>
<td>
★コメント★
</td>
<td><a href="★つぶやきURL★">link</a></td>
</tr>」。
#-----------------------------------------------------------------------
# メイン処理
#-----------------------------------------------------------------------

「」をメモ記入して、取得URLSに代入。

もし取得URLSが「」でないならば
  出力HTMLは「」。
  取得URLSを反復
    取得URLはそれ。
    取得URLをつぶやき仕分けして、つぶやきに代入。
    もし、つぶやき→サービス名が「対象外サービス」でないならば
      つぶやきをつぶやき整形出力。
      出力HTMLは、「{出力HTML}{それ}{改行}」。
    ここまで。
  ここまで
  出力HTMLは、「{テンプレートヘッダー}
  {出力HTML}</table>」
  出力HTMLをメモ記入。
ここまで
母艦を閉じる。

出力TXTをメモ記入。
#-----------------------------------------------------------------------
# グループ定義
#-----------------------------------------------------------------------
■対象外サービスとは
  ・サービス名
  ・URL
  ・作る~
    サービス名は「対象外サービス」
#-----------------------------------------------------------------------
■ツイッターとは
  ・{非公開}FURL
  ・サービス名
  ・サービスURL
  ・ファビコン
  ・ユーザーID
  ・ユーザーアイコン
  ・ステータスID
  ・データ文字列
  ・リプライ
  ・タグ
  ・コメント
  ・タイムスタンプ

  ・URL取得~それはFURL
  ・URL設定(V)~
    FURL=V。
    自身→初期設定。
  ・初期設定~
    自身→ステータスID設定。
    自身→データ文字列設定。
    自身→ユーザーID設定。
    自身→ユーザーアイコン設定。
    自身→コメント設定。
    自身→タイムスタンプ設定。
  ・ステータスID設定~
    自身→URLからURLファイル名抽出して、自身→ステータスIDに代入。
  ・作る~
    サービス名=「twitter」。
    ファビコン=「http://a1.twimg.com/a/1276896641/images/favicon.ico」。
    サービスURL=「http://twitter.com/」。
    APIURL=「http://twitter.com/statuses/show/」
  ・ユーザーID設定~
    自身→データ文字列から「user/screen_name」を階層タグ切り出してタグ削除。
    それを自身→ユーザーIDに代入。
  ・ユーザーアイコン設定~
    自身→データ文字列から「user/profile_image_url」を階層タグ切り出してタグ削除。
    それ[0]を自身→ユーザーアイコンに代入。
  ・復号処理~システム:HTMLエンティティ復号
  ・リプライ抽出(抽出対象)~
    自身→リプライは、抽出対象から「replies」をタグ切り出し。
    抽出対象の「{自身→リプライ}」を「」に置換。
    それで戻る。
  ・データ文字列設定~
    問合せURL=「{APIURL}{ステータスID}.xml」
    問合せURLからHTTPデータ取得して自身→復号処理。
    リプライ抽出(それ)。
    それを自身→データ文字列に代入。
  ・タグ抽出処理(抽出対象)~
    #ハッシュタグ抽出機能を実装予定
    抽出対象で戻る。
  ・特殊記法置換(置換対象)~
    置換対象の「@([a-zA-Z0-9_-]+)」を「<a href="{サービスURL}$1">@$1</a>」へ正規表現置換。
    それで戻る。
  ・コメント設定~
    自身→データ文字列から「status/text」を階層タグ切り出してタグ削除。
    自身→タグ抽出処理(それ)。
    自身→特殊記法置換(それ)。
    #IDコール抑止
    それの「id:([a-zA-Z][a-zA-Z0-9_-]{波カッコ}1,30{波カッコ閉じ}[a-zA-Z0-9])」を「<a href="http://b.hatena.ne.jp/$1">id:$1</a>」へ正規表現置換。
    それを自身→コメントに代入。
  ・地域標準時変換(UTC日付、UTC時刻、加減算演算子、加減算時間)~
    加減算日数は0。
    地域標準時刻は、UTC時刻に「{加減算演算子}{加減算時間}」を時間加算。
    UTC時刻を「:」で区切り、UTC時刻配列に代入。
    加減算時間を「:」で区切り、加減算時間配列に代入。
    もし、加減算演算子が「+」ならば
      秒換算は((UTC時刻配列[0]×60×60)+(UTC時刻配列[1]×60)+(UTC時刻配列[2]))+
      ((加減算時間配列[0]×60×60)+(加減算時間配列[1]×60)+(加減算時間配列[2]))
      もし、秒換算が(24×60×60)以上ならば
        加減算日数は1。
    違えば
      秒換算は((UTC時刻配列[0]×60×60)+(UTC時刻配列[1]×60)+(UTC時刻配列[2]))-
      ((加減算時間配列[0]×60×60)+(加減算時間配列[1]×60)+(加減算時間配列[2]))
      もし、秒換算が0未満ならば
        加減算日数は1。
    地域標準日時は、UTC日付に「{加減算演算子}0/0/{加減算日数}」を日付加算。
    「{地域標準日時} {地域標準時刻}」で戻る。
  ・タイムスタンプ設定~
    英語月@「Jan」=「01」
    英語月@「Feb」=「02」
    英語月@「Mar」=「03」
    英語月@「Apr」=「04」
    英語月@「May」=「05」
    英語月@「Jun」=「06」
    英語月@「Jul」=「07」
    英語月@「Aug」=「08」
    英語月@「Sep」=「09」
    英語月@「Oct」=「10」
    英語月@「Nov」=「11」
    英語月@「Dec」=「12」
    自身→データ文字列から「status/created_at」を階層タグ切り出してタグ削除。
    取得日時はそれ[0]を「 」で区切る。
    英語月@「{取得日時[1]}」を取得月に代入する。
    取得JST日付は「{取得日時[5]}/{取得月}/{取得日時[2]}」。
    自身→地域標準時変換(取得JST日付、取得日時[3]、「+」、「09:00:00」)。
    それをタイムスタンプに代入。

  ・URL  ←URL設定  →URL取得

#-----------------------------------------------------------------------
■Hatenaハイクとは +ツイッター
  ・作る~
    サービス名は「はてなハイク」
    ファビコン=「http://favicon.hatena.ne.jp/?url=http://h.hatena.ne.jp/」。
    サービスURL=「http://h.hatena.ne.jp/」。
    APIURL=「http://h.hatena.ne.jp/api/statuses/show/」
  ・復号処理~システム:SJIS変換
  ・タグ抽出処理(抽出対象)~
    抽出対象を「^.*=」で正規表現マッチ。
    それの「=」を「」に置換してタグTXTに代入。
    「<a href="http://h.hatena.ne.jp/{タグTXTをURLエンコード}">{タグTXT}</a>」を自身→タグに代入。
    抽出対象の「^.*=」を「」へ正規表現置換。
    それで戻る。
  ・特殊記法置換(置換対象)~ 
    正規表現修飾子バックアップは正規表現修飾子。
    正規表現修飾子は正規表現修飾子&「i」。
    置換対象の「(https?://[-_.!~*'()a-z0-9;/?:@&=+$,%#]+\.(jpg|jpeg|png|gif|bmp))」を「<img src="$1">」へ正規表現置換。
    正規表現修飾子は正規表現修飾子バックアップ。
    それで戻る。
  ・タイムスタンプ設定~
    自身→データ文字列から「status/created_at」を階層タグ切り出してタグ削除。
    タイムスタンプ配列は、それ[0]を「T」で区切る。
    取得JST日付は、タイムスタンプ配列[0]の「-」を「/」に置換。
    取得JST時刻は、タイムスタンプ配列[1]の「Z」を「」に置換。
    「取得JST日付{取得JST日付}取得JST時刻{取得JST時刻}」を表示。
    自身→地域標準時変換(取得JST日付、取得JST時刻、「+」、「09:00:00」)。
    それをタイムスタンプに代入。

#-----------------------------------------------------------------------
■Hatenaブックマークとは +ツイッター
  ・作る~
    サービス名は「はてなブックマーク」
    ファビコン=「http://favicon.hatena.ne.jp/?url=http://b.hatena.ne.jp/」。
    サービスURL=「http://b.hatena.ne.jp/」。
  ・初期設定~
    自身→ステータスID設定。
    自身→ユーザーID設定。 #はてブ独特
    自身→データ文字列設定。
    自身→ユーザーアイコン設定。
    自身→コメント設定。
    自身→タグ抽出処理。
    自身→タイムスタンプ設定。
  ・ステータスID設定~
    自身→URLを「#bookmark-(\d+)」で正規表現マッチ。
    自身→ステータスIDは抽出文字列[0]。
  ・ユーザーID設定~
    自身→URLからURL基本パス抽出。
    それの「{自身→URLからURLドメイン名抽出}」を「」に置換。
    それの「/」を「」に置換。
    それの「http:」を「」に置換。
    自身→ユーザーIDは、それ。
  ・ユーザーアイコン設定~
    id頭2桁は、自身→ユーザーIDから2文字左部分。
    自身→ユーザーアイコンは、「http://www.st-hatena.com/users/{id頭2桁}/{自身→ユーザーID}/profile.gif」
  ・復号処理~システム:SJIS変換
  ・データ文字列設定~
    検索文字列は、自身→URLからHTTPデータ取得して自身→復号処理。
    正規表現命令文は「<a class="username" href="/{自身→ユーザーID}/{自身→URLからURLファイル名抽出}">.*[\r\n]+(.*[\r\n]+){波カッコ}1,4{波カッコ閉じ}」。
    検索文字列を正規表現命令文で正規表現マッチ。
    自身→データ文字列は、それ。
  ・タグ抽出処理~
    自身→データ文字列を「<span class="tags">.*」で正規表現マッチ。
    それから「span/a」の階層タグ切り出す。
    それの「href="」を「href="http://b.hatena.ne.jp」に置換。
    それの「{改行}」を「/」に置換。
    自身→タグは、それ。
  ・特殊記法置換(置換対象)~
    それの「((b:)*?)id:entry:([0-9]+)」を「<a href="http://b.hatena.ne.jp/entry/$3">$2id:entry:$3</a>」へ正規表現置換。
    それで戻る。
  ・コメント設定~
    自身→データ文字列を「<span class="comment">.*」で正規表現マッチしてタグ削除。
    自身→特殊記法置換(それ)。
    #IDコール抑止
    それの「id:([a-zA-Z][a-zA-Z0-9_-]{波カッコ}1,30{波カッコ閉じ}[a-zA-Z0-9])」を「<a href="http://b.hatena.ne.jp/$1">id:$1</a>」へ正規表現置換。
    自身→コメントは、それ。
  ・タイムスタンプ設定~
    自身→データ文字列を「<span class="timestamp">.*」で正規表現マッチしてタグ削除。
    自身→タイムスタンプは、それ。

#-----------------------------------------------------------------------
# 関数定義
#-----------------------------------------------------------------------
●つぶやき仕分け(URLを)
  URLからURLドメイン名抽出して、取得ドメインに代入。
  取得ドメインで条件分岐
    「twitter.com」ならば
      生成グループをツイッターとして作成。
    「h.hatena.ne.jp」ならば
      生成グループをHatenaハイクとして作成。
    「b.hatena.ne.jp」ならば
      生成グループをHatenaブックマークとして作成。
    違えば
      生成グループを対象外サービスとして作成。
  ここまで
  生成グループ→URLはURL。
  生成グループで戻る。

●つぶやき整形出力({グループ}対象グループを)
  ファビコンリンク=「<a href="{対象グループ→サービスURL}">
<img src="{対象グループ→ファビコン}">
</a><br>」。
  ファビコンリンクは、ファビコンリンクの「{改行}」を「」に置換。
  
  タグリンク=「」。
  もし対象グループ→タグが「」でないならば
    タグリンク=「<span style="font-style:italic;">{対象グループ→タグ}</span><br>」。
  出力TXTは、テンプレートの「★id★」を「{対象グループ→ユーザーID}」に置換。
  出力TXTは、出力TXTの「★ファビコン★」をファビコンリンクに置換。

  出力TXTは、出力TXTの「★ユーザーアイコン★」を「{対象グループ→ユーザーアイコン}」に置換。
  コメント=「{タグリンク}{対象グループ→コメント}<br>({対象グループ→タイムスタンプ})」。
  出力TXTは、出力TXTの「★コメント★」をコメントに置換。
  出力TXTは、出力TXTの「★つぶやきURL★」を「{対象グループ→URL}」に置換。
  出力TXTは、出力TXTの「★サービスURL★」を「{対象グループ→サービスURL}」に置換。
  出力TXTで戻る。

■ちょっとコメント

 ツールを書いてみて実感したけれど、twitterAPI互換な はてなハイクAPIは、もっと評価されても良い気がする。

 と言うか、いっそのこと、はてなブックマークAPIも、twitterAPI互換なヤツを作っちゃいなよ、長いものには巻かれちまえよ、はてな!とか思ったりw

 …ということで、上記ソースで「Hatenaブックマーク」グループの定義でやや強引に「twitter」グループをミックスしているのは、まぁ、そういう願いを込めてです。

■現在分かっている問題点

 基本的に自分が使う個人ツールとして書いたので、自分が使わない機能や許容できる問題点については投げっぱなし感が…

  • エラー処理系
    • 入力されたステータスURLのチェック
    • twitterのサービスが過負荷で、クジラの絵の「Over capacity」画面が表示された場合に、なでしこの実行エラーに
      • たぶん、はてなハイク/ブックマークが犬絵の「メンテナンス中」画面が表示された場合も、恐らく実行エラーに
  • 一部はてな記法がHTML化できていない
    • URL(http:~)のリンク化(←自分が、はてなダイアリーに貼り付ける使い方なので必要性を感じなかった)
    • 商品(asin:~)のリンク化(←同上)
    • YouTube/ニコニコ動画のプレイヤー表示
  • 一部twitter記法がHTML化できていない
    • ハッシュタグのリンク化


【関連記事】これまでの道のり

2010-06-24

twitter&はてなハイク引用HTMLを生成する、なでしこスクリプト

| twitter&はてなハイク引用HTMLを生成する、なでしこスクリプト - そっとなでしこ を含むブックマーク はてなブックマーク - twitter&はてなハイク引用HTMLを生成する、なでしこスクリプト - そっとなでしこ

 とりあえず形になりました(色々不具合が残っている悪寒がしますが…)。

【追記】一応、完成

■使い方

 スクリプトを起動すると表示されるメモ欄に、引用したいtwitterや、はてなハイクのステータスURLを改行区切りで入力して決定を押します。

 例えば、以下のURLを入力すると、

http://twitter.com/mametanuki/status/16340857818

http://h.hatena.ne.jp/Mukke/9234078269114015349

http://twitter.com/maname/status/16343275783

http://h.hatena.ne.jp/mame-tanuki/9236538674340364601

下のような表示をするHTML文が出力されます。

  


mametanuki

はてなのサービスが盛大に落ちまくってる。メンテナンスの犬画面すら出ず、「Internal Server Error」になるのは久々に見た http://i.hatena.ne.jp/idea/27496
(2010/06/17 07:41:35)

link


Mukke

はてなダイアリー
http://www.hatena.ne.jp/maintenance

>復旧いたしました。上記サービス以外にも、はてなモノリス、はてなメッセージ、はてなフォトライフにおきましても、つながりにくい状態となっておりました。原因はデータベースの過負荷によるもので、サーバの性能を強化し、復旧いたしました

嘘つき!w
(2010/06/17 07:48:08)

link


maname

はてなは私が倒した
(2010/06/17 08:19:45)

link


mame-tanuki

三文字

(2007/12/21 21:29:44)

link

■ソースコード

#-----------------------------------------------------------------------
# 出力HTMLテンプレート
#-----------------------------------------------------------------------
テンプレートヘッダーは「<table border="1" bgcolor="#FFFFFF">」。
テンプレートは「<tr>
<td width="32" height="32">
★ファビコン★<img src="★ユーザーアイコン★" width="32" height="32">
</td>
<td><a href="★サービスURL★★id★">★id★</a></td>
<td>
★コメント★
</td>
<td><a href="★つぶやきURL★">link</a></td>
</tr>」。
#-----------------------------------------------------------------------
# メイン処理
#-----------------------------------------------------------------------

「」をメモ記入して、取得URLSに代入。

もし取得URLSが「」でないならば
  出力HTMLは「」。
  取得URLSを反復
    取得URLはそれ。
    取得URLをつぶやき仕分けして、つぶやきに代入。
    もし、つぶやき→サービス名が「対象外サービス」でないならば
      #「{つぶやき→サービス名}」を言う。
      つぶやきをつぶやき整形出力。
      出力HTMLは、「{出力HTML}{それ}{改行}」。
    ここまで。
  ここまで
  出力HTMLは、「{テンプレートヘッダー}
  {出力HTML}</table>」
  出力HTMLをメモ記入。
ここまで
母艦を閉じる。

出力TXTをメモ記入。
#-----------------------------------------------------------------------
# グループ定義
#-----------------------------------------------------------------------
■対象外サービスとは
  ・サービス名
  ・URL
  ・作る~
    サービス名は「対象外サービス」
#-----------------------------------------------------------------------
■ツイッターとは
  ・{非公開}FURL
  ・サービス名
  ・サービスURL
  ・ファビコン
  ・ユーザーID
  ・ユーザーアイコン
  ・ステータスID
  ・データ文字列
  ・リプライ
  ・タグ
  ・コメント
  ・タイムスタンプ

  ・URL取得~それはFURL
  ・URL設定(V)~
    FURL=V。
    自身→初期設定。
  ・初期設定~
    自身→ステータスID設定。
    自身→データ文字列設定。
    自身→ユーザーID設定。
    自身→ユーザーアイコン設定。
    自身→コメント設定。
    自身→タイムスタンプ設定。
  ・ステータスID設定~
    自身→URLからURLファイル名抽出して、自身→ステータスIDに代入。
  ・作る~
    サービス名=「twitter」。
    ファビコン=「http://a1.twimg.com/a/1276896641/images/favicon.ico」。
    サービスURL=「http://twitter.com/」。
    APIURL=「http://twitter.com/statuses/show/」
  ・ユーザーID設定~
    自身→データ文字列から「user/screen_name」を階層タグ切り出してタグ削除。
    それを自身→ユーザーIDに代入。
  ・ユーザーアイコン設定~
    自身→データ文字列から「user/profile_image_url」を階層タグ切り出してタグ削除。
    それ[0]を自身→ユーザーアイコンに代入。
  ・復号処理~システム:HTMLエンティティ復号
  ・リプライ抽出(抽出対象)~
    自身→リプライは、抽出対象から「replies」をタグ切り出し。
    抽出対象の「{自身→リプライ}」を「」に置換。
    それで戻る。
  ・データ文字列設定~
    問合せURL=「{APIURL}{ステータスID}.xml」
    問合せURLからHTTPデータ取得して自身→復号処理。
    リプライ抽出(それ)。
    それを自身→データ文字列に代入。
    #「{自身→データ文字列}」を言う。
  ・タグ抽出処理(抽出対象)~
    #ハッシュタグ抽出機能を実装予定
    抽出対象で戻る。
  ・特殊記法置換(置換対象)~
    置換対象の「@([a-zA-Z0-9_-]+)」を「<a href="{サービスURL}$1">@$1</a>」へ正規表現置換。
    それで戻る。
  ・コメント設定~
    自身→データ文字列から「status/text」を階層タグ切り出してタグ削除。
    自身→タグ抽出処理(それ)。
    自身→特殊記法置換(それ)。
    #IDコール抑止
    それの「id:([a-zA-Z][a-zA-Z0-9_-]{波カッコ}1,30{波カッコ閉じ}[a-zA-Z0-9])」を「<a href="http://b.hatena.ne.jp/$1">id:$1</a>」へ正規表現置換。
    それを自身→コメントに代入。
  ・地域標準時変換(UTC日付、UTC時刻、加減算演算子、加減算時間)~
    加減算日数は0。
    地域標準時刻は、UTC時刻に「{加減算演算子}{加減算時間}」を時間加算。
    UTC時刻を「:」で区切り、UTC時刻配列に代入。
    加減算時間を「:」で区切り、加減算時間配列に代入。
    もし、加減算演算子が「+」ならば
      秒換算は((UTC時刻配列[0]×60×60)+(UTC時刻配列[1]×60)+(UTC時刻配列[2]))+
      ((加減算時間配列[0]×60×60)+(加減算時間配列[1]×60)+(加減算時間配列[2]))
      もし、秒換算が(24×60×60)以上ならば
        加減算日数は1。
    違えば
      秒換算は((UTC時刻配列[0]×60×60)+(UTC時刻配列[1]×60)+(UTC時刻配列[2]))-
      ((加減算時間配列[0]×60×60)+(加減算時間配列[1]×60)+(加減算時間配列[2]))
      もし、秒換算が0未満ならば
        加減算日数は1。
    地域標準日時は、UTC日付に「{加減算演算子}0/0/{加減算日数}」を日付加算。
    「{地域標準日時} {地域標準時刻}」で戻る。
  ・タイムスタンプ設定~
    英語月@「Jan」=「01」
    英語月@「Feb」=「02」
    英語月@「Mar」=「03」
    英語月@「Apr」=「04」
    英語月@「May」=「05」
    英語月@「Jun」=「06」
    英語月@「Jul」=「07」
    英語月@「Aug」=「08」
    英語月@「Sep」=「09」
    英語月@「Oct」=「10」
    英語月@「Nov」=「11」
    英語月@「Dec」=「12」
    自身→データ文字列から「status/created_at」を階層タグ切り出してタグ削除。
    取得日時はそれ[0]を「 」で区切る。
    英語月@「{取得日時[1]}」を取得月に代入する。
    取得JST日付は「{取得日時[5]}/{取得月}/{取得日時[2]}」。
    自身→地域標準時変換(取得JST日付、取得日時[3]、「+」、「09:00:00」)。
    それをタイムスタンプに代入。

  ・URL  ←URL設定  →URL取得

#-----------------------------------------------------------------------
■Hatenaハイクとは +ツイッター
  ・作る~
    サービス名は「はてなハイク」
    ファビコン=「http://favicon.hatena.ne.jp/?url=http://h.hatena.ne.jp/」。
    サービスURL=「http://h.hatena.ne.jp/」。
    APIURL=「http://h.hatena.ne.jp/api/statuses/show/」
  ・復号処理~システム:SJIS変換
  ・タグ抽出処理(抽出対象)~
    抽出対象を「^.*=」で正規表現マッチ。
    それの「=」を「」に置換してタグTXTに代入。
    「<a href="http://h.hatena.ne.jp/{タグTXTをURLエンコード}">{タグTXT}</a>」を自身→タグに代入。
    抽出対象の「^.*=」を「」へ正規表現置換。
    それで戻る。
  ・特殊記法置換(置換対象)~ 
    正規表現修飾子バックアップは正規表現修飾子。
    正規表現修飾子は正規表現修飾子&「i」。
    置換対象の「(https?://[-_.!~*'()a-z0-9;/?:@&=+$,%#]+\.(jpg|jpeg|png|gif|bmp))」を「<img src="$1">」へ正規表現置換。
    正規表現修飾子は正規表現修飾子バックアップ。
    それで戻る。
  ・タイムスタンプ設定~
    自身→データ文字列から「status/created_at」を階層タグ切り出してタグ削除。
    タイムスタンプ配列は、それ[0]を「T」で区切る。
    取得JST日付は、タイムスタンプ配列[0]の「-」を「/」に置換。
    取得JST時刻は、タイムスタンプ配列[1]の「Z」を「」に置換。
    「取得JST日付{取得JST日付}取得JST時刻{取得JST時刻}」を表示。
    自身→地域標準時変換(取得JST日付、取得JST時刻、「+」、「09:00:00」)。
    それをタイムスタンプに代入。

#-----------------------------------------------------------------------
# 関数定義
#-----------------------------------------------------------------------
●つぶやき仕分け(URLを)
  URLからURLドメイン名抽出して、取得ドメインに代入。
  取得ドメインで条件分岐
    「twitter.com」ならば
      生成グループをツイッターとして作成。
    「h.hatena.ne.jp」ならば
      生成グループをHatenaハイクとして作成。
    違えば
      生成グループを対象外サービスとして作成。
  ここまで
  生成グループ→URLはURL。
  生成グループで戻る。

●つぶやき整形出力({グループ}対象グループを)
  ファビコンリンク=「<a href="{対象グループ→サービスURL}">
<img src="{対象グループ→ファビコン}">
</a><br>」。
  ファビコンリンクは、ファビコンリンクの「{改行}」を「」に置換。
  
  タグリンク=「」。
  もし対象グループ→タグが「」でないならば
    タグリンク=「<span style="font-style:italic;">{対象グループ→タグ}</span><br>」。
  出力TXTは、テンプレートの「★id★」を「{対象グループ→ユーザーID}」に置換。
  出力TXTは、出力TXTの「★ファビコン★」をファビコンリンクに置換。

  出力TXTは、出力TXTの「★ユーザーアイコン★」を「{対象グループ→ユーザーアイコン}」に置換。
  コメント=「{タグリンク}{対象グループ→コメント}<br>({対象グループ→タイムスタンプ})」。
  出力TXTは、出力TXTの「★コメント★」をコメントに置換。
  出力TXTは、出力TXTの「★つぶやきURL★」を「{対象グループ→URL}」に置換。
  出力TXTは、出力TXTの「★サービスURL★」を「{対象グループ→サービスURL}」に置換。
  出力TXTで戻る。

 今のところ分かっている不具合は、twitterのサービスが過負荷で、クジラの絵の「Over capacity」画面が表示された場合に、なでしこの実行エラーになってしまうこと。そういう例外処理が実装できていません。

 とりあえず次は、下記のスクリプトを統合し、twitter&はてなハイク&はてなブックマークが引用できるスクリプトに拡張しようかと思います。

2010-06-23

協定世界時を日本標準時に変換

| 協定世界時を日本標準時に変換 - そっとなでしこ を含むブックマーク はてなブックマーク - 協定世界時を日本標準時に変換 - そっとなでしこ

 先日書いたスクリプトの「協定世界時(UTC)を日本標準時(JST)に変換」処理に初歩的なミスが…orz

取得日時[3]に「+09:00:00」を時間加算して取得時間に代入する。

●twitter引用HTMLを生成する、なでしこスクリプト - そっとなでしこ - なでしこ学習帳@はてな

http://nadesiko.g.hatena.ne.jp/mame-tanuki/20100620/twitter2html

日付変更が考慮されてませんね、これ…orz

…ということで、協定世界時から地域標準時を取得するサンプルを書きました。

■ソースコード

取得UTC日付は「2010/06/16」。
取得UTC時刻は「22:48:08」。
「UTC:{取得UTC日付} {取得UTC時刻}」を表示。

地域標準時変換(取得UTC日付、取得UTC時刻、「+」、「09:00:00」)
「日本標準時→{それ}」を表示。
地域標準時変換(取得UTC日付、取得UTC時刻、「-」、「10:00:00」)
「ハワイ・アリューシャン標準時→{それ}」を表示。


#-----------------------------------------------------------------------
●地域標準時変換(UTC日付、UTC時刻、加減算演算子、加減算時間)
  加減算日数は0。
  
  地域標準時刻は、UTC時刻に「{加減算演算子}{加減算時間}」を時間加算。
  UTC時刻を「:」で区切り、UTC時刻配列に代入。
  加減算時間を「:」で区切り、加減算時間配列に代入。
  
  もし、加減算演算子が「+」ならば
    秒換算は((UTC時刻配列[0]×60×60)+(UTC時刻配列[1]×60)+(UTC時刻配列[2]))+
    ((加減算時間配列[0]×60×60)+(加減算時間配列[1]×60)+(加減算時間配列[2]))
    もし、秒換算が(24×60×60)以上ならば
      加減算日数は1。
    ここまで。
  違えば
    秒換算は((UTC時刻配列[0]×60×60)+(UTC時刻配列[1]×60)+(UTC時刻配列[2]))-
    ((加減算時間配列[0]×60×60)+(加減算時間配列[1]×60)+(加減算時間配列[2]))
    もし、秒換算が0未満ならば
      加減算日数は1。
    ここまで。
  ここまで
  地域標準日時は、UTC日付に「{加減算演算子}0/0/{加減算日数}」を日付加算。
  「{地域標準日時} {地域標準時刻}」で戻る。

 ちなみに、はてなハイクもAPIで取得できる投稿日付も協定世界時。ただ、日付フォーマットが「ISO 8601形式」でtwitterとは違います。

 とは言え、協定世界時を日本標準時に変換する処理は共通化できそう。つまり、この処理を「ツイッター」グループで内部関数として定義し、「ツイッター」グループをミックスした「Hatenaハイク」グループではこれを呼び出して使うわけです。


■関連リンク

2010-06-22

大文字小文字を無視して正規表現サンプル

| 大文字小文字を無視して正規表現サンプル - そっとなでしこ を含むブックマーク はてなブックマーク - 大文字小文字を無視して正規表現サンプル - そっとなでしこ

 文字列の中に画像ファイルへリンクするURLがあった場合、HTMLのIMGタグに変換したいと考えました。正規表現で。

画像を貼り付けるには、URLの最後が「.gif, .jpg, .jpeg, .png, .bmp」のいずれかで終わるURLを本文欄に記入してください。自動的にその画像が展開されて表示されます。

●はてなハイク - Help

http://h.hatena.ne.jp/help

 そのURLが画像ファイルへのリンクか否かは、拡張子で見分けます。ただ、拡張子は小文字の場合もあれば大文字の場合もあります。たとえば拡張子「jpg」の場合、

\.[jJ][pP][gG]

のような書き方をして、大文字小文字のどちらでもヒットするようにすることになります。これは面倒臭いw

■正規表現修飾子で大文字小文字の違いを無視

 ということで、大文字小文字の違いを無視する正規表現修飾子を設定してみようと思います。

i 大小文字の違いを無視する

●正規表現メモ

http://www.kt.rim.or.jp/~kbk/regex/regex.html

■サンプルコード

つぶやき=「三文字
小文字拡張子→http://f.hatena.ne.jp/images/fotolife/m/mame-tanuki/20071221/20071221212939.png
大文字拡張子→http://f.hatena.ne.jp/images/fotolife/m/mame-tanuki/20071221/20071221212939.PNG
http://h.hatena.ne.jp/mame-tanuki/
」。

正規表現修飾子を表示。
つぶやきの「(https?://[-_.!~*'()a-z0-9;/?:@&=+$,%#]+\.(jpg|jpeg|png|gif|bmp))」を「<img src="$1">」へ正規表現置換
それを表示

正規表現修飾子バックアップは正規表現修飾子。
正規表現修飾子は正規表現修飾子&「i」。
正規表現修飾子を表示。

つぶやきの「(https?://[-_.!~*'()a-z0-9;/?:@&=+$,%#]+\.(jpg|jpeg|png|gif|bmp))」を「<img src="$1">」へ正規表現置換
それを表示

正規表現修飾子は正規表現修飾子バックアップ。
正規表現修飾子を表示。

つぶやきの「(https?://[-_.!~*'()a-z0-9;/?:@&=+$,%#]+\.(jpg|jpeg|png|gif|bmp))」を「<img src="$1">」へ正規表現置換
それを表示

■これをツールに実装すると…

 ということで、上記の置換処理を「つぶやき引用ツール」に組み込めば、例えば、

http://h.hatena.ne.jp/Siesta/9259270396070822636

とURLを指定すると、次のように表示されるHTMLが出力される…ようになるはずw

  


Siesta

大嫌いな人が家に来た時の対応を考える

(2010/06/22 05:15:27)

link

2010-06-21

グループのミックスで、予想外の動作が

| グループのミックスで、予想外の動作が - そっとなでしこ を含むブックマーク はてなブックマーク - グループのミックスで、予想外の動作が - そっとなでしこ

グループを宣言するとき、他のグループをミックスすることができます。オブジェクト指向で言えば継承に当たりますが、それほど高度な機能ではなく、ただ単に、グループ内の項目をコピーしているだけです。グループ内に変数名の衝突があれば上書きしてしまいます。

グループ分け(オブジェクト指向ライク)|日本語プログラミング言語「なでしこ」

で、次のようなサンプルコードを書いてみた所、自分の予想とは違った動きが。

■ソースコード

つぶやきとはHatenaハイク。
「{つぶやき→サービス名}」を言う。   #予想通り「はてなハイク」と言う
つぶやき→サービス名表示。        #予想通り「はてなハイク」と言う
つぶやき→概要表示。           #予想外に「ツイッター」と言う

#-----------------------------------------------------------------------
# グループ定義
#-----------------------------------------------------------------------
■ツイッターとは
  ・サービス名
  ・作る~
    サービス名は「ツイッター」
  ・サービス名表示~
    「ツイッター」と言う。
  ・概要表示~
    サービス名表示。
#-----------------------------------------------------------------------
■Hatenaハイクとは +ツイッター
  ・作る~
    サービス名は「はてなハイク」
  ・サービス名表示~
    「はてなハイク」と言う。

■「つぶやき→概要表示」が予想外の動きを

 上のサンプルでは、「ツイッター」グループをミックスする形で「Hatenaハイク」グループを定義しています。そうすることで、2つのグループで共通する部分は、「Hatenaハイク」グループでは省略しようという魂胆です。

 で、「Hatenaハイク」グループでは、「概要表示」というグループ内関数を省略しています。ですから、「Hatenaハイク」グループの「概要表示」を呼ぶと、ミックスした「ツイッター」グループの「概要表示」が呼ばれます。

 それは意図通りなのですが、この時、「概要表示」から呼ばれるグループ内関数「サービス名表示」は、「Hatenaハイク」グループで定義された「サービス名表示」が呼ばれるものと思っていました。ところが動かしてみると、予想に反して「ツイッター」グループの「サービス名表示」が呼ばれました。

■グループ内で自分自身を表す「自身」変数を使え

 どうも調べてみると、自分が意図したような動きをさせるためには、「ツイッター」グループの「概要表示」の定義を次のように記述しなければならないようです。

  ・概要表示~
    自身→サービス名表示。

 このようにして、生成されたインスタンスそれ自身の「サービス名表示」を呼び出すのだと明示することで、「Hatenaハイク」グループで呼ばれた「概要表示」は、「Hatenaハイク」グループの「サービス名表示」を呼び出すようになりました。

グループ内で自分自身を指定したい場合があります。そのときは、『自身』変数を使います。『自身』は常にグループ内で自分自身のインスタンスへのエイリアス変数です。『自身』は動的に設定されていますので、自身のメンバへアクセスするときは、『自身→メンバ名』または『自身@「メンバ名」』の形式で指定します。

グループ分け(オブジェクト指向ライク)|日本語プログラミング言語「なでしこ」

 なるほど~