[orx-fcurve] Fix regular expressions for Javascript, fix unit tests
This commit is contained in:
@@ -9,14 +9,21 @@ import org.openrndr.extra.expressions.evaluateExpression
|
|||||||
*/
|
*/
|
||||||
fun efcurve(ef: String, constants: Map<String, Double> = emptyMap()): String {
|
fun efcurve(ef: String, constants: Map<String, Double> = emptyMap()): String {
|
||||||
val expression = Regex("_([^_]+)_")
|
val expression = Regex("_([^_]+)_")
|
||||||
val repetition = Regex("\\|([^|]+)\\|\\[([^\\[\\]]+)]")
|
|
||||||
val list = Regex("\\|([^|]+)\\|\\{([^\\[\\]]+)}")
|
// IntelliJ falsely reports a redundant escape character. the escape character is required when running the regular
|
||||||
|
// expression on a javascript target. Removing the escape character will result in a `Lone quantifier brackets`
|
||||||
|
// syntax error.
|
||||||
|
|
||||||
|
@Suppress("RegExpRedundantEscape")
|
||||||
|
val repetition = Regex("""\|([^|]+)\|\[([^\[\]]+)\]""")
|
||||||
|
|
||||||
|
@Suppress("RegExpRedundantEscape")
|
||||||
|
val list = Regex("\\|([^|]+)\\|\\{([^\\[\\]]+)\\}")
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* perform comment substitution
|
* perform comment substitution
|
||||||
* (?m) enables multiline mode
|
|
||||||
*/
|
*/
|
||||||
var curve = Regex("(?m)(#.*)$").replace(ef, "")
|
var curve = Regex("(#.*)$", RegexOption.MULTILINE).replace(ef, "")
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allow for nested repetitions and lists
|
* Allow for nested repetitions and lists
|
||||||
@@ -70,20 +77,7 @@ fun efcurve(ef: String, constants: Map<String, Double> = emptyMap()): String {
|
|||||||
/**
|
/**
|
||||||
* evaluate expression in expansion
|
* evaluate expression in expansion
|
||||||
*/
|
*/
|
||||||
return (expression.replace(curve) { ef ->
|
return (expression.replace(curve) { exp ->
|
||||||
evaluateExpression(ef.groupValues[1], constants)?.toString() ?: error("parse error in '$curve")
|
evaluateExpression(exp.groupValues[1], constants)?.toString() ?: error("parse error in '$curve")
|
||||||
})
|
})
|
||||||
}
|
|
||||||
|
|
||||||
fun main() {
|
|
||||||
efcurve("""M1 |h5 m3|{
|
|
||||||
|10.3 # toch wel handig zo'n comment
|
|
||||||
|11.2
|
|
||||||
|14.5
|
|
||||||
|}
|
|
||||||
""".trimMargin())
|
|
||||||
|
|
||||||
println(efcurve("|M0 |h4 m3|[2]|[5]"))
|
|
||||||
|
|
||||||
println(efcurve("""M0|h4 m_it_|{|_cos(it * PI * 0.5)_ |[4]}"""))
|
|
||||||
}
|
}
|
||||||
@@ -16,18 +16,18 @@ class TestEFCurve {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun expressions() {
|
fun expressions() {
|
||||||
assertEquals("M9.0", efcurve("M_4 + 5_"))
|
assertEquals("M${9.0}", efcurve("M_4 + 5_"))
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun listExpansion() {
|
fun listExpansion() {
|
||||||
assertEquals("M0 L1.0, 3.0 L1.0, 6.0", efcurve("M0 |L1.0, _it_|{3, 6}"))
|
assertEquals("M0 L1.0, ${3.0} L1.0, ${6.0}", efcurve("M0 |L1.0, _it_|{3, 6}"))
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun repetition() {
|
fun repetition() {
|
||||||
assertEquals("M0 L1.0, 3.0 L1.0, 3.0", efcurve("M0 |L1.0, 3.0|[2]"))
|
assertEquals("M0 L1.0, 3.0 L1.0, 3.0", efcurve("M0 |L1.0, 3.0|[2]"))
|
||||||
assertEquals("M0 L1.0, 0.0 L1.0, 1.0", efcurve("M0 |L1.0, _it_|[2]"))
|
assertEquals("M0 L1.0, ${0.0} L1.0, ${1.0}", efcurve("M0 |L1.0, _it_|[2]"))
|
||||||
assertEquals("M0 L1.0, 0.0 L1.0, 1.0 L1.0, 0.0 L1.0, 1.0 L1.0, 0.0 L1.0, 1.0", efcurve("M0 ||L1.0, _it_|[2]|[3]"))
|
assertEquals("M0 L1.0, ${0.0} L1.0, ${1.0} L1.0, ${0.0} L1.0, ${1.0} L1.0, ${0.0} L1.0, ${1.0}", efcurve("M0 ||L1.0, _it_|[2]|[3]"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user