Successfully reported this slideshow.
Your SlideShare is downloading. ×

The new Text::Hatena

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Loading in …3
×

Check these out next

1 of 34 Ad

More Related Content

Similar to The new Text::Hatena (18)

Advertisement

The new Text::Hatena

  1. 1. この夏の最新 Text::Hatena をお届けします!! 2012/08/18 大西康裕 (id:onishi) はてな
  2. 2. 自己紹介 • id:onishi - 大西康裕 • 株式会社はてな (2001∼) • チーフエンジニア • はてなブログディレクター • @yasuhiro_onishi • PAUSE: ONISHI - Devel::KYTProf
  3. 3. Text::Hatena とは はてな記法を HTMLに変換 するモジュール
  4. 4. はてな記法とは • はてなブログやはてなダイアリーやはてなグ ループで使える書式 • かんたんな記述でHTML文書構造や自動リン クが書ける • hatenadiary.g.hatena.ne.jp/keyword/ はてな記法一覧
  5. 5. 入力支援(ブロック記法)
  6. 6. 自動リンク(インライン記法)
  7. 7. たくさんの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
  8. 8. Text::Hatena # ∼0.16 use Text::Hatena; # 0.16 my $parser = Text::Hatena->new; $parser->parse($text); my $html = $parser->html;
  9. 9. Text::Hatena # 0.20 use Text::Hatena; # 0.20 my $html = Text::Hatena->parse($text);
  10. 10. Text::Xatena use Text::Xatena; my $thx = Text::Xatena->new; $thx->format($string);
  11. 11. Text::HatenaLite use Text::HatenaLite::Parser; my $html = Text::HatenaLite::Parser ->parse_string($string);
  12. 12. もっとたくさんの… • Hatena::Diary::HTMLParserBody • Hatena2::Group::HTMLParserBody • Hatena::Bookmark::TextFormat • Hatena::Haiku::Body
  13. 13. Hatena::Diary::HTMLParserBody • 最初のはてな記法 Parser • 2008年までテストなかった • 1200行のメソッド • まだ使われています…
  14. 14. H::D::HTMLParserBody#makelink
  15. 15. 記法展開の難しさ(1) テキストをHTMLにするものだけど HTML::Parserベース • はてな記法はHTMLタグが使える • コメント記法 • スーパーPRE記法
  16. 16. 記法展開の難しさ(1) <script> ここは記法展開しないよ </script> <!-- ここは消えるよ --> >|| 記法展開しないでPREになるよ ||<
  17. 17. 記法展開の難しさ(1) <script> >|| ここはどうなる? ||< </script> >|| <!-- ここはどうなる? --> ||<
  18. 18. 記法展開の難しさ(1) 記法とHTMLを 同時に解釈しな ければいけない
  19. 19. 記法展開の難しさ(2) 3つのことを同時にやっている • 記法の展開 • キーワードリンク • XSS対策(ホワイトリストによるscript制限)
  20. 20. 記法展開の難しさ(2) どうしてこうなった • 記法とキーワードリンクが密結合している • []キーワードリンクしない記法[] • 記法展開すると意味を失う
  21. 21. 記法展開の難しさ(2) 記法展開とキーワー ドリンクを同時に行 わなければならない
  22. 22. このため 記法展開とキーワードリンクが密結 合であるため、Text::Hatena な どの記法展開だけのモジュールを 作っても、実際のプロダクト(はて なダイアリー)で利用できなかった
  23. 23. どうしよう
  24. 24. メタデータによる疎結合化 記法展開時に 「これ以上リンクしない」という カスタムデータ属性を付与 <span data-unlink> ここはこれ以上リンクしない </span>
  25. 25. メタデータによる疎結合化 } • 記法パーサ • data-unlink属性を付与 疎結合化 • キーワードリンカ • data-unlink属性を見てリンクを判断
  26. 26. The new Text::Hatena • Text::Xatena をベースに (©cho45) • カスタムデータ属性を使って記法展開とキー ワードリンクを疎結合化 • 過去(や類似)のインターフェース互換 • 多くのはてな記法に対応 • 実際にはてなブログで利用している
  27. 27. インターフェース後方互換 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);
  28. 28. 単体でも使える便利モジュール •Text::Hatena::Keyword • キーワードリンカ •Text::Hatena::Embed • URL埋め込み支援([http:embed]記法)
  29. 29. 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); # リンク
  30. 30. Text::Hatena::Embed URLを渡すといい感じにembed my $embed = Text::Hatena::Embed->new; my $html = $embed->render($url); www.slideshare.net/onishi/oembed-texthatena
  31. 31. github.com/onishi/Text-Hatena 本日公開しました!! どうぞご利用ください!! pull request ください!!
  32. 32. はてなブログ 27週連続新機能リリース中 日本一開発がホットなブログ hatenablog.com
  33. 33. 人材募集 • 株式会社はてなではエンジニアその他 全職種を募集しています • 一緒にブログを作りましょう! www.hatena.ne.jp/company/staff
  34. 34. ご清聴ありがとうございました

Editor's Notes

  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

×