[gtksourceview/wip/chergert/backport-implregex-to-gsv4: 1/2] data: backport language-specs from GSV 5.x




commit 0dae82fb1e21ce3dd2cf911d5b5e2318688754f8
Author: Christian Hergert <chergert redhat com>
Date:   Mon Sep 5 16:01:47 2022 -0700

    data: backport language-specs from GSV 5.x
    
    This includes many changes for regexes so that they match what is
    expected from newer PCRE implementations.

 data/language-specs/awk.lang                       |    6 +
 data/language-specs/c.lang                         |   15 +-
 data/language-specs/chdr.lang                      |    2 +-
 data/language-specs/cpp.lang                       |    7 +-
 data/language-specs/cpphdr.lang                    |    2 +-
 data/language-specs/css.lang                       |   10 +-
 data/language-specs/cuda.lang                      |    2 +-
 data/language-specs/def.lang                       |   12 +-
 data/language-specs/gdscript.lang                  |    2 +-
 data/language-specs/groovy.lang                    |    6 +-
 data/language-specs/html.lang                      |    4 +-
 data/language-specs/j.lang                         |    2 +-
 data/language-specs/javascript-expressions.lang    |    6 +-
 .../javascript-functions-classes.lang              |    2 +-
 data/language-specs/javascript-literals.lang       |    6 +-
 data/language-specs/javascript-modules.lang        |    2 +-
 data/language-specs/javascript-statements.lang     |    2 +-
 data/language-specs/javascript-values.lang         |    4 +-
 data/language-specs/javascript.lang                |   10 +-
 data/language-specs/jsdoc.lang                     |    2 +-
 data/language-specs/jsx.lang                       |    2 +-
 data/language-specs/lean.lang                      |   64 +-
 data/language-specs/less.lang                      |    2 +-
 data/language-specs/logtalk.lang                   |    8 +-
 data/language-specs/objj.lang                      |    2 +-
 data/language-specs/perl.lang                      |    6 +-
 data/language-specs/php.lang                       |    6 +-
 data/language-specs/powershell.lang                | 1020 +++++++++++---------
 data/language-specs/python.lang                    |    2 +-
 data/language-specs/python3.lang                   |  134 ++-
 data/language-specs/scss.lang                      |    2 +-
 data/language-specs/twig.lang                      |  346 +++++++
 data/language-specs/typescript-js-expressions.lang |    2 +-
 .../typescript-js-functions-classes.lang           |    2 +-
 data/language-specs/typescript-js-literals.lang    |    2 +-
 data/language-specs/typescript-js-modules.lang     |    2 +-
 data/language-specs/typescript-js-statements.lang  |    2 +-
 data/language-specs/typescript-jsx.lang            |    2 +-
 .../typescript-type-expressions.lang               |    2 +-
 data/language-specs/typescript-type-generics.lang  |    2 +-
 data/language-specs/typescript-type-literals.lang  |    2 +-
 data/language-specs/typescript.lang                |    2 +-
 tests/syntax-highlighting/file.awk                 |   21 +
 tests/syntax-highlighting/file.css                 |    2 +-
 tests/syntax-highlighting/file.erb                 |    2 +-
 tests/syntax-highlighting/file.ftl                 |    2 +-
 tests/syntax-highlighting/file.lean                |   11 +-
 tests/syntax-highlighting/file.less                |    2 +-
 tests/syntax-highlighting/file.pl                  |   35 +
 tests/syntax-highlighting/file.py3                 |   15 +
 tests/syntax-highlighting/file.scss                |    2 +-
 tests/syntax-highlighting/file.svh                 |    2 +-
 tests/syntax-highlighting/file.toml                |    2 +-
 tests/syntax-highlighting/file.twig                |   23 +
 54 files changed, 1268 insertions(+), 569 deletions(-)
---
diff --git a/data/language-specs/awk.lang b/data/language-specs/awk.lang
index 9de238d3..f4d88802 100644
--- a/data/language-specs/awk.lang
+++ b/data/language-specs/awk.lang
@@ -32,6 +32,7 @@
     <style id="pattern" name="Pattern" map-to="def:preprocessor"/>
     <style id="variable" name="Variable" map-to="def:identifier"/>
     <style id="builtin-function" name="Builtin Function" map-to="def:builtin"/>
+    <style id="regexpr" name="Regular Expression" map-to="def:string"/>
   </styles>
 
   <definitions>
@@ -118,6 +119,10 @@
       <match>\$\d+</match>
     </context>
 
+    <context id="regexpr" style-ref="regexpr">
+      <match>/.*/</match>
+    </context>
+
     <context id="awk">
       <include>
         <context ref="def:shebang"/>
@@ -129,6 +134,7 @@
         <context ref="field-variable"/>
         <context ref="built-in-functions"/>
         <context ref="arithmetic-functions"/>
+        <context ref="regexpr"/>
       </include>
     </context>
 
diff --git a/data/language-specs/c.lang b/data/language-specs/c.lang
index dc5359c3..d945789c 100644
--- a/data/language-specs/c.lang
+++ b/data/language-specs/c.lang
@@ -232,24 +232,15 @@
       <keyword>_Complex</keyword>
       <keyword>_Imaginary</keyword>
       <keyword>char</keyword>
-      <keyword>char(16|32)_t</keyword>
-      <keyword>double(_t)?</keyword>
-      <keyword>float(_t)?</keyword>
+      <keyword>double</keyword>
+      <keyword>float</keyword>
       <keyword>int</keyword>
-      <keyword>(u)?int(_least|_fast)?(8|16|32|64)_t</keyword>
-      <keyword>(u)?intmax_t</keyword>
-      <keyword>(u)?intptr_t</keyword>
       <keyword>long</keyword>
-      <keyword>ptrdiff_t</keyword>
-      <keyword>off(64)?_t</keyword>
       <keyword>short</keyword>
       <keyword>signed</keyword>
-      <keyword>size_t</keyword>
-      <keyword>ssize_t</keyword>
       <keyword>unsigned</keyword>
       <keyword>void</keyword>
-      <keyword>wchar_t</keyword>
-      <keyword>wint_t</keyword>
+      <keyword>[a-z_][0-9a-z_]+(_t|_T)</keyword>
     </context>
 
     <context id="storage-class" style-ref="storage-class">
diff --git a/data/language-specs/chdr.lang b/data/language-specs/chdr.lang
index 1d611743..5d485a33 100644
--- a/data/language-specs/chdr.lang
+++ b/data/language-specs/chdr.lang
@@ -39,7 +39,7 @@
     for instance a different style for C++ headers.
   -->
   <definitions>
-    <context id="chdr">
+    <context id="chdr" class="no-spell-check">
       <include>
         <context ref="objc:objc-header"/>
         <context ref="cpp:cpp-proper"/>
diff --git a/data/language-specs/cpp.lang b/data/language-specs/cpp.lang
index 8f350c10..d2835c54 100644
--- a/data/language-specs/cpp.lang
+++ b/data/language-specs/cpp.lang
@@ -35,6 +35,7 @@
         <style id="raw-string" name="Raw String" map-to="def:string"/>
         <style id="keyword" name="Keyword" map-to="c:keyword"/>
         <style id="type" name="Data Type" map-to="c:type"/>
+        <style id="nullptr" name="Null Pointer Value" map-to="def:special-constant"/>
         <style id="common-defines" name="Common Defines" map-to="c:common-defines"/>
     </styles>
 
@@ -73,7 +74,6 @@
                     <keyword>noexcept</keyword>
                     <keyword>not</keyword>
                     <keyword>not_eq</keyword>
-                    <keyword>nullptr</keyword>
                     <keyword>operator</keyword>
                     <keyword>or</keyword>
                     <keyword>or_eq</keyword>
@@ -104,7 +104,10 @@
                 <context id="types" style-ref="type">
                     <keyword>explicit</keyword>
                     <keyword>mutable</keyword>
-                    <keyword>nullptr_t</keyword>
+                </context>
+
+                <context id="nullptr" style-ref="nullptr">
+                    <keyword>nullptr</keyword>
                 </context>
 
                 <context id="common-defines" style-ref="common-defines">
diff --git a/data/language-specs/cpphdr.lang b/data/language-specs/cpphdr.lang
index 519846b3..232e2f5b 100644
--- a/data/language-specs/cpphdr.lang
+++ b/data/language-specs/cpphdr.lang
@@ -31,7 +31,7 @@
   </metadata>
 
   <definitions>
-    <context id="cpphdr">
+    <context id="cpphdr" class="no-spell-check">
       <include>
         <context ref="cpp:cpp-proper"/>
         <context ref="c:c"/>
diff --git a/data/language-specs/css.lang b/data/language-specs/css.lang
index 7d49cfbc..e9c9369d 100644
--- a/data/language-specs/css.lang
+++ b/data/language-specs/css.lang
@@ -97,7 +97,7 @@
   <default-regex-options case-sensitive="false"/>
 
   <!-- from keyword-code-point -->
-  
<keyword-char-class>[^\x{0}-\x{2C}\x{2E}\x{2F}\x{3A}-\x{40}\x{5B}\x{5D}\x{5E}\x{60}\x{7B}-\x{7F}]</keyword-char-class>
+  
<keyword-char-class>[^\N{U+0}-\N{U+2C}\N{U+2E}\N{U+2F}\N{U+3A}-\N{U+40}\N{U+5B}\N{U+5D}\N{U+5E}\N{U+60}\N{U+7B}-\N{U+7F}]</keyword-char-class>
 
   <definitions>
 
@@ -136,7 +136,7 @@
     U+0080-       Non-ASCII
     -->
     <define-regex id="identifier-start-code-point" extended="true">
-      [^\x{0}-\x{40}\x{5B}-\x{5E}\x{60}\x{7B}-\x{7F}]
+      [^\N{U+0}-\N{U+40}\N{U+5B}-\N{U+5E}\N{U+60}\N{U+7B}-\N{U+7F}]
     </define-regex>
 
     <!--
@@ -151,7 +151,7 @@
     U+0080-       Non-ASCII
     -->
     <define-regex id="identifier-code-point" extended="true">
-      [^\x{0}-\x{2C}\x{2E}\x{2F}\x{3A}-\x{40}\x{5B}-\x{5E}\x{60}\x{7B}-\x{7F}]
+      [^\N{U+0}-\N{U+2C}\N{U+2E}\N{U+2F}\N{U+3A}-\N{U+40}\N{U+5B}-\N{U+5E}\N{U+60}\N{U+7B}-\N{U+7F}]
     </define-regex>
 
     <!--
@@ -165,7 +165,7 @@
     U+0080-       Non-ASCII
     -->
     <define-regex id="identifier-prefix-code-point" extended="true">
-      [^\x{0}-\x{2F}\x{3A}-\x{40}\x{5B}-\x{5E}\x{60}\x{7B}-\x{7F}]
+      [^\N{U+0}-\N{U+2F}\N{U+3A}-\N{U+40}\N{U+5B}-\N{U+5E}\N{U+60}\N{U+7B}-\N{U+7F}]
     </define-regex>
 
     <!--
@@ -181,7 +181,7 @@
     U+0080-       Non-ASCII
     -->
     <define-regex id="keyword-code-point" extended="true">
-      [^\x{0}-\x{2C}\x{2E}\x{2F}\x{3A}-\x{40}\x{5B}\x{5D}\x{5E}\x{60}\x{7B}-\x{7F}]
+      [^\N{U+0}-\N{U+2C}\N{U+2E}\N{U+2F}\N{U+3A}-\N{U+40}\N{U+5B}\N{U+5D}\N{U+5E}\N{U+60}\N{U+7B}-\N{U+7F}]
     </define-regex>
 
     <!--
diff --git a/data/language-specs/cuda.lang b/data/language-specs/cuda.lang
index b74d1313..16721f3d 100644
--- a/data/language-specs/cuda.lang
+++ b/data/language-specs/cuda.lang
@@ -84,7 +84,7 @@
       <keyword>threadIdx</keyword>
     </context>
 
-    <context id="kernel-call" style-ref="def:string">
+    <context id="kernel-call">
       <start>&lt;&lt;&lt;</start>
       <end>&gt;&gt;&gt;</end>
     </context>
diff --git a/data/language-specs/def.lang b/data/language-specs/def.lang
index 4a07444c..ebe1d183 100644
--- a/data/language-specs/def.lang
+++ b/data/language-specs/def.lang
@@ -30,7 +30,7 @@
          A style scheme has to at least define the style
          for the first item of each group and if desired
          define the style for the other items to achieve a
-         more finegrained control on the apperance.
+         more finegrained control on the appearance.
          Finally a style scheme may also define language
          specific styles. -->
 
@@ -125,7 +125,7 @@
     <style id="preprocessor"        name="Preprocessor directive"/>
     <!-- Any erroneous construct -->
     <style id="error"               name="Error"/>
-    <!-- to mark possibily errors or unrecommended syntax  -->
+    <!-- to mark possibly errors or unrecommended syntax  -->
     <style id="warning"             name="Warning"/>
     <!--Reserved keywords: like "const" and "goto" in Java -->
     <style id="reserved"            name="Reserved keyword" map-to="def:error" />
@@ -165,17 +165,17 @@
          ID_Start and ID_Continue
     -->
     <define-regex id="unicode-id-start" extended="true">
-      (?!\x{2E2F}) [\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}]
+      (?!\N{U+2E2F}) [\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}]
     </define-regex>
     <define-regex id="unicode-id-continue" extended="true">
-      (?!\x{2E2F}) 
[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}]
+      (?!\N{U+2E2F}) 
[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}]
     </define-regex>
     <define-regex id="unicode-xid-start" extended="true">
-      
(?![\x{037A}\x{0E33}\x{0EB3}\x{309B}-\x{309C}\x{FC5E}-\x{FC63}\x{FDFA}-\x{FDFB}\x{FE70}\x{FE72}\x{FE74}\x{FE76}\x{FE78}\x{FE7A}\x{FE7C}\x{FE7E}\x{FF9E}-\x{FF9F}])
+      
(?![\N{U+037A}\N{U+0E33}\N{U+0EB3}\N{U+309B}-\N{U+309C}\N{U+FC5E}-\N{U+FC63}\N{U+FDFA}-\N{U+FDFB}\N{U+FE70}\N{U+FE72}\N{U+FE74}\N{U+FE76}\N{U+FE78}\N{U+FE7A}\N{U+FE7C}\N{U+FE7E}\N{U+FF9E}-\N{U+FF9F}])
       \%{unicode-id-start}
     </define-regex>
     <define-regex id="unicode-xid-continue" extended="true">
-      
(?![\x{037A}\x{309B}-\x{309C}\x{FC5E}-\x{FC63}\x{FDFA}-\x{FDFB}\x{FE70}\x{FE72}\x{FE74}\x{FE76}\x{FE78}\x{FE7A}\x{FE7C}\x{FE7E}])
+      
(?![\N{U+037A}\N{U+309B}-\N{U+309C}\N{U+FC5E}-\N{U+FC63}\N{U+FDFA}-\N{U+FDFB}\N{U+FE70}\N{U+FE72}\N{U+FE74}\N{U+FE76}\N{U+FE78}\N{U+FE7A}\N{U+FE7C}\N{U+FE7E}])
       \%{unicode-id-continue}
     </define-regex>
 
diff --git a/data/language-specs/gdscript.lang b/data/language-specs/gdscript.lang
index 1933d066..4a02df41 100644
--- a/data/language-specs/gdscript.lang
+++ b/data/language-specs/gdscript.lang
@@ -56,7 +56,7 @@
         [#0\-\ \+]*             # conversion flags
         (\-?\%{number}|\*)?     # minimum field width
         (\.(\-?\%{number}|\*))? # precision
-        (hlL)?                  # lentgh modifier
+        (hlL)?                  # length modifier
         [diouxXeEfFgGcrs%]      # conversion type
       </match>
     </context>
diff --git a/data/language-specs/groovy.lang b/data/language-specs/groovy.lang
index 538f4d5c..3e8dfcb9 100644
--- a/data/language-specs/groovy.lang
+++ b/data/language-specs/groovy.lang
@@ -61,7 +61,7 @@
     </define-regex>
 
     <define-regex id="letter" extended="true">
-      [a-zA-Z\x{c0}-\x{d6}\x{d8}-\x{f6}\x{f8}-\x{ff}\x{100}-\x{fffe}_]
+      [a-zA-Z\N{U+c0}-\N{U+d6}\N{U+d8}-\N{U+f6}\N{U+f8}-\N{U+ff}\N{U+100}-\N{U+fffe}_]
     </define-regex>
 
     <context id="escaped-character">
@@ -155,8 +155,8 @@
         # we can't have it match an arbitrary amount of whitespace. Thus, we do an approximate
         # check, only trying zero and one spaces.
 
-        (?&lt;! \+\+   | --   | [])}'"\$\d]   | \%{letter} |
-                \+\+\s | --\s | [])}'"\$\d]\s | \%{letter}\s )
+        (?&lt;! \+\+   | --   | [\]\)}'"\$\d]   | \%{letter} |
+                \+\+\s | --\s | [\]\)}'"\$\d]\s | \%{letter}\s )
 
         /
       </start>
diff --git a/data/language-specs/html.lang b/data/language-specs/html.lang
index effd373b..85c0864a 100644
--- a/data/language-specs/html.lang
+++ b/data/language-specs/html.lang
@@ -267,7 +267,7 @@
     </context>
 
     <!-- See https://gitlab.gnome.org/GNOME/gtksourceview/commit/5385eb27720875bc144d54ccbd00d1613c41f7e0 -->
-    <define-regex id="attribute-name">[^\x00\t\n\f\r 
"'/&lt;=&gt;\x{007F}-\x{009F}\x{FDD0}-\x{FDEF}\x{FFFE}\x{FFFF}\x{1FFFE}\x{1FFFF}\x{2FFFE}\x{2FFFF}\x{3FFFE}\x{3FFFF}\x{4FFFE}\x{4FFFF}\x{5FFFE}\x{5FFFF}\x{6FFFE}\x{6FFFF}\x{7FFFE}\x{7FFFF}\x{8FFFE}\x{8FFFF}\x{9FFFE}\x{9FFFF}\x{AFFFE}\x{AFFFF}\x{BFFFE}\x{BFFFF}\x{CFFFE}\x{CFFFF}\x{DFFFE}\x{DFFFF}\x{EFFFE}\x{EFFFF}\x{FFFFE}\x{FFFFF}\x{10FFFE}\x{10FFFF}]+</define-regex>
+    <define-regex id="attribute-name">[^\N{U+00}\t\n\f\r 
"'/&lt;=&gt;\N{U+007F}-\N{U+009F}\N{U+FDD0}-\N{U+FDEF}\N{U+FFFE}\N{U+FFFF}\N{U+1FFFE}\N{U+1FFFF}\N{U+2FFFE}\N{U+2FFFF}\N{U+3FFFE}\N{U+3FFFF}\N{U+4FFFE}\N{U+4FFFF}\N{U+5FFFE}\N{U+5FFFF}\N{U+6FFFE}\N{U+6FFFF}\N{U+7FFFE}\N{U+7FFFF}\N{U+8FFFE}\N{U+8FFFF}\N{U+9FFFE}\N{U+9FFFF}\N{U+AFFFE}\N{U+AFFFF}\N{U+BFFFE}\N{U+BFFFF}\N{U+CFFFE}\N{U+CFFFF}\N{U+DFFFE}\N{U+DFFFF}\N{U+EFFFE}\N{U+EFFFF}\N{U+FFFFE}\N{U+FFFFF}\N{U+10FFFE}\N{U+10FFFF}]+</define-regex>
 
     <context id="generic-tag">
       <include>
@@ -382,7 +382,7 @@
 
     <context id="tag" class="no-spell-check">
       <!-- See https://gitlab.gnome.org/GNOME/gtksourceview/commit/5385eb27720875bc144d54ccbd00d1613c41f7e0 
-->
-      <start>&lt;/?[a-z][^\x00\t\n\f\r 
/&gt;\x{007F}-\x{009F}\x{FDD0}-\x{FDEF}\x{FFFE}\x{FFFF}\x{1FFFE}\x{1FFFF}\x{2FFFE}\x{2FFFF}\x{3FFFE}\x{3FFFF}\x{4FFFE}\x{4FFFF}\x{5FFFE}\x{5FFFF}\x{6FFFE}\x{6FFFF}\x{7FFFE}\x{7FFFF}\x{8FFFE}\x{8FFFF}\x{9FFFE}\x{9FFFF}\x{AFFFE}\x{AFFFF}\x{BFFFE}\x{BFFFF}\x{CFFFE}\x{CFFFF}\x{DFFFE}\x{DFFFF}\x{EFFFE}\x{EFFFF}\x{FFFFE}\x{FFFFF}\x{10FFFE}\x{10FFFF}]*</start>
+      <start>&lt;/?[a-z][^\N{U+00}\t\n\f\r 
/&gt;\N{U+007F}-\N{U+009F}\N{U+FDD0}-\N{U+FDEF}\N{U+FFFE}\N{U+FFFF}\N{U+1FFFE}\N{U+1FFFF}\N{U+2FFFE}\N{U+2FFFF}\N{U+3FFFE}\N{U+3FFFF}\N{U+4FFFE}\N{U+4FFFF}\N{U+5FFFE}\N{U+5FFFF}\N{U+6FFFE}\N{U+6FFFF}\N{U+7FFFE}\N{U+7FFFF}\N{U+8FFFE}\N{U+8FFFF}\N{U+9FFFE}\N{U+9FFFF}\N{U+AFFFE}\N{U+AFFFF}\N{U+BFFFE}\N{U+BFFFF}\N{U+CFFFE}\N{U+CFFFF}\N{U+DFFFE}\N{U+DFFFF}\N{U+EFFFE}\N{U+EFFFF}\N{U+FFFFE}\N{U+FFFFF}\N{U+10FFFE}\N{U+10FFFF}]*</start>
       <end>/?&gt;</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="tag"/>
diff --git a/data/language-specs/j.lang b/data/language-specs/j.lang
index 44d3b5e8..34c8910d 100644
--- a/data/language-specs/j.lang
+++ b/data/language-specs/j.lang
@@ -189,7 +189,7 @@
 
     <!-- Lab text definition -->
     <context id="labtext" style-ref="labtext">
-      <start>^\s*[\x{2500}|-]{2,}</start>
+      <start>^\s*[\N{U+2500}|-]{2,}</start>
       <end>\%{close-expdef}</end>
     </context>
 
diff --git a/data/language-specs/javascript-expressions.lang b/data/language-specs/javascript-expressions.lang
index 3b3cc350..9025ab9b 100644
--- a/data/language-specs/javascript-expressions.lang
+++ b/data/language-specs/javascript-expressions.lang
@@ -26,7 +26,7 @@
 -->
 <language id="js-expr" name="JavaScript Expressions" version="2.0" _section="Script" hidden="true">
   <!-- from js:identifier-char -->
-  
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</keyword-char-class>
+  
<keyword-char-class>(?!\N{U+2E2F})[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}$\N{U+200C}\N{U+200D}]</keyword-char-class>
 
   <definitions>
 
@@ -494,7 +494,7 @@
         <context id="_async-keywords" style-ref="js:keyword">
           <match extended="true">
             \%{js:async-keyword}
-            # preceeds arrow function
+            # precedes arrow function
             (?=
               \%{js:optional-whitespace-or-comments}
               (?:
@@ -502,7 +502,7 @@
                 \(  # can this be better?
               )
             )
-            # does not preceed "function" (leave to function expression)
+            # does not precede "function" (leave to function expression)
             (?! \%{js:optional-whitespace-or-comments} \%{js:function-keyword} )
           </match>
         </context> <!-- /_async-keywords -->
diff --git a/data/language-specs/javascript-functions-classes.lang 
b/data/language-specs/javascript-functions-classes.lang
index 94f872db..5a056bae 100644
--- a/data/language-specs/javascript-functions-classes.lang
+++ b/data/language-specs/javascript-functions-classes.lang
@@ -26,7 +26,7 @@
 -->
 <language id="js-fn" name="JavaScript Functions and Classes" version="2.0" _section="Script" hidden="true">
   <!-- from js:identifier-char -->
-  
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</keyword-char-class>
+  
<keyword-char-class>(?!\N{U+2E2F})[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}$\N{U+200C}\N{U+200D}]</keyword-char-class>
 
   <definitions>
 
diff --git a/data/language-specs/javascript-literals.lang b/data/language-specs/javascript-literals.lang
index bccbbc9c..8e69ac74 100644
--- a/data/language-specs/javascript-literals.lang
+++ b/data/language-specs/javascript-literals.lang
@@ -26,7 +26,7 @@
 -->
 <language id="js-lit" name="JavaScript Literals" version="2.0" _section="Script" hidden="true">
   <!-- from js:identifier-char -->
-  
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</keyword-char-class>
+  
<keyword-char-class>(?!\N{U+2E2F})[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}$\N{U+200C}\N{U+200D}]</keyword-char-class>
 
   <definitions>
 
@@ -142,7 +142,7 @@
     <context id="_escapes">
       <include>
 
-        <!-- Annex B: <LegacyOctalEscapeSequence> (preceeded by
+        <!-- Annex B: <LegacyOctalEscapeSequence> (preceded by
              backslash) -->
         <context id="_legacy-octal-escape-sequences" style-ref="js:escape">
           <match extended="true">
@@ -155,7 +155,7 @@
           </match>
         </context> <!-- /_legacy-octal-escape-sequences -->
 
-        <!-- <EscapeSequence> (preceeded by backslash) -->
+        <!-- <EscapeSequence> (preceded by backslash) -->
         <context id="_escape-sequences" style-ref="js:escape">
           <match extended="true">
             \%{js:unicode-escape} |
diff --git a/data/language-specs/javascript-modules.lang b/data/language-specs/javascript-modules.lang
index df5a37c2..5a8802c3 100644
--- a/data/language-specs/javascript-modules.lang
+++ b/data/language-specs/javascript-modules.lang
@@ -26,7 +26,7 @@
 -->
 <language id="js-mod" name="JavaScript Modules" version="2.0" _section="Script" hidden="true">
   <!-- from js:identifier-char -->
-  
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</keyword-char-class>
+  
<keyword-char-class>(?!\N{U+2E2F})[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}$\N{U+200C}\N{U+200D}]</keyword-char-class>
 
   <definitions>
 
diff --git a/data/language-specs/javascript-statements.lang b/data/language-specs/javascript-statements.lang
index ab0359f4..b9c48af4 100644
--- a/data/language-specs/javascript-statements.lang
+++ b/data/language-specs/javascript-statements.lang
@@ -26,7 +26,7 @@
 -->
 <language id="js-st" name="JavaScript Statements" version="2.0" _section="Script" hidden="true">
   <!-- from js:identifier-char -->
-  
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</keyword-char-class>
+  
<keyword-char-class>(?!\N{U+2E2F})[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}$\N{U+200C}\N{U+200D}]</keyword-char-class>
 
   <definitions>
 
diff --git a/data/language-specs/javascript-values.lang b/data/language-specs/javascript-values.lang
index a5af679b..ea57f633 100644
--- a/data/language-specs/javascript-values.lang
+++ b/data/language-specs/javascript-values.lang
@@ -26,7 +26,7 @@
 -->
 <language id="js-val" name="JavaScript Built-in Values" version="2.0" _section="Script" hidden="true">
   <!-- from js:identifier-char -->
-  
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</keyword-char-class>
+  
<keyword-char-class>(?!\N{U+2E2F})[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}$\N{U+200C}\N{U+200D}]</keyword-char-class>
 
   <definitions>
 
@@ -43,7 +43,7 @@
         <!--
             There was a long discussion on ##javascript on freenode between
             'katspaugh', 'joo' and 'prog_' on whether 'undefined' should be
-            highlighted on not, specialy as a constant. The conclusion was "It can't
+            highlighted on not, specially as a constant. The conclusion was "It can't
             be highlighted as a constant literal value, because it can be an
             identifier (of a variable value) but leave it be as it is. Let tradition
             and convention obscure the details."
diff --git a/data/language-specs/javascript.lang b/data/language-specs/javascript.lang
index ecbfed1a..a3cc2d35 100644
--- a/data/language-specs/javascript.lang
+++ b/data/language-specs/javascript.lang
@@ -120,7 +120,7 @@
   </styles>
 
   <!-- from identifier-char -->
-  
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</keyword-char-class>
+  
<keyword-char-class>(?!\N{U+2E2F})[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}$\N{U+200C}\N{U+200D}]</keyword-char-class>
 
   <definitions>
 
@@ -167,7 +167,7 @@
          Naming convention for contexts:
          * Prefixes:
            * "_" (underscore): "Private" to one or more "public"
-             contexts (can still be overriden by child languages)
+             contexts (can still be overridden by child languages)
            * "ordered-": Wrapper for another context so that it can only
              match in a referenced position (has once-only="true")
            * "last-": An "ordered-" wrapper with end-parent="true",
@@ -205,7 +205,7 @@
          U+200D Zero-width joiner <ZWJ>
     -->
     <define-regex id="identifier-char" extended="true">
-      \%{def:unicode-id-continue} | [$\x{200C}\x{200D}]
+      \%{def:unicode-id-continue} | [$\N{U+200C}\N{U+200D}]
     </define-regex> <!-- /identifier-char -->
 
     <!-- <IdentifierPart> -->
@@ -244,7 +244,7 @@
          Zs Space_Separator category <USP>
     -->
     <define-regex id="whitespace" extended="true">
-      [\t\x{000B}\f \x{00A0}\x{FEFF}\p{Zs}]
+      [\t\N{U+000B}\f \N{U+00A0}\N{U+FEFF}\p{Zs}]
     </define-regex> <!-- /whitespace -->
 
     <!-- includes characters from <LineTerminator>,
@@ -257,7 +257,7 @@
          U+2029 Paragraph separator <PS>
     -->
     <define-regex id="not-whitespace" extended="true">
-      [^\t\x{000B}\f \x{00A0}\x{FEFF}\p{Zs}\n\r\x{2028}\x{2029}]
+      [^\t\N{U+000B}\f \N{U+00A0}\N{U+FEFF}\p{Zs}\n\r\N{U+2028}\N{U+2029}]
     </define-regex> <!-- /not-whitespace -->
 
     <define-regex id="before-next-token" extended="true">
diff --git a/data/language-specs/jsdoc.lang b/data/language-specs/jsdoc.lang
index 9b011b26..bad98882 100644
--- a/data/language-specs/jsdoc.lang
+++ b/data/language-specs/jsdoc.lang
@@ -35,7 +35,7 @@
   </styles>
 
   <!-- from js:identifier-char -->
-  
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</keyword-char-class>
+  
<keyword-char-class>(?!\N{U+2E2F})[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}$\N{U+200C}\N{U+200D}]</keyword-char-class>
 
   <definitions>
 
diff --git a/data/language-specs/jsx.lang b/data/language-specs/jsx.lang
index b493ce52..5c5a8cb9 100644
--- a/data/language-specs/jsx.lang
+++ b/data/language-specs/jsx.lang
@@ -37,7 +37,7 @@
   </styles>
 
   <!-- from js:identifier-char -->
-  
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</keyword-char-class>
+  
<keyword-char-class>(?!\N{U+2E2F})[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}$\N{U+200C}\N{U+200D}]</keyword-char-class>
 
   <definitions>
 
diff --git a/data/language-specs/lean.lang b/data/language-specs/lean.lang
index 2cb0e051..3fac5b49 100644
--- a/data/language-specs/lean.lang
+++ b/data/language-specs/lean.lang
@@ -4,7 +4,7 @@
  This file is part of GtkSourceView
 
  Authors: Elias Aebi
- Copyright (C) 2021 Elias Aebi
+ Copyright (C) 2021-2022 Elias Aebi
 
  GtkSourceView is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
@@ -31,6 +31,7 @@
 
   <styles>
     <style id="comment" name="Comment" map-to="def:comment"/>
+    <style id="attribute" name="Attribute" map-to="def:preprocessor"/>
     <style id="command" name="Command" map-to="def:preprocessor"/>
     <style id="keyword" name="Keyword" map-to="def:keyword"/>
     <style id="string" name="String" map-to="def:string"/>
@@ -38,6 +39,7 @@
     <style id="escaped-character" name="Escaped Character" map-to="def:special-char"/>
     <style id="numeric" name="Numeric" map-to="def:number"/>
     <style id="boolean" name="Boolean" map-to="def:boolean"/>
+    <style id="identifier" name="Identifier"/>
   </styles>
 
   <definitions>
@@ -57,27 +59,38 @@
       </include>
     </context>
 
+    <context id="attribute" style-ref="attribute">
+      <start>@\[</start>
+      <end>\]</end>
+      <include>
+        <context ref="lean"/>
+      </include>
+    </context>
+
     <context id="command" style-ref="command">
       <match extended="true">
-        ^\s*\#(
+        \#(?:
             check(_failure)?
           | eval
           | print
           | reduce
-        )
+        )\b
       </match>
     </context>
 
     <context id="keyword" style-ref="keyword">
+      <keyword>abbrev</keyword>
       <keyword>axiom</keyword>
       <keyword>break</keyword>
       <keyword>class</keyword>
       <keyword>continue</keyword>
       <keyword>def</keyword>
+      <keyword>deriving</keyword>
       <keyword>do</keyword>
       <keyword>else</keyword>
       <keyword>end</keyword>
       <keyword>example</keyword>
+      <keyword>extends</keyword>
       <keyword>for</keyword>
       <keyword>fun</keyword>
       <keyword>if</keyword>
@@ -88,7 +101,10 @@
       <keyword>match</keyword>
       <keyword>mut</keyword>
       <keyword>namespace</keyword>
+      <keyword>opaque</keyword>
       <keyword>open</keyword>
+      <keyword>partial</keyword>
+      <keyword>rec</keyword>
       <keyword>return</keyword>
       <keyword>section</keyword>
       <keyword>structure</keyword>
@@ -101,24 +117,24 @@
       <keyword>λ</keyword>
     </context>
 
-    <define-regex id="string-escape" extended="true">
-      \\(
-          \\
-        | \"
-        | \'
-        | n
-        | t
-        | x[0-9a-fA-F]{2}
-      )
-    </define-regex>
+    <context id="escaped-character" style-ref="escaped-character">
+      <match extended="true">
+        \\(?:
+            \\
+          | \"
+          | \'
+          | n
+          | t
+          | x[0-9a-fA-F]{2}
+        )
+      </match>
+    </context>
 
     <context id="string" style-ref="string" end-at-line-end="true" class="string" 
class-disabled="no-spell-check">
       <start>"</start>
       <end>"</end>
       <include>
-        <context style-ref="escaped-character">
-          <match>\%{string-escape}</match>
-        </context>
+        <context ref="escaped-character"/>
       </include>
     </context>
 
@@ -126,15 +142,13 @@
       <start>'</start>
       <end>'</end>
       <include>
-        <context style-ref="escaped-character">
-          <match>\%{string-escape}</match>
-        </context>
+        <context ref="escaped-character"/>
       </include>
     </context>
 
     <context id="numeric" style-ref="numeric">
       <match extended="true">
-          0[bB][0-1]+
+          0[bB][01]+
         | 0[oO][0-7]+
         | 0[xX][0-9a-fA-F]+
         | [0-9]+
@@ -146,16 +160,26 @@
       <keyword>false</keyword>
     </context>
 
+    <context id="identifier" style-ref="identifier">
+      <match extended="true">
+        (?![λΠΣ])[a-zA-Zα-ωΑ-Ωἀ-῾ϊ-ϻ℀-⅏_]
+        (?:(?![λΠΣ])[a-zA-Zα-ωΑ-Ωἀ-῾ϊ-ϻ℀-⅏_0-9'ⁿ₀-₉ₐ-ₜᵢ-ᵪ])*
+        | «[^«»\r\n\t]*»
+      </match>
+    </context>
+
     <context id="lean" class="no-spell-check">
       <include>
         <context ref="line-comment"/>
         <context ref="block-comment"/>
+        <context ref="attribute"/>
         <context ref="command"/>
         <context ref="keyword"/>
         <context ref="string"/>
         <context ref="character"/>
         <context ref="numeric"/>
         <context ref="boolean"/>
+        <context ref="identifier"/>
       </include>
     </context>
 
diff --git a/data/language-specs/less.lang b/data/language-specs/less.lang
index 3fdb955a..7509ddbb 100644
--- a/data/language-specs/less.lang
+++ b/data/language-specs/less.lang
@@ -56,7 +56,7 @@
   <default-regex-options case-sensitive="false"/>
 
   <!-- from css:keyword-code-point -->
-  
<keyword-char-class>[^\x{0}-\x{2C}\x{2E}\x{2F}\x{3A}-\x{40}\x{5B}\x{5D}\x{5E}\x{60}\x{7B}-\x{7F}]</keyword-char-class>
+  
<keyword-char-class>[^\N{U+0}-\N{U+2C}\N{U+2E}\N{U+2F}\N{U+3A}-\N{U+40}\N{U+5B}\N{U+5D}\N{U+5E}\N{U+60}\N{U+7B}-\N{U+7F}]</keyword-char-class>
 
   <definitions>
 
diff --git a/data/language-specs/logtalk.lang b/data/language-specs/logtalk.lang
index d6f16dc2..aa33e97f 100644
--- a/data/language-specs/logtalk.lang
+++ b/data/language-specs/logtalk.lang
@@ -204,7 +204,7 @@
       <keyword>(copy_term)(?=[(])</keyword>
       <keyword>(numbervars)(?=[(])</keyword>
       <keyword>(term_variables)(?=[(])</keyword>
-      <!-- Arithemtic evaluation -->
+      <!-- Arithmetic evaluation -->
       <keyword>is</keyword>
       <!-- Evaluable functors -->
       <keyword>e</keyword>
@@ -222,7 +222,7 @@
       <keyword>(truncate)(?=[(])</keyword>
       <keyword>(round)(?=[(])</keyword>
       <keyword>(ceiling)(?=[(])</keyword>
-      <!-- Other arithemtic functors -->
+      <!-- Other arithmetic functors -->
       <keyword>(sin)(?=[(])</keyword>
       <keyword>(cos)(?=[(])</keyword>
       <keyword>(tan)(?=[(])</keyword>
@@ -285,7 +285,7 @@
       <keyword>@&gt;</keyword>
       <!-- Term creation and decomposition -->
       <keyword>=\.\.</keyword>
-      <!-- Arithemtic comparison -->
+      <!-- Arithmetic comparison -->
       <keyword>=:=</keyword>
       <keyword>=\\=</keyword>
       <keyword>&lt;</keyword>
@@ -298,7 +298,7 @@
       <keyword>\*</keyword>
       <keyword>//</keyword>
       <keyword>/</keyword>
-      <!-- Other arithemtic functors -->
+      <!-- Other arithmetic functors -->
       <keyword>\*\*</keyword>
       <!-- Bitwise functors -->
       <keyword>&gt;&gt;</keyword>
diff --git a/data/language-specs/objj.lang b/data/language-specs/objj.lang
index 7b4cb79f..505552ca 100644
--- a/data/language-specs/objj.lang
+++ b/data/language-specs/objj.lang
@@ -37,7 +37,7 @@
   </styles>
 
   <!-- from js:identifier-char -->
-  
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</keyword-char-class>
+  
<keyword-char-class>(?!\N{U+2E2F})[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}$\N{U+200C}\N{U+200D}]</keyword-char-class>
 
   <definitions>
 
diff --git a/data/language-specs/perl.lang b/data/language-specs/perl.lang
index 5acb65a7..4b38ec4b 100644
--- a/data/language-specs/perl.lang
+++ b/data/language-specs/perl.lang
@@ -165,7 +165,7 @@ FIXME: =pod should require an empty line before/after, as written in perlpod
     </define-regex>
 
     <!-- this assertion is shared by all the regex contexts to avoid wrong
-         highlighing of function calls, etc.
+         highlighting of function calls, etc.
          \b can't be used because of $var, @var, &func, %func.              -->
     <!-- FIXME I added { and ( to the list to fix #507075 and #535703. Someone
          please look at it, it seems wrong. It probably should be a positive
@@ -1022,7 +1022,7 @@ FIXME: =pod should require an empty line before/after, as written in perlpod
     </context>
 
     <context id="pod" style-ref="pod" class-disabled="no-spell-check">
-      <start>^(?=(=[a-z]))</start>
+      <start>^(?=(=(?!end))[a-z])</start>
       <end>^=(cut)$</end>
       <include>
         <context sub-pattern="1" where="end" style-ref="pod-keyword"/>
@@ -1033,7 +1033,7 @@ FIXME: =pod should require an empty line before/after, as written in perlpod
         </context>
         <context>
           <start>^=(begin)\s+(.*)$</start>
-          <end>^=(end)\s+\%{1@start}$</end>
+          <end>^=(end)\s+\%{2@start}$</end>
           <include>
             <context sub-pattern="1" where="start" style-ref="pod-keyword"/>
             <context sub-pattern="1" where="end" style-ref="pod-keyword"/>
diff --git a/data/language-specs/php.lang b/data/language-specs/php.lang
index 15b3008f..5d9e6fee 100644
--- a/data/language-specs/php.lang
+++ b/data/language-specs/php.lang
@@ -58,7 +58,7 @@
 
   <definitions>
 
-    <define-regex id="identifier">[a-zA-Z_\x{80}-\x{10ffff}][a-zA-Z0-9_\x{80}-\x{10ffff}]*</define-regex>
+    <define-regex 
id="identifier">[a-zA-Z_\N{U+80}-\N{U+10ffff}][a-zA-Z0-9_\N{U+80}-\N{U+10ffff}]*</define-regex>
 
     <context id="bash-line-comment" style-ref="comment" end-at-line-end="true" extend-parent="false" 
class="comment" class-disabled="no-spell-check">
       <start>#</start>
@@ -264,11 +264,15 @@
       <keyword>floatval</keyword>
       <keyword>gettype</keyword>
       <keyword>intval</keyword>
+      <keyword>json_decode</keyword>
+      <keyword>json_encode</keyword>
       <keyword>print_r</keyword>
       <keyword>serialize</keyword>
       <keyword>settype</keyword>
       <keyword>str_contains</keyword>
       <keyword>str_replace</keyword>
+      <keyword>str_starts_with</keyword>
+      <keyword>str_ends_with</keyword>
       <keyword>strip_tags</keyword>
       <keyword>strpos</keyword>
       <keyword>strval</keyword>
diff --git a/data/language-specs/powershell.lang b/data/language-specs/powershell.lang
index 283ed8e5..0dca47c9 100644
--- a/data/language-specs/powershell.lang
+++ b/data/language-specs/powershell.lang
@@ -76,73 +76,76 @@
     </context>
 
     <context id="keywords" style-ref="keyword">
-      <keyword>begin</keyword>
-      <keyword>break</keyword>
-      <keyword>case</keyword>
-      <keyword>Continue</keyword>
+      <keyword>Begin</keyword>
+      <keyword>Break</keyword>
       <keyword>Catch</keyword>
+      <keyword>Class</keyword>
+      <keyword>Continue</keyword>
+      <keyword>Data</keyword>
       <keyword>Default</keyword>
       <keyword>Do</keyword>
+      <keyword>DynamicParam</keyword>
       <keyword>Else</keyword>
       <keyword>Elseif</keyword>
       <keyword>End</keyword>
+      <keyword>Enum</keyword>
       <keyword>Exit</keyword>
       <keyword>Filter</keyword>
+      <keyword>Finally</keyword>
       <keyword>For</keyword>
       <keyword>Foreach</keyword>
       <keyword>Function</keyword>
-      <keyword>Finally</keyword>
+      <keyword>Hidden</keyword>
       <keyword>If</keyword>
       <keyword>In</keyword>
+      <keyword>Parallel</keyword>
       <keyword>Param</keyword>
+      <keyword>Parameter</keyword>
       <keyword>Process</keyword>
       <keyword>Prompt</keyword>
-      <keyword>Parameter</keyword>
       <keyword>Return</keyword>
       <keyword>Switch</keyword>
-      <keyword>Then</keyword>
       <keyword>Throw</keyword>
       <keyword>Trap</keyword>
       <keyword>Try</keyword>
       <keyword>Until</keyword>
+      <keyword>Using</keyword>
       <keyword>While</keyword>
       <keyword>Workflow</keyword>
-      <keyword>Parallel</keyword>
     </context>
 
     <context id="Function-Param" style-ref="function-param">
-        <keyword>DefaultParameterSetName</keyword>
-        <keyword>ConfirmImpact</keyword>
-        <keyword>SupportsShouldProcess</keyword>
-        <keyword>CmdletBinding</keyword>
-        <keyword>Mandatory</keyword>
-        <keyword>Position</keyword>
-        <keyword>ParameterSetName</keyword>
-        <keyword>ValueFromPipeline</keyword>
-        <keyword>ValueFromPipelineByPropertyName</keyword>
-        <keyword>ValueFromPipelineByPropertyName</keyword>
-        <keyword>Alias</keyword>
-        <keyword>AllowNull</keyword>
-        <keyword>AllowEmptyString</keyword>
-        <keyword>AllowEmptyCollection</keyword>
-        <keyword>ValidateCount</keyword>
-        <keyword>ValidateSet</keyword>
-        <keyword>ValidatePattern</keyword>
-        <keyword>ValidateRange</keyword>
-        <keyword>ValidateScript</keyword>
-        <keyword>ValidateNotNull</keyword>
-        <keyword>ValidateNotNullOrEmpty</keyword>
+      <keyword>Alias</keyword>
+      <keyword>AllowEmptyCollection</keyword>
+      <keyword>AllowEmptyString</keyword>
+      <keyword>AllowNull</keyword>
+      <keyword>CmdletBinding</keyword>
+      <keyword>ConfirmImpact</keyword>
+      <keyword>DefaultParameterSetName</keyword>
+      <keyword>Mandatory</keyword>
+      <keyword>ParameterSetName</keyword>
+      <keyword>Position</keyword>
+      <keyword>SupportsShouldProcess</keyword>
+      <keyword>ValidateCount</keyword>
+      <keyword>ValidateNotNull</keyword>
+      <keyword>ValidateNotNullOrEmpty</keyword>
+      <keyword>ValidatePattern</keyword>
+      <keyword>ValidateRange</keyword>
+      <keyword>ValidateScript</keyword>
+      <keyword>ValidateSet</keyword>
+      <keyword>ValueFromPipeline</keyword>
+      <keyword>ValueFromPipelineByPropertyName</keyword>
     </context>
 
     <define-regex id="operator" extended="true">
-    \-
-    (   b?and | b?not | b?or | b?xor | (I|C)?eq | (I|C)?ge | (I|C)?gt |
+      \-
+      ( b?and | b?not | b?or | b?xor | (I|C)?eq | (I|C)?ge | (I|C)?gt |
         (I|C)?le | (I|C)?lt | (I|C)?ne |
         (I|C)?(not)?contains | (I|C)?(not)?like | (I|C)?(not)?match | (I|C)?replace |
-        shr | shl | (not)?in |      # add in powershell 3.0
-        (not)?is | as
-    )
-    \b
+        shr | shl | (not)?in |
+        is(not)? | as
+      )
+      \b
     </define-regex>
 
     <context id="operator" style-ref="operator">
@@ -162,431 +165,559 @@
     </context>
 
     <define-regex id="variable" extended="true">
-        \$
-        ([scriptglobacve]{5,7}:)?   #script:, global:, local:, private:
-        [a-z0-9_]+
-        \b
+      \$
+      ([scriptglobacve]{5,7}:)?   #script:, global:, local:, private:
+      [a-z0-9_]+
+      \b
     </define-regex>
 
     <!-- FixMe $? isn't correct displayed -->
     <context id="Variable" style-ref="variable">
-        <match>\%{variable}</match>
+      <match>\%{variable}</match>
     </context>
 
     <context id="BuiltIn-Function" style-ref="builtin-function">
-        <keyword>Add-Computer</keyword>
-        <keyword>Add-Content</keyword>
-        <keyword>Add-History</keyword>
-        <keyword>Add-Member</keyword>
-        <keyword>Add-PSSnapin</keyword>
-        <keyword>Add-Type</keyword>
-        <keyword>Checkpoint-Computer</keyword>
-        <keyword>Clear-Content</keyword>
-        <keyword>Clear-EventLog</keyword>
-        <keyword>Clear-History</keyword>
-        <keyword>Clear-Item</keyword>
-        <keyword>Clear-ItemProperty</keyword>
-        <keyword>Clear-Variable</keyword>
-        <keyword>Compare-Object</keyword>
-        <keyword>Complete-Transaction</keyword>
-        <keyword>Connect-WSMan</keyword>
-        <keyword>Convert-Path</keyword>
-        <keyword>ConvertFrom-CSV</keyword>
-        <keyword>ConvertFrom-SecureString</keyword>
-        <keyword>ConvertFrom-StringData</keyword>
-        <keyword>ConvertTo-CSV</keyword>
-        <keyword>ConvertTo-Html</keyword>
-        <keyword>ConvertTo-SecureString</keyword>
-        <keyword>ConvertTo-XML</keyword>
-        <keyword>Copy-Item</keyword>
-        <keyword>Copy-ItemProperty</keyword>
-        <keyword>Debug-Process</keyword>
-        <keyword>Disable-ComputerRestore</keyword>
-        <keyword>Disable-PSBreakpoint</keyword>
-        <keyword>Disable-PSSessionConfiguration</keyword>
-        <keyword>Disable-WSManCredSSP</keyword>
-        <keyword>Disconnect-WSMan</keyword>
-        <keyword>Enable-ComputerRestore</keyword>
-        <keyword>Enable-PSBreakpoint</keyword>
-        <keyword>Enable-PSRemoting</keyword>
-        <keyword>Enable-PSSessionConfiguration</keyword>
-        <keyword>Enable-WSManCredSSP</keyword>
-        <keyword>Enter-PSSession</keyword>
-        <keyword>Exit-PSSession</keyword>
-        <keyword>Export-Alias</keyword>
-        <keyword>Export-CSV</keyword>
-        <keyword>Export-Clixml</keyword>
-        <keyword>Export-Console</keyword>
-        <keyword>Export-Counter</keyword>
-        <keyword>Export-FormatData</keyword>
-        <keyword>Export-ModuleMember</keyword>
-        <keyword>Export-PSSession</keyword>
-        <keyword>ForEach-Object</keyword>
-        <keyword>Format-Custom</keyword>
-        <keyword>Format-List</keyword>
-        <keyword>Format-Table</keyword>
-        <keyword>Format-Wide</keyword>
-        <keyword>Get-Acl</keyword>
-        <keyword>Get-Alias</keyword>
-        <keyword>Get-AuthenticodeSignature</keyword>
-        <keyword>Get-ChildItem</keyword>
-        <keyword>Get-Command</keyword>
-        <keyword>Get-ComputerRestorePoint</keyword>
-        <keyword>Get-Content</keyword>
-        <keyword>Get-Counter</keyword>
-        <keyword>Get-Credential</keyword>
-        <keyword>Get-Culture</keyword>
-        <keyword>Get-Date</keyword>
-        <keyword>Get-Event</keyword>
-        <keyword>Get-EventLog</keyword>
-        <keyword>Get-EventSubscriber</keyword>
-        <keyword>Get-ExecutionPolicy</keyword>
-        <keyword>Get-FormatData</keyword>
-        <keyword>Get-Help</keyword>
-        <keyword>Get-History</keyword>
-        <keyword>Get-Host</keyword>
-        <keyword>Get-HotFix</keyword>
-        <keyword>Get-Item</keyword>
-        <keyword>Get-ItemProperty</keyword>
-        <keyword>Get-Job</keyword>
-        <keyword>Get-Location</keyword>
-        <keyword>Get-Member</keyword>
-        <keyword>Get-Module</keyword>
-        <keyword>Get-PSBreakpoint</keyword>
-        <keyword>Get-PSCallStack</keyword>
-        <keyword>Get-PSDrive</keyword>
-        <keyword>Get-PSProvider</keyword>
-        <keyword>Get-PSSession</keyword>
-        <keyword>Get-PSSessionConfiguration</keyword>
-        <keyword>Get-PSSnapin</keyword>
-        <keyword>Get-PfxCertificate</keyword>
-        <keyword>Get-Process</keyword>
-        <keyword>Get-Random</keyword>
-        <keyword>Get-Service</keyword>
-        <keyword>Get-TraceSource</keyword>
-        <keyword>Get-Transaction</keyword>
-        <keyword>Get-UICulture</keyword>
-        <keyword>Get-Unique</keyword>
-        <keyword>Get-Variable</keyword>
-        <keyword>Get-WSManCredSSP</keyword>
-        <keyword>Get-WSManInstance</keyword>
-        <keyword>Get-WinEvent</keyword>
-        <keyword>Get-WmiObject</keyword>
-        <keyword>Group-Object</keyword>
-        <keyword>Get-Services</keyword>
-        <keyword>Import-Alias</keyword>
-        <keyword>Import-CSV</keyword>
-        <keyword>Import-Clixml</keyword>
-        <keyword>Import-Counter</keyword>
-        <keyword>Import-LocalizedData</keyword>
-        <keyword>Import-Module</keyword>
-        <keyword>Import-PSSession</keyword>
-        <keyword>Invoke-Command</keyword>
-        <keyword>Invoke-Expression</keyword>
-        <keyword>Invoke-History</keyword>
-        <keyword>Invoke-Item</keyword>
-        <keyword>Invoke-WSManAction</keyword>
-        <keyword>Invoke-WmiMethod</keyword>
-        <keyword>Join-Path</keyword>
-        <keyword>Limit-EventLog</keyword>
-        <keyword>Measure-Command</keyword>
-        <keyword>Measure-Object</keyword>
-        <keyword>Move-Item</keyword>
-        <keyword>Move-ItemProperty</keyword>
-        <keyword>New-Alias</keyword>
-        <keyword>New-Event</keyword>
-        <keyword>New-EventLog</keyword>
-        <keyword>New-Item</keyword>
-        <keyword>New-ItemProperty</keyword>
-        <keyword>New-Module</keyword>
-        <keyword>New-ModuleManifest</keyword>
-        <keyword>New-Object</keyword>
-        <keyword>New-PSDrive</keyword>
-        <keyword>New-PSSession</keyword>
-        <keyword>New-PSSessionOption</keyword>
-        <keyword>New-Service</keyword>
-        <keyword>New-TimeSpan</keyword>
-        <keyword>New-Variable</keyword>
-        <keyword>New-WSManInstance</keyword>
-        <keyword>New-WSManSessionOption</keyword>
-        <keyword>New-WebServiceProxy</keyword>
-        <keyword>Out-Default</keyword>
-        <keyword>Out-File</keyword>
-        <keyword>Out-GridView</keyword>
-        <keyword>Out-Host</keyword>
-        <keyword>Out-Null</keyword>
-        <keyword>Out-Printer</keyword>
-        <keyword>Out-String</keyword>
-        <keyword>Pop-Location</keyword>
-        <keyword>Push-Location</keyword>
-        <keyword>Read-Host</keyword>
-        <keyword>Receive-Job</keyword>
-        <keyword>Register-EngineEvent</keyword>
-        <keyword>Register-ObjectEvent</keyword>
-        <keyword>Register-PSSessionConfiguration</keyword>
-        <keyword>Register-WmiEvent</keyword>
-        <keyword>Remove-Computer</keyword>
-        <keyword>Remove-Event</keyword>
-        <keyword>Remove-EventLog</keyword>
-        <keyword>Remove-Item</keyword>
-        <keyword>Remove-ItemProperty</keyword>
-        <keyword>Remove-Job</keyword>
-        <keyword>Remove-Module</keyword>
-        <keyword>Remove-PSBreakpoint</keyword>
-        <keyword>Remove-PSDrive</keyword>
-        <keyword>Remove-PSSession</keyword>
-        <keyword>Remove-PSSnapin</keyword>
-        <keyword>Remove-Variable</keyword>
-        <keyword>Remove-WSManInstance</keyword>
-        <keyword>Remove-WmiObject</keyword>
-        <keyword>Rename-Item</keyword>
-        <keyword>Rename-ItemProperty</keyword>
-        <keyword>Reset-ComputerMachinePassword</keyword>
-        <keyword>Resolve-Path</keyword>
-        <keyword>Restart-Computer</keyword>
-        <keyword>Restart-Service</keyword>
-        <keyword>Restore-Computer</keyword>
-        <keyword>Resume-Service</keyword>
-        <keyword>Select-Object</keyword>
-        <keyword>Select-String</keyword>
-        <keyword>Select-XML</keyword>
-        <keyword>Send-MailMessage</keyword>
-        <keyword>Set-Acl</keyword>
-        <keyword>Set-Alias</keyword>
-        <keyword>Set-AuthenticodeSignature</keyword>
-        <keyword>Set-Content</keyword>
-        <keyword>Set-Date</keyword>
-        <keyword>Set-ExecutionPolicy</keyword>
-        <keyword>Set-Item</keyword>
-        <keyword>Set-ItemProperty</keyword>
-        <keyword>Set-Location</keyword>
-        <keyword>Set-PSBreakpoint</keyword>
-        <keyword>Set-PSDebug</keyword>
-        <keyword>Set-PSSessionConfiguration</keyword>
-        <keyword>Set-Service</keyword>
-        <keyword>Set-StrictMode</keyword>
-        <keyword>Set-TraceSource</keyword>
-        <keyword>Set-Variable</keyword>
-        <keyword>Set-WSManInstance</keyword>
-        <keyword>Set-WSManQuickConfig</keyword>
-        <keyword>Set-WmiInstance</keyword>
-        <keyword>Show-EventLog</keyword>
-        <keyword>Sort-Object</keyword>
-        <keyword>Split-Path</keyword>
-        <keyword>Start-Job</keyword>
-        <keyword>Start-Process</keyword>
-        <keyword>Start-Service</keyword>
-        <keyword>Start-Sleep</keyword>
-        <keyword>Start-Transaction</keyword>
-        <keyword>Start-Transcript</keyword>
-        <keyword>Stop-Computer</keyword>
-        <keyword>Stop-Job</keyword>
-        <keyword>Stop-Process</keyword>
-        <keyword>Stop-Service</keyword>
-        <keyword>Stop-Transcript</keyword>
-        <keyword>Suspend-Service</keyword>
-        <keyword>Tee-Object</keyword>
-        <keyword>Test-ComputerSecureChannel</keyword>
-        <keyword>Test-Connection</keyword>
-        <keyword>Test-ModuleManifest</keyword>
-        <keyword>Test-Path</keyword>
-        <keyword>Test-WSMan</keyword>
-        <keyword>Trace-Command</keyword>
-        <keyword>Undo-Transaction</keyword>
-        <keyword>Unregister-Event</keyword>
-        <keyword>Unregister-PSSessionConfiguration</keyword>
-        <keyword>Update-FormatData</keyword>
-        <keyword>Update-List</keyword>
-        <keyword>Update-TypeData</keyword>
-        <keyword>Use-Transaction</keyword>
-        <keyword>Wait-Event</keyword>
-        <keyword>Wait-Job</keyword>
-        <keyword>Wait-Process</keyword>
-        <keyword>Where-Object</keyword>
-        <keyword>Write-Debug</keyword>
-        <keyword>Write-Error</keyword>
-        <keyword>Write-EventLog</keyword>
-        <keyword>Write-Host</keyword>
-        <keyword>Write-Output</keyword>
-        <keyword>Write-Progress</keyword>
-        <keyword>Write-Verbose</keyword>
-        <keyword>Write-Warning</keyword>
+      <keyword>Add-Computer</keyword>
+      <keyword>Add-Content</keyword>
+      <keyword>Add-History</keyword>
+      <keyword>Add-Member</keyword>
+      <keyword>Add-PSSnapin</keyword>
+      <keyword>Add-Type</keyword>
+      <keyword>Checkpoint-Computer</keyword>
+      <keyword>Clear-Content</keyword>
+      <keyword>Clear-EventLog</keyword>
+      <keyword>Clear-History</keyword>
+      <keyword>Clear-Host</keyword>
+      <keyword>Clear-Item</keyword>
+      <keyword>Clear-ItemProperty</keyword>
+      <keyword>Clear-RecycleBin</keyword>
+      <keyword>Clear-Variable</keyword>
+      <keyword>Compare-Object</keyword>
+      <keyword>Complete-Transaction</keyword>
+      <keyword>Compress-Archive</keyword>
+      <keyword>Connect-PSSession</keyword>
+      <keyword>Connect-WSMan</keyword>
+      <keyword>Convert-Path</keyword>
+      <keyword>ConvertFrom-CSV</keyword>
+      <keyword>ConvertFrom-Json</keyword>
+      <keyword>ConvertFrom-Markdown</keyword>
+      <keyword>ConvertFrom-SecureString</keyword>
+      <keyword>ConvertFrom-StringData</keyword>
+      <keyword>ConvertTo-CSV</keyword>
+      <keyword>ConvertTo-Html</keyword>
+      <keyword>ConvertTo-Json</keyword>
+      <keyword>ConvertTo-SecureString</keyword>
+      <keyword>ConvertTo-XML</keyword>
+      <keyword>Copy-Item</keyword>
+      <keyword>Copy-ItemProperty</keyword>
+      <keyword>Debug-Job</keyword>
+      <keyword>Debug-Process</keyword>
+      <keyword>Debug-Runspace</keyword>
+      <keyword>Disable-ComputerRestore</keyword>
+      <keyword>Disable-ExperimentalFeature</keyword>
+      <keyword>Disable-PSBreakpoint</keyword>
+      <keyword>Disable-PSSessionConfiguration</keyword>
+      <keyword>Disable-RunspaceDebug</keyword>
+      <keyword>Disable-WSManCredSSP</keyword>
+      <keyword>Disconnect-PSSession</keyword>
+      <keyword>Disconnect-WSMan</keyword>
+      <keyword>Enable-ComputerRestore</keyword>
+      <keyword>Enable-ExperimentalFeature</keyword>
+      <keyword>Enable-PSBreakpoint</keyword>
+      <keyword>Enable-PSRemoting</keyword>
+      <keyword>Enable-PSSessionConfiguration</keyword>
+      <keyword>Enable-RunspaceDebug</keyword>
+      <keyword>Enable-WSManCredSSP</keyword>
+      <keyword>Enter-PSHostProcess</keyword>
+      <keyword>Enter-PSSession</keyword>
+      <keyword>Exit-PSHostProcess</keyword>
+      <keyword>Exit-PSSession</keyword>
+      <keyword>Expand-Archive</keyword>
+      <keyword>Export-Alias</keyword>
+      <keyword>Export-Clixml</keyword>
+      <keyword>Export-Console</keyword>
+      <keyword>Export-Counter</keyword>
+      <keyword>Export-CSV</keyword>
+      <keyword>Export-FormatData</keyword>
+      <keyword>Export-ModuleMember</keyword>
+      <keyword>Export-PSSession</keyword>
+      <keyword>Find-Command</keyword>
+      <keyword>Find-DSCResource</keyword>
+      <keyword>Find-Module</keyword>
+      <keyword>Find-Package</keyword>
+      <keyword>Find-PackageProvider</keyword>
+      <keyword>Find-RoleCapability</keyword>
+      <keyword>Find-Script</keyword>
+      <keyword>ForEach-Object</keyword>
+      <keyword>Format-Custom</keyword>
+      <keyword>Format-Hex</keyword>
+      <keyword>Format-List</keyword>
+      <keyword>Format-Table</keyword>
+      <keyword>Format-Wide</keyword>
+      <keyword>Get-Acl</keyword>
+      <keyword>Get-Alias</keyword>
+      <keyword>Get-AuthenticodeSignature</keyword>
+      <keyword>Get-ChildItem</keyword>
+      <keyword>Get-Clipboard</keyword>
+      <keyword>Get-Command</keyword>
+      <keyword>Get-ComputerInfo</keyword>
+      <keyword>Get-ComputerRestorePoint</keyword>
+      <keyword>Get-Content</keyword>
+      <keyword>Get-Counter</keyword>
+      <keyword>Get-Credential</keyword>
+      <keyword>Get-CredsFromCredentialProvider</keyword>
+      <keyword>Get-Culture</keyword>
+      <keyword>Get-Date</keyword>
+      <keyword>Get-DscResource</keyword>
+      <keyword>Get-Error</keyword>
+      <keyword>Get-Event</keyword>
+      <keyword>Get-EventLog</keyword>
+      <keyword>Get-EventSubscriber</keyword>
+      <keyword>Get-ExecutionPolicy</keyword>
+      <keyword>Get-ExperimentalFeature</keyword>
+      <keyword>Get-FileHash</keyword>
+      <keyword>Get-FormatData</keyword>
+      <keyword>Get-Help</keyword>
+      <keyword>Get-History</keyword>
+      <keyword>Get-Host</keyword>
+      <keyword>Get-HotFix</keyword>
+      <keyword>Get-InstalledModule</keyword>
+      <keyword>Get-InstalledScript</keyword>
+      <keyword>Get-Item</keyword>
+      <keyword>Get-ItemProperty</keyword>
+      <keyword>Get-ItemPropertyValue</keyword>
+      <keyword>Get-Job</keyword>
+      <keyword>Get-Location</keyword>
+      <keyword>Get-MarkdownOption</keyword>
+      <keyword>Get-Member</keyword>
+      <keyword>Get-Module</keyword>
+      <keyword>Get-Package</keyword>
+      <keyword>Get-PackageProvider</keyword>
+      <keyword>Get-PackageSource</keyword>
+      <keyword>Get-PfxCertificate</keyword>
+      <keyword>Get-Process</keyword>
+      <keyword>Get-PSBreakpoint</keyword>
+      <keyword>Get-PSCallStack</keyword>
+      <keyword>Get-PSDrive</keyword>
+      <keyword>Get-PSHostProcessInfo</keyword>
+      <keyword>Get-PSProvider</keyword>
+      <keyword>Get-PSReadLineKeyHandler</keyword>
+      <keyword>Get-PSReadLineOption</keyword>
+      <keyword>Get-PSRepository</keyword>
+      <keyword>Get-PSSession</keyword>
+      <keyword>Get-PSSessionConfiguration</keyword>
+      <keyword>Get-PSSnapin</keyword>
+      <keyword>Get-Random</keyword>
+      <keyword>Get-Runspace</keyword>
+      <keyword>Get-RunspaceDebug</keyword>
+      <keyword>Get-Service</keyword>
+      <keyword>Get-Services</keyword>
+      <keyword>Get-TimeZone</keyword>
+      <keyword>Get-TraceSource</keyword>
+      <keyword>Get-Transaction</keyword>
+      <keyword>Get-TypeData</keyword>
+      <keyword>Get-UICulture</keyword>
+      <keyword>Get-Unique</keyword>
+      <keyword>Get-Uptime</keyword>
+      <keyword>Get-Variable</keyword>
+      <keyword>Get-Verb</keyword>
+      <keyword>Get-WinEvent</keyword>
+      <keyword>Get-WmiObject</keyword>
+      <keyword>Get-WSManCredSSP</keyword>
+      <keyword>Get-WSManInstance</keyword>
+      <keyword>Group-Object</keyword>
+      <keyword>Import-Alias</keyword>
+      <keyword>Import-Clixml</keyword>
+      <keyword>Import-Counter</keyword>
+      <keyword>Import-CSV</keyword>
+      <keyword>Import-LocalizedData</keyword>
+      <keyword>Import-Module</keyword>
+      <keyword>Import-PackageProvider</keyword>
+      <keyword>Import-PowerShellDataFile</keyword>
+      <keyword>Import-PSSession</keyword>
+      <keyword>Install-Module</keyword>
+      <keyword>Install-Package</keyword>
+      <keyword>Install-PackageProvider</keyword>
+      <keyword>Install-Script</keyword>
+      <keyword>Invoke-Command</keyword>
+      <keyword>Invoke-DscResource</keyword>
+      <keyword>Invoke-Expression</keyword>
+      <keyword>Invoke-History</keyword>
+      <keyword>Invoke-Item</keyword>
+      <keyword>Invoke-RestMethod</keyword>
+      <keyword>Invoke-WebRequest</keyword>
+      <keyword>Invoke-WmiMethod</keyword>
+      <keyword>Invoke-WSManAction</keyword>
+      <keyword>Join-Path</keyword>
+      <keyword>Join-String</keyword>
+      <keyword>Limit-EventLog</keyword>
+      <keyword>Measure-Command</keyword>
+      <keyword>Measure-Object</keyword>
+      <keyword>Move-Item</keyword>
+      <keyword>Move-ItemProperty</keyword>
+      <keyword>New-Alias</keyword>
+      <keyword>New-DscChecksum</keyword>
+      <keyword>New-Event</keyword>
+      <keyword>New-EventLog</keyword>
+      <keyword>New-Guid</keyword>
+      <keyword>New-Item</keyword>
+      <keyword>New-ItemProperty</keyword>
+      <keyword>New-Module</keyword>
+      <keyword>New-ModuleManifest</keyword>
+      <keyword>New-Object</keyword>
+      <keyword>New-PSDrive</keyword>
+      <keyword>New-PSRoleCapabilityFile</keyword>
+      <keyword>New-PSSession</keyword>
+      <keyword>New-PSSessionOption</keyword>
+      <keyword>New-PSTransportOption</keyword>
+      <keyword>New-ScriptFileInfo</keyword>
+      <keyword>New-Service</keyword>
+      <keyword>New-TemporaryFile</keyword>
+      <keyword>New-TimeSpan</keyword>
+      <keyword>New-Variable</keyword>
+      <keyword>New-WebServiceProxy</keyword>
+      <keyword>New-WSManInstance</keyword>
+      <keyword>New-WSManSessionOption</keyword>
+      <keyword>Out-Default</keyword>
+      <keyword>Out-File</keyword>
+      <keyword>Out-GridView</keyword>
+      <keyword>Out-Host</keyword>
+      <keyword>Out-Null</keyword>
+      <keyword>Out-Printer</keyword>
+      <keyword>Out-String</keyword>
+      <keyword>Pop-Location</keyword>
+      <keyword>Publish-Module</keyword>
+      <keyword>Publish-Script</keyword>
+      <keyword>Push-Location</keyword>
+      <keyword>Read-Host</keyword>
+      <keyword>Receive-Job</keyword>
+      <keyword>Receive-PSSession</keyword>
+      <keyword>Register-ArgumentCompleter</keyword>
+      <keyword>Register-EngineEvent</keyword>
+      <keyword>Register-ObjectEvent</keyword>
+      <keyword>Register-PackageSource</keyword>
+      <keyword>Register-PSRepository</keyword>
+      <keyword>Register-PSSessionConfiguration</keyword>
+      <keyword>Register-WmiEvent</keyword>
+      <keyword>Remove-Alias</keyword>
+      <keyword>Remove-Computer</keyword>
+      <keyword>Remove-Event</keyword>
+      <keyword>Remove-EventLog</keyword>
+      <keyword>Remove-Item</keyword>
+      <keyword>Remove-ItemProperty</keyword>
+      <keyword>Remove-Job</keyword>
+      <keyword>Remove-Module</keyword>
+      <keyword>Remove-PSBreakpoint</keyword>
+      <keyword>Remove-PSDrive</keyword>
+      <keyword>Remove-PSReadLineKeyHandler</keyword>
+      <keyword>Remove-PSSession</keyword>
+      <keyword>Remove-PSSnapin</keyword>
+      <keyword>Remove-Service</keyword>
+      <keyword>Remove-TypeData</keyword>
+      <keyword>Remove-Variable</keyword>
+      <keyword>Remove-WmiObject</keyword>
+      <keyword>Remove-WSManInstance</keyword>
+      <keyword>Rename-Item</keyword>
+      <keyword>Rename-ItemProperty</keyword>
+      <keyword>Reset-ComputerMachinePassword</keyword>
+      <keyword>Resolve-Path</keyword>
+      <keyword>Restart-Computer</keyword>
+      <keyword>Restart-Service</keyword>
+      <keyword>Restore-Computer</keyword>
+      <keyword>Resume-Service</keyword>
+      <keyword>Save-Help</keyword>
+      <keyword>Save-Module</keyword>
+      <keyword>Save-Package</keyword>
+      <keyword>Save-Script</keyword>
+      <keyword>Select-Object</keyword>
+      <keyword>Select-String</keyword>
+      <keyword>Select-XML</keyword>
+      <keyword>Send-MailMessage</keyword>
+      <keyword>Set-Acl</keyword>
+      <keyword>Set-Alias</keyword>
+      <keyword>Set-AuthenticodeSignature</keyword>
+      <keyword>Set-Clipboard</keyword>
+      <keyword>Set-Content</keyword>
+      <keyword>Set-Date</keyword>
+      <keyword>Set-ExecutionPolicy</keyword>
+      <keyword>Set-Item</keyword>
+      <keyword>Set-ItemProperty</keyword>
+      <keyword>Set-Location</keyword>
+      <keyword>Set-MarkdownOption</keyword>
+      <keyword>Set-PackageSource</keyword>
+      <keyword>Set-PSBreakpoint</keyword>
+      <keyword>Set-PSDebug</keyword>
+      <keyword>Set-PSReadLineKeyHandler</keyword>
+      <keyword>Set-PSReadLineOption</keyword>
+      <keyword>Set-PSRepository</keyword>
+      <keyword>Set-PSSessionConfiguration</keyword>
+      <keyword>Set-Service</keyword>
+      <keyword>Set-StrictMode</keyword>
+      <keyword>Set-TimeZone</keyword>
+      <keyword>Set-TraceSource</keyword>
+      <keyword>Set-Variable</keyword>
+      <keyword>Set-WmiInstance</keyword>
+      <keyword>Set-WSManInstance</keyword>
+      <keyword>Set-WSManQuickConfig</keyword>
+      <keyword>Show-Command</keyword>
+      <keyword>Show-EventLog</keyword>
+      <keyword>Show-Markdown</keyword>
+      <keyword>Sort-Object</keyword>
+      <keyword>Split-Path</keyword>
+      <keyword>Start-Job</keyword>
+      <keyword>Start-Process</keyword>
+      <keyword>Start-Service</keyword>
+      <keyword>Start-Sleep</keyword>
+      <keyword>Start-ThreadJob</keyword>
+      <keyword>Start-Transaction</keyword>
+      <keyword>Start-Transcript</keyword>
+      <keyword>Stop-Computer</keyword>
+      <keyword>Stop-Job</keyword>
+      <keyword>Stop-Process</keyword>
+      <keyword>Stop-Service</keyword>
+      <keyword>Stop-Transcript</keyword>
+      <keyword>Suspend-Service</keyword>
+      <keyword>Tee-Object</keyword>
+      <keyword>Test-ComputerSecureChannel</keyword>
+      <keyword>Test-Connection</keyword>
+      <keyword>Test-Json</keyword>
+      <keyword>Test-ModuleManifest</keyword>
+      <keyword>Test-Path</keyword>
+      <keyword>Test-ScriptFileInfo</keyword>
+      <keyword>Test-WSMan</keyword>
+      <keyword>Trace-Command</keyword>
+      <keyword>Unblock-File</keyword>
+      <keyword>Undo-Transaction</keyword>
+      <keyword>Uninstall-Module</keyword>
+      <keyword>Uninstall-Package</keyword>
+      <keyword>Uninstall-Script</keyword>
+      <keyword>Unregister-Event</keyword>
+      <keyword>Unregister-PackageSource</keyword>
+      <keyword>Unregister-PSRepository</keyword>
+      <keyword>Unregister-PSSessionConfiguration</keyword>
+      <keyword>Update-FormatData</keyword>
+      <keyword>Update-Help</keyword>
+      <keyword>Update-List</keyword>
+      <keyword>Update-Module</keyword>
+      <keyword>Update-ModuleManifest</keyword>
+      <keyword>Update-Script</keyword>
+      <keyword>Update-ScriptFileInfo</keyword>
+      <keyword>Update-TypeData</keyword>
+      <keyword>Use-Transaction</keyword>
+      <keyword>Wait-Debugger</keyword>
+      <keyword>Wait-Event</keyword>
+      <keyword>Wait-Job</keyword>
+      <keyword>Wait-Process</keyword>
+      <keyword>Where-Object</keyword>
+      <keyword>Write-Debug</keyword>
+      <keyword>Write-Error</keyword>
+      <keyword>Write-EventLog</keyword>
+      <keyword>Write-Host</keyword>
+      <keyword>Write-Information</keyword>
+      <keyword>Write-Output</keyword>
+      <keyword>Write-Progress</keyword>
+      <keyword>Write-Verbose</keyword>
+      <keyword>Write-Warning</keyword>
     </context>
 
     <context id="BuiltIn-Alias" style-ref="builtin-function">
-        <keyword>ac</keyword>
-        <keyword>asnp</keyword>
-        <keyword>cat</keyword>
-        <keyword>cd</keyword>
-        <keyword>chdir</keyword>
-        <keyword>clc</keyword>
-        <keyword>clear</keyword>
-        <keyword>clhy</keyword>
-        <keyword>cli</keyword>
-        <keyword>clp</keyword>
-        <keyword>cls</keyword>
-        <keyword>clv</keyword>
-        <keyword>compare</keyword>
-        <keyword>copy</keyword>
-        <keyword>cp</keyword>
-        <keyword>cpi</keyword>
-        <keyword>cpp</keyword>
-        <keyword>cvpa</keyword>
-        <keyword>dbp</keyword>
-        <keyword>del</keyword>
-        <keyword>diff</keyword>
-        <keyword>dir</keyword>
-        <keyword>ebp</keyword>
-        <keyword>echo</keyword>
-        <keyword>epal</keyword>
-        <keyword>epcsv</keyword>
-        <keyword>epsn</keyword>
-        <keyword>erase</keyword>
-        <keyword>etsn</keyword>
-        <keyword>exsn</keyword>
-        <keyword>fc</keyword>
-        <keyword>fl</keyword>
-        <keyword>foreach</keyword>
-        <keyword>ft</keyword>
-        <keyword>fw</keyword>
-        <keyword>gal</keyword>
-        <keyword>gbp</keyword>
-        <keyword>gc</keyword>
-        <keyword>gci</keyword>
-        <keyword>gcm</keyword>
-        <keyword>gcs</keyword>
-        <keyword>gdr</keyword>
-        <keyword>ghy</keyword>
-        <keyword>gi</keyword>
-        <keyword>gjb</keyword>
-        <keyword>gl</keyword>
-        <keyword>gm</keyword>
-        <keyword>gmo</keyword>
-        <keyword>gp</keyword>
-        <keyword>gps</keyword>
-        <keyword>group</keyword>
-        <keyword>gsn</keyword>
-        <keyword>gsnp</keyword>
-        <keyword>gsv</keyword>
-        <keyword>gu</keyword>
-        <keyword>gv</keyword>
-        <keyword>gwmi</keyword>
-        <keyword>h</keyword>
-        <keyword>history</keyword>
-        <keyword>icm</keyword>
-        <keyword>iex</keyword>
-        <keyword>ihy</keyword>
-        <keyword>ii</keyword>
-        <keyword>ipal</keyword>
-        <keyword>ipcsv</keyword>
-        <keyword>ipmo</keyword>
-        <keyword>ipsn</keyword>
-        <keyword>ise</keyword>
-        <keyword>iwmi</keyword>
-        <keyword>kill</keyword>
-        <keyword>lp</keyword>
-        <keyword>ls</keyword>
-        <keyword>man</keyword>
-        <keyword>md</keyword>
-        <keyword>measure</keyword>
-        <keyword>mi</keyword>
-        <keyword>mount</keyword>
-        <keyword>move</keyword>
-        <keyword>mp</keyword>
-        <keyword>mv</keyword>
-        <keyword>nal</keyword>
-        <keyword>ndr</keyword>
-        <keyword>ni</keyword>
-        <keyword>nmo</keyword>
-        <keyword>nsn</keyword>
-        <keyword>nv</keyword>
-        <keyword>ogv</keyword>
-        <keyword>oh</keyword>
-        <keyword>popd</keyword>
-        <keyword>ps</keyword>
-        <keyword>pushd</keyword>
-        <keyword>pwd</keyword>
-        <keyword>r</keyword>
-        <keyword>rbp</keyword>
-        <keyword>rcjb</keyword>
-        <keyword>rd</keyword>
-        <keyword>rdr</keyword>
-        <keyword>ren</keyword>
-        <keyword>ri</keyword>
-        <keyword>rjb</keyword>
-        <keyword>rm</keyword>
-        <keyword>rmdir</keyword>
-        <keyword>rmo</keyword>
-        <keyword>rni</keyword>
-        <keyword>rnp</keyword>
-        <keyword>rp</keyword>
-        <keyword>rsn</keyword>
-        <keyword>rsnp</keyword>
-        <keyword>rv</keyword>
-        <keyword>rvpa</keyword>
-        <keyword>rwmi</keyword>
-        <keyword>sajb</keyword>
-        <keyword>sal</keyword>
-        <keyword>saps</keyword>
-        <keyword>sasv</keyword>
-        <keyword>sbp</keyword>
-        <keyword>sc</keyword>
-        <keyword>select</keyword>
-        <keyword>set</keyword>
-        <keyword>si</keyword>
-        <keyword>sl</keyword>
-        <keyword>sleep</keyword>
-        <keyword>sort</keyword>
-        <keyword>sp</keyword>
-        <keyword>spjb</keyword>
-        <keyword>spps</keyword>
-        <keyword>spsv</keyword>
-        <keyword>start</keyword>
-        <keyword>sv</keyword>
-        <keyword>swmi</keyword>
-        <keyword>tee</keyword>
-        <keyword>type</keyword>
-        <keyword>where</keyword>
-        <keyword>wjb</keyword>
-        <keyword>write</keyword>
+      <keyword>ac</keyword>
+      <keyword>asnp</keyword>
+      <keyword>cat</keyword>
+      <keyword>cd</keyword>
+      <keyword>chdir</keyword>
+      <keyword>clc</keyword>
+      <keyword>clear</keyword>
+      <keyword>clhy</keyword>
+      <keyword>cli</keyword>
+      <keyword>clp</keyword>
+      <keyword>cls</keyword>
+      <keyword>clv</keyword>
+      <keyword>cnsn</keyword>
+      <keyword>compare</keyword>
+      <keyword>copy</keyword>
+      <keyword>cp</keyword>
+      <keyword>cpi</keyword>
+      <keyword>cpp</keyword>
+      <keyword>cvpa</keyword>
+      <keyword>dbp</keyword>
+      <keyword>del</keyword>
+      <keyword>diff</keyword>
+      <keyword>dir</keyword>
+      <keyword>dnsn</keyword>
+      <keyword>ebp</keyword>
+      <keyword>echo</keyword>
+      <keyword>epal</keyword>
+      <keyword>epcsv</keyword>
+      <keyword>epsn</keyword>
+      <keyword>erase</keyword>
+      <keyword>etsn</keyword>
+      <keyword>exsn</keyword>
+      <keyword>fc</keyword>
+      <keyword>fhx</keyword>
+      <keyword>fl</keyword>
+      <keyword>foreach</keyword>
+      <keyword>ft</keyword>
+      <keyword>fw</keyword>
+      <keyword>gal</keyword>
+      <keyword>gbp</keyword>
+      <keyword>gc</keyword>
+      <keyword>gcb</keyword>
+      <keyword>gci</keyword>
+      <keyword>gcm</keyword>
+      <keyword>gcs</keyword>
+      <keyword>gdr</keyword>
+      <keyword>gerr</keyword>
+      <keyword>ghy</keyword>
+      <keyword>gi</keyword>
+      <keyword>gin</keyword>
+      <keyword>gjb</keyword>
+      <keyword>gl</keyword>
+      <keyword>gm</keyword>
+      <keyword>gmo</keyword>
+      <keyword>gp</keyword>
+      <keyword>gps</keyword>
+      <keyword>gpv</keyword>
+      <keyword>group</keyword>
+      <keyword>gsn</keyword>
+      <keyword>gsnp</keyword>
+      <keyword>gsv</keyword>
+      <keyword>gtz</keyword>
+      <keyword>gu</keyword>
+      <keyword>gv</keyword>
+      <keyword>gwmi</keyword>
+      <keyword>h</keyword>
+      <keyword>history</keyword>
+      <keyword>icm</keyword>
+      <keyword>iex</keyword>
+      <keyword>ihy</keyword>
+      <keyword>ii</keyword>
+      <keyword>ipal</keyword>
+      <keyword>ipcsv</keyword>
+      <keyword>ipmo</keyword>
+      <keyword>ipsn</keyword>
+      <keyword>irm</keyword>
+      <keyword>ise</keyword>
+      <keyword>iwmi</keyword>
+      <keyword>iwr</keyword>
+      <keyword>kill</keyword>
+      <keyword>lp</keyword>
+      <keyword>ls</keyword>
+      <keyword>man</keyword>
+      <keyword>md</keyword>
+      <keyword>measure</keyword>
+      <keyword>mi</keyword>
+      <keyword>mount</keyword>
+      <keyword>move</keyword>
+      <keyword>mp</keyword>
+      <keyword>mv</keyword>
+      <keyword>nal</keyword>
+      <keyword>ndr</keyword>
+      <keyword>ni</keyword>
+      <keyword>nmo</keyword>
+      <keyword>nsn</keyword>
+      <keyword>nv</keyword>
+      <keyword>ogv</keyword>
+      <keyword>oh</keyword>
+      <keyword>popd</keyword>
+      <keyword>ps</keyword>
+      <keyword>pushd</keyword>
+      <keyword>pwd</keyword>
+      <keyword>r</keyword>
+      <keyword>rbp</keyword>
+      <keyword>rcjb</keyword>
+      <keyword>rcsn</keyword>
+      <keyword>rd</keyword>
+      <keyword>rdr</keyword>
+      <keyword>ren</keyword>
+      <keyword>ri</keyword>
+      <keyword>rjb</keyword>
+      <keyword>rm</keyword>
+      <keyword>rmdir</keyword>
+      <keyword>rmo</keyword>
+      <keyword>rni</keyword>
+      <keyword>rnp</keyword>
+      <keyword>rp</keyword>
+      <keyword>rsn</keyword>
+      <keyword>rsnp</keyword>
+      <keyword>rv</keyword>
+      <keyword>rvpa</keyword>
+      <keyword>rwmi</keyword>
+      <keyword>sajb</keyword>
+      <keyword>sal</keyword>
+      <keyword>saps</keyword>
+      <keyword>sasv</keyword>
+      <keyword>sbp</keyword>
+      <keyword>sc</keyword>
+      <keyword>scb</keyword>
+      <keyword>select</keyword>
+      <keyword>set</keyword>
+      <keyword>shcm</keyword>
+      <keyword>si</keyword>
+      <keyword>sl</keyword>
+      <keyword>sleep</keyword>
+      <keyword>sls</keyword>
+      <keyword>sort</keyword>
+      <keyword>sp</keyword>
+      <keyword>spjb</keyword>
+      <keyword>spps</keyword>
+      <keyword>spsv</keyword>
+      <keyword>start</keyword>
+      <keyword>stz</keyword>
+      <keyword>sv</keyword>
+      <keyword>swmi</keyword>
+      <keyword>tee</keyword>
+      <keyword>type</keyword>
+      <keyword>where</keyword>
+      <keyword>wjb</keyword>
+      <keyword>write</keyword>
     </context>
 
     <context id="BuiltIn-Parameters" style-ref="builtin-parameters">
-        <prefix>\-</prefix>
-        <!--in common use-->
-        <keyword>ErrorAction</keyword>
-        <keyword>ErrorVariable</keyword>
-        <keyword>WarningAction</keyword>
-        <keyword>WarningVariable</keyword>
-        <keyword>Verbose</keyword>
-        <keyword>OutVariable</keyword>
-        <keyword>OutBuffer</keyword>
-        <keyword>Debug</keyword>
-        <keyword>PipelineVariable</keyword>
-        <!--Other-->
-        <keyword>ForegroundColor</keyword>
-        <keyword>BackgroundColor</keyword>
-        <keyword>TypeName</keyword>
-        <keyword>Object</keyword>
-        <keyword>ComObject</keyword>
-        <keyword>NoNewline</keyword>
-        <keyword>Certificate</keyword>
-        <keyword>InputObject</keyword>
-        <keyword>MemberType</keyword>
-        <keyword>Name</keyword>
-        <keyword>Value</keyword>
-        <keyword>PassThru</keyword>
-        <keyword>Version</keyword>
-        <keyword>Seconds</keyword>
-        <keyword>PassThru</keyword>
+      <prefix>\-</prefix>
+      <!--in common use-->
+      <keyword>Debug</keyword>
+      <keyword>ErrorAction</keyword>
+      <keyword>ErrorVariable</keyword>
+      <keyword>InformationAction</keyword>
+      <keyword>InformationVariable</keyword>
+      <keyword>OutBuffer</keyword>
+      <keyword>OutVariable</keyword>
+      <keyword>PipelineVariable</keyword>
+      <keyword>Verbose</keyword>
+      <keyword>WarningAction</keyword>
+      <keyword>WarningVariable</keyword>
+      <!--Other-->
+      <keyword>BackgroundColor</keyword>
+      <keyword>Certificate</keyword>
+      <keyword>ComObject</keyword>
+      <keyword>Exclude</keyword>
+      <keyword>Force</keyword>
+      <keyword>ForegroundColor</keyword>
+      <keyword>Hours</keyword>
+      <keyword>Include</keyword>
+      <keyword>InputObject</keyword>
+      <keyword>LiteralPath</keyword>
+      <keyword>MemberType</keyword>
+      <keyword>Minutes</keyword>
+      <keyword>Name</keyword>
+      <keyword>NoNewline</keyword>
+      <keyword>Object</keyword>
+      <keyword>PassThru</keyword>
+      <keyword>Path</keyword>
+      <keyword>Property</keyword>
+      <keyword>Seconds</keyword>
+      <keyword>TypeName</keyword>
+      <keyword>Value</keyword>
+      <keyword>Version</keyword>
     </context>
 
     <context id="User-Function" style-ref="user-function">
-        <match>\b[a-z0-9_-]+\-[a-z0-9_]+\b</match>
+      <match>\b[a-z0-9_-]+\-[a-z0-9_]+\b</match>
     </context>
 
     <context id="Number" style-ref="number">
-        <match>\b(0x[0-9a-f]+[L]?|[0-9]+(\.[0-9]+)?[d]?)\b</match>
+      <match>\b(0x[0-9a-f]+[L]?|[0-9]+(\.[0-9]+)?[d]?)\b</match>
     </context>
 
     <context id="DataTypes" style-ref="datatype">
@@ -594,20 +725,25 @@
       <keyword>bool</keyword>
       <keyword>byte</keyword>
       <keyword>char</keyword>
+      <keyword>datetime</keyword>
       <keyword>decimal</keyword>
       <keyword>double</keyword>
       <keyword>hashtable</keyword>
-      <keyword>int</keyword>
       <keyword>int32</keyword>
+      <keyword>int</keyword>
       <keyword>long</keyword>
+      <keyword>pscustomobject</keyword>
+      <keyword>psobject</keyword>
       <keyword>single</keyword>
       <keyword>string</keyword>
+      <keyword>timespan</keyword>
       <keyword>void</keyword>
       <keyword>xml</keyword>
     </context>
 
     <context id="powershell" class="no-spell-check">
       <include>
+        <!-- Order will affect styling behavior -->
         <context ref="line-comment"/>
         <context ref="multiline-comment"/>
         <context ref="string"/>
diff --git a/data/language-specs/python.lang b/data/language-specs/python.lang
index 4ac0d6be..8fef6606 100644
--- a/data/language-specs/python.lang
+++ b/data/language-specs/python.lang
@@ -72,7 +72,7 @@
         [#0\-\ \+]*             # conversion flags
         (\-?\%{number}|\*)?     # minimum field width
         (\.(\-?\%{number}|\*))? # precision
-        (hlL)?                  # lentgh modifier
+        (hlL)?                  # length modifier
         [diouxXeEfFgGcrs%]      # conversion type
       </match>
     </context>
diff --git a/data/language-specs/python3.lang b/data/language-specs/python3.lang
index be45a059..a82571aa 100644
--- a/data/language-specs/python3.lang
+++ b/data/language-specs/python3.lang
@@ -28,25 +28,26 @@
   </metadata>
 
   <styles>
-    <style id="module-handler"    name="Module Handler"        map-to="python:module-handler"/>
-    <style id="keyword"           name="Keyword"               map-to="python:keyword"/>
-    <style id="multiline-string"  name="Multiline string"      map-to="python:multiline-string"/>
-    <style id="string"            name="String"                map-to="python:string"/>
-    <style id="escaped-char"      name="Escaped Character"     map-to="python:escaped-char"/>
-    <style id="format"            name="Format"                map-to="python:format"/>
-    <style id="string-conversion" name="String Conversion"     map-to="python:string-conversion"/>
-    <style id="special-variable"  name="Special Variable"      map-to="python:special-variable"/>
-    <style id="boolean"           name="Boolean"               map-to="python:boolean"/>
-    <style id="floating-point"    name="Floating point number" map-to="python:floating-point"/>
-    <style id="decimal"           name="Decimal number"        map-to="python:decimal"/>
-    <style id="base-n-integer"    name="Base-N number"         map-to="python:base-n-integer"/>
-    <style id="complex"           name="Complex number"        map-to="python:complex"/>
-    <style id="builtin-constant"  name="Builtin Constant"      map-to="python:builtin-constant"/>
-    <style id="builtin-object"    name="Builtin Object"        map-to="python:builtin-object"/>
-    <style id="builtin-function"  name="Builtin Function"      map-to="python:builtin-function"/>
-    <style id="function-name"     name="Function Name"         map-to="python:function-name"/>
-    <style id="class-name"        name="Class Name"            map-to="python:class-name"/>
-    <style id="decorator"         name="Decorator"             map-to="python:decorator"/>
+    <style id="module-handler"        name="Module Handler"        map-to="python:module-handler"/>
+    <style id="keyword"               name="Keyword"               map-to="python:keyword"/>
+    <style id="multiline-string"      name="Multiline string"      map-to="python:multiline-string"/>
+    <style id="string"                name="String"                map-to="python:string"/>
+    <style id="escaped-char"          name="Escaped Character"     map-to="python:escaped-char"/>
+    <style id="format"                name="Format"                map-to="python:format"/>
+    <style id="string-conversion"     name="String Conversion"     map-to="python:string-conversion"/>
+    <style id="special-variable"      name="Special Variable"      map-to="python:special-variable"/>
+    <style id="boolean"               name="Boolean"               map-to="python:boolean"/>
+    <style id="floating-point"        name="Floating point number" map-to="python:floating-point"/>
+    <style id="decimal"               name="Decimal number"        map-to="python:decimal"/>
+    <style id="base-n-integer"        name="Base-N number"         map-to="python:base-n-integer"/>
+    <style id="complex"               name="Complex number"        map-to="python:complex"/>
+    <style id="builtin-constant"      name="Builtin Constant"      map-to="python:builtin-constant"/>
+    <style id="builtin-object"        name="Builtin Object"        map-to="python:builtin-object"/>
+    <style id="builtin-function"      name="Builtin Function"      map-to="python:builtin-function"/>
+    <style id="function-name"         name="Function Name"         map-to="python:function-name"/>
+    <style id="class-name"            name="Class Name"            map-to="python:class-name"/>
+    <style id="decorator"             name="Decorator"             map-to="python:decorator"/>
+    <style id="f-string-curly-braces" name="f-string curly braces" map-to="def:special-char"/>
   </styles>
 
   <definitions>
@@ -73,13 +74,38 @@
         [#0\-\ \+]*             # conversion flags
         (\-?\%{number}|\*)?     # minimum field width
         (\.(\-?\%{number}|\*))? # precision
-        (hlL)?                  # lentgh modifier
+        (hlL)?                  # length modifier
         [diouxXeEfFgGcrs%]      # conversion type
       </match>
     </context>
 
+    <context id="curly-braces" extend-parent="true">
+      <start>\{</start>
+      <end>\}</end>
+      <include>
+        <context ref="python3"/>
+        <context ref="curly-braces"/>
+      </include>
+    </context>
+
+    <context id="f-string-curly-braces" extend-parent="false" class-disabled="string">
+      <start>(\{)</start>
+      <end>(\})</end>
+      <include>
+        <context ref="python3"/>
+        <context ref="curly-braces"/>
+        <context sub-pattern="1" where="start" style-ref="f-string-curly-braces"/>
+        <context sub-pattern="1" where="end" style-ref="f-string-curly-braces"/>
+      </include>
+    </context>
+
+    <context id="escaped-curly-brace" style-ref="escaped-char" extend-parent="true">
+      <match>\{\{</match>
+    </context>
+
     <define-regex id="string-prefix">(b|B)?</define-regex>
     <define-regex id="raw-string-prefix">(r|R|rb|RB|rB|Rb|br|BR|bR|Br)</define-regex>
+    <define-regex id="f-string-prefix">(f|F)</define-regex>
 
     <context id="multiline-double-quoted-string" style-ref="multiline-string" class="string" 
class-disabled="no-spell-check">
       <start>\%{string-prefix}"""</start>
@@ -118,6 +144,69 @@
         <context ref="def:line-continue"/>
       </include>
     </context>
+    <context id="multiline-double-quoted-f-string" class="string" class-disabled="no-spell-check">
+      <start>(\%{f-string-prefix}""")</start>
+      <end>(""")</end>
+      <include>
+        <context ref="escaped-curly-brace"/>
+        <context ref="f-string-curly-braces"/>
+        <context ref="python:escaped-char"/>
+        <context ref="def:line-continue"/>
+        <context style-ref="multiline-string" extend-parent="false" class="string">
+          <match>.</match>
+        </context>
+        <context sub-pattern="1" where="start" style-ref="string"/>
+        <context sub-pattern="1" where="end" style-ref="string"/>
+      </include>
+    </context>
+
+    <context id="multiline-single-quoted-f-string" class="string" class-disabled="no-spell-check">
+      <start>(\%{f-string-prefix}''')</start>
+      <end>(''')</end>
+      <include>
+        <context ref="escaped-curly-brace"/>
+        <context ref="f-string-curly-braces"/>
+        <context ref="python:escaped-char"/>
+        <context ref="def:line-continue"/>
+        <context style-ref="multiline-string" extend-parent="false" class="string">
+          <match>.</match>
+        </context>
+        <context sub-pattern="1" where="start" style-ref="string"/>
+        <context sub-pattern="1" where="end" style-ref="string"/>
+      </include>
+    </context>
+
+    <context id="double-quoted-f-string" end-at-line-end="true" class="string" 
class-disabled="no-spell-check">
+      <start>(\%{f-string-prefix}")</start>
+      <end>(")</end>
+      <include>
+        <context ref="escaped-curly-brace"/>
+        <context ref="f-string-curly-braces"/>
+        <context ref="python:escaped-char"/>
+        <context ref="def:line-continue"/>
+        <context style-ref="string" extend-parent="false" class="string">
+          <match>.</match>
+        </context>
+        <context sub-pattern="1" where="start" style-ref="string"/>
+        <context sub-pattern="1" where="end" style-ref="string"/>
+      </include>
+    </context>
+
+    <context id="single-quoted-f-string" end-at-line-end="true" class="string" 
class-disabled="no-spell-check">
+      <start>(\%{f-string-prefix}')</start>
+      <end>(')</end>
+      <include>
+        <context ref="escaped-curly-brace"/>
+        <context ref="f-string-curly-braces"/>
+        <context ref="python:escaped-char"/>
+        <context ref="def:line-continue"/>
+        <context style-ref="string" extend-parent="false" class="string">
+          <match>.</match>
+        </context>
+        <context sub-pattern="1" where="start" style-ref="string"/>
+        <context sub-pattern="1" where="end" style-ref="string"/>
+      </include>
+    </context>
 
     <context id="multiline-double-quoted-raw-string" style-ref="multiline-string" class="string" 
class-disabled="no-spell-check">
       <start>\%{raw-string-prefix}"""</start>
@@ -207,6 +296,11 @@
         <context ref="double-quoted-string"/>
         <context ref="single-quoted-string"/>
 
+        <context ref="multiline-double-quoted-f-string"/>
+        <context ref="multiline-single-quoted-f-string"/>
+        <context ref="single-quoted-f-string"/>
+        <context ref="double-quoted-f-string"/>
+
         <context ref="multiline-double-quoted-raw-string"/>
         <context ref="multiline-single-quoted-raw-string"/>
         <context ref="double-quoted-raw-string"/>
diff --git a/data/language-specs/scss.lang b/data/language-specs/scss.lang
index 41458eed..acfbafb5 100644
--- a/data/language-specs/scss.lang
+++ b/data/language-specs/scss.lang
@@ -59,7 +59,7 @@
   <default-regex-options case-sensitive="false"/>
 
   <!-- from css:keyword-code-point -->
-  
<keyword-char-class>[^\x{0}-\x{2C}\x{2E}\x{2F}\x{3A}-\x{40}\x{5B}\x{5D}\x{5E}\x{60}\x{7B}-\x{7F}]</keyword-char-class>
+  
<keyword-char-class>[^\N{U+0}-\N{U+2C}\N{U+2E}\N{U+2F}\N{U+3A}-\N{U+40}\N{U+5B}\N{U+5D}\N{U+5E}\N{U+60}\N{U+7B}-\N{U+7F}]</keyword-char-class>
 
   <definitions>
 
diff --git a/data/language-specs/twig.lang b/data/language-specs/twig.lang
new file mode 100644
index 00000000..2f7a8134
--- /dev/null
+++ b/data/language-specs/twig.lang
@@ -0,0 +1,346 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ This file is part of GtkSourceView
+
+ Author: Gerry Demaret <gerry tigron be>
+ Copyright (C) 2022 Gerry Demaret <gerry tigron be>
+
+ GtkSourceView is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ GtkSourceView is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this library; if not, see <http://www.gnu.org/licenses/>.
+
+-->
+<language id="twig" name="Twig" version="2.0" _section="Markup">
+  <metadata>
+    <property name="mimetypes">text/x-twig</property>
+    <property name="globs">*.twig</property>
+    <property name="line-comment-start">#</property>
+    <property name="block-comment-start">{#</property>
+    <property name="block-comment-end">#}</property>
+  </metadata>
+
+  <styles>
+    <style id="comment" name="Comment" map-to="def:comment"/>
+    <style id="error" name="Error" map-to="def:error"/>
+    <style id="variable" name="Variable" map-to="def:identifier"/>
+    <style id="escape" name="Escaped Character" map-to="def:special-char"/>
+    <style id="string" name="String" map-to="def:string"/>
+    <style id="here-doc" name="Heredoc" map-to="def:string"/>
+    <style id="here-doc-bound" name="Heredoc Bound" map-to="def:keyword"/>
+    <style id="keyword" name="Keyword" map-to="def:keyword"/>
+    <style id="operator" name="Operator" map-to="def:operator"/>
+    <style id="filters" name="Null Value" map-to="def:boolean"/>
+    <style id="tests" name="tests" map-to="def:boolean"/>
+    <style id="boolean" name="Boolean value" map-to="def:boolean"/>
+    <style id="floating-point" name="Floating point number" map-to="def:floating-point"/>
+    <style id="decimal" name="Decimal number" map-to="def:decimal"/>
+    <style id="octal" name="Octal number" map-to="def:base-n-integer"/>
+    <style id="hexadecimal" name="Hexadecimal number" map-to="def:base-n-integer"/>
+  </styles>
+
+  <definitions>
+    <!-- Html comments are more permissive than xml comments -->
+    <context id="comment" style-ref="comment">
+        <start>&lt;!--</start>
+        <end>--\s*&gt;</end>
+        <include>
+            <context ref="def:in-comment"/>
+        </include>
+    </context>
+
+    <context id="twig-comment" style-ref="comment">
+        <start>&#123;&#35;</start>
+        <end>&#35;&#125;</end>
+        <include>
+            <context ref="def:in-line-comment"/>
+        </include>
+    </context>
+
+    <context id="close-comment-outside-comment" style-ref="error">
+      <match>&#35;&#125;(?!&#123;&#35;)</match>
+    </context>
+
+    <context id="escape" style-ref="escape">
+      <match>\\((\\|"|n|t|\$|r)|[0-7]{1,3}|x[0-9a-fA-F]{1,2})</match>
+    </context>
+
+    <context id="variable" style-ref="variable">
+      <match>[$]+[a-zA-Z_][a-zA-Z0-9_]*</match>
+    </context>
+
+    <context id="array-operators" style-ref="variable">
+      <match>(\[|\])</match>
+    </context>
+
+    <context id="string-var">
+      <include>
+        <context ref="variable"/>
+        <context id="curly-var" style-ref="variable" >
+          <start>{(?=\$)</start>
+          <end>}</end>
+          <include>
+            <context ref="string-var"/>
+          </include>
+        </context>
+        <context id="backwards-curly-var" style-ref="variable">
+          <start>\${</start>
+          <end>}</end>
+          <include>
+            <context ref="string-var"/>
+          </include>
+        </context>
+      </include>
+    </context>
+
+    <context id="double-quoted-string" style-ref="string">
+      <start>"</start>
+      <end>"</end>
+      <include>
+        <context ref="escape"/>
+        <context ref="string-var"/>
+        <context ref="def:line-continue"/>
+      </include>
+    </context>
+
+    <context id="single-quoted-string" style-ref="string">
+      <start>'</start>
+      <end>'</end>
+      <include>
+        <context style-ref="def:special-char">
+          <match>\\['\\]</match>
+        </context>
+        <context ref="def:line-continue"/>
+      </include>
+    </context>
+
+    <context id="backtick-string" style-ref="string" extend-parent="false">
+      <start>`</start>
+      <end>`</end>
+      <include>
+        <context ref="escape"/>
+        <context ref="def:line-continue"/>
+      </include>
+    </context>
+
+    <context id="here-doc-string" style-ref="here-doc" extend-parent="true">
+      <start>(&lt;&lt;&lt;)\s?([a-zA-Z_][a-zA-Z0-9_]*)</start>
+      <end>^(\%{2@start});?$</end>
+      <include>
+        <context sub-pattern="0" where="start" style-ref="here-doc-bound"/>
+        <context sub-pattern="1" where="end" style-ref="here-doc-bound"/>
+        <context ref="escape"/>
+        <context ref="string-var"/>
+        <context ref="def:line-continue"/>
+      </include>
+    </context>
+
+    <context id="keywords" style-ref="keyword">
+        <keyword>block</keyword>
+        <keyword>endblock</keyword>
+        <keyword>capture</keyword>
+        <keyword>config_load</keyword>
+        <keyword>for</keyword>
+        <keyword>foreach</keyword>
+        <keyword>foreachelse</keyword>
+        <keyword>endfor</keyword>
+        <keyword>if</keyword>
+        <keyword>elseif</keyword>
+        <keyword>endif</keyword>
+        <keyword>extends</keyword>
+        <keyword>ifequal</keyword>
+        <keyword>endifequal</keyword>
+        <keyword>else</keyword>
+        <keyword>include</keyword>
+        <keyword>include_php</keyword>
+        <keyword>insert</keyword>
+        <keyword>ldelim</keyword>
+        <keyword>rdelim</keyword>
+        <keyword>literal</keyword>
+        <keyword>php</keyword>
+        <keyword>section</keyword>
+        <keyword>sectionelse</keyword>
+        <keyword>strip</keyword>
+        <keyword>assign</keyword>
+        <keyword>counter</keyword>
+        <keyword>cycle</keyword>
+        <keyword>range</keyword>
+        <keyword>constant</keyword>
+        <keyword>parent</keyword>
+        <keyword>debug</keyword>
+        <keyword>eval</keyword>
+        <keyword>fetch</keyword>
+        <keyword>html_checkboxes</keyword>
+        <keyword>html_image</keyword>
+        <keyword>html_options</keyword>
+        <keyword>html_radios</keyword>
+        <keyword>html_select_date</keyword>
+        <keyword>html_select_time</keyword>
+        <keyword>html_table</keyword>
+        <keyword>mailto</keyword>
+        <keyword>math</keyword>
+        <keyword>popup</keyword>
+        <keyword>popup_init</keyword>
+        <keyword>textformat</keyword>
+        <keyword>macro</keyword>
+        <keyword>endmacro</keyword>
+        <keyword>in</keyword>
+        <keyword>import</keyword>
+        <keyword>as</keyword>
+        <keyword>filter</keyword>
+        <keyword>endfilter</keyword>
+        <keyword>set</keyword>
+        <keyword>endset</keyword>
+        <keyword>from</keyword>
+        <keyword>not</keyword>
+        <keyword>is</keyword>
+        <keyword>autoescape</keyword>
+        <keyword>endautoescape</keyword>
+        <keyword>use</keyword>
+        <keyword>with</keyword>
+        <keyword>spaceless</keyword>
+        <keyword>endspaceless</keyword>
+        <keyword>raw</keyword>
+        <keyword>endraw</keyword>
+        <keyword>trans</keyword>
+    </context>
+
+    <context id="operators" style-ref="operator" extend-parent="false">
+      <match>[-.~^@,;:/%|\=\+\*\!\?&amp;&lt;&gt;()]</match>
+    </context>
+
+    <context id="filters" style-ref="filters">
+      <prefix>(?i)\b</prefix> <!-- case insensitive -->
+        <keyword>capitalize</keyword>
+        <keyword>cat</keyword>
+        <keyword>count_characters</keyword>
+        <keyword>count_paragraphs</keyword>
+        <keyword>count_sentences</keyword>
+        <keyword>count_words</keyword>
+        <keyword>date</keyword>
+        <keyword>date_format</keyword>
+        <keyword>default</keyword>
+        <keyword>escape</keyword>
+        <keyword>defined</keyword>
+        <keyword>format</keyword>
+        <keyword>indent</keyword>
+        <keyword>join</keyword>
+        <keyword>length</keyword>
+        <keyword>lower</keyword>
+        <keyword>merge</keyword>
+        <keyword>nl2br</keyword>
+        <keyword>regex_replace</keyword>
+        <keyword>replace</keyword>
+        <keyword>url_encode</keyword>
+        <keyword>json_encode</keyword>
+        <keyword>striptags</keyword>
+        <keyword>reverse</keyword>
+        <keyword>keys</keyword>
+        <keyword>e</keyword>
+        <keyword>title</keyword>
+        <keyword>safe</keyword>
+        <keyword>sort</keyword>
+        <keyword>spacify</keyword>
+        <keyword>string_format</keyword>
+        <keyword>strip</keyword>
+        <keyword>strip_tags</keyword>
+        <keyword>truncate</keyword>
+        <keyword>upper</keyword>
+        <keyword>wordwrap</keyword>
+    </context>
+
+    <context id="tests" style-ref="tests">
+      <prefix>(?i)\b</prefix> <!-- case insensitive -->
+        <keyword>divisibleby</keyword>
+        <keyword>none</keyword>
+        <keyword>even</keyword>
+        <keyword>odd</keyword>
+        <keyword>sameas</keyword>
+        <keyword>empty</keyword>
+    </context>
+
+    <context id="boolean" style-ref="boolean">
+      <prefix>(?i)\b</prefix> <!-- case insensitive -->
+      <keyword>false</keyword>
+      <keyword>true</keyword>
+    </context>
+
+    <context id="float" style-ref="floating-point">
+      <match extended="true">
+        (?&lt;![\w\.])
+        ([0-9]+[Ee][+-]?[0-9]+ |
+         ([0-9]*\.[0-9]+ | [0-9]+\.[0-9]*)([Ee][+-]?[0-9]+)?)
+        (?![\w\.])
+      </match>
+    </context>
+
+    <context id="decimal-number" style-ref="decimal">
+      <match extended="true">
+        (?&lt;![\w\.])
+        [+-]?([1-9][0-9]*|0)
+        (?![\w\.])
+      </match>
+    </context>
+
+    <context id="octal-number" style-ref="octal">
+      <match extended="true">
+        (?&lt;![\w\.])
+        [+-]?0[0-7]+
+        (?![\w\.])
+      </match>
+    </context>
+
+    <context id="hexadecimal-number" style-ref="hexadecimal">
+      <match extended="true">
+        (?&lt;![\w\.])
+        [+-]?0x[0-9a-fA-F]+
+        (?![\w\.])
+      </match>
+    </context>
+
+    <context id="twig-block" style-ref="comment" end-at-line-end="true">
+      <start>&#123;(&#123;|&#37;)(/?)</start>
+      <end>(&#125;|&#37;)&#125;</end>
+      <include>
+        <context sub-pattern="0" where="start" style-ref="boolean"/>
+        <context sub-pattern="0" where="end" style-ref="boolean"/>
+        <context ref="double-quoted-string"/>
+        <context ref="single-quoted-string"/>
+        <context ref="backtick-string"/>
+        <context ref="here-doc-string"/>
+        <context ref="variable"/>
+        <context ref="array-operators"/>
+        <context ref="keywords"/>
+        <context ref="operators"/>
+        <context ref="filters"/>
+        <context ref="tests"/>
+        <context ref="boolean"/>
+        <context ref="float"/>
+        <context ref="decimal-number"/>
+        <context ref="octal-number"/>
+        <context ref="hexadecimal-number"/>
+      </include>
+    </context>
+
+    <replace id="html:embedded-lang-hook" ref="twig-block"/>
+
+    <context id="twig">
+      <include>
+        <context ref="twig-block"/>
+        <context ref="html:html"/>
+        <context ref="twig-comment"/>
+        <context ref="close-comment-outside-comment"/>
+      </include>
+    </context>
+
+  </definitions>
+</language>
diff --git a/data/language-specs/typescript-js-expressions.lang 
b/data/language-specs/typescript-js-expressions.lang
index b4926f5b..fb3ea24b 100644
--- a/data/language-specs/typescript-js-expressions.lang
+++ b/data/language-specs/typescript-js-expressions.lang
@@ -22,7 +22,7 @@
 -->
 <language id="typescript-js-expr" name="TypeScript JavaScript Expression Additions" version="2.0" 
_section="Script" hidden="true">
   <!-- from js:identifier-char -->
-  
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</keyword-char-class>
+  
<keyword-char-class>(?!\N{U+2E2F})[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}$\N{U+200C}\N{U+200D}]</keyword-char-class>
 
   <definitions>
 
diff --git a/data/language-specs/typescript-js-functions-classes.lang 
b/data/language-specs/typescript-js-functions-classes.lang
index 7db4b7d6..bc3be7aa 100644
--- a/data/language-specs/typescript-js-functions-classes.lang
+++ b/data/language-specs/typescript-js-functions-classes.lang
@@ -22,7 +22,7 @@
 -->
 <language id="typescript-js-fn" name="TypeScript JavaScript Function and Class Additions" version="2.0" 
_section="Script" hidden="true">
   <!-- from js:identifier-char -->
-  
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</keyword-char-class>
+  
<keyword-char-class>(?!\N{U+2E2F})[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}$\N{U+200C}\N{U+200D}]</keyword-char-class>
 
   <definitions>
 
diff --git a/data/language-specs/typescript-js-literals.lang b/data/language-specs/typescript-js-literals.lang
index fb6787b3..cdd1279c 100644
--- a/data/language-specs/typescript-js-literals.lang
+++ b/data/language-specs/typescript-js-literals.lang
@@ -22,7 +22,7 @@
 -->
 <language id="typescript-js-lit" name="TypeScript JavaScript Literal Additions" version="2.0" 
_section="Script" hidden="true">
   <!-- from js:identifier-char -->
-  
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</keyword-char-class>
+  
<keyword-char-class>(?!\N{U+2E2F})[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}$\N{U+200C}\N{U+200D}]</keyword-char-class>
 
   <definitions>
 
diff --git a/data/language-specs/typescript-js-modules.lang b/data/language-specs/typescript-js-modules.lang
index 6512e88c..04322d2e 100644
--- a/data/language-specs/typescript-js-modules.lang
+++ b/data/language-specs/typescript-js-modules.lang
@@ -22,7 +22,7 @@
 -->
 <language id="typescript-js-mod" name="TypeScript JavaScript Module Additions" version="2.0" 
_section="Script" hidden="true">
   <!-- from js:identifier-char -->
-  
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</keyword-char-class>
+  
<keyword-char-class>(?!\N{U+2E2F})[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}$\N{U+200C}\N{U+200D}]</keyword-char-class>
 
   <definitions>
 
diff --git a/data/language-specs/typescript-js-statements.lang 
b/data/language-specs/typescript-js-statements.lang
index 6ce34025..84785b32 100644
--- a/data/language-specs/typescript-js-statements.lang
+++ b/data/language-specs/typescript-js-statements.lang
@@ -22,7 +22,7 @@
 -->
 <language id="typescript-js-st" name="TypeScript JavaScript Statement Additions" version="2.0" 
_section="Script" hidden="true">
   <!-- from js:identifier-char -->
-  
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</keyword-char-class>
+  
<keyword-char-class>(?!\N{U+2E2F})[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}$\N{U+200C}\N{U+200D}]</keyword-char-class>
 
   <definitions>
 
diff --git a/data/language-specs/typescript-jsx.lang b/data/language-specs/typescript-jsx.lang
index d24b6b1e..cb73366e 100644
--- a/data/language-specs/typescript-jsx.lang
+++ b/data/language-specs/typescript-jsx.lang
@@ -30,7 +30,7 @@
   </metadata>
 
   <!-- from js:identifier-char -->
-  
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</keyword-char-class>
+  
<keyword-char-class>(?!\N{U+2E2F})[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}$\N{U+200C}\N{U+200D}]</keyword-char-class>
 
   <definitions>
 
diff --git a/data/language-specs/typescript-type-expressions.lang 
b/data/language-specs/typescript-type-expressions.lang
index dccd11a5..6b837b41 100644
--- a/data/language-specs/typescript-type-expressions.lang
+++ b/data/language-specs/typescript-type-expressions.lang
@@ -22,7 +22,7 @@
 -->
 <language id="typescript-type-expr" name="TypeScript Type Expressions" version="2.0" _section="Script" 
hidden="true">
   <!-- from js:identifier-char -->
-  
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</keyword-char-class>
+  
<keyword-char-class>(?!\N{U+2E2F})[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}$\N{U+200C}\N{U+200D}]</keyword-char-class>
 
   <definitions>
 
diff --git a/data/language-specs/typescript-type-generics.lang 
b/data/language-specs/typescript-type-generics.lang
index 4d3a0ff5..a454ffa1 100644
--- a/data/language-specs/typescript-type-generics.lang
+++ b/data/language-specs/typescript-type-generics.lang
@@ -22,7 +22,7 @@
 -->
 <language id="typescript-type-gen" name="TypeScript Type Generics" version="2.0" _section="Script" 
hidden="true">
   <!-- from js:identifier-char -->
-  
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</keyword-char-class>
+  
<keyword-char-class>(?!\N{U+2E2F})[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}$\N{U+200C}\N{U+200D}]</keyword-char-class>
 
   <definitions>
 
diff --git a/data/language-specs/typescript-type-literals.lang 
b/data/language-specs/typescript-type-literals.lang
index 13ee07ab..328740e1 100644
--- a/data/language-specs/typescript-type-literals.lang
+++ b/data/language-specs/typescript-type-literals.lang
@@ -22,7 +22,7 @@
 -->
 <language id="typescript-type-lit" name="TypeScript Type Literals" version="2.0" _section="Script" 
hidden="true">
   <!-- from js:identifier-char -->
-  
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</keyword-char-class>
+  
<keyword-char-class>(?!\N{U+2E2F})[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}$\N{U+200C}\N{U+200D}]</keyword-char-class>
 
   <definitions>
 
diff --git a/data/language-specs/typescript.lang b/data/language-specs/typescript.lang
index 22e197af..f6ce88d0 100644
--- a/data/language-specs/typescript.lang
+++ b/data/language-specs/typescript.lang
@@ -88,7 +88,7 @@
   </styles>
 
   <!-- from js:identifier-char -->
-  
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</keyword-char-class>
+  
<keyword-char-class>(?!\N{U+2E2F})[\p{L}\p{Nl}\N{U+1885}-\N{U+1886}\N{U+2118}\N{U+212E}\N{U+309B}-\N{U+309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\N{U+00B7}\N{U+0387}\N{U+1369}-\N{U+1371}\N{U+19DA}$\N{U+200C}\N{U+200D}]</keyword-char-class>
 
   <definitions>
 
diff --git a/tests/syntax-highlighting/file.awk b/tests/syntax-highlighting/file.awk
new file mode 100644
index 00000000..a786d454
--- /dev/null
+++ b/tests/syntax-highlighting/file.awk
@@ -0,0 +1,21 @@
+#!/usr/bin/awk -f
+# This is a comment line.
+
+# Special patterns:
+BEGIN
+END
+
+# Field variables:
+xxx$0xxx
+xx$NFxxx
+
+# String and numeric contansts:
+string = "Hello, World!"
+number = 42
+
+# Patterns:
+/\.'regexpr#"/ { print $0 }
+NR == 1, NR == 5 { printf("%s\n", $0) }
+
+# Statements:
+print string, number
diff --git a/tests/syntax-highlighting/file.css b/tests/syntax-highlighting/file.css
index 450a694c..b0276005 100644
--- a/tests/syntax-highlighting/file.css
+++ b/tests/syntax-highlighting/file.css
@@ -114,7 +114,7 @@ svg|[fill] { /* attribute */
     color: rebeccapurple;
     color: currentColor;
 
-    /* freqency (not currently used for any property) */
+    /* frequency (not currently used for any property) */
     content: 44.1kHz;
 
     /* integer */
diff --git a/tests/syntax-highlighting/file.erb b/tests/syntax-highlighting/file.erb
index aada3426..a5f44874 100644
--- a/tests/syntax-highlighting/file.erb
+++ b/tests/syntax-highlighting/file.erb
@@ -1,5 +1,5 @@
 <%
-# this is a comment withing a processed Ruby block
+# this is a comment within a processed Ruby block
 day_of_week = Time.now.wday
 %>
 
diff --git a/tests/syntax-highlighting/file.ftl b/tests/syntax-highlighting/file.ftl
index f920f3b8..11877671 100644
--- a/tests/syntax-highlighting/file.ftl
+++ b/tests/syntax-highlighting/file.ftl
@@ -17,7 +17,7 @@ installing = Installing { -brand-name }
 spaces = {"    "}This message starts with 3 spaces
 tears-of-joy = Use {"\U01F602"} or 😂
 
-## Varibles
+## Variables
 
 unread-emails = { $user } has { $email-count } unread emails
 
diff --git a/tests/syntax-highlighting/file.lean b/tests/syntax-highlighting/file.lean
index 5b92b00a..01338465 100644
--- a/tests/syntax-highlighting/file.lean
+++ b/tests/syntax-highlighting/file.lean
@@ -5,11 +5,12 @@
   /- nested block comment -/
 -/
 
-def main : IO Unit :=
+@[noinline]
+def helloWorld : IO Unit :=
   let a := 1
-  let b := 0b1
-  let c := 0x1
-  let d := '1'
+  let a1 := 0b1
+  let a₂ := 0x1
+  let a' := '1'
   IO.println "Hello World"
 
-#eval main
+#eval helloWorld
diff --git a/tests/syntax-highlighting/file.less b/tests/syntax-highlighting/file.less
index ddda6e06..16e1d35e 100644
--- a/tests/syntax-highlighting/file.less
+++ b/tests/syntax-highlighting/file.less
@@ -571,7 +571,7 @@ svg|[fill] { /* attribute */
     color: rebeccapurple;
     color: currentColor;
 
-    /* freqency (not currently used for any property) */
+    /* frequency (not currently used for any property) */
     content: 44.1kHz;
 
     /* integer */
diff --git a/tests/syntax-highlighting/file.pl b/tests/syntax-highlighting/file.pl
index 36742a41..4ac90ad7 100644
--- a/tests/syntax-highlighting/file.pl
+++ b/tests/syntax-highlighting/file.pl
@@ -102,16 +102,51 @@ sub login {
   } until /^\s+$/;
 }
 
+=pod
+
 =head1 EXAMPLE
+
 B<collateindex.pl> B<-o> F<index.sgml> F<HTML.index>
+
 =head1 EXIT STATUS
+
 =over 5
+
 =item B<0>
 Success
+
 =item B<1>
 Failure
+
 =back
+
 =head1 AUTHOR
+
 Norm Walsh E<lt>ndw nwalsh comE<gt>
 Minor updates by Adam Di Carlo E<lt>adam onshore comE<gt> and Peter Eisentraut E<lt>peter_e gmx netE<gt>
+
+=begin html
+<!--
+This is raw data ignored by POD processors.
+=end not_the_end
 =cut
+-->
+=end html
+
+Still POD.
+
+=cut
+
+sub end {
+=pod
+
+Here's another snippet of valid C<POD>.
+
+=cut
+
+    my $foo = { bar => \*STDOUT };
+}
+
+__END__
+
+if present, this data isn't supposed to be processed as Perl.
diff --git a/tests/syntax-highlighting/file.py3 b/tests/syntax-highlighting/file.py3
new file mode 100644
index 00000000..7b7a0160
--- /dev/null
+++ b/tests/syntax-highlighting/file.py3
@@ -0,0 +1,15 @@
+#!/usr/bin/env python3
+
+import gi
+
+gi.require_version('Gtk', '4.0')
+
+from gi.repository import GLib, GObject, Gtk
+
+my_fstring = f'this is a fstring {something("here")}'
+my_fstring = f"this is a fstring {other('stuff'}"
+
+class MyClass(GObject.Object):
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwarg)
+
diff --git a/tests/syntax-highlighting/file.scss b/tests/syntax-highlighting/file.scss
index a764ae45..cb33a63e 100644
--- a/tests/syntax-highlighting/file.scss
+++ b/tests/syntax-highlighting/file.scss
@@ -607,7 +607,7 @@ svg|[fill] { /* attribute */
     color: rebeccapurple;
     color: currentColor;
 
-    /* freqency (not currently used for any property) */
+    /* frequency (not currently used for any property) */
     content: 44.1kHz;
 
     /* integer */
diff --git a/tests/syntax-highlighting/file.svh b/tests/syntax-highlighting/file.svh
index 84f48fe7..210c4641 100644
--- a/tests/syntax-highlighting/file.svh
+++ b/tests/syntax-highlighting/file.svh
@@ -1,7 +1,7 @@
 class my_class extends some_class;
 
   // This is a comment.
-  /* This is also a comment, but it containts keywords: bit string, etc */
+  /* This is also a comment, but it contains keywords: bit string, etc */
 
   // Some types.
   string         my_string = "This is a string";
diff --git a/tests/syntax-highlighting/file.toml b/tests/syntax-highlighting/file.toml
index 902a1ae6..59ea6223 100644
--- a/tests/syntax-highlighting/file.toml
+++ b/tests/syntax-highlighting/file.toml
@@ -21,7 +21,7 @@ inf = inf  # positive infinity
         "key" = "text"
         multi_line_array = [
             "]",
-            # ] commmet
+            # ] comment
             ]
 
 
diff --git a/tests/syntax-highlighting/file.twig b/tests/syntax-highlighting/file.twig
new file mode 100644
index 00000000..cac141c9
--- /dev/null
+++ b/tests/syntax-highlighting/file.twig
@@ -0,0 +1,23 @@
+{{ var }}
+{{ var|escape }}
+{{ var|e }}         {# shortcut to escape a variable #}
+
+{% for user in users %}
+    * {{ user.name }}
+{% else %}
+    No users have been found.
+{% endfor %}
+
+{% extends "layout.html" %}
+
+{% block content %}
+    Content of the page...
+{% endblock %}
+
+{% autoescape "html" %}
+    {{ var }}
+    {{ var|raw }}     {# var won't be escaped #}
+    {{ var|escape }}  {# var won't be doubled-escaped #}
+{% endautoescape %}
+
+{{ include('page.html', sandboxed = true) }}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]