#include <eepp/ui/doc/languages/powershell.hpp>
#include <eepp/ui/doc/syntaxdefinitionmanager.hpp>

namespace EE { namespace UI { namespace Doc { namespace Language {

SyntaxDefinition& addPowerShell() {

	return SyntaxDefinitionManager::instance()->add(

		{ "PowerShell",
		  { "%.ps1$", "%.psm1$", "%.psd1$", "%.ps1xml$", "%.pssc$", "%.psrc$", "%.cdxml$" },
		  {
			  { { "#.*\n" }, "comment" },
			  { { "[[\\.]]" }, "normal" },
			  { { "\"", "\"" }, "string" },
			  { { "'", "'" }, "string" },
			  { { "%f[%w_][%d%.]+%f[^%w_]" }, "number" },
			  { { "[%+=/%*%^%%<>!~|&,:]+" }, "operator" },
			  { { "%f[%S]%-[%w%-%_]+" }, "function" },
			  { { "[%u][%a]+[%-][%u][%a]+" }, "function" },
			  { { "${.*}" }, "symbol" },
			  { { "$[%a_@*][%w_]*" }, "type" },
			  { { "$[%$][%a]+" }, "type" },
			  { { "%[?[%a_][%w_]*%]?" }, "symbol" },

		  },
		  {
			  { "elseif", "keyword" },
			  { "in", "keyword" },
			  { "exit", "function" },
			  { "TBD", "comment" },
			  { "XXX", "comment" },
			  { "dynamicparam", "keyword" },
			  { "continue", "keyword" },
			  { "finally", "keyword" },
			  { "default", "keyword" },
			  { "begin", "function" },
			  { "Parameter", "keyword" },
			  { "switch", "keyword" },
			  { "data", "keyword" },
			  { "sequence", "function" },
			  { "workflow", "keyword" },
			  { "global", "keyword" },
			  { "local", "keyword" },
			  { "private", "keyword" },
			  { "script", "keyword" },
			  { "using", "keyword" },
			  { "configuration", "keyword" },
			  { "return", "keyword" },
			  { "try", "keyword" },
			  { "foreach", "keyword" },
			  { "class", "keyword" },
			  { "process", "function" },
			  { "end", "function" },
			  { "TODO", "comment" },
			  { "filter", "keyword" },
			  { "ValidateScript", "keyword" },
			  { "false", "literal" },
			  { "inlinescript", "function" },
			  { "for", "keyword" },
			  { "while", "keyword" },
			  { "select", "function" },
			  { "function", "keyword" },
			  { "throw", "keyword" },
			  { "where", "function" },
			  { "catch", "keyword" },
			  { "true", "literal" },
			  { "else", "keyword" },
			  { "parallel", "function" },
			  { "enum", "keyword" },
			  { "param", "keyword" },
			  { "NOTE", "comment" },
			  { "break", "keyword" },
			  { "CmdletBinding", "keyword" },
			  { "trap", "keyword" },
			  { "until", "keyword" },
			  { "if", "keyword" },
			  { "do", "keyword" },
			  { "FIXME", "comment" },
			  { "HACK", "comment" },

			  { "clean", "keyword" },
			  { "define", "keyword" },
			  { "dynamicParam", "keyword" },
			  { "from", "keyword" },
			  { "hidden", "keyword" },
			  { "static", "keyword" },
			  { "using", "keyword" },
			  { "var", "keyword" },
			  { "assembly", "keyword" },
			  { "base", "keyword" },
			  { "command", "keyword" },
			  { "interface", "keyword" },
			  { "module", "keyword" },
			  { "namespace", "keyword" },
			  { "private", "keyword" },
			  { "public", "keyword" },
			  { "type", "keyword" },

			  { "Requires", "keyword" },
			  { "requires", "keyword" },
			  { "region", "keyword" },
			  { "endregion", "keyword" },
			  { "Region", "keyword" },
			  { "EndEegion", "keyword" },

			  { "inlineScript", "function" },

			  { "help", "function" },
			  { "mkdir", "function" },
			  { "oss", "function" },
			  { "pause", "function" },
			  { "prompt", "function" },
			  { "ac", "function" },
			  { "cat", "function" },
			  { "cd", "function" },
			  { "chdir", "function" },
			  { "clc", "function" },
			  { "clear", "function" },
			  { "clhy", "function" },
			  { "cli", "function" },
			  { "clp", "function" },
			  { "cls", "function" },
			  { "clv", "function" },
			  { "cnsn", "function" },
			  { "compare", "function" },
			  { "copy", "function" },
			  { "cp", "function" },
			  { "cpi", "function" },
			  { "cpp", "function" },
			  { "cvpa", "function" },
			  { "dbp", "function" },
			  { "del", "function" },
			  { "diff", "function" },
			  { "dir", "function" },
			  { "dnsn", "function" },
			  { "ebp", "function" },
			  { "echo", "function" },
			  { "epal", "function" },
			  { "epcsv", "function" },
			  { "erase", "function" },
			  { "etsn", "function" },
			  { "exsn", "function" },
			  { "fc", "function" },
			  { "fhx", "function" },
			  { "fl", "function" },
			  { "ft", "function" },
			  { "fw", "function" },
			  { "gal", "function" },
			  { "gbp", "function" },
			  { "gc", "function" },
			  { "gci", "function" },
			  { "gcm", "function" },
			  { "gcs", "function" },
			  { "gdr", "function" },
			  { "gerr", "function" },
			  { "ghy", "function" },
			  { "gi", "function" },
			  { "gjb", "function" },
			  { "gl", "function" },
			  { "gm", "function" },
			  { "gmo", "function" },
			  { "gp", "function" },
			  { "gps", "function" },
			  { "gpv", "function" },
			  { "group", "function" },
			  { "gsn", "function" },
			  { "gsv", "function" },
			  { "gu", "function" },
			  { "gv", "function" },
			  { "h", "function" },
			  { "history", "function" },
			  { "icm", "function" },
			  { "iex", "function" },
			  { "ihy", "function" },
			  { "ii", "function" },
			  { "ipal", "function" },
			  { "ipcsv", "function" },
			  { "ipmo", "function" },
			  { "irm", "function" },
			  { "iwr", "function" },
			  { "kill", "function" },
			  { "ls", "function" },
			  { "man", "function" },
			  { "md", "function" },
			  { "measure", "function" },
			  { "mi", "function" },
			  { "mount", "function" },
			  { "move", "function" },
			  { "mp", "function" },
			  { "mv", "function" },
			  { "nal", "function" },
			  { "ndr", "function" },
			  { "ni", "function" },
			  { "nmo", "function" },
			  { "nsn", "function" },
			  { "nv", "function" },
			  { "ogv", "function" },
			  { "oh", "function" },
			  { "popd", "function" },
			  { "ps", "function" },
			  { "pushd", "function" },
			  { "pwd", "function" },
			  { "r", "function" },
			  { "rbp", "function" },
			  { "rcjb", "function" },
			  { "rcsn", "function" },
			  { "rd", "function" },
			  { "rdr", "function" },
			  { "ren", "function" },
			  { "ri", "function" },
			  { "rjb", "function" },
			  { "rm", "function" },
			  { "rmdir", "function" },
			  { "rmo", "function" },
			  { "rni", "function" },
			  { "rnp", "function" },
			  { "rp", "function" },
			  { "rsn", "function" },
			  { "rv", "function" },
			  { "rvpa", "function" },
			  { "sajb", "function" },
			  { "sal", "function" },
			  { "saps", "function" },
			  { "sasv", "function" },
			  { "sbp", "function" },
			  { "select", "function" },
			  { "set", "function" },
			  { "shcm", "function" },
			  { "si", "function" },
			  { "sl", "function" },
			  { "sleep", "function" },
			  { "sls", "function" },
			  { "sort", "function" },
			  { "sp", "function" },
			  { "spjb", "function" },
			  { "spps", "function" },
			  { "spsv", "function" },
			  { "start", "function" },
			  { "sv", "function" },
			  { "tee", "function" },
			  { "wjb", "function" },
			  { "write", "function" },
			  { "asnp", "function" },
			  { "cfs", "function" },
			  { "curl", "function" },
			  { "epsn", "function" },
			  { "gcb", "function" },
			  { "gin", "function" },
			  { "gsnp", "function" },
			  { "gtz", "function" },
			  { "gwmi", "function" },
			  { "ipsn", "function" },
			  { "ise", "function" },
			  { "iwmi", "function" },
			  { "lp", "function" },
			  { "npssc", "function" },
			  { "rsnp", "function" },
			  { "rujb", "function" },
			  { "rwmi", "function" },
			  { "sc", "function" },
			  { "scb", "function" },
			  { "stz", "function" },
			  { "sujb", "function" },
			  { "swmi", "function" },
			  { "trcm", "function" },
			  { "wget", "function" },

			  { "[math]", "keyword" },
			  { "[ordered]", "keyword" },
			  { "[adsi]", "keyword" },
			  { "[array]", "keyword" },
			  { "[bigint]", "keyword" },
			  { "[bool]", "keyword" },
			  { "[byte]", "keyword" },
			  { "[char]", "keyword" },
			  { "[cimclass]", "keyword" },
			  { "[datetime]", "keyword" },
			  { "[decimal]", "keyword" },
			  { "[double]", "keyword" },
			  { "[float]", "keyword" },
			  { "[guid]", "keyword" },
			  { "[hashtable]", "keyword" },
			  { "[int]", "keyword" },
			  { "[int16]", "keyword" },
			  { "[int32]", "keyword" },
			  { "[int64]", "keyword" },
			  { "[ipaddress]", "keyword" },
			  { "[long]", "keyword" },
			  { "[mailaddress]", "keyword" },
			  { "[psobject]", "keyword" },
			  { "[psvariable]", "keyword" },
			  { "[ref]", "keyword" },
			  { "[regex]", "keyword" },
			  { "[runspace]", "keyword" },
			  { "[sbyte]", "keyword" },
			  { "[scriptblock]", "keyword" },
			  { "[short]", "keyword" },
			  { "[single]", "keyword" },
			  { "[string]", "keyword" },
			  { "[switch]", "keyword" },
			  { "[timespan]", "keyword" },
			  { "[type]", "keyword" },
			  { "[uint]", "keyword" },
			  { "[uint16]", "keyword" },
			  { "[uint32]", "keyword" },
			  { "[uint64]", "keyword" },
			  { "[ulong]", "keyword" },
			  { "[uri]", "keyword" },
			  { "[ushort]", "keyword" },
			  { "[version]", "keyword" },
			  { "[void]", "keyword" },
			  { "[wmi]", "keyword" },
			  { "[wmiclass]", "keyword" },
			  { "[xml]", "keyword" },

		  },
		  "#",
		  {}

		} );
}

}}}} // namespace EE::UI::Doc::Language
