123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557 |
- /*
- Language: SAS
- Author: Mauricio Caceres <mauricio.caceres.bravo@gmail.com>
- Description: Syntax Highlighting for SAS
- Category: scientific
- */
- /** @type LanguageFn */
- function sas(hljs) {
- const regex = hljs.regex;
- // Data step and PROC SQL statements
- const SAS_KEYWORDS = [
- "do",
- "if",
- "then",
- "else",
- "end",
- "until",
- "while",
- "abort",
- "array",
- "attrib",
- "by",
- "call",
- "cards",
- "cards4",
- "catname",
- "continue",
- "datalines",
- "datalines4",
- "delete",
- "delim",
- "delimiter",
- "display",
- "dm",
- "drop",
- "endsas",
- "error",
- "file",
- "filename",
- "footnote",
- "format",
- "goto",
- "in",
- "infile",
- "informat",
- "input",
- "keep",
- "label",
- "leave",
- "length",
- "libname",
- "link",
- "list",
- "lostcard",
- "merge",
- "missing",
- "modify",
- "options",
- "output",
- "out",
- "page",
- "put",
- "redirect",
- "remove",
- "rename",
- "replace",
- "retain",
- "return",
- "select",
- "set",
- "skip",
- "startsas",
- "stop",
- "title",
- "update",
- "waitsas",
- "where",
- "window",
- "x|0",
- "systask",
- "add",
- "and",
- "alter",
- "as",
- "cascade",
- "check",
- "create",
- "delete",
- "describe",
- "distinct",
- "drop",
- "foreign",
- "from",
- "group",
- "having",
- "index",
- "insert",
- "into",
- "in",
- "key",
- "like",
- "message",
- "modify",
- "msgtype",
- "not",
- "null",
- "on",
- "or",
- "order",
- "primary",
- "references",
- "reset",
- "restrict",
- "select",
- "set",
- "table",
- "unique",
- "update",
- "validate",
- "view",
- "where"
- ];
- // Built-in SAS functions
- const FUNCTIONS = [
- "abs",
- "addr",
- "airy",
- "arcos",
- "arsin",
- "atan",
- "attrc",
- "attrn",
- "band",
- "betainv",
- "blshift",
- "bnot",
- "bor",
- "brshift",
- "bxor",
- "byte",
- "cdf",
- "ceil",
- "cexist",
- "cinv",
- "close",
- "cnonct",
- "collate",
- "compbl",
- "compound",
- "compress",
- "cos",
- "cosh",
- "css",
- "curobs",
- "cv",
- "daccdb",
- "daccdbsl",
- "daccsl",
- "daccsyd",
- "dacctab",
- "dairy",
- "date",
- "datejul",
- "datepart",
- "datetime",
- "day",
- "dclose",
- "depdb",
- "depdbsl",
- "depdbsl",
- "depsl",
- "depsl",
- "depsyd",
- "depsyd",
- "deptab",
- "deptab",
- "dequote",
- "dhms",
- "dif",
- "digamma",
- "dim",
- "dinfo",
- "dnum",
- "dopen",
- "doptname",
- "doptnum",
- "dread",
- "dropnote",
- "dsname",
- "erf",
- "erfc",
- "exist",
- "exp",
- "fappend",
- "fclose",
- "fcol",
- "fdelete",
- "fetch",
- "fetchobs",
- "fexist",
- "fget",
- "fileexist",
- "filename",
- "fileref",
- "finfo",
- "finv",
- "fipname",
- "fipnamel",
- "fipstate",
- "floor",
- "fnonct",
- "fnote",
- "fopen",
- "foptname",
- "foptnum",
- "fpoint",
- "fpos",
- "fput",
- "fread",
- "frewind",
- "frlen",
- "fsep",
- "fuzz",
- "fwrite",
- "gaminv",
- "gamma",
- "getoption",
- "getvarc",
- "getvarn",
- "hbound",
- "hms",
- "hosthelp",
- "hour",
- "ibessel",
- "index",
- "indexc",
- "indexw",
- "input",
- "inputc",
- "inputn",
- "int",
- "intck",
- "intnx",
- "intrr",
- "irr",
- "jbessel",
- "juldate",
- "kurtosis",
- "lag",
- "lbound",
- "left",
- "length",
- "lgamma",
- "libname",
- "libref",
- "log",
- "log10",
- "log2",
- "logpdf",
- "logpmf",
- "logsdf",
- "lowcase",
- "max",
- "mdy",
- "mean",
- "min",
- "minute",
- "mod",
- "month",
- "mopen",
- "mort",
- "n",
- "netpv",
- "nmiss",
- "normal",
- "note",
- "npv",
- "open",
- "ordinal",
- "pathname",
- "pdf",
- "peek",
- "peekc",
- "pmf",
- "point",
- "poisson",
- "poke",
- "probbeta",
- "probbnml",
- "probchi",
- "probf",
- "probgam",
- "probhypr",
- "probit",
- "probnegb",
- "probnorm",
- "probt",
- "put",
- "putc",
- "putn",
- "qtr",
- "quote",
- "ranbin",
- "rancau",
- "ranexp",
- "rangam",
- "range",
- "rank",
- "rannor",
- "ranpoi",
- "rantbl",
- "rantri",
- "ranuni",
- "repeat",
- "resolve",
- "reverse",
- "rewind",
- "right",
- "round",
- "saving",
- "scan",
- "sdf",
- "second",
- "sign",
- "sin",
- "sinh",
- "skewness",
- "soundex",
- "spedis",
- "sqrt",
- "std",
- "stderr",
- "stfips",
- "stname",
- "stnamel",
- "substr",
- "sum",
- "symget",
- "sysget",
- "sysmsg",
- "sysprod",
- "sysrc",
- "system",
- "tan",
- "tanh",
- "time",
- "timepart",
- "tinv",
- "tnonct",
- "today",
- "translate",
- "tranwrd",
- "trigamma",
- "trim",
- "trimn",
- "trunc",
- "uniform",
- "upcase",
- "uss",
- "var",
- "varfmt",
- "varinfmt",
- "varlabel",
- "varlen",
- "varname",
- "varnum",
- "varray",
- "varrayx",
- "vartype",
- "verify",
- "vformat",
- "vformatd",
- "vformatdx",
- "vformatn",
- "vformatnx",
- "vformatw",
- "vformatwx",
- "vformatx",
- "vinarray",
- "vinarrayx",
- "vinformat",
- "vinformatd",
- "vinformatdx",
- "vinformatn",
- "vinformatnx",
- "vinformatw",
- "vinformatwx",
- "vinformatx",
- "vlabel",
- "vlabelx",
- "vlength",
- "vlengthx",
- "vname",
- "vnamex",
- "vtype",
- "vtypex",
- "weekday",
- "year",
- "yyq",
- "zipfips",
- "zipname",
- "zipnamel",
- "zipstate"
- ];
- // Built-in macro functions
- const MACRO_FUNCTIONS = [
- "bquote",
- "nrbquote",
- "cmpres",
- "qcmpres",
- "compstor",
- "datatyp",
- "display",
- "do",
- "else",
- "end",
- "eval",
- "global",
- "goto",
- "if",
- "index",
- "input",
- "keydef",
- "label",
- "left",
- "length",
- "let",
- "local",
- "lowcase",
- "macro",
- "mend",
- "nrbquote",
- "nrquote",
- "nrstr",
- "put",
- "qcmpres",
- "qleft",
- "qlowcase",
- "qscan",
- "qsubstr",
- "qsysfunc",
- "qtrim",
- "quote",
- "qupcase",
- "scan",
- "str",
- "substr",
- "superq",
- "syscall",
- "sysevalf",
- "sysexec",
- "sysfunc",
- "sysget",
- "syslput",
- "sysprod",
- "sysrc",
- "sysrput",
- "then",
- "to",
- "trim",
- "unquote",
- "until",
- "upcase",
- "verify",
- "while",
- "window"
- ];
- const LITERALS = [
- "null",
- "missing",
- "_all_",
- "_automatic_",
- "_character_",
- "_infile_",
- "_n_",
- "_name_",
- "_null_",
- "_numeric_",
- "_user_",
- "_webout_"
- ];
- return {
- name: 'SAS',
- case_insensitive: true,
- keywords: {
- literal: LITERALS,
- keyword: SAS_KEYWORDS
- },
- contains: [
- {
- // Distinct highlight for proc <proc>, data, run, quit
- className: 'keyword',
- begin: /^\s*(proc [\w\d_]+|data|run|quit)[\s;]/
- },
- {
- // Macro variables
- className: 'variable',
- begin: /&[a-zA-Z_&][a-zA-Z0-9_]*\.?/
- },
- {
- begin: [
- /^\s*/,
- /datalines;|cards;/,
- /(?:.*\n)+/,
- /^\s*;\s*$/
- ],
- className: {
- 2: "keyword",
- 3: "string"
- }
- },
- {
- begin: [
- /%mend|%macro/,
- /\s+/,
- /[a-zA-Z_&][a-zA-Z0-9_]*/
- ],
- className: {
- 1: "built_in",
- 3: "title.function"
- }
- },
- { // Built-in macro variables
- className: 'built_in',
- begin: '%' + regex.either(...MACRO_FUNCTIONS)
- },
- {
- // User-defined macro functions
- className: 'title.function',
- begin: /%[a-zA-Z_][a-zA-Z_0-9]*/
- },
- {
- // TODO: this is most likely an incorrect classification
- // built_in may need more nuance
- // https://github.com/highlightjs/highlight.js/issues/2521
- className: 'meta',
- begin: regex.either(...FUNCTIONS) + '(?=\\()'
- },
- {
- className: 'string',
- variants: [
- hljs.APOS_STRING_MODE,
- hljs.QUOTE_STRING_MODE
- ]
- },
- hljs.COMMENT('\\*', ';'),
- hljs.C_BLOCK_COMMENT_MODE
- ]
- };
- }
- export { sas as default };
|