そうだGo、京都 (https://go-kyoto.connpass.com/event/55599/) で発表した資料です。
GoͰܰྔϚʔΫΞοϓݴޠͷύʔαʔΛॻ͘id:aereal
View Slide
ܰྔϚʔΫΞοϓݴޠͱ• ҎԼ LML = Lightweight Markup Language• HTMLXMLͱϓϨʔϯςΩετͷதؒ• Markdown, Textile, ͯͳه๏, etc.
GoͰͯͳه๏ͷύʔαʔΛॻ͘id:aereal
ࣗݾհ• id:aereal• Twitter: aereal• GitHub: aereal• גࣜձࣾͯͳ ΞϓϦέʔγϣϯΤϯδχΞ
!͓͜ͱΘΓ!• ࠓճհ͢Δͯͳه๏ύʔαʔ ϓϥΠϕʔτϫʔΫͰ͢• ͯͳͷαʔϏεʹ࠾༻͞ΕΔ͔ͳͲ ͯ͢ະఆͰ͢
ࢀߟใ• ͜ͷࢿྉͰհ͢Δใͯ͢ 2017gokyoto ͱ͍͏λάΛ͚ͭͯϒοΫϚʔΫ͍ͯ͠·͢• http://b.hatena.ne.jp/aereal/2017gokyoto/
ͯͳه๏ͱ• ͯͳ͕ఏڙ͢ΔαʔϏεͷҰ෦Ͱ͑ΔLML• ͯͳϒϩάɺͯͳμΠΞϦʔ• org-modeͱͪΐͬͱࣅ͍ͯΔ
ͯͳه๏ͷྫ* ݟग़͠1** ݟग़͠2- Ruby- Perl- Go+ ى+ ঝ+ స+ ݁
ͳͥύʔαʔΛॻ͘?• طʹಈ͍͍ͯΔͷʹखΛՃ͑ΔͷͰμϝ?• ͳͥͯͳه๏?• ͳͥGoͰ?
Ϟνϕʔγϣϯ• طଘͷ࣮ʹखΛՃ͑ΔͷΉ͔͍ͣ͠• ͯͳه๏Λύʔε͍ͨ͠χʔζ͋Δ!• Go͕ॻ͖͔ͨͬͨ
طଘͷ࣮ʹखΛՃ͑ΔͷΉ͔͍ͣ͠• ܗࣜతͳఆ͕ٛͳ͍ = ಈ͘ίʔυ͕༷• ਖ਼نදݱ
ͯͳه๏Λύʔε͍ͨ͠χʔζ͋Δ!• ͯͳάϧʔϓͰීஈ͔Βॻ͍͍ͯΔ• ͯͳϒϩάͰهΛॻ͘ͷ͕झຯ• →ͯͳه๏ʹৗతʹ৮Ε͍ͯΔ• Markdownͷม (...)
Go͕ॻ͖͔ͨͬͨ• ීஈPerlJavaScriptɺͨ·ʹScala• ۀͱҟͳΔίϯςΩετͰίʔυΛॻ͖͔ͨͬͨ
ͪΐ͏Ͳ͍͍ඪ• Ͱ͖Δ͜ͱɺΓ͍ͨ͜ͱɺؔ৺ͷ͋Δ͜ͱ͕ ͍͍͔Μ͡ʹόϥϯε͞Ε͍ͯΔ• WebͱςΩετϓϩηογϯά• খඪΛੵΈॏͶ͍͚ͯΔ• ʮࠓ͜ͷه๏ΛՃ͠Α͏ʯ
108͋Δͯͳه๏ύʔαʔ• ͯͳμΠΞϦʔ• ͯͳάϧʔϓ• Text-Hatena (CPAN)• Text-Xatena• chris4403/WikiTextConverter• ...
108͋Δͯͳه๏ύʔαʔ• ͦΕͧΕඍົʹ༷͕ҟͳΔ• ৽͘͠࡞ΒΕͨͷ΄ͲεʔύʔηοτͷఆٛΛ ࢼΈΔ͕͋Δ
ܗࣜతͳఆٛΛ༩͍͑ͨ• ࣮ͱఆٛΛૄʹ͍ͨ͠• ఆ͚ٛͩΛࢀর͍ͨ͠• ͤΊͯCommonMark͘Β͍ͷͷ……• (ͱ͍࣮͑ͱϦϯΫͤ͞ΒΕΔ΄͏͕Α͍)
aereal/go-text-hatenahttps://github.com/aereal/go-text-hatena
࣮ͨ͠ه๏• ݟग़͠• Ϧετ• Ҿ༻• HTTPه๏ (Ұ෦)
ࢦ͢ͱ͜Ζ• ϙʔλϒϧͰ͋Δ͜ͱ• ݴޠʹґΒͣར༻Ͱ͖Δ• ར༻ऀ͕ҙͷHTMLมϧʔϧΛద༻Ͱ͖Δ• ࣮ͱఆٛΛૄʹ• ఆٛΛ੩తʹࢀরͰ͖Δ• ࣮ݴޠ (Go) ͷ͕ࣝͳͯ͘งғؾ௫ΊΔ
࣮• GoͰೖग़ྗΛΠϯλʔϑΣʔεͱ͢ΔόΠφϦ• → ݴޠʹґΒͣར༻Ͱ͖Δ• ASTΛJSONͰग़ྗ͢Δ͚ͩ• → ར༻ऀ͕ҙͷHTMLมϧʔϧΛద༻ (࣮)Ͱ͖Δ
࣮• goyaccΛ͍YACCͰจ๏ఆٛ• → ఆٛΛ੩తʹࢀরͰ͖Δ (parser.go.y)• ࣮ݴޠ (Go) ͷ͕ࣝͳͯ͘งғؾ௫ΊΔ
HTMLͷม• αʔϏεʹΑͬͯͲΕ͘Β͍HTMLͷೖྗΛ ڐ༰͢Δ͔ͷํ͕ҟͳΔ• ͯͳϒϩάࣗ༝͕ͩɺͯͳμΠΞϦʔ ϗϫΠτϦετܗࣜ• ηΩϡϦςΟ্ͷࣄ
มσϞ• aereal/sketch-hatena-notation-api
GoͰύʔαʔΛॻ͘
ͬͨπʔϧ• Go• goyacc• text/scanner
goyacc• yaccͷGo൛• ࠷ۙ go tool ͔Β֎Εͨ• go get golang.org/x/tools/cmd/goyacc
yacc• ύʔαʔδΣωϨʔλʔ• BNF• ఆٛʹରͯ͠ίʔϧόοΫΛॻ͍͍ͯ͘• ؐݩͱΞΫγϣϯͱݺΕΔ• शyacc͕͓͢͢Ί• ࣮ྫͱͯ͠ mattn/streeem ࢀߟʹͳΔ
yaccͷ͍͍ͱ͜Ζ• BNFʹΑΔఆٛͱɺؐݩ͢Δίʔυ͕Ͱ͖Δ• ݴޠDSLΛ͏ύʔαʔίϯϏωʔλʔΑΓ ଞͷਓʹݺΜͰΒ͍͍͢ؾ͕͢Δ
yaccͷඍົͳͱ͜Ζ• *.go.y ͰΤσΟλͷࢧԉ͕ड͚ΒΕͳ͍• ͏·͍͜ͱઃఆͨ͠ΒͰ͖ͦ͏Ͱ͋Δ• ࣈ۟ղੳࣗͰؤுΔඞཁ͕͋Δ• GoͰ text/scanner ͱ͍͏ඪ४ϥΠϒϥϦ͕ ͋ΔͷͰָͰ͖Δ
ίʔυΛಡΜͰΈΔ• lex.go• parser.go.y• parser_test.go
·ͱΊ
·ͱΊ• ͯͳه๏ύʔαʔΛGoͰॻ͍ͨ• Goʹgoyacctext/scannerͳͲ ߏจղੳࣈ۟ղੳͷͨΊͷπʔϧ͕ἧ͍ͬͯΔ