Home About Contact
Text Processing , Kotlin

マークアップテキストのパース、ネストしたブロッククオートに対処(改善版)

前回のエントリー の改善版です。 Tree クラスが本来不要な情報を保持できるように定義していたことで、 コード全体が冗長になっていました。 そこを改善します。

元はこのように定義していました。

sealed class TreeValue(open val lines: List<Line>){
    data class Just(override val lines: List<Line>): TreeValue(lines)
    data class BlockQuote(override val lines: List<Line>): TreeValue(lines)
    object Nothing: TreeValue(listOf())
}

sealed class Tree(open val value: TreeValue){
    data class Leaf(override val value: TreeValue): Tree(value)
    data class Node(override val value: TreeValue, val children: List<Tree>): Tree(value)
}

しかし、実際は次のような定義で事足りることが判明。

sealed class TreeValue(open val lines: List<Line>){
    data class Just(override val lines: List<Line>): TreeValue(lines)
    data class BlockQuote(override val lines: List<Line>): TreeValue(lines)
}

sealed class Tree {
    data class Leaf(val value: TreeValue): Tree()
    data class Node(val children: List<Tree>): Tree()
}

定義を見れば一目瞭然ですが、Tree.Leaf にのみ value が出現する。

この変更を反映して(それにともない発生した変更個所を修正したあと)次のコードを実行してみる。

val markupText = """
xxx
yyy
> aaa
> bbb
> > ccc
> > ddd
> > eee
> fff
> ggg
hhh
iii
"""

val children = buildTree(markupText)
val rootTree = if( children.size>0 ){
    Tree.Node(children)
} else {
    val emptyTreeValue = TreeValue.Just(listOf())
    Tree.Leaf(emptyTreeValue)
}

showTree(rootTree)

実行。

$ kotlin main.kts
--- <doc> ---
    --- <just> ---

    xxx
    yyy
    --- </just>---
    --- <blockquote> ---
        --- <just> ---
        aaa
        bbb
        --- </just>---
        --- <blockquote> ---
        ccc
        ddd
        eee
        --- </blockquote>---
        --- <just> ---
        fff
        ggg
        --- </just>---
    --- </blockquote>---
    --- <just> ---
    hhh
    iii

    --- </just>---
--- </doc>---

うまくいきました。

せっかくなので、深くネストした BlockQuote に対処できることを確認。 こんなマークアップテキストがきたとしても・・・

xxx
> yyy
> > aaa
> > bbb
> > > ccc
> > > ddd
> > > eee
> > fff
> > ggg
> hhh
> iii
jjj

実行。

$ kotlin main.kts
--- <doc> ---
    --- <just> ---
    
    xxx
    --- </just>---
    --- <blockquote> ---
        --- <just> ---
        yyy
        --- </just>---
        --- <blockquote> ---
            --- <just> ---
            aaa
            bbb
            --- </just>---
            --- <blockquote> ---
            ccc
            ddd
            eee
            --- </blockquote>---
            --- <just> ---
            fff
            ggg
            --- </just>---
        --- </blockquote>---
        --- <just> ---
        hhh
        iii
        --- </just>---
    --- </blockquote>---
    --- <just> ---
    jjj
    
    --- </just>---
--- </doc>---

意図通り作動しているようです。