       "3":
         name: "entity.other.attribute-name.html"
       "4":
+        name: "punctuation.separator.key-value.html"
+    end: "(?=([,;]|\\s|$))"
+    patterns: [
+      {
+        include: "#expression"
+      }
+    ]
+  "attr-assignment-html":
+    applyEndPatternLast: 1
+    begin: "(?:\\s+|[,])(?:(key)|([a-zA-Z][a-zA-Z]*)|([_a-zA-Z0-9][a-zA-Z0-9:_.-]*))\\s*([=])\\s*"
+    beginCaptures:
+      "1":
         name: "support.function.marko-attribute"
+      "2":
+        name: "entity.other.attribute-name.html"
+      "3":
+        name: "entity.other.attribute-name.html"
+      "4":
+        name: "punctuation.separator.key-value.html"
+    end: "(?=[,;]|\\s|/>|>)"
+    patterns: [
+      {
+        include: "#expression-no-gt"
+      }
+    ]
+  "attr-js-block":
+    applyEndPatternLast: 1
+    begin: "\\s\\{"
+    beginCaptures:
+      "0":
+        name: "punctuation.section.scope.begin.js"
+    end: "\\}"
+    endCaptures:
+      "0":
+        name: "punctuation.section.scope.end.js"
+    patterns: [
+      {
+        include: "#js"
+      }
+    ]
+  "attr-no-value":
+    captures:
+      "1":
+        name: "entity.other.attribute-name.html"
+      "2":
+        name: "entity.other.attribute-name.html"
+      "3":
+        name: "entity.other.attribute-name.html"
+    match: "\\s+(?:([a-zA-Z][a-zA-Z]*)|(data-[a-zA-Z0-9-]*)|([a-zA-Z0-9][a-zA-Z0-9:_.-]+))(?=\\s|/>|>|$)"
+  "attr-semicolon":
+    applyEndPatternLast: 1
+    begin: "([;])"
+    beginCaptures:
+      "1":
+        name: "punctuation.terminator.statement.js"
+    end: "(?=\\n)"
+    patterns: [
+      {
+        include: "#comment-line"
+      }
+      {
+        include: "#comment-block"
+      }
+    ]
+  "attr-special":
+    captures:
+      "1":
+        name: "support.function.marko-attribute"
+    match: "\\s+(else)\\b"
+  "attr-spread-concise":
+    applyEndPatternLast: 1
+    begin: "(?:\\s+|[,])(\\.\\.\\.)\\s*"
+    beginCaptures:
       "5":
         name: "punctuation.separator.key-value.html"
     end: "(?=([,;]|\\s|$))"

      }
      {
        include: "#tag-name-custom-html"
      }
      {
        include: "#tag-name-html"

        include: "#open-tag-end"
      }
    ]
  "tag-name-dynamic-concise":
    applyEndPatternLast: 1
    begin: "^\\s*(?=\\$\\{.*\\})"
    comment: "A concise custom tag name"
    end: "(?=\\n)"
    patterns: [
      {
        include: "#placeholder"
      }
      {
        include: "#html-line-concise"
      }
      {
        include: "#attr-stuff-concise"
      }
    ]
  "tag-name-dynamic-html":
    begin: "(<)(?=\\$\\{.*\\})"
    beginCaptures:
      "1":
        name: "punctuation.definition.tag.begin.open.html"
    comment: "The beginning of a regular HTML tag in non-concise mode"
    end: "(</)(\\2)?(>)|(/>)"
    endCaptures:
      "1":
        name: "punctuation.definition.tag.begin.close.html"
      "2":
        name: "support.function.marko-tag.close.html"
      "3":
        name: "punctuation.definition.tag.end.close.html"
      "4":
        name: "punctuation.definition.tag.end.self-close.html"
    patterns: [
      {
        include: "#placeholder"
      }
      {
        include: "#attr-stuff-html"
      }
      {
        include: "#open-tag-end"
      }
    ]
  "tag-name-html":
    begin: "(<)([a-zA-Z0-9-]+)(?=(>|/>|\\s|\\())"
    beginCaptures:
      "1":
        name: "punctuation.definition.tag.begin.open.html"
