Skip to content

Commit 9f965e1

Browse files
authored
Merge pull request #33 from javecs/feature/rule-renderer
計算結果を表示する機能を別のクラスに分けました。
2 parents 6eeca99 + 980d8a6 commit 9f965e1

6 files changed

Lines changed: 69 additions & 16 deletions

File tree

src/main/kotlin/xyz/javecs/tools/text2expr/Text2Expr.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,31 @@ package xyz.javecs.tools.text2expr
22

33
import xyz.javecs.tools.expr.Calculator
44
import xyz.javecs.tools.text2expr.parsers.RuleBuilder
5+
import xyz.javecs.tools.text2expr.parsers.RuleRenderer
6+
import xyz.javecs.tools.text2expr.parsers.Variable
57
import xyz.javecs.tools.text2expr.utils.normalize
68
import xyz.javecs.tools.text2expr.utils.read
79
import xyz.javecs.tools.text2expr.utils.resources
810

911
class Text2Expr(rulePath: String = "rules") {
1012
private val rules = ArrayList<RuleBuilder>()
1113
private val calc = Calculator()
14+
private val renderer = RuleRenderer(read("templates/reply.st"))
1215

1316
init {
14-
val reply = read("templates/reply.st")
15-
resources(rulePath).forEach { rules.add(RuleBuilder(read(it), reply)) }
17+
resources(rulePath).forEach { rules.add(RuleBuilder(read(it))) }
1618
}
1719

1820
fun eval(text: String, rendered: Boolean = false): String {
1921
rules.forEach {
2022
try {
2123
val evaluation = it.eval(text)
2224
if (evaluation.value != Double.NaN) return if (rendered) {
23-
evaluation.rendered
25+
renderer.add("variables", evaluation.variables.map { Variable(it.key, it.value) }.toList())
26+
renderer.add("expr", evaluation.expr)
27+
renderer.add("text", text)
28+
renderer.add("value", evaluation.value)
29+
renderer.render()
2430
} else {
2531
evaluation.value.toString()
2632
}

src/main/kotlin/xyz/javecs/tools/text2expr/parsers/RuleBuilder.kt

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,14 @@ package xyz.javecs.tools.text2expr.parsers
22

33
import com.atilika.kuromoji.ipadic.Token
44
import com.atilika.kuromoji.ipadic.Tokenizer
5-
import org.stringtemplate.v4.ST
65
import xyz.javecs.tools.expr.Calculator
76
import xyz.javecs.tools.text2expr.utils.normalize
87

98
private val tokenizer = Tokenizer()
10-
private val printValue = "これかな?\n<value>"
11-
12-
data class Variable(val key:String, val value:Double)
13-
data class Evaluation(val value: Number = Double.NaN, val rendered: String = "")
14-
class RuleBuilder(source: String, template: String = printValue) {
9+
data class Evaluation(val value: Number = Double.NaN, val expr: List<String> = ArrayList(), val variables: Map<String, Double> = HashMap())
10+
class RuleBuilder(source: String) {
1511
private val parser = RuleParser()
16-
private val renderer = ST(template)
12+
1713
init {
1814
parser.visit(parser(source).text2expr())
1915
}
@@ -64,11 +60,7 @@ class RuleBuilder(source: String, template: String = printValue) {
6460
return if (matches(norm, { (key, value) -> args.add("$key = $value") })) {
6561
args.forEach { calc.eval(it) }
6662
expr().forEach { calc.eval(it) }
67-
renderer.add("variables", calc.variables().map { Variable(it.key, it.value) }.toList())
68-
renderer.add("expr", expr())
69-
renderer.add("text", text)
70-
renderer.add("value", calc.value)
71-
Evaluation(calc.value, renderer.render())
63+
Evaluation(calc.value, expr().toList(), calc.variables())
7264
} else {
7365
Evaluation()
7466
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package xyz.javecs.tools.text2expr.parsers
2+
3+
import org.stringtemplate.v4.ST
4+
5+
data class Variable(val key:String, val value:Double)
6+
class RuleRenderer(template: String) {
7+
private val renderer = ST(template)
8+
fun add(name: String, value: Any) {
9+
renderer.add(name, value)
10+
}
11+
fun render(): String = renderer.render()
12+
}

src/main/kotlin/xyz/javecs/tools/text2expr/utils/Resources.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ import kotlin.streams.toList
88

99
private val reflections = Reflections(null, ResourcesScanner())
1010
fun read(path: String) = Resources.toString(Resources.getResource(path), Charsets.UTF_8)!!
11-
fun resources(prefix: String) = reflections.getResources(Pattern.compile(".+\\.txt")).stream()
11+
fun resources(prefix: String, extension: String = "txt") = reflections.getResources(Pattern.compile(".+\\.$extension")).stream()
1212
.filter { it.startsWith("$prefix/") }
1313
.toList()
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package xyz.javecs.tools.text2expr.test.kotlin
2+
3+
import org.junit.Test
4+
import xyz.javecs.tools.text2expr.Text2Expr
5+
import xyz.javecs.tools.text2expr.parsers.RuleBuilder
6+
import xyz.javecs.tools.text2expr.parsers.RuleRenderer
7+
import xyz.javecs.tools.text2expr.parsers.Variable
8+
import xyz.javecs.tools.text2expr.utils.read
9+
import kotlin.test.assertEquals
10+
import kotlin.test.assertTrue
11+
12+
class RuleRendererTest {
13+
@Test fun renderer1() {
14+
val expected = """
15+
|x = 1.0
16+
|y = 1.0
17+
|
18+
|こうだから、
19+
|x+y
20+
|
21+
|答えは、
22+
|2
23+
|
24+
""".trimMargin("|")
25+
val template = read("test-templates/template1.st")
26+
val renderer = RuleRenderer(template)
27+
renderer.add("variables", listOf(Variable("x", 1.0), Variable("y", 1.0)))
28+
renderer.add("expr", listOf("x+y"))
29+
renderer.add("value", 2)
30+
assertEquals(expected, renderer.render())
31+
}
32+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<if(variables)>
2+
<variables:{v|<v.key> = <v.value>
3+
}>
4+
<endif>
5+
<if(expr)>
6+
こうだから、
7+
<expr:{e|<e>
8+
}>
9+
<endif>
10+
答えは、
11+
<value>

0 commit comments

Comments
 (0)