前回のエントリー の改善版です。 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>---
意図通り作動しているようです。