package cangjie_tpc::prism4cj.languages

public class PrismLatex {
    public static func create(): Grammar {
        let funcPattern: Regex = Regex("\\\\(?:[^a-z()\\[\\]]|[a-z*]+)", RegexFlag.IgnoreCase)
        let insideEqu: Grammar = GrammarImpl("inside",
            ArrayList<Token>([Prism.token("equation-command", Prism.pattern(funcPattern, false, false, "regex"))]))
        return GrammarImpl(
            "latex",
            ArrayList<Token>([
                Prism.token("comment", Prism.pattern(Regex("%${wildcard}*", RegexFlag.MultiLine))),
                Prism.token("cdata",
                    Prism.pattern(Regex("(\\\\begin\\{((?:verbatim|lstlisting)\\*?)\\})[\\s\\S]*?(?=\\\\end\\{\\2\\})"),
                    true)),
                Prism.token("equation",
                    Prism.pattern(
                    Regex("\\$(?:\\\\[\\s\\S]|[^\\\\$])*\\$|\\\\\\([\\s\\S]*?\\\\\\)|\\\\\\[[\\s\\S]*?\\\\\\]"), false,
                    false, "string", insideEqu),
                    Prism.pattern(
                    Regex(
                    "(\\\\begin\\{((?:equation|math|eqnarray|align|multline|gather)\\*?)\\})[\\s\\S]*?(?=\\\\end\\{\\2\\})"
                ), true, false, "string", insideEqu)),
                Prism.token("keyword",
                    Prism.pattern(
                    Regex(
                    "(\\\\(?:begin|end|ref|cite|label|usepackage|documentclass)(?:\\[[^\\]]+\\])?\\{)[^}]+(?=\\})"),
                    true)),
                Prism.token("url", Prism.pattern(Regex("(\\\\url\\{)[^}]+(?=\\})"), true)),
                Prism.token("headline",
                    Prism.pattern(
                    Regex(
                    "(\\\\(?:part|chapter|section|subsection|frametitle|subsubsection|paragraph|subparagraph|subsubparagraph|subsubsubparagraph)\\*?(?:\\[[^\\]]+\\])?\\{)[^}]+(?=\\}(?:\\[[^\\]]+\\])?)"
                ), true, false, "class-name")),
                Prism.token("function", Prism.pattern(funcPattern, false, false, "selector")),
                Prism.token("punctuation", Prism.pattern(Regex("[\\[\\]{}&]")))
            ])
        )
    }
}