Skip to content

replacements.kt

src/jvmMain/kotlin/afield/ui/output/templates/replacements.kt · 42 lines

package afield.ui.output.templates

import afield.data.table.div
import afield.data.table.get
import afield.data.table.minus
import afield.data.table.plus
import afield.data.table.rem
import afield.data.table.times
import afield.runtime.execution.plus
import afield.runtime.lifecycle.plus
import afield.runtime.lifecycle.rem

import afield.audio.synth.*
import afield.graphics.vulkan.*
import afield.media.stream.*
import afield.media.video.*

A small {{placeholder}} templating system: filter replaces each placeholder from knownValues or templates, and an unknown one becomes empty text.

a micro templating system

val templates = mutableMapOf<String, (String, String) -> String>()

Template functions by placeholder name; each receives the placeholder and the whole text.

val knownValues = mutableMapOf<String, String>()

fun replaceTemplate(input: String, replacer: (placeholder: String, wholeText: String) -> String): String {

fun replaceTemplate(input: String, replacer: (placeholder: String, wholeText: String) -> String): String {
    // The regex captures anything between "{{" and "}}", allowing for optional whitespace.
    val regex = Regex("""\{\{\s*(.*?)\s*\}\}""")
    return regex.replace(input) { matchResult ->
        val placeholder = matchResult.groupValues[1]
        replacer(placeholder, input)
    }
}

fun filter(source: String)

fun filter(source: String) = replaceTemplate(source) { template, everything ->
    knownValues[template] ?: templates[template]?.invoke(template, everything) ?: ""
}