All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.kotlinx.css.RuleContainer.kt Maven / Gradle / Ivy

package kotlinx.css

@CssDsl
interface RuleContainer {
    val indent: String
    val rules: MutableList
    val multiRules: MutableList

    fun StringBuilder.buildRules(indent: String) {
        val resolvedRules = resolveRules(rules, multiRules)

        resolvedRules.forEach {
            appendLine("${it.selector} {")
            append(it.css)
            appendLine("}")
        }
    }

    /**
     * @return all [multiRules], but only the first occurrence of a regular rule from [rules]
     */
    fun resolveRules(rules: List, multiRules: List): List {
        val resolvedRules = LinkedHashMap()
        rules.forEach {
            val foundRule = resolvedRules[it.selector]
            if (foundRule == null) {
                resolvedRules[it.selector] = Rule(it.selector, CssBuilder().apply { append(it.css) })
            } else {
                // if CSS with the selector already exists, append new CSS to the old one
                foundRule.css.append(it.css)
            }
        }
        return multiRules + resolvedRules.values
    }

    fun rule(selector: String, block: RuleSet) = rule(selector, passStaticClassesToParent = false, block = block)

    fun rule(selector: String, passStaticClassesToParent: Boolean, repeatable: Boolean = false, block: RuleSet): Rule {
        val css = CssBuilder(
            "$indent  ",
            allowClasses = false,
            parent = if (passStaticClassesToParent) this else null
        ).apply(block)
        return rule(selector, passStaticClassesToParent, repeatable, css)
    }

    fun rule(selector: String, passStaticClassesToParent: Boolean, repeatable: Boolean = false, css: CssBuilder) =
        Rule(selector, css).also {
            css.parent = if (passStaticClassesToParent) this else null
            (if (repeatable) multiRules else rules).add(it)
        }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy