モダンPerlリファクタリング #yapcasia

B4afc7d853d7f1cb6a253d3c7183c05a?s=47 Naoya Ito
September 20, 2013

モダンPerlリファクタリング #yapcasia

YAPC Asia 2013

B4afc7d853d7f1cb6a253d3c7183c05a?s=128

Naoya Ito

September 20, 2013
Tweet

Transcript

  1. 2.
  2. 4.

    #  Hello,  World     *  list  1   *

     list  2 ▪Hello,  World   ・list  1   ・list  2
  3. 5.
  4. 7.

    "'5&3 package  Text::Md2Inao::Builder::Inao;   use  parent  qw/Text::Md2Inao::Builder/;   use  Text::Md2Inao::Builder::DSL;

        case  default  =>  sub  {          my  ($c,  $h)  =  @_;          fallback_to_html($h);   };     case  a  =>  sub  {          my  ($c,  $h)  =  @_;          my  $url      =  $h-­‐>attr('href');          my  $title  =  $h-­‐>as_trimmed_text;          if  ($url  and  $title)  {                  return  sprintf  "%s◆注/◆%s◆/注◆",  $title,  $url;          }  else  {                  return  fallback_to_html($h);          }   };     ...  
  5. 8.
  6. 10.

    ϦϑΝΫλϦϯάͷྲྀΕ •  Լ४උ –  σΟϨΫτϦΛ੔͑ͯ(JUIVCʹ –  $1"/Ϟδϡʔϧચ͍ग़͠ •  શମΛϞδϡʔϧԽͯ͠"1*ఆٛ • 

    &OEUP&OEͷςετ •  ҎԼ܁Γฦ͠ –  ࡉ͔͍ςετ –  ϦϑΝΫλϦϯά •  ճؼςετΛཷΊΔ
  7. 11.
  8. 13.
  9. 14.

    $1"/Ϟδϡʔϧચ͍ग़͠ •  $BSUPO DQBOpMF •  ΑΓϙʔλϒϧʹ #  cpanfile   requires

     'Text::Markdown';   requires  'HTML::TreeBuilder';   requires  'Unicode::EastAsianWidth';   requires  'Pod::Usage';   ...  
  10. 15.

    DBSUPOFYFD %  carton  install   %  carton  exec  perl  bin/md2inao.pl

      •  ϥΠϒϥϦΛϩʔΧϧύεલఏʹ ີ෧ػೳ  –  ʮଞͰೖΕͨϞδϡʔϧͰಈ͍ͯͨʯΛճආ •  ґଘϞδϡʔϧͷόʔδϣϯΛݫີʹݻఆ DBSUPOFYFD͠ͳ͕Β଍Γͳ͍ϞδϡʔϧΛ DQBOpMFʹ௥ه˰͋ΒෆࢥٞɺϞδϡʔϧҰཡ ͷͰ͖͕͋Γ
  11. 17.

    શମΛͻͱͭͷϞδϡʔϧʹ my  $inao  =  Text::Md2Inao-­‐>new({      default_list    

                     =>  'disc',      max_list_length                =>  63,      max_inline_list_length  =>  55,   });     print  $inao-­‐>parse($markdown)  
  12. 18.

    package  Text::Md2Inao;     sub  parse  {      my

     $markdown  =  shift;      ...      return  $inao;   }   ·ͣ͸ͬ͘͟Γ෴͏
  13. 19.

    ςετ͕ॻ͚Δ use  Test::More;     my  $inao  =  Text::Md2Inao-­‐>new  

    my  $out  =  $inao-­‐>parse("#  Hello,  World");   is  $out,  "▪Hello,  World";     done_testing;  
  14. 20.

    %  carton  exec  -­‐Ilib  -­‐-­‐  prove  t/01_api.t   t/01_api.t  ..

     ok   All  tests  successful.   Files=1,  Tests=1,    0  wallclock  secs  (  0.02  usr     0.00  sys  +    0.09  cusr    0.00  csys  =    0.11  CPU)   Result:  PASS  
  15. 25.

    NEJOBPͰ͸5FTU#BTF use  Test::Base;     use  Text::Md2Inao;     plan

     tests  =>  1  *  blocks;     run_is  in  =>  'expected';     sub  md2inao  {  Text::Md2Inao-­‐>new-­‐>parse($_)  }     __END__   ===   -­‐-­‐-­‐  in  md2inao   #  見出し1(大見出し、節)     -­‐-­‐-­‐  expected   ▪見出し1(大見出し、節)     ===   -­‐-­‐-­‐  in  md2inao   ##  見出し2(中見出し、項)     -­‐-­‐-­‐  expected   ▪▪見出し2(中見出し、項)  
  16. 26.

    8FCΞϓϦέʔγϣϯͷ৔߹ •  1MBDLԽͯ͠1MBDL5FTUͳͲ use  Test::More;   use  Plack::Test;    

    ...     #  $app  :  PSGI  application   test_psgi  $app,  sub  {        like  shift-­‐>(GET  "/amazlet/")-­‐>content,  qr/<!-­‐-­‐  locale:  jp  -­‐-­‐>/     };  
  17. 27.

    $(*ͳΜͰ͚͢Ͳŋŋŋ •  1MBDL"QQ8SBQ$(*Ͱ1MBDLԽ͢Δ use  Plack::Builder;   use  Plack::App::WrapCGI;    

    builder  {      mount  "/cgi-­‐bin/amazlet.cgi"  =>  Plack::App::WrapCGI-­‐>new(          script  =>  './htdocs/amazlet.cgi',  execute  =>  1      )-­‐>to_app;   };  
  18. 31.

    ճؼςετΛཷΊࠐΉ %  ls  t/99_rt_*  |  cat   t/99_rt_blockquote_id.t   t/99_rt_bold.t

      t/99_rt_indent.t   t/99_rt_list.t   t/99_rt_list_id.t   t/99_rt_list_in_column.t   t/99_rt_nested_parentheses.t   t/99_rt_paragraph.t   t/99_rt_quotes.t   t/99_rt_ruby_in_footnote.t   t/99_rt_table_indent.t   ...   •  όάൃݟˠճؼςετॻ͘ˠςετ௨͢
  19. 32.
  20. 40.

    ςετ͸ɺ͍͍ͩͨͰɻ Ͱ΋සൟʹ࣮ߦ •  ·ͣ͸ϦϑΝΫλϦϯά͕ා͘ͳ͍ఔ౓ʹς ετ͕͋Ε͹͍͍ –  ϦϑΝΫλϦϯά͕ਐΉͱςετ͕ॻ͖΍͘͢ –  ࣗવͱΧόϨοδ͸্͕Δ • 

    ϦϑΝΫλϦϯάதʹݟ͚ͭͨόάͷճؼς ετΛཷΊΑ͏ –  ࣗવͱݎ࿚ʹͳ͍ͬͯ͘ •  ࡞ͬͨςετ͸ͪΐͬͱߋ৽ͷ౓ɺසൟʹ࣮ ߦ͠Α͏
  21. 41.

    (PPE+PC package  Text::Md2Inao::Builder::Inao;   use  parent  qw/Text::Md2Inao::Builder/;   use  Text::Md2Inao::Builder::DSL;

        case  default  =>  sub  {          my  ($c,  $h)  =  @_;          fallback_to_html($h);   };     case  a  =>  sub  {          my  ($c,  $h)  =  @_;          my  $url      =  $h-­‐>attr('href');          my  $title  =  $h-­‐>as_trimmed_text;          if  ($url  and  $title)  {                  return  sprintf  "%s◆注/◆%s◆/注◆",  $title,  $url;          }  else  {                  return  fallback_to_html($h);          }   };     ...