Description="Microsoft PowerShell"

Categories = {"source", "script", "shell"}

Identifiers=[[ [a-zA-Z_][\w\-]* ]]

Keywords={
  { Id=1,
    List={"add-content", "add-history", "add-member", "add-pssnapin",
        "clear-content", "clear-item", "clear-itemproperty", "clear-variable",
        "compare-object", "convertfrom-securestring",
        "convert-path", "convertto-html", "convertto-securestring", "copy-item",
        "copy-itemproperty", "export-alias", "export-clixml", "export-console",
        "export-csv", "foreach-object", "format-custom",
        "format-list", "format-table", "format-wide", "get-acl", "get-alias",
        "get-authenticodesignature", "get-childitem", "get-command", "get-content",
        "get-credential", "get-culture", "get-date",
        "get-eventlog", "get-executionpolicy", "get-help", "get-history",
        "get-host", "get-item", "get-itemproperty", "get-location", "get-member",
        "get-pfxcertificate", "get-process", "get-psdrive",
        "get-psprovider", "get-pssnapin", "get-service", "get-tracesource",
        "get-uiculture", "get-unique", "get-variable", "get-wmiobject", "group-object",
        "import-alias", "import-clixml", "import-csv",
        "invoke-expression", "invoke-history", "invoke-item", "join-path",
        "measure-command", "measure-object", "move-item", "move-itemproperty",
        "new-alias", "new-item", "new-itemproperty", "new-object", "write-host",
        "new-psdrive", "new-service", "new-timespan", "new-variable", "out-default",
        "out-file", "out-host", "out-null", "out-printer", "out-string", "pop-location",
        "push-location", "read-host",
        "remove-item", "remove-itemproperty", "remove-psdrive", "remove-pssnapin",
        "remove-variable", "rename-item", "rename-itemproperty", "resolve-path",
        "restart-service", "resume-service", "select-object",
        "select-string", "set-acl", "set-alias", "set-authenticodesignature",
        "set-content", "set-date", "set-executionpolicy", "set-item",
        "set-itemproperty", "set-location", "set-psdebug", "set-service",
        "set-tracesource", "set-variable", "sort-object", "split-path",
        "start-service", "start-sleep", "start-transcript", "stop-process",
        "stop-service", "stop-transcript", "suspend-service", "tee-object",
        "test-path", "trace-command", "update-formatdata", "update-typedata",
        "where-object", "write-debug",
        "write-error", "write-host", "write-output", "write-progress",
        "write-verbose", "write-warning", "switch", "function", "if", "throw", "else",
        "while", "break", "in", "return", "try", "catch", "for", "assembly", "base",
        "begin", "class", "command", "configuration", "continue", "data",
        "define", "do", "dynamicparam", "elseif", "end", "enum", "exit", "filter",
        "finally", "foreach", "from", "hidden", "inlinescript", "interface",
        "module", "namespace", "parallel", "param", "private", "process", "public",
        "sequence", "static", "trap", "type", "until", "using", "var",
        "workflow"},
  },
  { Id=2,
    List={"ac", "asnp", "clc", "cli", "clp", "clv", "cpi", "cpp", "cvpa",
        "diff", "epal", "epcsv", "fc", "fl", "foreach", "%", "ft", "fw", "gal", "gc",
        "gci", "gcm", "gdr", "ghy", "gi", "gl", "gm", "gp",
        "gps", "group", "gsv", "gsnp", "gu", "gv", "gwmi", "iex", "ihy", "ii",
        "ipal", "ipcsv", "mi", "mp", "nal", "ndr", "ni", "nv", "oh", "rdr", "ri", "rni",
        "rnp", "rp", "rsnp", "rv", "rvpa", "sal", "sasv",
        "sc", "select", "si", "sl", "sleep", "sort", "sp", "spps", "spsv", "sv",
        "tee", "where", "write", "cat", "cd", "clear", "cp", "h", "history",
        "kill", "lp", "ls", "mount", "mv", "popd", "ps", "pushd",
        "pwd", "r", "rm", "rmdir", "echo", "cls", "chdir", "copy", "del", "dir",
        "erase", "move", "rd", "ren", "set", "type"},
  },
  { Id=3,
    Regex=[[Win32_\w+]],
  },
  { Id=4,
    Regex=[[\$\w+]],
  },
}

Strings={
  Delimiter=[["|']],
  Escape=[[ `\d{3}|`x\d{2}|^[ntvbrfa`\?'"] ]],
    Interpolation=[[ \$\w+|\$\(.+?\) ]],
}

IgnoreCase=true

--Comments={
--  { Block=false,
--    Delimiter= { [[#]] },
--  },
--}

-- https://gitlab.com/saalen/highlight/-/issues/210
Comments={
  { Block=false,
    Delimiter= { [[(?<!\<)#(?!>)]] }
  },
  { Block=true,
    Delimiter= { [[<#]],[[#>]] },
  }
}

Operators=[[\(|\)|\[|\]|\{|\}|\,|\;|\.|\:|\&|<|>|\!|\=|\/|\*|\%|\+|\-|\~|\?|\||\.]]

EnableIndentation=false

-- fix recognition of $
function OnStateChange(oldState, newState, token)

  if  (string.sub(token,1,1) =="$") and oldState==HL_STRING and newState==HL_KEYWORD then
    return HL_INTERPOLATION
  end

end
