Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ふりがな付きHTML文書に対する文字列探索

Tadashi Saito
January 23, 2023

 ふりがな付きHTML文書に対する文字列探索

第64回プログラミング・シンポジウム 一般講演
https://prosym.org/64/program.html#day1

• 「<ruby>吾輩<rp>(</rp><rt>わがはい</rt><rp>)</rp>は」に対して、「吾輩は」「わがはいは」の両方がマッチする探索法・ツールです
• 発表当日の版から、明らかな脱字を二箇所修正しています
 • P15: 文書全体と捉えると → 文書全体を分岐文字列と捉えると
 • P22: コードコメント中のTeXマークアップを有効化
• Speaker Deckの制限で、PDFの物理サイズを大きくしています
 • 仕様として幅のピクセル数が小さいと画質を落とすらしく、これにはPDFの物理幅も影響するようです
 • Beamerのデフォルト出力(今回は幅16cm)では見た目がぼやけたため、A3相当(幅42cm)に拡大していますので、ダウンロード・表示時はご注意ください

Tadashi Saito

January 23, 2023
Tweet

More Decks by Tadashi Saito

Other Decks in Research

Transcript

  1. ;Γ͕ͳ෇͖HTMLจॻʹର͢Δจࣈྻ୳ࡧ ୈ 64 ճϓϩάϥϛϯάɾγϯϙδ΢Ϝ Ұൠߨԋ ᜊ౻ ͨͩ͠ ڡ 1 ؠ࡚

    ӳ࠸2 2023 ೥ 1 ݄ 6 ೔ 1 ిؾ௨৴େֶ େֶӃ৘ใཧ޻ֶݚڀՊ 2 ໌࣏େֶ ཧ޻ֶ෦
  2. ‌ <ruby> ‌ λά HTML Ͱͷ;Γ͕ͳ͸ ‌ <ruby> ‌ λάͰද͢ɽ1999

    ೥ͷ Internet Explorer 5 ʹ ΑΔಠ࣮ࣗ૷ͱ 2001 ೥ͷඪ४ن੍֨ఆΛܦͯɼ20 ೥Ҏ্ͷྺ࢙͕͋Δɽ ྫ͑͹ɼ ‌ Θ͕͸͍ ޗഐ ͸ ‌ ͸ҎԼͷΑ͏ʹॻ͘ɽ ‌ <ruby> ޗഐ <rp>ʢ</rp> <rt>Θ͕͸͍</rt> <rp>ʣ</rp> </ruby> ͸ ‌ 3/26
  3. ‌ <ruby> ‌ λά HTML Ͱͷ;Γ͕ͳ͸ ‌ <ruby> ‌ λάͰද͢ɽ1999

    ೥ͷ Internet Explorer 5 ʹ ΑΔಠ࣮ࣗ૷ͱ 2001 ೥ͷඪ४ن੍֨ఆΛܦͯɼ20 ೥Ҏ্ͷྺ࢙͕͋Δɽ ྫ͑͹ɼ ‌ Θ͕͸͍ ޗഐ ͸ ‌ ͸ҎԼͷΑ͏ʹॻ͘ɽ ‌ <ruby> ޗഐ <rp>ʢ</rp> <rt>Θ͕͸͍</rt> <rp>ʣ</rp> </ruby> ͸ ‌ ‌ <ruby> ‌ ;Γ͕ͳɾ਌จࣈͷશମ 3/26
  4. ‌ <ruby> ‌ λά HTML Ͱͷ;Γ͕ͳ͸ ‌ <ruby> ‌ λάͰද͢ɽ1999

    ೥ͷ Internet Explorer 5 ʹ ΑΔಠ࣮ࣗ૷ͱ 2001 ೥ͷඪ४ن੍֨ఆΛܦͯɼ20 ೥Ҏ্ͷྺ࢙͕͋Δɽ ྫ͑͹ɼ ‌ Θ͕͸͍ ޗഐ ͸ ‌ ͸ҎԼͷΑ͏ʹॻ͘ɽ ‌ <ruby> ޗഐ <rp>ʢ</rp> <rt>Θ͕͸͍</rt> <rp>ʣ</rp> </ruby> ͸ ‌ ‌ <ruby> ‌ ;Γ͕ͳɾ਌จࣈͷશମ ‌ <ruby> ‌ ௚Լ ਌จࣈ 3/26
  5. ‌ <ruby> ‌ λά HTML Ͱͷ;Γ͕ͳ͸ ‌ <ruby> ‌ λάͰද͢ɽ1999

    ೥ͷ Internet Explorer 5 ʹ ΑΔಠ࣮ࣗ૷ͱ 2001 ೥ͷඪ४ن੍֨ఆΛܦͯɼ20 ೥Ҏ্ͷྺ࢙͕͋Δɽ ྫ͑͹ɼ ‌ Θ͕͸͍ ޗഐ ͸ ‌ ͸ҎԼͷΑ͏ʹॻ͘ɽ ‌ <ruby> ޗഐ <rp>ʢ</rp> <rt>Θ͕͸͍</rt> <rp>ʣ</rp> </ruby> ͸ ‌ ‌ <ruby> ‌ ;Γ͕ͳɾ਌จࣈͷશମ ‌ <ruby> ‌ ௚Լ ਌จࣈ ‌ <rt> ‌ ;Γ͕ͳ 3/26
  6. ‌ <ruby> ‌ λά HTML Ͱͷ;Γ͕ͳ͸ ‌ <ruby> ‌ λάͰද͢ɽ1999

    ೥ͷ Internet Explorer 5 ʹ ΑΔಠ࣮ࣗ૷ͱ 2001 ೥ͷඪ४ن੍֨ఆΛܦͯɼ20 ೥Ҏ্ͷྺ࢙͕͋Δɽ ྫ͑͹ɼ ‌ Θ͕͸͍ ޗഐ ͸ ‌ ͸ҎԼͷΑ͏ʹॻ͘ɽ ‌ <ruby> ޗഐ <rp>ʢ</rp> <rt>Θ͕͸͍</rt> <rp>ʣ</rp> </ruby> ͸ ‌ ‌ <ruby> ‌ ;Γ͕ͳɾ਌จࣈͷશମ ‌ <ruby> ‌ ௚Լ ਌จࣈ ‌ <rt> ‌ ;Γ͕ͳ ‌ <rp> ‌ ݹ͍ϒϥ΢β༻ɼ ‌ <ruby> ‌ ରԠϒϥ΢βͰ͸ແࢹ 3/26
  7. ‌ <ruby> ‌ λά HTML Ͱͷ;Γ͕ͳ͸ ‌ <ruby> ‌ λάͰද͢ɽ1999

    ೥ͷ Internet Explorer 5 ʹ ΑΔಠ࣮ࣗ૷ͱ 2001 ೥ͷඪ४ن੍֨ఆΛܦͯɼ20 ೥Ҏ্ͷྺ࢙͕͋Δɽ ྫ͑͹ɼ ‌ Θ͕͸͍ ޗഐ ͸ ‌ ͸ҎԼͷΑ͏ʹॻ͘ɽ ‌ <ruby> ޗഐ <rp>ʢ</rp> <rt>Θ͕͸͍</rt> <rp>ʣ</rp> </ruby> ͸ ‌ ‌ <ruby> ‌ ;Γ͕ͳɾ਌จࣈͷશମ ‌ <ruby> ‌ ௚Լ ਌จࣈ ‌ <rt> ‌ ;Γ͕ͳ ‌ <rp> ‌ ݹ͍ϒϥ΢β༻ɼ ‌ <ruby> ‌ ରԠϒϥ΢βͰ͸ແࢹ ‌ <rp> ‌ ͋Γ ‌ ޗഐʢΘ͕͸͍ʣ͸ ‌ ‌ <rp> ‌ ͳ͠ ‌ ޗഐΘ͕͸͍͸ ‌ 3/26
  8. ‌ <ruby> ‌ λά HTML Ͱͷ;Γ͕ͳ͸ ‌ <ruby> ‌ λάͰද͢ɽ1999

    ೥ͷ Internet Explorer 5 ʹ ΑΔಠ࣮ࣗ૷ͱ 2001 ೥ͷඪ४ن੍֨ఆΛܦͯɼ20 ೥Ҏ্ͷྺ࢙͕͋Δɽ ྫ͑͹ɼ ‌ Θ͕͸͍ ޗഐ ͸ ‌ ͸ҎԼͷΑ͏ʹॻ͘ɽ ‌ <ruby> ޗഐ <rp>ʢ</rp> <rt>Θ͕͸͍</rt> <rp>ʣ</rp> </ruby> ͸ ‌ ‌ <ruby> ‌ ;Γ͕ͳɾ਌จࣈͷશମ ‌ <ruby> ‌ ௚Լ ਌จࣈ ‌ <rt> ‌ ;Γ͕ͳ ‌ <rp> ‌ ݹ͍ϒϥ΢β༻ɼ ‌ <ruby> ‌ ରԠϒϥ΢βͰ͸ແࢹ ‌ <rp> ‌ ͋Γ ‌ ޗഐʢΘ͕͸͍ʣ͸ ‌ ‌ <rp> ‌ ͳ͠ ‌ ޗഐΘ͕͸͍͸ ‌ 3/26
  9. ‌ <ruby> ‌ λά HTML Ͱͷ;Γ͕ͳ͸ ‌ <ruby> ‌ λάͰද͢ɽ1999

    ೥ͷ Internet Explorer 5 ʹ ΑΔಠ࣮ࣗ૷ͱ 2001 ೥ͷඪ४ن੍֨ఆΛܦͯɼ20 ೥Ҏ্ͷྺ࢙͕͋Δɽ ྫ͑͹ɼ ‌ Θ͕͸͍ ޗഐ ͸ ‌ ͸ҎԼͷΑ͏ʹॻ͘ɽ ‌ <ruby> ޗഐ <rp>ʢ</rp> <rt>Θ͕͸͍</rt> <rp>ʣ</rp> </ruby> ͸ ‌ ‌ <ruby> ‌ ;Γ͕ͳɾ਌จࣈͷશମ ‌ <ruby> ‌ ௚Լ ਌จࣈ ‌ <rt> ‌ ;Γ͕ͳ ‌ <rp> ‌ ݹ͍ϒϥ΢β༻ɼ ‌ <ruby> ‌ ରԠϒϥ΢βͰ͸ແࢹ ‌ <rp> ‌ ͋Γ ‌ ޗഐʢΘ͕͸͍ʣ͸ ‌ ‌ <rp> ‌ ͳ͠ ‌ ޗഐΘ͕͸͍͸ ‌ 3/26
  10. ओཁϒϥ΢βͷ໰୊఺ ݱࡏීٴ͢Δओཁͳϒϥ΢β͸ 3 ͭ͋Δɽ • Firefox Mozillaɼݩ͔ΒΦʔϓϯιʔειϑτ΢ΣΞ • Chrome GoogleɼΦʔϓϯιʔεϒϥ΢β

    Chromium ͕ϕʔε • Safari AppleɼΦʔϓϯιʔεϒϥ΢β WebKit ͕ϕʔε ;Γ͕ͳ෇͖ HTML จॻΛϖʔδ಺ݕࡧ͢Δͱɼ͜ΕΒͷͲͷ࠷৽൛Ͱ΋ ผʑͷ໰୊͕ى͜Δɽ 4/26
  11. ओཁϒϥ΢βͷ໰୊఺: Chrome ;Γ͕ͳɾ਌จࣈͷ྆ํͰݕࡧ͕Մೳɽ͔͠͠ɼ ‌ <ruby> ‌ λάͷલޙʹ ݟ͑ͳ͍ʮนʯ͕ੜ͡ɼจࣈྻͷ෼அ͕ى͜Δɽ ʮ Θ͕͸͍

    ޗഐ ͸ʯͰ͸ɼ ʮ Θ͕͸͍ ޗഐʯͱʮ͸ʯͷؒʹน͕ੜ·Εɼ ʮޗഐ͸ʯͰ΋ɼ ʮΘ͕͸͍͸ʯͰ΋Ϛον͠ͳ͍ɽ 7/26
  12. ओཁϒϥ΢βͷ໰୊఺: Chrome ;Γ͕ͳɾ਌จࣈͷ྆ํͰݕࡧ͕Մೳɽ͔͠͠ɼ ‌ <ruby> ‌ λάͷલޙʹ ݟ͑ͳ͍ʮนʯ͕ੜ͡ɼจࣈྻͷ෼அ͕ى͜Δɽ ʮ Θ͕͸͍

    ޗഐ/͸ʯͰ͸ɼ ʮ Θ͕͸͍ ޗഐʯͱʮ͸ʯͷؒʹน͕ੜ·Εɼ ʮޗഐ͸ʯͰ΋ɼ ʮΘ͕͸͍͸ʯͰ΋Ϛον͠ͳ͍ɽ 7/26
  13. ओཁϒϥ΢βͷ໰୊఺: Chrome ;Γ͕ͳɾ਌จࣈͷ྆ํͰݕࡧ͕Մೳɽ͔͠͠ɼ ‌ <ruby> ‌ λάͷલޙʹ ݟ͑ͳ͍ʮนʯ͕ੜ͡ɼจࣈྻͷ෼அ͕ى͜Δɽ ʮ Θ͕͸͍

    ޗഐ/͸ʯͰ͸ɼ ʮ Θ͕͸͍ ޗഐʯͱʮ͸ʯͷؒʹน͕ੜ·Εɼ ʮޗഐ͸ʯͰ΋ɼ ʮΘ͕͸͍͸ʯͰ΋Ϛον͠ͳ͍ɽ 7/26
  14. ओཁϒϥ΢βͷ໰୊఺: Chrome ;Γ͕ͳɾ਌จࣈͷ྆ํͰݕࡧ͕Մೳɽ͔͠͠ɼ ‌ <ruby> ‌ λάͷલޙʹ ݟ͑ͳ͍ʮนʯ͕ੜ͡ɼจࣈྻͷ෼அ͕ى͜Δɽ ʮ Θ͕͸͍

    ޗഐ/͸ʯͰ͸ɼ ʮ Θ͕͸͍ ޗഐʯͱʮ͸ʯͷؒʹน͕ੜ·Εɼ ʮޗഐ͸ʯͰ΋ɼ ʮΘ͕͸͍͸ʯͰ΋Ϛον͠ͳ͍ɽ 7/26
  15. ๬·͍͠ڍಈ: લఏͱ͢Δؔ܎ ʮ਌จࣈʯͱʮ;Γ͕ͳʯʹ͸ɼҎԼͷؔ܎͕੒Γཱͭͱߟ͑Δɽ 1. ྆ऀͰҰͭͷմʢάϧʔϓʣΛͳ͢ɽ • ‌ <ruby> ‌ λά͸ҰͭͷάϧʔϓͰ͋Δɽ

    2. ྆ऀʹฒྻʹଘࡏ͢Δɽ • ҰྻͰද͢৔߹ɼ ʮޗഐʢΘ͕͸͍ʣ ʯ ɾ ʮΘ͕͸͍ʢޗഐʣ ʯͷ ͍ͣΕ΋ޡΓͰ͸ͳ͍ɽ • ྆ऀ͸ʮॏͳ͍ͬͯΔʯͱݟ၏ͤΔɽ 3. ྆ऀͱ΋લޙͷจࣈྻͱ࿈ଓ͢Δɽ • ʮޗഐʯ ʮΘ͕͸͍ʯͷ྆ํ͕ɼ࣍ͷʮ͸ʯʹͭͳ͕Δɽ • ;Γ͕ͳ͕ಡΈΛࣔ͢৔߹ɼ྆ऀ͸ൃԻ΋౳͍͠ɽ 10/26
  16. ๬·͍͠ڍಈ: લఏͱ͢Δؔ܎ ʮ਌จࣈʯͱʮ;Γ͕ͳʯʹ͸ɼҎԼͷؔ܎͕੒Γཱͭͱߟ͑Δɽ 1. ྆ऀͰҰͭͷմʢάϧʔϓʣΛͳ͢ɽ • ‌ <ruby> ‌ λά͸ҰͭͷάϧʔϓͰ͋Δɽ

    2. ྆ऀʹฒྻʹଘࡏ͢Δɽ • ҰྻͰද͢৔߹ɼ ʮޗഐʢΘ͕͸͍ʣ ʯ ɾ ʮΘ͕͸͍ʢޗഐʣ ʯͷ ͍ͣΕ΋ޡΓͰ͸ͳ͍ɽ • ྆ऀ͸ʮॏͳ͍ͬͯΔʯͱݟ၏ͤΔɽ 3. ྆ऀͱ΋લޙͷจࣈྻͱ࿈ଓ͢Δɽ • ʮޗഐʯ ʮΘ͕͸͍ʯͷ྆ํ͕ɼ࣍ͷʮ͸ʯʹͭͳ͕Δɽ • ;Γ͕ͳ͕ಡΈΛࣔ͢৔߹ɼ྆ऀ͸ൃԻ΋౳͍͠ɽ 10/26
  17. ๬·͍͠ڍಈ: લఏͱ͢Δؔ܎ ʮ਌จࣈʯͱʮ;Γ͕ͳʯʹ͸ɼҎԼͷؔ܎͕੒Γཱͭͱߟ͑Δɽ 1. ྆ऀͰҰͭͷմʢάϧʔϓʣΛͳ͢ɽ • ‌ <ruby> ‌ λά͸ҰͭͷάϧʔϓͰ͋Δɽ

    2. ྆ऀʹฒྻʹଘࡏ͢Δɽ • ҰྻͰද͢৔߹ɼ ʮޗഐʢΘ͕͸͍ʣ ʯ ɾ ʮΘ͕͸͍ʢޗഐʣ ʯͷ ͍ͣΕ΋ޡΓͰ͸ͳ͍ɽ • ྆ऀ͸ʮॏͳ͍ͬͯΔʯͱݟ၏ͤΔɽ 3. ྆ऀͱ΋લޙͷจࣈྻͱ࿈ଓ͢Δɽ • ʮޗഐʯ ʮΘ͕͸͍ʯͷ྆ํ͕ɼ࣍ͷʮ͸ʯʹͭͳ͕Δɽ • ;Γ͕ͳ͕ಡΈΛࣔ͢৔߹ɼ྆ऀ͸ൃԻ΋౳͍͠ɽ 10/26
  18. ๬·͍͠ڍಈ: લఏͱ͢Δؔ܎ ʮ਌จࣈʯͱʮ;Γ͕ͳʯʹ͸ɼҎԼͷؔ܎͕੒Γཱͭͱߟ͑Δɽ 1. ྆ऀͰҰͭͷմʢάϧʔϓʣΛͳ͢ɽ • ‌ <ruby> ‌ λά͸ҰͭͷάϧʔϓͰ͋Δɽ

    2. ྆ऀʹฒྻʹଘࡏ͢Δɽ • ҰྻͰද͢৔߹ɼ ʮޗഐʢΘ͕͸͍ʣ ʯ ɾ ʮΘ͕͸͍ʢޗഐʣ ʯͷ ͍ͣΕ΋ޡΓͰ͸ͳ͍ɽ • ྆ऀ͸ʮॏͳ͍ͬͯΔʯͱݟ၏ͤΔɽ 3. ྆ऀͱ΋લޙͷจࣈྻͱ࿈ଓ͢Δɽ • ʮޗഐʯ ʮΘ͕͸͍ʯͷ྆ํ͕ɼ࣍ͷʮ͸ʯʹͭͳ͕Δɽ • ;Γ͕ͳ͕ಡΈΛࣔ͢৔߹ɼ྆ऀ͸ൃԻ΋౳͍͠ɽ 10/26
  19. ๬·͍͠ڍಈ: લఏͱ͢Δؔ܎ ʮ਌จࣈʯͱʮ;Γ͕ͳʯʹ͸ɼҎԼͷؔ܎͕੒Γཱͭͱߟ͑Δɽ 1. ྆ऀͰҰͭͷմʢάϧʔϓʣΛͳ͢ɽ • ‌ <ruby> ‌ λά͸ҰͭͷάϧʔϓͰ͋Δɽ

    2. ྆ऀʹฒྻʹଘࡏ͢Δɽ • ҰྻͰද͢৔߹ɼ ʮޗഐʢΘ͕͸͍ʣ ʯ ɾ ʮΘ͕͸͍ʢޗഐʣ ʯͷ ͍ͣΕ΋ޡΓͰ͸ͳ͍ɽ • ྆ऀ͸ʮॏͳ͍ͬͯΔʯͱݟ၏ͤΔɽ 3. ྆ऀͱ΋લޙͷจࣈྻͱ࿈ଓ͢Δɽ • ʮޗഐʯ ʮΘ͕͸͍ʯͷ྆ํ͕ɼ࣍ͷʮ͸ʯʹͭͳ͕Δɽ • ;Γ͕ͳ͕ಡΈΛࣔ͢৔߹ɼ྆ऀ͸ൃԻ΋౳͍͠ɽ 10/26
  20. ؔ࿈ݚڀ จࣈྻ୳ࡧ KMP ๏ [Knuth Βɼ 1977] ౳ɽςΩετ͸ҰྻʹฒΜͩจࣈ͕લఏ ਖ਼نදݱ [Thompsonɼ1968]

    ౳ɽॊೈʹࢦఆͰ͖Δͷ͸ύλʔϯଆͷΈɼ ςΩετ͸ݻఆɾจࣈྻ୳ࡧͱಉ༷ͷલఏ શจݕࡧ ܾఆతͰͳ͘ɼࣙॻͷ಺༰͕ϚονΛࠨӈɽຊݚڀͰѻ͏ͷ͸ɼ จॻதʹଘࡏ͢Δจࣈྻͦͷ··ͷ୳ࡧ ෳ਺ͷจࣈྻΛ·ͱΊͯଊ͑ͨจࣈྻ୳ࡧͷݚڀ͸ݟ౰ͨΒͳ͔ͬͨɽ 12/26
  21. ςΩετߏ଄: ৄࡉ は ねこ 猫 である。 • ಺෦ʹจࣈྻ͕ 4 ͭଘࡏ

    • ࠷ॳͷʮ͸ʯ͸਌จࣈɾ;Γ͕ͳͷ྆ํ΁ͭͳ͕Δ • ਌จࣈɾ;Γ͕ͳͷ྆ํ͕ޙଓͷʮͰ͋Δɻʯ΁ͭͳ͕Δ ͜ͷΑ͏ͳߏ଄Λ෼ذจࣈྻͱݺͼɼ௕ํܗͰද͞ΕΔݸʑͷ௨ৗจࣈྻΛ ෦෼ςΩετͱݺͿɽ 14/26
  22. ςΩετߏ଄: ·ͱΊ จॻશମΛ෼ذจࣈྻͱଊ͑Δͱɼ෼ذͱ߹ྲྀ͕܁Γฦ͠ݱΕΔɽ わがはい ねこ なまえ な …… は はまだ

    である。 吾輩 猫 名前 無 い。…… …… • ෼ذɾ߹ྲྀ͸೚ҙͷՕॴͰ೚ҙͷճ਺ൃੜ͢Δ • ߹ྲྀ͠ͳ͍։࢝ɾऴྃ΋ڐ༰͞ΕΔ ͜ͷߏ଄ʹର͢Δจࣈྻ୳ࡧͷ࣮ݱ͕࣍ͷ໰୊ͱͳΔɽ 15/26
  23. طଘΞϧΰϦζϜద༻ͷ೉͠͞ طଘͷจࣈྻ୳ࡧΞϧΰϦζϜΛ෼ذจࣈྻʹద༻Ͱ͖Δ͔ʁ • طଘΞϧΰϦζϜ͸ʮҰྻʹฒΜͩจࣈྻʯ͕ඞཁ • ۪௚ͳํ๏: ͢΂ͯͷ෼ذΛ෼ղ͠ͳ͕Βจࣈྻ୳ࡧ 1. ʮ͸ Ͷ͜

    ೣͰ͋Δɻʯ͔Βɼ2 ͭͷจࣈྻΛॱ࣍ੜ੒ 2. ʮ͸ೣͰ͋Δɻʯͱʮ͸Ͷ͜Ͱ͋Δɻʯ 3. ͦΕͧΕΛैདྷͲ͓Γ୳ࡧʁ ⇒ ୳ࡧର৅͕ࢦ਺ؔ਺తʹ૿Ճ ରࡦ͸Մೳ͕ͩɼࠓճ͜ͷํ਑͸औΒͳ͔ͬͨɽ 16/26
  24. ෼ذจࣈྻͷ୳ࡧ (1) ྗ೚ͤ๏ ௨ৗͷจࣈྻ୳ࡧͰ͋Δʮྗ೚ͤ๏ʯΛجʹɼ·ͣૉ๿ͳ࣮૷͔Β։࢝ɽ const matched = []; // Ϛον݁ՌΛ·ͱΊΔ഑ྻ

    for (const sid of text.sids) { // ෦෼ςΩετͷ ID औಘΛ܁Γฦ͠ const str = text.getString(sid); // ෦෼ςΩετΛऔಘ for (let i = 0; i < str.length; i++) { // ෦෼ςΩετͷจࣈྻ௕͚ͩ܁Γฦ͠ const m = matchFrom(text, sid, i, pat);// ύλʔϯ pat Λ୳ࡧ։࢝ if (m) matched.push(...m); // Ϛον͕͋Ε͹݁Ռͷ഑ྻʹ֨ೲ } } return matched; // ࠷ޙʹ͢΂ͯͷϚον݁ՌΛฦ͢ • ෼ذจࣈྻ text ͷத͔Β෦෼ςΩετ IDɾsid ΛॱʹऔΓग़͢ • sid ͔Β෦෼ςΩετ ‌ str ‌ ΛऔΓग़͠ɼจࣈྻͷ௕͞ΛಘΔ • ఴࣈ ‌ i ‌ Λ ‌ 0 ‌ ͔ΒϧʔϓɼҐஔ ‌ (sid,i) ‌ ͔Β ‌ matchFrom() ‌ Ͱ୳ࡧ։࢝ 17/26
  25. (1) ྗ೚ͤ๏ͷಈ͖ ୳ࡧ։࢝ҐஔΛܾఆޙɼ ‌ matchFrom() ‌ ͸෯༏ઌ୳ࡧʹΑͬͯಈ࡞͢Δɽ • ෦෼ςΩετͱύλʔϯͷจࣈྻͷ௕͞Λൺֱ ෦෼ςΩετ

    ‌ >= ‌ ύλʔϯ ύλʔϯ຤ඌ·Ͱͷর߹Ͱ͙͢ऴྃ ෦෼ςΩετ ‌ < ‌ ύλʔϯ ෦෼ςΩετ຤ඌ·Ͱর߹ɼ੒ཱ࣌͸࢒ΓΛ ࣍ͷ෦෼ςΩετ΁ ͜ΕΒΛɼ࣍ͷ෦෼ςΩετͷর߹͕ෆཁʹͳΔ·Ͱ܁Γฦ͢ɽ 18/26
  26. ෼ذจࣈྻͷ୳ࡧ (2) ྗ೚ͤ๏ͷվྑ طଘͷจࣈྻ୳ࡧΞϧΰϦζϜΛద༻Ͱ͖ͳ͍ཧ༝͸ʁ • Ϛον͕ෳ਺෦෼ςΩετʹ·͕ͨΔՄೳੑ͕͋ΔͨΊ • ʮઈରʹ·͕ͨͳ͍ύλʔϯʯ͕͋Ε͹ɼطଘॲཧ͕׆༻Մೳ =⇒ ҰจࣈͳΒઈରʹ·͕ͨͳ͍ɽ

    վྑҊ 1. ύλʔϯ p ͷઌ಄Ұจࣈ p[0] ͷΈʹண໨ 2. ૯౰Γ࣌ɼ෦෼ςΩετ͝ͱʹඪ४ػೳͰ p[0] Λจࣈྻ୳ࡧ 3. p[0] Ϛον੒൱Ͱ෼ذ ੒ޭ ͦͷҐஔ͔Βैདྷ௨Γͷ୳ࡧΛ։࢝ ࣦഊ ఴࣈ͸ͦΕҎ্ௐ΂ͣɼ࣍ͷ෦෼ςΩετ΁δϟϯϓ 19/26
  27. (2) վྑ൛ͷίʔυࠩ෼ const matched = []; for (const sid of

    text.sids) { const str = text.getString(sid); - for (let i = 0; i < str.length; i++) { + for (let i, j = 0; (i = str.indexOf(pat[0], j)) >= 0; j = i + 1) { const m = matchFrom(text, sid, i, pat); if (m) matched.push(...m); } } return matched; • มߋ͸Ұߦɽඪ४ͷจࣈྻϝιου ‌ indexOf() ‌ Λ׆༻ • ‌ matchFrom() ‌ ʹΑΔ୳ࡧ։࢝ΛεΩοϓ վྑલ จࣈྻͷ௕͞ͱಉ͡ճ਺Λඞͣݺͼग़͠ վྑޙ ‌ indexOf() ‌ ͰҰจࣈ໨͕Ϛονͨ͠Ґஔ͚ͩ 20/26
  28. (2) վྑ൛ͷίʔυࠩ෼ const matched = []; for (const sid of

    text.sids) { const str = text.getString(sid); - for (let i = 0; i < str.length; i++) { + for (let i, j = 0; (i = str.indexOf(pat[0], j)) >= 0; j = i + 1) { const m = matchFrom(text, sid, i, pat); if (m) matched.push(...m); } } return matched; • มߋ͸Ұߦɽඪ४ͷจࣈྻϝιου ‌ indexOf() ‌ Λ׆༻ • ‌ matchFrom() ‌ ʹΑΔ୳ࡧ։࢝ΛεΩοϓ վྑલ จࣈྻͷ௕͞ͱಉ͡ճ਺Λඞͣݺͼग़͠ վྑޙ ‌ indexOf() ‌ ͰҰจࣈ໨͕Ϛονͨ͠Ґஔ͚ͩ =⇒ ‌ matchFrom() ‌ ͷάϥϑ୳ࡧ਺͕ݮΓɼߴ଎Խ͕ظ଴Ͱ͖Δɽ 20/26
  29. ࣮૷ ༗ޮੑͷධՁɾ࣮ূͷͨΊɼJavaScript ϥΠϒϥϦ Ruby Finder ͱͯ͠ఏҊ ख๏Λ࣮૷ɽݱঢ়ɼ؅ཧऀ͕੩తϖʔδʹ૊ΈࠐΉܗͷར༻Λ૝ఆɽ ҰൠϢʔβͷར༻ը໘ྫ • DOM

    ϊʔυ͔Β෼ذจࣈྻςΩετΛ ߏஙɾ୳ࡧ • ES2015 ͷΫϥεߏจΛར༻࣮ͯ͠૷ • ϒϥ΢βͰಈ࡞͢ΔϥΠϒϥϦ • ֎෦ґଘͳ͠ɼϖʔδ΁ͷ૊ࠐ͕༰қ • ओཁ 3 ϒϥ΢β͢΂ͯͰಈ࡞֬ೝࡁΈ 21/26
  30. αΠτ؅ཧऀͷར༻ྫ αΠτ૊ࠐ࣌ͷརศੑͷͨΊɼϥΠϒϥϦͱͯ͠ͷΠϯλʔϑΣʔε͸؆ૉʹอͬͨɽ const finder = new RubyFinder(); // ෼ذจࣈྻςΩετΛߏஙɼҾ਺লུ࣌͸<body> const

    found = finder.find("ޗഐ͸"); // Ҿ਺ͷύλʔϯ͔Βจࣈྻ୳ࡧΛ࣮ߦ console.log(found.count); // ݁Ռ͔ΒϚον݅਺Λऔಘɾදࣔ found.highlightResults(); // ෳ਺ͷϚονՕॴΛϋΠϥΠτՄೳ found.removeHighlighting(); // ϋΠϥΠτ࡟আ ্ه͸ਓ޻తͳྫͰ͋Γɼ࣮༻্͸ҎԼΛ૝ఆɽ·ͨิॿػߏ΋࣮૷༧ఆɽ • new RubyFinder() ͸ DOM ϊʔυಡࠐ࣌ʹҰ౓͚࣮ͩߦ • find() Ҿ਺ͷ಺༰΍୳ࡧ࣮ߦͷλΠϛϯά͸ϑΥʔϜܦ༝ • จࣈྻ୳ࡧͷ࣮ߦͰࣗಈϋΠϥΠτɾ࡟আ 22/26
  31. ධՁ: ֓ཁ ੑೳ໘Ͱͷ࣮༻ੑΛධՁɽओཁ 3 ϒϥ΢βʹରԠ͢ΔΦʔϓϯιʔε࣮૷ʹ ର͠ɼจࣈྻ୳ࡧ࣮ߦͷ࣌ؒΛܭଌͨ͠ɽ ධՁର৅ͷ HTML ϑΝΠϧ͸ 2

    ͭɽ खࢴ ݱ࣮తͳαΠζͷ୹ฤখઆ ޗഐ͸ೣͰ͋Δ ࠷ѱέʔεΛҙਤͨ͠௕ฤখઆ ࡞඼໊ όΠτ਺ ‌ <ruby> ‌ ਺ ຊจจࣈ਺ ύλʔϯ Ϛον਺ खࢴ 44,312 101 12,737 ʮ࠺͸ʯ 9 ޗഐ͸ೣͰ͋Δ 1,497,214 9,214 369,230 ʮޗഐ͸ʯ 189 ·ͨൺֱͷͨΊɼ૊ΈࠐΈจࣈྻ୳ࡧͷ࣮ߦ࣌ؒ΋ܭଌɽ୳ࡧର৅͸௨ৗจࣈྻɼ ‌ <body> ‌ ͷ಺༰͔Β੒ΔʮޗഐʢΘ͕͸͍ʣ͸ʯΑ͏ͳ΋ͷɽ 23/26
  32. ධՁ: (1) ݱ࣮తͳ HTML ͷจࣈྻ୳ࡧ จࣈྻ୳ࡧ: खࢴ (µsec) ୳ࡧํࣜ Firefox

    Chromium WebKit ྗ೚ͤ 16,042 33,738 18,598 վྑྗ೚ͤ 4,315 1,819 3,376 ʢ૊ΈࠐΈʣ 912 471 480 • ྗ೚ͤ๏Ͱ΋࠷ѱͰ໿ 0.034 ඵɼे෼ʹߴ଎ • վྑྗ೚ͤ๏Ͱ͸͞Βʹ 18.5 ഒҎ্ߴ଎Խ 24/26
  33. ධՁ: (2) ڊେͳ HTML ͷจࣈྻ୳ࡧ จࣈྻ୳ࡧ: ޗഐ͸ೣͰ͋Δ (µsec) ୳ࡧํࣜ Firefox

    Chromium WebKit ྗ೚ͤ 77,940 343,446 186,372 վྑྗ೚ͤ 8,130 10,285 12,688 ʢ૊ΈࠐΈʣ 1,860 808 887 • ྗ೚ͤ๏ͷ࣮ߦ͕࣌ؒେ෯ʹ૿Ճ • ࠷ѱέʔεͰ໿ 0.34 ඵɼ૊ΈࠐΈ୳ࡧͱͷൺ΋ѱԽ • ͔͠͠վྑ൛͸໿ 0.013 ඵɼ࣮༻ੑΛҡ࣋ 25/26
  34. ࣮૷ͷΫϥεߏ੒ 1 1 1 1..* 1 1 1 1 1

    1 1 1..* 1 1..* 1 1..* 1 1 RubyFinder BranchString StringNode String Node FoundData BranchStringRange DomPath શମΛ ‌ RubyFinder ‌ ͕౷ׅɼϢʔβ͕ҙࣝ ͢Δͷ͸ ‌ FoundData ‌ ͱͷ 2 ͭͷΈɽ • ‌ RubyFinder ‌ ͕ DOM ͔Β෼ذจࣈྻ ‌ BranchString ‌ ΁ม׵΋୲౰ • ‌ BranchString ‌ Λจࣈྻ୳ࡧ͢Δͱ ‌ FoundData ‌ Λฦ͢ • ‌ FoundData ‌ ͸ෳ਺ͷ DOM ϊʔυɾൣғ ΁ͷࢀরΛอ࣋