Slide 1

Slide 1 text

Ϟμϯ1FSMϦϑΝΫλϦϯά !OBPZB@JUP

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

.BSLEPXO5P*OBP NEJOBP

Slide 4

Slide 4 text

#  Hello,  World     *  list  1   *  list  2 ■Hello,  World   ・list  1   ・list  2

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

ߏ଄తʹػೳΛ͚ͭՃ͑ʹ͍͘ϓϩ άϥϜʹ৽نػೳΛ௥Ճ͠ͳ͚Ε͹ͳ Βͳ͍৔߹ʹ͸ɺ·ͣػೳ௥Ճ͕؆୯ ʹͳΔΑ͏ʹϦϑΝΫλϦϯάΛͯ͠ ͔Β௥ՃΛߦ͏͜ͱɻ 1 ʰϦϑΝΫλϦϯάϓϩάϥϛϯάͷମ࣭վળςΫχοΫʱ ϚʔνϯɾϑΝ΢ϥʔ

Slide 7

Slide 7 text

"'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);          }   };     ...  

Slide 8

Slide 8 text

લఏ

Slide 9

Slide 9 text

ಓ۩ •  $BSUPODQBOpMF •  (JUIVC •  ςετ •  $*ɺ(VBSE

Slide 10

Slide 10 text

ϦϑΝΫλϦϯάͷྲྀΕ •  Լ४උ –  σΟϨΫτϦΛ੔͑ͯ(JUIVCʹ –  $1"/Ϟδϡʔϧચ͍ग़͠ •  શମΛϞδϡʔϧԽͯ͠"1*ఆٛ •  &OEUP&OEͷςετ •  ҎԼ܁Γฦ͠ –  ࡉ͔͍ςετ –  ϦϑΝΫλϦϯά •  ճؼςετΛཷΊΔ

Slide 11

Slide 11 text

Լ४උ

Slide 12

Slide 12 text

σΟϨΫτϦΛ੔͑ͯ(JUIVC΁ •  $1"/Ϟδϡʔϧͱಉ͡σΟϨΫτϦϨΠ Ξ΢τʹ͢Δ – ֤छπʔϧͷԸܙʹ༩Δ •  QSPWFɺ$BSUPOɺ(VBSEɺ5SBWJT$*

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

$1"/Ϟδϡʔϧચ͍ग़͠ •  $BSUPODQBOpMF •  ΑΓϙʔλϒϧʹ #  cpanfile   requires  'Text::Markdown';   requires  'HTML::TreeBuilder';   requires  'Unicode::EastAsianWidth';   requires  'Pod::Usage';   ...  

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

͍͟ϦϑΝΫλϦϯά

Slide 17

Slide 17 text

શମΛͻͱͭͷϞδϡʔϧʹ my  $inao  =  Text::Md2Inao-­‐>new({      default_list                      =>  'disc',      max_list_length                =>  63,      max_inline_list_length  =>  55,   });     print  $inao-­‐>parse($markdown)  

Slide 18

Slide 18 text

package  Text::Md2Inao;     sub  parse  {      my  $markdown  =  shift;      ...      return  $inao;   }   ·ͣ͸ͬ͘͟Γ෴͏

Slide 19

Slide 19 text

ςετ͕ॻ͚Δ use  Test::More;     my  $inao  =  Text::Md2Inao-­‐>new   my  $out  =  $inao-­‐>parse("#  Hello,  World");   is  $out,  "■Hello,  World";     done_testing;  

Slide 20

Slide 20 text

%  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  

Slide 21

Slide 21 text

ϦϑΝΫλϦϯάΛ։࢝͢Δͱ͖ɺ ࠷ॳʹ͢Δ͜ͱ͸ৗʹಉ͡Ͱ͢ɻର৅ ͱͳΔίʔυʹ͍͖ͭͯͪΜͱͨ͠ς ετ܈Λ࡞Γ্͛Δ͜ͱͰ͢ 1 ʰϦϑΝΫλϦϯάϓϩάϥϛϯάͷମ࣭վળςΫχοΫʱ ϚʔνϯɾϑΝ΢ϥʔ

Slide 22

Slide 22 text

جຊઓུ •  ࣮ߦ؀ڥͱΞϓϦέʔγϣϯΛ෼཭͢Δ – $6*ͳΒ45%*/45%065ͷ*0 – 8FCΞϓϦͳΒ)551αʔόʔ •  ෼཭ͨ͠ΞϓϦέʔγϣϯଆͷҰ൪େ͖ ͳ"1*ͷςετΛॻ͘ – ͜Ε͕&OEUP&OEͷςετ

Slide 23

Slide 23 text

&OEUP&OEͷςετ͔Β࢝ΊΔ •  ·ͣ͸֎ଆͷʮৼΔ෣͍ʯΛอূ – ͦͷͨΊͷ֎෦"1*ͬ͘͟ΓϞδϡʔϧԽ

Slide 24

Slide 24 text

ϦϑΝΫλϦϯά ໊ࢺ ֎෦͔Β ݟͨͱ͖ͷৼΔ෣͍Λอͪͭͭɺཧղ ΍मਖ਼͕؆୯ʹͳΔΑ͏ʹɺιϑτ ΢ΣΞͷ಺෦ߏ଄ΛมԽͤ͞Δ͜ ͱɻ 1 ʰϦϑΝΫλϦϯάϓϩάϥϛϯάͷମ࣭վળςΫχοΫʱ ϚʔνϯɾϑΝ΢ϥʔ

Slide 25

Slide 25 text

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(中見出し、項)  

Slide 26

Slide 26 text

8FCΞϓϦέʔγϣϯͷ৔߹ •  1MBDLԽͯ͠1MBDL5FTUͳͲ use  Test::More;   use  Plack::Test;     ...     #  $app  :  PSGI  application   test_psgi  $app,  sub  {        like  shift-­‐>(GET  "/amazlet/")-­‐>content,  qr//     };  

Slide 27

Slide 27 text

$(*ͳΜͰ͚͢Ͳŋŋŋ •  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;   };  

Slide 28

Slide 28 text

࣮ߦ؀ڥ͕ີ݁߹ͨ͠ ಠࣗ'8ͳΜͰ͚͢Ͳŋŋŋ •  IFBEMFTTϒϥ΢βͰ&&ςετ͢Δ – DBQZCBSBXFCLJUIFBEMFTTͱ͔ – ͦͷޙɺ1MBDLԽͯ͠'8Λ෼཭ 3VCZ͚ͩͲͳ

Slide 29

Slide 29 text

͋ͱ͸ɺҎԼ܁Γฦ͠ •  ΑΓཻ౓ͷࡉ͔͍ςετΛ௥Ճ – ࡉ͔͍σʔλͰͷ&OEUP&OE – ಺෦ϞδϡʔϧͷϢχοτςετ •  ϦϑΝΫλϦϯάΛਐΊΔ ςετ͑͋͞Ε͹ɺͲΜͳʹϨΨ γʔͰ΋ϦϑΝΫλϦϯά͸೉͘͠ ͳ͍ɻ

Slide 30

Slide 30 text

όάϨϙʔτΛड͚औͬͨΒɺ·ͣ ͦͷόάΛ໌Β͔ʹ͢ΔͨΊͷ୯ମς ετΛॻ͚ɻ 1 ʰϦϑΝΫλϦϯάϓϩάϥϛϯάͷମ࣭վળςΫχοΫʱ ϚʔνϯɾϑΝ΢ϥʔ

Slide 31

Slide 31 text

ճؼςετΛཷΊࠐΉ %  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   ...   •  όάൃݟˠճؼςετॻ͘ˠςετ௨͢

Slide 32

Slide 32 text

ίπ

Slide 33

Slide 33 text

ςετ͸͜·Ίʹճͦ͏

Slide 34

Slide 34 text

ςετΛසൟʹͤΑɻίϯύΠϧ࣌ ʹ͸ςετΛہॴԽͯ͠ɺ೔ʹ࠷௿ ౓͸͢΂ͯͷςετΛ࣮ߦͤ Αɻ 1 ʰϦϑΝΫλϦϯάϓϩάϥϛϯάͷମ࣭վળςΫχοΫʱ ϚʔνϯɾϑΝ΢ϥʔ

Slide 35

Slide 35 text

ܧଓతΠϯςάϨʔγϣϯ 5SBWJT$*

Slide 36

Slide 36 text

(VBSEHVBSEUBQ h"p://hitode909.hatenablog.com/entry/2013/05/11/190623

Slide 37

Slide 37 text

ςετ͸ແཧͤͣ ʮ΄Ͳ΄Ͳʯఔ౓ʹ

Slide 38

Slide 38 text

ෆ׬શͳςετͰ΋ɺॻ͍࣮ͯߦ͢ Δํ͕ɺ࣮ߦͰ͖ͳ͍׬શͳςετ ΑΓ΋·ͩ͠ɻ 1 ʰϦϑΝΫλϦϯάϓϩάϥϛϯάͷମ࣭վળςΫχοΫʱ ϚʔνϯɾϑΝ΢ϥʔ

Slide 39

Slide 39 text

%))΋͜͏ݴ͍ͬͯΔ •  ʮΧόϨοδ͸Λ໨ࢦ͞ͳ͍ʯ •  ʮ࡞ۀͷ൒෼Ҏ্͕ςετɺ͸͓͔͍͠ʯ •  ʮςετϑΝʔετʹͩ͜ΘΒͳ͍ʯ – ͕ςετϑΝʔετͰ͕ςετΞ ϑλʔ h"p://37signals.com/svn/posts/3159-­‐tes@ng-­‐like-­‐the-­‐tsa

Slide 40

Slide 40 text

ςετ͸ɺ͍͍ͩͨͰɻ Ͱ΋සൟʹ࣮ߦ •  ·ͣ͸ϦϑΝΫλϦϯά͕ා͘ͳ͍ఔ౓ʹς ετ͕͋Ε͹͍͍ –  ϦϑΝΫλϦϯά͕ਐΉͱςετ͕ॻ͖΍͘͢ –  ࣗવͱΧόϨοδ͸্͕Δ •  ϦϑΝΫλϦϯάதʹݟ͚ͭͨόάͷճؼς ετΛཷΊΑ͏ –  ࣗવͱݎ࿚ʹͳ͍ͬͯ͘ •  ࡞ͬͨςετ͸ͪΐͬͱߋ৽ͷ౓ɺසൟʹ࣮ ߦ͠Α͏

Slide 41

Slide 41 text

(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);          }   };     ...