/*
Language: Caché Object Script
Author: Nikita Savchenko <zitros.lab@gmail.com>
Category: enterprise, scripting
Website: https://cedocs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls
*/
/** @type LanguageFn */
function cos(hljs) {
    const STRINGS = {
        className: 'string',
        variants: [
            {
                begin: '"',
                end: '"',
                contains: [
                    {
                        begin: "\"\"",
                        relevance: 0
                    }
                ]
            }
        ]
    };
    const NUMBERS = {
        className: "number",
        begin: "\\b(\\d+(\\.\\d*)?|\\.\\d+)",
        relevance: 0
    };
    const COS_KEYWORDS = 'property parameter class classmethod clientmethod extends as break '
        + 'catch close continue do d|0 else elseif for goto halt hang h|0 if job '
        + 'j|0 kill k|0 lock l|0 merge new open quit q|0 read r|0 return set s|0 '
        + 'tcommit throw trollback try tstart use view while write w|0 xecute x|0 '
        + 'zkill znspace zn ztrap zwrite zw zzdump zzwrite print zbreak zinsert '
        + 'zload zprint zremove zsave zzprint mv mvcall mvcrt mvdim mvprint zquit '
        + 'zsync ascii';
    // registered function - no need in them due to all functions are highlighted,
    // but I'll just leave this here.
    // "$bit", "$bitcount",
    // "$bitfind", "$bitlogic", "$case", "$char", "$classmethod", "$classname",
    // "$compile", "$data", "$decimal", "$double", "$extract", "$factor",
    // "$find", "$fnumber", "$get", "$increment", "$inumber", "$isobject",
    // "$isvaliddouble", "$isvalidnum", "$justify", "$length", "$list",
    // "$listbuild", "$listdata", "$listfind", "$listfromstring", "$listget",
    // "$listlength", "$listnext", "$listsame", "$listtostring", "$listvalid",
    // "$locate", "$match", "$method", "$name", "$nconvert", "$next",
    // "$normalize", "$now", "$number", "$order", "$parameter", "$piece",
    // "$prefetchoff", "$prefetchon", "$property", "$qlength", "$qsubscript",
    // "$query", "$random", "$replace", "$reverse", "$sconvert", "$select",
    // "$sortbegin", "$sortend", "$stack", "$text", "$translate", "$view",
    // "$wascii", "$wchar", "$wextract", "$wfind", "$wiswide", "$wlength",
    // "$wreverse", "$xecute", "$zabs", "$zarccos", "$zarcsin", "$zarctan",
    // "$zcos", "$zcot", "$zcsc", "$zdate", "$zdateh", "$zdatetime",
    // "$zdatetimeh", "$zexp", "$zhex", "$zln", "$zlog", "$zpower", "$zsec",
    // "$zsin", "$zsqr", "$ztan", "$ztime", "$ztimeh", "$zboolean",
    // "$zconvert", "$zcrc", "$zcyc", "$zdascii", "$zdchar", "$zf",
    // "$ziswide", "$zlascii", "$zlchar", "$zname", "$zposition", "$zqascii",
    // "$zqchar", "$zsearch", "$zseek", "$zstrip", "$zwascii", "$zwchar",
    // "$zwidth", "$zwpack", "$zwbpack", "$zwunpack", "$zwbunpack", "$zzenkaku",
    // "$change", "$mv", "$mvat", "$mvfmt", "$mvfmts", "$mviconv",
    // "$mviconvs", "$mvinmat", "$mvlover", "$mvoconv", "$mvoconvs", "$mvraise",
    // "$mvtrans", "$mvv", "$mvname", "$zbitand", "$zbitcount", "$zbitfind",
    // "$zbitget", "$zbitlen", "$zbitnot", "$zbitor", "$zbitset", "$zbitstr",
    // "$zbitxor", "$zincrement", "$znext", "$zorder", "$zprevious", "$zsort",
    // "device", "$ecode", "$estack", "$etrap", "$halt", "$horolog",
    // "$io", "$job", "$key", "$namespace", "$principal", "$quit", "$roles",
    // "$storage", "$system", "$test", "$this", "$tlevel", "$username",
    // "$x", "$y", "$za", "$zb", "$zchild", "$zeof", "$zeos", "$zerror",
    // "$zhorolog", "$zio", "$zjob", "$zmode", "$znspace", "$zparent", "$zpi",
    // "$zpos", "$zreference", "$zstorage", "$ztimestamp", "$ztimezone",
    // "$ztrap", "$zversion"
    return {
        name: 'Caché Object Script',
        case_insensitive: true,
        aliases: ["cls"],
        keywords: COS_KEYWORDS,
        contains: [
            NUMBERS,
            STRINGS,
            hljs.C_LINE_COMMENT_MODE,
            hljs.C_BLOCK_COMMENT_MODE,
            {
                className: "comment",
                begin: /;/,
                end: "$",
                relevance: 0
            },
            {
                className: "built_in",
                begin: /(?:\$\$?|\.\.)\^?[a-zA-Z]+/
            },
            {
                className: "built_in",
                begin: /\$\$\$[a-zA-Z]+/
            },
            {
                className: "built_in",
                begin: /%[a-z]+(?:\.[a-z]+)*/
            },
            {
                className: "symbol",
                begin: /\^%?[a-zA-Z][\w]*/
            },
            {
                className: "keyword",
                begin: /##class|##super|#define|#dim/
            },
            // sub-languages: are not fully supported by hljs by 11/15/2015
            // left for the future implementation.
            {
                begin: /&sql\(/,
                end: /\)/,
                excludeBegin: true,
                excludeEnd: true,
                subLanguage: "sql"
            },
            {
                begin: /&(js|jscript|javascript)</,
                end: />/,
                excludeBegin: true,
                excludeEnd: true,
                subLanguage: "javascript"
            },
            {
                // this brakes first and last tag, but this is the only way to embed a valid html
                begin: /&html<\s*</,
                end: />\s*>/,
                subLanguage: "xml"
            }
        ]
    };
}
export { cos as default };
//# sourceMappingURL=cos.js.map