const conf = {
  comments: {
    lineComment: "//",
    blockComment: ["/*", "*/"]
  },
  brackets: [
    ["{", "}"],
    ["[", "]"],
    ["(", ")"]
  ],
  autoClosingPairs: [
    { open: "{", close: "}" },
    { open: "[", close: "]" },
    { open: "(", close: ")" },
    { open: "'", close: "'", notIn: ["string", "comment"] },
    { open: '"', close: '"', notIn: ["string", "comment"] }
  ],
  surroundingPairs: [
    { open: "{", close: "}" },
    { open: "[", close: "]" },
    { open: "(", close: ")" },
    { open: "<", close: ">" },
    { open: "'", close: "'" },
    { open: '"', close: '"' }
  ]
};
const language = {
  defaultToken: "",
  tokenPostfix: ".ecl",
  ignoreCase: true,
  brackets: [
    { open: "{", close: "}", token: "delimiter.curly" },
    { open: "[", close: "]", token: "delimiter.square" },
    { open: "(", close: ")", token: "delimiter.parenthesis" },
    { open: "<", close: ">", token: "delimiter.angle" }
  ],
  pounds: [
    "append",
    "break",
    "declare",
    "demangle",
    "end",
    "for",
    "getdatatype",
    "if",
    "inmodule",
    "loop",
    "mangle",
    "onwarning",
    "option",
    "set",
    "stored",
    "uniquename"
  ].join("|"),
  keywords: [
    "__compressed__",
    "after",
    "all",
    "and",
    "any",
    "as",
    "atmost",
    "before",
    "beginc",
    "best",
    "between",
    "case",
    "cluster",
    "compressed",
    "compression",
    "const",
    "counter",
    "csv",
    "default",
    "descend",
    "embed",
    "encoding",
    "encrypt",
    "end",
    "endc",
    "endembed",
    "endmacro",
    "enum",
    "escape",
    "except",
    "exclusive",
    "expire",
    "export",
    "extend",
    "fail",
    "few",
    "fileposition",
    "first",
    "flat",
    "forward",
    "from",
    "full",
    "function",
    "functionmacro",
    "group",
    "grouped",
    "heading",
    "hole",
    "ifblock",
    "import",
    "in",
    "inner",
    "interface",
    "internal",
    "joined",
    "keep",
    "keyed",
    "last",
    "left",
    "limit",
    "linkcounted",
    "literal",
    "little_endian",
    "load",
    "local",
    "locale",
    "lookup",
    "lzw",
    "macro",
    "many",
    "maxcount",
    "maxlength",
    "min skew",
    "module",
    "mofn",
    "multiple",
    "named",
    "namespace",
    "nocase",
    "noroot",
    "noscan",
    "nosort",
    "not",
    "noxpath",
    "of",
    "onfail",
    "only",
    "opt",
    "or",
    "outer",
    "overwrite",
    "packed",
    "partition",
    "penalty",
    "physicallength",
    "pipe",
    "prefetch",
    "quote",
    "record",
    "repeat",
    "retry",
    "return",
    "right",
    "right1",
    "right2",
    "rows",
    "rowset",
    "scan",
    "scope",
    "self",
    "separator",
    "service",
    "shared",
    "skew",
    "skip",
    "smart",
    "soapaction",
    "sql",
    "stable",
    "store",
    "terminator",
    "thor",
    "threshold",
    "timelimit",
    "timeout",
    "token",
    "transform",
    "trim",
    "type",
    "unicodeorder",
    "unordered",
    "unsorted",
    "unstable",
    "update",
    "use",
    "validate",
    "virtual",
    "whole",
    "width",
    "wild",
    "within",
    "wnotrim",
    "xml",
    "xpath"
  ],
  functions: [
    "abs",
    "acos",
    "aggregate",
    "allnodes",
    "apply",
    "ascii",
    "asin",
    "assert",
    "asstring",
    "atan",
    "atan2",
    "ave",
    "build",
    "buildindex",
    "case",
    "catch",
    "choose",
    "choosen",
    "choosesets",
    "clustersize",
    "combine",
    "correlation",
    "cos",
    "cosh",
    "count",
    "covariance",
    "cron",
    "dataset",
    "dedup",
    "define",
    "denormalize",
    "dictionary",
    "distribute",
    "distributed",
    "distribution",
    "ebcdic",
    "enth",
    "error",
    "evaluate",
    "event",
    "eventextra",
    "eventname",
    "exists",
    "exp",
    "fail",
    "failcode",
    "failmessage",
    "fetch",
    "fromunicode",
    "fromxml",
    "getenv",
    "getisvalid",
    "global",
    "graph",
    "group",
    "hash",
    "hash32",
    "hash64",
    "hashcrc",
    "hashmd5",
    "having",
    "httpcall",
    "httpheader",
    "if",
    "iff",
    "index",
    "intformat",
    "isvalid",
    "iterate",
    "join",
    "keydiff",
    "keypatch",
    "keyunicode",
    "length",
    "library",
    "limit",
    "ln",
    "loadxml",
    "local",
    "log",
    "loop",
    "map",
    "matched",
    "matchlength",
    "matchposition",
    "matchtext",
    "matchunicode",
    "max",
    "merge",
    "mergejoin",
    "min",
    "nofold",
    "nolocal",
    "nonempty",
    "normalize",
    "nothor",
    "notify",
    "output",
    "parallel",
    "parse",
    "pipe",
    "power",
    "preload",
    "process",
    "project",
    "pull",
    "random",
    "range",
    "rank",
    "ranked",
    "realformat",
    "recordof",
    "regexfind",
    "regexreplace",
    "regroup",
    "rejected",
    "rollup",
    "round",
    "roundup",
    "row",
    "rowdiff",
    "sample",
    "sequential",
    "set",
    "sin",
    "sinh",
    "sizeof",
    "soapcall",
    "sort",
    "sorted",
    "sqrt",
    "stepped",
    "stored",
    "sum",
    "table",
    "tan",
    "tanh",
    "thisnode",
    "topn",
    "tounicode",
    "toxml",
    "transfer",
    "transform",
    "trim",
    "truncate",
    "typeof",
    "ungroup",
    "unicodeorder",
    "variance",
    "wait",
    "which",
    "workunit",
    "xmldecode",
    "xmlencode",
    "xmltext",
    "xmlunicode"
  ],
  typesint: ["integer", "unsigned"].join("|"),
  typesnum: ["data", "qstring", "string", "unicode", "utf8", "varstring", "varunicode"],
  typesone: [
    "ascii",
    "big_endian",
    "boolean",
    "data",
    "decimal",
    "ebcdic",
    "grouped",
    "integer",
    "linkcounted",
    "pattern",
    "qstring",
    "real",
    "record",
    "rule",
    "set of",
    "streamed",
    "string",
    "token",
    "udecimal",
    "unicode",
    "unsigned",
    "utf8",
    "varstring",
    "varunicode"
  ].join("|"),
  operators: ["+", "-", "/", ":=", "<", "<>", "=", ">", "\\", "and", "in", "not", "or"],
  symbols: /[=><!~?:&|+\-*\/\^%]+/,
  // escape sequences
  escapes: /\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,
  // The main tokenizer for our languages
  tokenizer: {
    root: [
      [/@typesint[4|8]/, "type"],
      [/#(@pounds)/, "type"],
      [/@typesone/, "type"],
      [
        /[a-zA-Z_$][\w-$]*/,
        {
          cases: {
            "@functions": "keyword.function",
            "@keywords": "keyword",
            "@operators": "operator"
          }
        }
      ],
      // whitespace
      { include: "@whitespace" },
      [/[{}()\[\]]/, "@brackets"],
      [/[<>](?!@symbols)/, "@brackets"],
      [
        /@symbols/,
        {
          cases: {
            "@operators": "delimiter",
            "@default": ""
          }
        }
      ],
      // numbers
      [/[0-9_]*\.[0-9_]+([eE][\-+]?\d+)?/, "number.float"],
      [/0[xX][0-9a-fA-F_]+/, "number.hex"],
      [/0[bB][01]+/, "number.hex"],
      // binary: use same theme style as hex
      [/[0-9_]+/, "number"],
      // delimiter: after number because of .\d floats
      [/[;,.]/, "delimiter"],
      // strings
      [/"([^"\\]|\\.)*$/, "string.invalid"],
      [/"/, "string", "@string"],
      // characters
      [/'[^\\']'/, "string"],
      [/(')(@escapes)(')/, ["string", "string.escape", "string"]],
      [/'/, "string.invalid"]
    ],
    whitespace: [
      [/[ \t\v\f\r\n]+/, ""],
      [/\/\*/, "comment", "@comment"],
      [/\/\/.*$/, "comment"]
    ],
    comment: [
      [/[^\/*]+/, "comment"],
      [/\*\//, "comment", "@pop"],
      [/[\/*]/, "comment"]
    ],
    string: [
      [/[^\\']+/, "string"],
      [/@escapes/, "string.escape"],
      [/\\./, "string.escape.invalid"],
      [/'/, "string", "@pop"]
    ]
  }
};

export { conf, language };
