package cangjie_tpc::prism4cj.languages

public class PrismCssExtras {
    public static func create(prism: Prism): ?Grammar {
        let css: ?Grammar = prism.grammar("css")
        if (let Some(v) <- css) {
            let selector: ?Token = GrammarUtils.findToken(v, "selector")
            if (let Some(m) <- selector) {
                let pattern: Pattern = Prism.pattern(
                    Regex("[^{}\\s][^{}]*(?=\\s*\\{)"),
                    false,
                    false,
                    None,
                    GrammarImpl(
                        "inside",
                        ArrayList<Token>([
                            Prism.token(
                                "pseudo-element",
                                Prism.pattern(Regex(":(?:after|before|first-letter|first-line|selection)|::[-\\w]+"))
                            ),
                            Prism.token("pseudo-class", Prism.pattern(Regex(":[-\\w]+(?:\\(.*\\))?"))),
                            Prism.token("class", Prism.pattern(Regex("\\.[-:.\\w]+"))),
                            Prism.token("id", Prism.pattern(Regex("#[-:.\\w]+"))),
                            Prism.token("attribute", Prism.pattern(Regex("\\[[^\\]]+\\]")))
                        ])
                    )
                )
                m.patterns().clear()
                m.patterns().add(pattern)
            }

            GrammarUtils.insertBeforeToken(
                v,
                "function",
                ArrayList<Token>([
                    Prism.token("hexcode", Prism.pattern(Regex("#[\\da-f]{3,8}", RegexFlag.IgnoreCase))),
                    Prism.token("entity", Prism.pattern(Regex("\\\\[\\da-f]{1,8}", RegexFlag.IgnoreCase))),
                    Prism.token("number", Prism.pattern(Regex("[\\d%.]+")))
                ])
            )
        }
        return None
    }
}