SlideShare una empresa de Scribd logo
1 de 34
この夏の最新
Text::Hatena
をお届けします!!
     2012/08/18
  大西康裕 (id:onishi) はてな
自己紹介

• id:onishi - 大西康裕
• 株式会社はてな (2001∼)
 • チーフエンジニア
 • はてなブログディレクター
• @yasuhiro_onishi
• PAUSE: ONISHI - Devel::KYTProf
Text::Hatena とは

はてな記法を
HTMLに変換
するモジュール
はてな記法とは

• はてなブログやはてなダイアリーやはてなグ
  ループで使える書式

• かんたんな記述でHTML文書構造や自動リン
  クが書ける

• hatenadiary.g.hatena.ne.jp/keyword/
  はてな記法一覧
入力支援(ブロック記法)
自動リンク(インライン記法)
たくさんのText::Hatena

• Text::Hatena ∼0.16 (jkondo)
 •   https://metacpan.org/release/JKONDO/Text-Hatena-0.16

• Text::Hatena 0.20 (jkondo)
 •   https://metacpan.org/module/Text::Hatena

• Text::Xatena (cho45)
 •   https://metacpan.org/module/Text::Xatena

• Text::HatenaLite (wakabatan)
 •   https://github.com/wakaba/perl-text-hatenalite
Text::Hatena # ∼0.16


use Text::Hatena; # 0.16

my $parser = Text::Hatena->new;
 $parser->parse($text);
my $html = $parser->html;
Text::Hatena # 0.20


use Text::Hatena; # 0.20

my $html = Text::Hatena->parse($text);
Text::Xatena



use Text::Xatena;

my $thx = Text::Xatena->new;
 $thx->format($string);
Text::HatenaLite



use Text::HatenaLite::Parser;

my $html = Text::HatenaLite::Parser
->parse_string($string);
もっとたくさんの…


• Hatena::Diary::HTMLParserBody
• Hatena2::Group::HTMLParserBody
• Hatena::Bookmark::TextFormat
• Hatena::Haiku::Body
Hatena::Diary::HTMLParserBody



• 最初のはてな記法 Parser
• 2008年までテストなかった
• 1200行のメソッド
• まだ使われています…
H::D::HTMLParserBody#makelink
記法展開の難しさ(1)

  テキストをHTMLにするものだけど
     HTML::Parserベース

• はてな記法はHTMLタグが使える
• コメント記法
• スーパーPRE記法
記法展開の難しさ(1)

<script>
ここは記法展開しないよ
</script>

<!--
ここは消えるよ
-->

>||
記法展開しないでPREになるよ
||<
記法展開の難しさ(1)

<script>
>||
ここはどうなる?
||<
</script>


>||
<!--
ここはどうなる?
-->
||<
記法展開の難しさ(1)


記法とHTMLを
同時に解釈しな
ければいけない
記法展開の難しさ(2)

   3つのことを同時にやっている

• 記法の展開
• キーワードリンク
• XSS対策(ホワイトリストによるscript制限)
記法展開の難しさ(2)

     どうしてこうなった

• 記法とキーワードリンクが密結合している
 • []キーワードリンクしない記法[]
 • 記法展開すると意味を失う
記法展開の難しさ(2)


記法展開とキーワー
ドリンクを同時に行
わなければならない
このため

記法展開とキーワードリンクが密結
合であるため、Text::Hatena な
どの記法展開だけのモジュールを
作っても、実際のプロダクト(はて
なダイアリー)で利用できなかった
どうしよう
メタデータによる疎結合化

記法展開時に
「これ以上リンクしない」という
カスタムデータ属性を付与
<span data-unlink>
  ここはこれ以上リンクしない
</span>
メタデータによる疎結合化




                }
• 記法パーサ
 • data-unlink属性を付与   疎結合化
• キーワードリンカ
 • data-unlink属性を見てリンクを判断
The new Text::Hatena

• Text::Xatena をベースに
          (©cho45)


• カスタムデータ属性を使って記法展開とキー
 ワードリンクを疎結合化

• 過去(や類似)のインターフェース互換
• 多くのはてな記法に対応
• 実際にはてなブログで利用している
インターフェース後方互換
use Text::Hatena;

my $parser = Text::Hatena->new;
my $html = $parser->parse($string);

# Text::Hatena 0.16 style
my $html = $parser->html;

# Text::Hatena 0.20 style
my $html = Text::Hatena->parse($string);

# Text::Xatena style
my $html = $parser->format($string);
単体でも使える便利モジュール


•Text::Hatena::Keyword
 • キーワードリンカ
•Text::Hatena::Embed
 • URL埋め込み支援([http:embed]記法)
Text::Hatena::Keyword

 data-unlink 属性を考慮してキーワードリンク
my $parser = Text::Hatena::Keyword->new(
   rules => [
      qr/hoge|fuga/ => sub { sprintf '/keyword/%s', uri_escape($_) },
      [qw/foo bar/] => sub { sprintf '/other/%s', uri_escape($_) },
   ],
);
my $words = $parser->extract($html); # 抽出
my $formatted_html = $parser->format($html); # リンク
Text::Hatena::Embed

       URLを渡すといい感じにembed


    my $embed = Text::Hatena::Embed->new;
    my $html = $embed->render($url);


www.slideshare.net/onishi/oembed-texthatena
github.com/onishi/Text-Hatena



  本日公開しました!!
   どうぞご利用ください!!
  pull request ください!!
はてなブログ

27週連続新機能リリース中
日本一開発がホットなブログ

 hatenablog.com
人材募集
• 株式会社はてなではエンジニアその他
 全職種を募集しています

• 一緒にブログを作りましょう!
www.hatena.ne.jp/company/staff
ご清聴ありがとうございました

Más contenido relacionado

Similar a The new Text::Hatena

RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話Takuto Wada
 
Html5でword pressテーマを作るよ!
Html5でword pressテーマを作るよ!Html5でword pressテーマを作るよ!
Html5でword pressテーマを作るよ!Muyuu Fujita
 
Contao Open Source CMS / 3.3と、その向こう
Contao Open Source CMS / 3.3と、その向こうContao Open Source CMS / 3.3と、その向こう
Contao Open Source CMS / 3.3と、その向こうTakahiro Kambe
 
WordPress中級者への道!テンプレートタグはどう動くのか!?
WordPress中級者への道!テンプレートタグはどう動くのか!?WordPress中級者への道!テンプレートタグはどう動くのか!?
WordPress中級者への道!テンプレートタグはどう動くのか!?Shinichi Nishikawa
 
HTML5での制作、いつから始める?
HTML5での制作、いつから始める?HTML5での制作、いつから始める?
HTML5での制作、いつから始める?Fuminori Mori
 
CRF を使った Web 本文抽出 for WebDB Forum 2011
CRF を使った Web 本文抽出 for WebDB Forum 2011CRF を使った Web 本文抽出 for WebDB Forum 2011
CRF を使った Web 本文抽出 for WebDB Forum 2011Shuyo Nakatani
 
いいパブッ!! - よくわかるEPUB 3
いいパブッ!! - よくわかるEPUB 3いいパブッ!! - よくわかるEPUB 3
いいパブッ!! - よくわかるEPUB 3Hiroshi Takase
 
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」ericsagnes
 
サイボウズのオープンソースへの取り組み - OSC 2018 Osaka
サイボウズのオープンソースへの取り組み - OSC 2018 Osakaサイボウズのオープンソースへの取り組み - OSC 2018 Osaka
サイボウズのオープンソースへの取り組み - OSC 2018 OsakaYuki Okada
 
WEB開発はじめの一歩 講師:村井亮介様
WEB開発はじめの一歩 講師:村井亮介様WEB開発はじめの一歩 講師:村井亮介様
WEB開発はじめの一歩 講師:村井亮介様株式会社GreenHack
 
使いやすいWordPressのためのCSSのつくりかた
使いやすいWordPressのためのCSSのつくりかた使いやすいWordPressのためのCSSのつくりかた
使いやすいWordPressのためのCSSのつくりかたHiroshi Urabe
 
かたログッ!! - 本をネットに解き放て
かたログッ!! - 本をネットに解き放てかたログッ!! - 本をネットに解き放て
かたログッ!! - 本をネットに解き放てHiroshi Takase
 
メディア工房サマーワークショップ「Webアプリ制作」1日目
メディア工房サマーワークショップ「Webアプリ制作」1日目メディア工房サマーワークショップ「Webアプリ制作」1日目
メディア工房サマーワークショップ「Webアプリ制作」1日目Takashi Endo
 
Introduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature EngineersIntroduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature EngineersTakeshi Arabiki
 
Concentrated HTML5 & Attractive HTML5
Concentrated HTML5 & Attractive HTML5Concentrated HTML5 & Attractive HTML5
Concentrated HTML5 & Attractive HTML5Sho Ito
 
Yesod でブログエンジンをつくってみた
Yesod でブログエンジンをつくってみたYesod でブログエンジンをつくってみた
Yesod でブログエンジンをつくってみたHiromi Ishii
 

Similar a The new Text::Hatena (18)

RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
 
Html5でword pressテーマを作るよ!
Html5でword pressテーマを作るよ!Html5でword pressテーマを作るよ!
Html5でword pressテーマを作るよ!
 
HTML5 for IA
HTML5 for IAHTML5 for IA
HTML5 for IA
 
Contao Open Source CMS / 3.3と、その向こう
Contao Open Source CMS / 3.3と、その向こうContao Open Source CMS / 3.3と、その向こう
Contao Open Source CMS / 3.3と、その向こう
 
WordPress中級者への道!テンプレートタグはどう動くのか!?
WordPress中級者への道!テンプレートタグはどう動くのか!?WordPress中級者への道!テンプレートタグはどう動くのか!?
WordPress中級者への道!テンプレートタグはどう動くのか!?
 
HTML5での制作、いつから始める?
HTML5での制作、いつから始める?HTML5での制作、いつから始める?
HTML5での制作、いつから始める?
 
CRF を使った Web 本文抽出 for WebDB Forum 2011
CRF を使った Web 本文抽出 for WebDB Forum 2011CRF を使った Web 本文抽出 for WebDB Forum 2011
CRF を使った Web 本文抽出 for WebDB Forum 2011
 
Web班番外編
Web班番外編Web班番外編
Web班番外編
 
いいパブッ!! - よくわかるEPUB 3
いいパブッ!! - よくわかるEPUB 3いいパブッ!! - よくわかるEPUB 3
いいパブッ!! - よくわかるEPUB 3
 
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」
 
サイボウズのオープンソースへの取り組み - OSC 2018 Osaka
サイボウズのオープンソースへの取り組み - OSC 2018 Osakaサイボウズのオープンソースへの取り組み - OSC 2018 Osaka
サイボウズのオープンソースへの取り組み - OSC 2018 Osaka
 
WEB開発はじめの一歩 講師:村井亮介様
WEB開発はじめの一歩 講師:村井亮介様WEB開発はじめの一歩 講師:村井亮介様
WEB開発はじめの一歩 講師:村井亮介様
 
使いやすいWordPressのためのCSSのつくりかた
使いやすいWordPressのためのCSSのつくりかた使いやすいWordPressのためのCSSのつくりかた
使いやすいWordPressのためのCSSのつくりかた
 
かたログッ!! - 本をネットに解き放て
かたログッ!! - 本をネットに解き放てかたログッ!! - 本をネットに解き放て
かたログッ!! - 本をネットに解き放て
 
メディア工房サマーワークショップ「Webアプリ制作」1日目
メディア工房サマーワークショップ「Webアプリ制作」1日目メディア工房サマーワークショップ「Webアプリ制作」1日目
メディア工房サマーワークショップ「Webアプリ制作」1日目
 
Introduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature EngineersIntroduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature Engineers
 
Concentrated HTML5 & Attractive HTML5
Concentrated HTML5 & Attractive HTML5Concentrated HTML5 & Attractive HTML5
Concentrated HTML5 & Attractive HTML5
 
Yesod でブログエンジンをつくってみた
Yesod でブログエンジンをつくってみたYesod でブログエンジンをつくってみた
Yesod でブログエンジンをつくってみた
 

Más de Yasuhiro Onishi

Hatena blogdevelopmentflow
Hatena blogdevelopmentflowHatena blogdevelopmentflow
Hatena blogdevelopmentflowYasuhiro Onishi
 
Redmine::ChanでIRCからプロジェクト管理
Redmine::ChanでIRCからプロジェクト管理Redmine::ChanでIRCからプロジェクト管理
Redmine::ChanでIRCからプロジェクト管理Yasuhiro Onishi
 
新はてなダイアリーの裏側
新はてなダイアリーの裏側新はてなダイアリーの裏側
新はてなダイアリーの裏側Yasuhiro Onishi
 
ウェブアプリケーションのパフォーマンスチューニング
ウェブアプリケーションのパフォーマンスチューニングウェブアプリケーションのパフォーマンスチューニング
ウェブアプリケーションのパフォーマンスチューニングYasuhiro Onishi
 

Más de Yasuhiro Onishi (6)

開発合宿!!!!
開発合宿!!!!開発合宿!!!!
開発合宿!!!!
 
Hatena blogdevelopmentflow
Hatena blogdevelopmentflowHatena blogdevelopmentflow
Hatena blogdevelopmentflow
 
wget.pl
wget.plwget.pl
wget.pl
 
Redmine::ChanでIRCからプロジェクト管理
Redmine::ChanでIRCからプロジェクト管理Redmine::ChanでIRCからプロジェクト管理
Redmine::ChanでIRCからプロジェクト管理
 
新はてなダイアリーの裏側
新はてなダイアリーの裏側新はてなダイアリーの裏側
新はてなダイアリーの裏側
 
ウェブアプリケーションのパフォーマンスチューニング
ウェブアプリケーションのパフォーマンスチューニングウェブアプリケーションのパフォーマンスチューニング
ウェブアプリケーションのパフォーマンスチューニング
 

The new Text::Hatena

Notas del editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n