{
  "name": "marko",
  "scopeName": "text.marko",
  "uuid": "46c8c3f8-cabe-466a-a633-5deafdc51253",
  "fileTypes": ["marko"],
  "patterns": [
    {
      "comment": "CSS style block, eg: style { color: green }",
      "name": "meta.embedded.css",
      "contentName": "source.css",
      "begin": "^\\s*(style)(\\b[^\\s]*\\.css)?\\s+({)",
      "end": "}",
      "patterns": [
        {
          "include": "source.css"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "support.type.builtin.marko"
        },
        "2": {
          "name": "storage.modifier.marko.css"
        },
        "3": {
          "name": "punctuation.section.scope.begin.marko.css"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.section.scope.end.marko.css"
        }
      }
    },
    {
      "comment": "Less style block, eg: style.less { color: green }",
      "name": "meta.embedded.less",
      "contentName": "source.less",
      "begin": "^\\s*(style)(\\b[^\\s]*\\.less)\\s+({)",
      "end": "}",
      "patterns": [
        {
          "include": "source.css.less"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "support.type.builtin.marko"
        },
        "2": {
          "name": "storage.modifier.marko.css"
        },
        "3": {
          "name": "punctuation.section.scope.begin.marko.css"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.section.scope.end.marko.css"
        }
      }
    },
    {
      "comment": "SCSS style block, eg: style.scss { color: green }",
      "name": "meta.embedded.scss",
      "contentName": "source.scss",
      "begin": "^\\s*(style)(\\b[^\\s]*\\.scss)\\s+({)",
      "end": "}",
      "patterns": [
        {
          "include": "source.css.scss"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "support.type.builtin.marko"
        },
        "2": {
          "name": "storage.modifier.marko.css"
        },
        "3": {
          "name": "punctuation.section.scope.begin.marko.css"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.section.scope.end.marko.css"
        }
      }
    },
    {
      "comment": "JS/TS style block",
      "name": "meta.embedded.ts",
      "contentName": "source.ts",
      "begin": "^\\s*(style)(\\b[^\\s]*\\.[tj]s)\\s+({)",
      "end": "}",
      "patterns": [
        {
          "include": "source.ts"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "support.type.builtin.marko"
        },
        "2": {
          "name": "storage.modifier.marko.css"
        },
        "3": {
          "name": "punctuation.section.scope.begin.marko.css"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.section.scope.end.marko.css"
        }
      }
    },
    {
      "comment": "Top level blocks parsed as JavaScript",
      "name": "meta.embedded.ts",
      "contentName": "source.ts",
      "begin": "^\\s*(?:(static\\b)|(?=(?:class|import|export)\\b))",
      "end": "(?=\\n|$)",
      "patterns": [
        {
          "include": "source.ts"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "keyword.control.static.marko"
        }
      }
    },
    {
      "include": "#content-concise-mode"
    }
  ],
  "repository": {
    "attrs": {
      "patterns": [
        {
          "include": "#javascript-comments"
        },
        {
          "comment": "Attribute with optional value",
          "name": "meta.marko-attribute",
          "applyEndPatternLast": 1,
          "begin": "(?:(key|on[a-zA-Z0-9_$-]+|[a-zA-Z0-9_$]+Change|no-update(?:-body)?(?:-if)?)|([a-zA-Z0-9_$][a-zA-Z0-9_$-]*)|(#[a-zA-Z0-9_$][a-zA-Z0-9_$-]*))(:[a-zA-Z0-9_$][a-zA-Z0-9_$-]*)?",
          "end": "(?=.|$)",
          "beginCaptures": {
            "1": {
              "name": "support.type.attribute-name.marko"
            },
            "2": {
              "name": "entity.other.attribute-name.marko"
            },
            "3": {
              "name": "support.function.attribute-name.marko"
            },
            "4": {
              "name": "support.function.attribute-name.marko"
            }
          },
          "patterns": [
            {
              "include": "#html-args-or-method"
            },
            {
              "include": "#attr-value"
            }
          ]
        },
        {
          "comment": "A ...spread attribute",
          "name": "meta.marko-spread-attribute",
          "contentName": "source.ts",
          "begin": "(\\.\\.\\.)",
          "end": "(?=[,;\\]]|/>|(?<=[^=])>|(?<!(?:^|[!~*%&^|?:]|[!~*%&^|?/<>+=-]=|=>|>{2,}|[^.]\\.|[^-]-|^\\s*\\+\\+|[^\\+]\\+{2}*\\+|[a-zA-Z0-9%).<\\]}]\\s*/|\\b(?<![.]\\s*)(?:await|async|class|function|keyof|new|typeof|void))\\s*)(?:\\n|[ \\t]+(?![\\n{(+!~*%&^|?:]|[<>/=-]=|=>|>{2,}|\\.[^.]|-[^-]|/[^>]|(?:in|instanceof|as|extends)\\s+[^:=/,;>])))",
          "patterns": [
            {
              "include": "#javascript-expression"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.spread.marko"
            }
          }
        },
        {
          "comment": "Consume any whitespace after a comma",
          "begin": "\\s*(,(?!,))",
          "end": "(?=\\S)",
          "captures": {
            "1": {
              "name": "punctuation.separator.comma.marko"
            }
          }
        },
        {
          "include": "#invalid"
        }
      ]
    },
    "attr-value": {
      "comment": "Attribute value",
      "name": "meta.embedded.ts",
      "contentName": "source.ts",
      "begin": "\\s*(:?=)\\s*",
      "end": "(?=[,;\\]]|/>|(?<=[^=])>|(?<!(?:^|[!~*%&^|?:]|[!~*%&^|?/<>+=-]=|=>|>{2,}|[^.]\\.|[^-]-|^\\s*\\+\\+|[^\\+]\\+{2}*\\+|[a-zA-Z0-9%).<\\]}]\\s*/|\\b(?<![.]\\s*)(?:await|async|class|function|keyof|new|typeof|void))\\s*)(?:\\n|[ \\t]+(?![\\n{(+!~*%&^|?:]|[<>/=-]=|=>|>{2,}|\\.[^.]|-[^-]|/[^>]|(?:in|instanceof|as|extends)\\s+[^:=/,;>])))",
      "patterns": [
        {
          "include": "#javascript-expression"
        }
      ],
      "beginCaptures": {
        "1": {
          "patterns": [
            {
              "include": "source.ts"
            }
          ]
        }
      }
    },
    "concise-html-block": {
      "comment": "--- HTML block within concise mode content. ---",
      "name": "meta.section.marko-html-block",
      "begin": "\\s*(--+)\\s*$",
      "end": "\\1",
      "patterns": [
        {
          "include": "#content-html-mode"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.section.embedded.scope.begin.marko"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.section.embedded.scope.end.marko"
        }
      }
    },
    "concise-html-line": {
      "comment": "-- HTML line within concise mode content. (content-html-mode w/o scriptlet)",
      "name": "meta.section.marko-html-line",
      "match": "\\s*(--+)(?=\\s+\\S)(.*)($)",
      "captures": {
        "1": {
          "name": "punctuation.section.embedded.scope.begin.marko"
        },
        "2": {
          "patterns": [
            {
              "include": "#cdata"
            },
            {
              "include": "#doctype"
            },
            {
              "include": "#declaration"
            },
            {
              "include": "#javascript-comments-after-whitespace"
            },
            {
              "include": "#html-comment"
            },
            {
              "include": "#tag-html"
            },
            {
              "comment": "Match escape characters in text.",
              "name": "text.marko",
              "match": "\\\\."
            },
            {
              "include": "#placeholder"
            },
            {
              "comment": "Match anything else as text.",
              "name": "text.marko",
              "match": ".+?"
            }
          ]
        },
        "3": {
          "name": "punctuation.section.embedded.scope.end.marko"
        }
      }
    },
    "concise-semi-eol": {
      "comment": "Match spaces followed by a semi that represents the end of the line in concise mode.",
      "begin": "\\s*(;)",
      "end": "$",
      "patterns": [
        {
          "include": "#javascript-comments"
        },
        {
          "include": "#html-comment"
        },
        {
          "include": "#invalid"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.terminator.marko"
        }
      }
    },
    "concise-attr-group": {
      "comment": "Matches a group of non newline sensitive attributes in square brackets.",
      "begin": "\\s*(\\[)",
      "end": "]",
      "patterns": [
        {
          "include": "#concise-attr-group"
        },
        {
          "begin": "\\s+",
          "end": "(?=\\S)"
        },
        {
          "include": "#attrs"
        },
        {
          "include": "#invalid"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.section.scope.begin.marko"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.section.scope.end.marko"
        }
      }
    },
    "concise-open-tag-content": {
      "comment": "Handles everything from the start of the tag name until the body content begins.",
      "patterns": [
        {
          "include": "#tag-before-attrs"
        },
        {
          "include": "#concise-semi-eol"
        },
        {
          "comment": "Matches unenclosed concise mode attributes.",
          "begin": "(?!^)[ \\t]",
          "end": "(?=--)|(?=\\n)",
          "patterns": [
            {
              "include": "#concise-semi-eol"
            },
            {
              "include": "#concise-attr-group"
            },
            {
              "begin": "[ \\t]+",
              "end": "(?=\\S|\\n)"
            },
            {
              "include": "#attrs"
            },
            {
              "include": "#invalid"
            }
          ]
        }
      ]
    },
    "concise-comment-block": {
      "comment": "--- Embedded concise comment content block. ---",
      "name": "meta.section.marko-comment-block",
      "begin": "\\s*(--+)\\s*$",
      "end": "\\1",
      "patterns": [
        {
          "include": "#content-embedded-comment"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.section.embedded.scope.begin.marko"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.section.embedded.scope.end.marko"
        }
      }
    },
    "concise-comment-line": {
      "comment": "-- Embedded concise comment content line.",
      "name": "meta.section.marko-comment-line",
      "applyEndPatternLast": 1,
      "begin": "\\s*(--+)",
      "end": "$",
      "patterns": [
        {
          "include": "#content-embedded-comment"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.section.embedded.scope.begin.marko"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.section.embedded.scope.end.marko"
        }
      }
    },
    "concise-script-block": {
      "comment": "--- Embedded concise script content block. ---",
      "name": "meta.section.marko-script-block",
      "begin": "\\s*(--+)\\s*$",
      "end": "\\1",
      "patterns": [
        {
          "include": "#content-embedded-script"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.section.embedded.scope.begin.marko"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.section.embedded.scope.end.marko"
        }
      }
    },
    "concise-script-line": {
      "comment": "-- Embedded concise script content line.",
      "name": "meta.section.marko-script-line",
      "applyEndPatternLast": 1,
      "begin": "\\s*(--+)",
      "end": "$",
      "patterns": [
        {
          "include": "#content-embedded-script"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.section.embedded.scope.begin.marko"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.section.embedded.scope.end.marko"
        }
      }
    },
    "concise-style-block": {
      "comment": "--- Embedded concise style content block. ---",
      "name": "meta.section.marko-style-block",
      "contentName": "source.css",
      "begin": "\\s*(--+)\\s*$",
      "end": "\\1",
      "patterns": [
        {
          "include": "#content-embedded-style"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.section.embedded.scope.begin.marko"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.section.embedded.scope.end.marko"
        }
      }
    },
    "concise-style-block-less": {
      "comment": "--- Embedded concise style content block. ---",
      "name": "meta.section.marko-style-block",
      "contentName": "source.less",
      "begin": "\\s*(--+)\\s*$",
      "end": "\\1",
      "patterns": [
        {
          "include": "#content-embedded-style-less"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.section.embedded.scope.begin.marko"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.section.embedded.scope.end.marko"
        }
      }
    },
    "concise-style-block-scss": {
      "comment": "--- Embedded concise style content block. ---",
      "name": "meta.section.marko-style-block",
      "contentName": "source.scss",
      "begin": "\\s*(--+)\\s*$",
      "end": "\\1",
      "patterns": [
        {
          "include": "#content-embedded-style-scss"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.section.embedded.scope.begin.marko"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.section.embedded.scope.end.marko"
        }
      }
    },
    "concise-style-line": {
      "comment": "-- Embedded concise style content line.",
      "name": "meta.section.marko-style-line",
      "contentName": "source.css",
      "applyEndPatternLast": 1,
      "begin": "\\s*(--+)",
      "end": "$",
      "patterns": [
        {
          "include": "#content-embedded-style"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.section.embedded.scope.begin.marko"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.section.embedded.scope.end.marko"
        }
      }
    },
    "concise-style-line-less": {
      "comment": "-- Embedded concise style content line.",
      "name": "meta.section.marko-style-line",
      "contentName": "source.less",
      "applyEndPatternLast": 1,
      "begin": "\\s*(--+)",
      "end": "$",
      "patterns": [
        {
          "include": "#content-embedded-style-less"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.section.embedded.scope.begin.marko"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.section.embedded.scope.end.marko"
        }
      }
    },
    "concise-style-line-scss": {
      "comment": "-- Embedded concise style content line.",
      "name": "meta.section.marko-style-line",
      "contentName": "source.scss",
      "applyEndPatternLast": 1,
      "begin": "\\s*(--+)",
      "end": "$",
      "patterns": [
        {
          "include": "#content-embedded-style-scss"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.section.embedded.scope.begin.marko"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.section.embedded.scope.end.marko"
        }
      }
    },
    "content-concise-mode": {
      "comment": "Concise mode content block.",
      "name": "meta.marko-concise-content",
      "patterns": [
        {
          "include": "#scriptlet"
        },
        {
          "include": "#javascript-comments"
        },
        {
          "include": "#cdata"
        },
        {
          "include": "#doctype"
        },
        {
          "include": "#declaration"
        },
        {
          "include": "#html-comment"
        },
        {
          "include": "#concise-html-block"
        },
        {
          "include": "#concise-html-line"
        },
        {
          "include": "#invalid-close-tag"
        },
        {
          "include": "#tag-html"
        },
        {
          "comment": "A concise html tag.",
          "patterns": [
            {
              "comment": "Concise Marko html-comment tag",
              "begin": "^(\\s*)(?=html-comment\\b)",
              "while": "(?=^(?:[})\\]`]|\\*/|\\1\\s+(\\S|$)))",
              "patterns": [
                {
                  "include": "#concise-open-tag-content"
                },
                {
                  "include": "#concise-comment-block"
                },
                {
                  "include": "#concise-comment-line"
                }
              ]
            },
            {
              "comment": "Concise style tag less",
              "begin": "^(\\s*)(?=style\\b[^\\s]*\\.less\\b)",
              "while": "(?=^(?:[})\\]`]|\\*/|\\1\\s+(\\S|$)))",
              "patterns": [
                {
                  "include": "#concise-open-tag-content"
                },
                {
                  "include": "#concise-style-block-less"
                },
                {
                  "include": "#concise-style-line-less"
                }
              ]
            },
            {
              "comment": "Concise style tag scss",
              "begin": "^(\\s*)(?=style\\b[^\\s]*\\.scss\\b)",
              "while": "(?=^(?:[})\\]`]|\\*/|\\1\\s+(\\S|$)))",
              "patterns": [
                {
                  "include": "#concise-open-tag-content"
                },
                {
                  "include": "#concise-style-block-scss"
                },
                {
                  "include": "#concise-style-line-scss"
                }
              ]
            },
            {
              "comment": "Concise style tag js/ts",
              "begin": "^(\\s*)(?=style\\b[^\\s]*\\.[tj]s\\b)",
              "while": "(?=^(?:[})\\]`]|\\*/|\\1\\s+(\\S|$)))",
              "patterns": [
                {
                  "include": "#concise-open-tag-content"
                },
                {
                  "include": "#concise-script-block"
                },
                {
                  "include": "#concise-script-line"
                }
              ]
            },
            {
              "comment": "Concise style tag",
              "begin": "^(\\s*)(?=style\\b)",
              "while": "(?=^(?:[})\\]`]|\\*/|\\1\\s+(\\S|$)))",
              "patterns": [
                {
                  "include": "#concise-open-tag-content"
                },
                {
                  "include": "#concise-style-block"
                },
                {
                  "include": "#concise-style-line"
                }
              ]
            },
            {
              "comment": "Concise script tag",
              "begin": "^(\\s*)(?=script\\b)",
              "while": "(?=^(?:[})\\]`]|\\*/|\\1\\s+(\\S|$)))",
              "patterns": [
                {
                  "include": "#concise-open-tag-content"
                },
                {
                  "include": "#concise-script-block"
                },
                {
                  "include": "#concise-script-line"
                }
              ]
            },
            {
              "comment": "Normal concise tag",
              "begin": "^([ \\t]*)(?=[a-zA-Z0-9_$@.#])",
              "while": "(?=^(?:[})\\]`]|\\*/|\\1\\s+(\\S|$)))",
              "patterns": [
                {
                  "include": "#concise-open-tag-content"
                },
                {
                  "include": "#content-concise-mode"
                }
              ]
            }
          ]
        }
      ]
    },
    "content-embedded-comment": {
      "comment": "Match comment content, but allow Marko placeholders.",
      "patterns": [
        {
          "include": "#placeholder"
        },
        {
          "name": "comment.block.marko",
          "match": "."
        }
      ]
    },
    "content-embedded-script": {
      "comment": "Match script content, but allow Marko placeholders.",
      "name": "meta.embedded.ts",
      "patterns": [
        {
          "include": "#placeholder"
        },
        {
          "include": "source.ts"
        }
      ]
    },
    "content-embedded-style": {
      "comment": "Match css content, but allow Marko placeholders.",
      "name": "meta.embedded.css",
      "patterns": [
        {
          "include": "#placeholder"
        },
        {
          "include": "source.css"
        }
      ]
    },
    "content-embedded-style-less": {
      "comment": "Match less content, but allow Marko placeholders.",
      "name": "meta.embedded.css.less",
      "patterns": [
        {
          "include": "#placeholder"
        },
        {
          "include": "source.css.less"
        }
      ]
    },
    "content-embedded-style-scss": {
      "comment": "Match scss content, but allow Marko placeholders.",
      "name": "meta.embedded.css.scss",
      "patterns": [
        {
          "include": "#placeholder"
        },
        {
          "include": "source.css.scss"
        }
      ]
    },
    "content-html-mode": {
      "comment": "HTML mode content block.",
      "patterns": [
        {
          "include": "#scriptlet"
        },
        {
          "include": "#cdata"
        },
        {
          "include": "#doctype"
        },
        {
          "include": "#declaration"
        },
        {
          "include": "#javascript-comments-after-whitespace"
        },
        {
          "include": "#html-comment"
        },
        {
          "include": "#invalid-close-tag"
        },
        {
          "include": "#tag-html"
        },
        {
          "match": "\\\\.",
          "name": "text.marko"
        },
        {
          "include": "#placeholder"
        },
        {
          "match": ".+?",
          "name": "text.marko"
        }
      ]
    },
    "html-args-or-method": {
      "comment": "Matches parenthesis for arguments or continues into method shorthand if a { is found.",
      "patterns": [
        {
          "comment": "Javascript style arguments",
          "name": "meta.embedded.ts",
          "contentName": "source.ts",
          "begin": "\\s*(?=\\()",
          "end": "(?<=\\))",
          "patterns": [
            {
              "include": "source.ts"
            }
          ]
        },
        {
          "comment": "Attribute method shorthand following parens",
          "name": "meta.embedded.ts",
          "contentName": "source.ts",
          "begin": "(?<=\\))\\s*(?={)",
          "end": "(?<=})",
          "patterns": [
            {
              "include": "source.ts"
            }
          ]
        }
      ]
    },
    "html-comment": {
      "comment": "HTML comment",
      "name": "comment.block.marko",
      "begin": "\\s*(<!(--)?)",
      "end": "\\2>",
      "beginCaptures": {
        "1": {
          "name": "punctuation.definition.comment.marko"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.comment.marko"
        }
      }
    },
    "cdata": {
      "name": "meta.tag.metadata.cdata.marko",
      "contentName": "string.other.inline-data.marko",
      "begin": "\\s*<!\\[CDATA\\[",
      "end": "]]>",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.tag.begin.marko"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.tag.end.marko"
        }
      }
    },
    "doctype": {
      "name": "meta.tag.metadata.doctype.marko",
      "begin": "\\s*<!(?=(?i:DOCTYPE\\s))",
      "end": ">",
      "patterns": [
        {
          "match": "\\G(?i:DOCTYPE)",
          "name": "entity.name.tag.marko"
        },
        {
          "begin": "\"",
          "end": "\"",
          "name": "string.quoted.double.marko"
        },
        {
          "match": "[^\\s>]+",
          "name": "entity.other.attribute-name.marko"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.tag.begin.marko"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.tag.end.marko"
        }
      }
    },
    "declaration": {
      "name": "meta.tag.metadata.processing.xml.marko",
      "begin": "(<\\?)\\s*([a-zA-Z0-9_$-]*)",
      "end": "(\\??>)",
      "patterns": [
        {
          "match": "((?:[^\\s=?>]+|\\?(?!>))+)(=)(?:(\"(?:[^\"\\\\]+|\\\\.)*\")|('(?:[^'\\\\]+|\\\\.)*')|((?:[^\\s?>]+|\\?(?!>))+))",
          "captures": {
            "1": {
              "name": "entity.other.attribute-name.marko"
            },
            "2": {
              "name": "punctuation.separator.key-value.html"
            },
            "3": {
              "name": "string.quoted.double.marko"
            },
            "4": {
              "name": "string.quoted.single.marko"
            },
            "5": {
              "name": "string.unquoted.marko"
            }
          }
        }
      ],
      "captures": {
        "1": {
          "name": "punctuation.definition.tag.marko"
        },
        "2": {
          "name": "entity.name.tag.marko"
        }
      }
    },
    "invalid": {
      "comment": "Used to highlight characters in places where all valid characters should have been matched.",
      "match": "\\S",
      "name": "invalid.illegal.character-not-allowed-here.marko"
    },
    "javascript-comments": {
      "patterns": [
        {
          "comment": "JavaScript /* block comment */",
          "contentName": "source.ts",
          "begin": "\\s*(?=/\\*)",
          "end": "(?<=\\*/)",
          "patterns": [
            {
              "include": "source.ts"
            }
          ]
        },
        {
          "comment": "JavaScript // single line comment",
          "contentName": "source.ts",
          "match": "\\s*//.*$",
          "captures": {
            "0": {
              "patterns": [
                {
                  "include": "source.ts"
                }
              ]
            }
          }
        }
      ]
    },
    "javascript-comments-after-whitespace": {
      "patterns": [
        {
          "comment": "JavaScript /* block comment */",
          "contentName": "source.ts",
          "begin": "(?:^|\\s+)(?=/\\*)",
          "end": "(?<=\\*/)",
          "patterns": [
            {
              "include": "source.ts"
            }
          ]
        },
        {
          "comment": "JavaScript // single line comment",
          "contentName": "source.ts",
          "match": "(?:^|\\s+)//.*$",
          "captures": {
            "0": {
              "patterns": [
                {
                  "include": "source.ts"
                }
              ]
            }
          }
        }
      ]
    },
    "javascript-expression": {
      "comment": "Matches JavaScript source code, but always continues for certain types of expressions.",
      "patterns": [
        {
          "include": "#javascript-comments"
        },
        {
          "comment": "We must match the some expressions ourselves since otherwise the js grammar can overstep.",
          "match": "(?:\\s*\\b(?:as|await|extends|in|instanceof|keyof|new|typeof|void))+\\s+(?![:=/,;>])[a-zA-Z0-9_$@#]*",
          "captures": {
            "0": {
              "patterns": [
                {
                  "include": "source.ts"
                }
              ]
            }
          }
        },
        {
          "comment": "We must match regexps since otherwise it can be cutoff by self closed tags or comments.",
          "contentName": "source.ts",
          "applyEndPatternLast": 1,
          "match": "(?<![a-zA-Z0-9%).<\\]}])\\s*/(?:[^\\\\\\[/]+|\\\\.|\\[(?:[^\\\\\\]]+|\\\\.)*\\])*/[a-zA-Z]*",
          "captures": {
            "0": {
              "name": "string.regexp.ts",
              "patterns": [
                {
                  "include": "source.ts#regexp"
                },
                {
                  "include": "source.ts"
                }
              ]
            }
          }
        },
        {
          "include": "source.ts"
        }
      ]
    },
    "open-tag-content": {
      "comment": "Matches everything within an open tag from tag name to the last attr.",
      "patterns": [
        {
          "include": "#tag-before-attrs"
        },
        {
          "comment": "Attributes begin after the first space within the tag name",
          "begin": "(?!/?>)",
          "end": "(?=/?>)",
          "patterns": [
            {
              "include": "#attrs"
            }
          ]
        }
      ]
    },
    "placeholder": {
      "comment": "A Marko template literal expression (allows $!{}).",
      "contentName": "source.ts",
      "begin": "\\$!?{",
      "end": "}",
      "patterns": [
        {
          "include": "source.ts"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.template-expression.begin.ts"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.template-expression.end.ts"
        }
      }
    },
    "javascript-placeholder": {
      "comment": "A JavaScript style template literal expression.",
      "contentName": "source.ts",
      "begin": "\\${",
      "end": "}",
      "patterns": [
        {
          "include": "source.ts"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.template-expression.begin.ts"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.template-expression.end.ts"
        }
      }
    },
    "scriptlet": {
      "comment": "An inline JavaScript scriptlet.",
      "name": "meta.embedded.ts",
      "contentName": "source.ts",
      "begin": "^\\s*(\\$)\\s+",
      "end": "$",
      "patterns": [
        {
          "include": "source.ts"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "keyword.control.scriptlet.marko"
        }
      }
    },
    "tag-before-attrs": {
      "comment": "Everything in a tag before the attributes content",
      "patterns": [
        {
          "include": "#tag-name"
        },
        {
          "include": "#tag-shorthand-class-or-id"
        },
        {
          "comment": "Variable for a tag",
          "name": "meta.embedded.ts",
          "contentName": "source.ts",
          "begin": "/(?![/*])",
          "end": "(?=[,;(|/>]|:?=|\\s+[^:]|$)",
          "beginCaptures": {
            "0": {
              "name": "punctuation.separator.tag-variable.marko"
            }
          },
          "patterns": [
            {
              "comment": "Match identifiers",
              "match": "[a-zA-Z$_][0-9a-zA-Z$_]*",
              "name": "variable.other.constant.object.ts"
            },
            {
              "comment": "Match object pattern",
              "begin": "{",
              "end": "}",
              "patterns": [
                {
                  "include": "source.ts#object-binding-element"
                },
                {
                  "include": "#javascript-expression"
                }
              ],
              "captures": {
                "0": {
                  "name": "punctuation.definition.binding-pattern.object.ts"
                }
              }
            },
            {
              "comment": "Match array pattern",
              "begin": "\\[",
              "end": "]",
              "patterns": [
                {
                  "include": "source.ts#array-binding-element"
                },
                {
                  "include": "#javascript-expression"
                }
              ],
              "captures": {
                "0": {
                  "name": "punctuation.definition.binding-pattern.array.ts"
                }
              }
            },
            {
              "comment": "Match type",
              "begin": "\\s*(:)(?!=)",
              "end": "(?=[,;\\](]|/>|(?<=[^=])>|(?<!(?:^|[!~*%&^|?:]|[!~*%&^|?/<>+=-]=|=>|>{2,}|[^.]\\.|[^-]-|^\\s*\\+\\+|[^\\+]\\+{2}*\\+|[a-zA-Z0-9%).<\\]}]\\s*/|\\b(?<![.]\\s*)(?:await|async|class|function|keyof|new|typeof|void))\\s*)(?:\\n|[ \\t]+(?![\\n{+!~*%&^|?:]|[<>/=-]=|=>|>{2,}|\\.[^.]|-[^-]|/[^>]|(?:in|instanceof|as|extends)\\s+[^:=/,;>])))",
              "patterns": [
                {
                  "include": "source.ts#type"
                },
                {
                  "include": "#javascript-expression"
                }
              ],
              "beginCaptures": {
                "1": {
                  "name": "keyword.operator.type.annotation.ts"
                }
              }
            },
            {
              "include": "#javascript-expression"
            }
          ]
        },
        {
          "comment": "Parameters for a tag",
          "contentName": "source.ts",
          "begin": "\\|",
          "end": "\\|",
          "beginCaptures": {
            "0": {
              "name": "punctuation.section.scope.begin.marko"
            }
          },
          "endCaptures": {
            "0": {
              "name": "punctuation.section.scope.end.marko"
            }
          },
          "patterns": [
            {
              "include": "source.ts#function-parameters-body"
            },
            {
              "include": "source.ts"
            }
          ]
        },
        {
          "include": "#html-args-or-method"
        },
        {
          "include": "#attr-value"
        }
      ]
    },
    "tag-html": {
      "comment": "Matches an HTML tag and its contents",
      "patterns": [
        {
          "comment": "HTML void elements",
          "begin": "\\s*(<)(?=(area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr)\\b)",
          "end": "/?>",
          "patterns": [
            {
              "include": "#open-tag-content"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "punctuation.definition.tag.begin.marko"
            }
          },
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.tag.end.marko"
            }
          }
        },
        {
          "comment": "Marko html-comment tag",
          "begin": "\\s*(<)(?=html-comment\\b)",
          "end": "/>|(?<=\\>)",
          "patterns": [
            {
              "include": "#open-tag-content"
            },
            {
              "comment": "Style comment content",
              "begin": ">",
              "end": "\\s*(</)(html-comment)?(>)",
              "patterns": [
                {
                  "include": "#content-embedded-comment"
                }
              ],
              "beginCaptures": {
                "0": {
                  "name": "punctuation.definition.tag.end.marko"
                }
              },
              "endCaptures": {
                "1": {
                  "name": "punctuation.definition.tag.begin.marko"
                },
                "2": {
                  "patterns": [
                    {
                      "include": "#tag-name"
                    }
                  ]
                },
                "3": {
                  "name": "punctuation.definition.tag.end.marko"
                }
              }
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "punctuation.definition.tag.begin.marko"
            }
          },
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.tag.end.marko"
            }
          }
        },
        {
          "comment": "HTML style tag with less",
          "begin": "\\s*(<)(?=style\\b[^\\s]*\\.less\\b)",
          "end": "/>|(?<=\\>)",
          "patterns": [
            {
              "include": "#open-tag-content"
            },
            {
              "comment": "Style body content",
              "contentName": "source.less",
              "begin": ">",
              "end": "\\s*(</)(style)?(>)",
              "patterns": [
                {
                  "include": "#content-embedded-style-less"
                }
              ],
              "beginCaptures": {
                "0": {
                  "name": "punctuation.definition.tag.end.marko"
                }
              },
              "endCaptures": {
                "1": {
                  "name": "punctuation.definition.tag.begin.marko"
                },
                "2": {
                  "patterns": [
                    {
                      "include": "#tag-name"
                    }
                  ]
                },
                "3": {
                  "name": "punctuation.definition.tag.end.marko"
                }
              }
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "punctuation.definition.tag.begin.marko"
            }
          },
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.tag.end.marko"
            }
          }
        },
        {
          "comment": "HTML style tag with scss",
          "begin": "\\s*(<)(?=style\\b[^\\s]*\\.scss\\b)",
          "end": "/>|(?<=\\>)",
          "patterns": [
            {
              "include": "#open-tag-content"
            },
            {
              "comment": "Style body content",
              "contentName": "source.less",
              "begin": ">",
              "end": "\\s*(</)(style)?(>)",
              "patterns": [
                {
                  "include": "#content-embedded-style-scss"
                }
              ],
              "beginCaptures": {
                "0": {
                  "name": "punctuation.definition.tag.end.marko"
                }
              },
              "endCaptures": {
                "1": {
                  "name": "punctuation.definition.tag.begin.marko"
                },
                "2": {
                  "patterns": [
                    {
                      "include": "#tag-name"
                    }
                  ]
                },
                "3": {
                  "name": "punctuation.definition.tag.end.marko"
                }
              }
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "punctuation.definition.tag.begin.marko"
            }
          },
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.tag.end.marko"
            }
          }
        },
        {
          "comment": "HTML style tag with js/ts",
          "begin": "\\s*(<)(?=style\\b[^\\s]*\\.[tj]s\\b)",
          "end": "/>|(?<=\\>)",
          "patterns": [
            {
              "include": "#open-tag-content"
            },
            {
              "comment": "Style body content",
              "contentName": "source.ts",
              "begin": ">",
              "end": "\\s*(</)(style)?(>)",
              "patterns": [
                {
                  "include": "#content-embedded-script"
                }
              ],
              "beginCaptures": {
                "0": {
                  "name": "punctuation.definition.tag.end.marko"
                }
              },
              "endCaptures": {
                "1": {
                  "name": "punctuation.definition.tag.begin.marko"
                },
                "2": {
                  "patterns": [
                    {
                      "include": "#tag-name"
                    }
                  ]
                },
                "3": {
                  "name": "punctuation.definition.tag.end.marko"
                }
              }
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "punctuation.definition.tag.begin.marko"
            }
          },
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.tag.end.marko"
            }
          }
        },
        {
          "comment": "HTML style tag",
          "begin": "\\s*(<)(?=style\\b)",
          "end": "/>|(?<=\\>)",
          "beginCaptures": {
            "1": {
              "name": "punctuation.definition.tag.begin.marko"
            }
          },
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.tag.end.marko"
            }
          },
          "patterns": [
            {
              "include": "#open-tag-content"
            },
            {
              "comment": "Style body content",
              "contentName": "source.css",
              "begin": ">",
              "end": "\\s*(</)(style)?(>)",
              "patterns": [
                {
                  "include": "#content-embedded-style"
                }
              ],
              "beginCaptures": {
                "0": {
                  "name": "punctuation.definition.tag.end.marko"
                }
              },
              "endCaptures": {
                "1": {
                  "name": "punctuation.definition.tag.begin.marko"
                },
                "2": {
                  "patterns": [
                    {
                      "include": "#tag-name"
                    }
                  ]
                },
                "3": {
                  "name": "punctuation.definition.tag.end.marko"
                }
              }
            }
          ]
        },
        {
          "comment": "HTML script tag",
          "begin": "\\s*(<)(?=script\\b)",
          "end": "/>|(?<=\\>)",
          "patterns": [
            {
              "include": "#open-tag-content"
            },
            {
              "comment": "Script body content",
              "contentName": "source.ts",
              "begin": ">",
              "end": "\\s*(</)(script)?(>)",
              "patterns": [
                {
                  "include": "#content-embedded-script"
                }
              ],
              "beginCaptures": {
                "0": {
                  "name": "punctuation.definition.tag.end.marko"
                }
              },
              "endCaptures": {
                "1": {
                  "name": "punctuation.definition.tag.begin.marko"
                },
                "2": {
                  "patterns": [
                    {
                      "include": "#tag-name"
                    }
                  ]
                },
                "3": {
                  "name": "punctuation.definition.tag.end.marko"
                }
              }
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "punctuation.definition.tag.begin.marko"
            }
          },
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.tag.end.marko"
            }
          }
        },
        {
          "comment": "HTML normal tag",
          "begin": "\\s*(<)(?=[a-zA-Z0-9_$@.#])",
          "end": "/>|(?<=\\>)",
          "patterns": [
            {
              "include": "#open-tag-content"
            },
            {
              "comment": "Body content",
              "begin": ">",
              "end": "\\s*(</)([a-zA-Z0-9_$:@.#-]+)?(.*?)(>)",
              "patterns": [
                {
                  "include": "#content-html-mode"
                }
              ],
              "beginCaptures": {
                "0": {
                  "name": "punctuation.definition.tag.end.marko"
                }
              },
              "endCaptures": {
                "1": {
                  "name": "punctuation.definition.tag.begin.marko"
                },
                "2": {
                  "patterns": [
                    {
                      "include": "#tag-name"
                    },
                    {
                      "include": "#tag-shorthand-class-or-id"
                    }
                  ]
                },
                "3": {
                  "patterns": [
                    {
                      "include": "#invalid"
                    }
                  ]
                },
                "4": {
                  "name": "punctuation.definition.tag.end.marko"
                }
              }
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "punctuation.definition.tag.begin.marko"
            }
          },
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.tag.end.marko"
            }
          }
        }
      ]
    },
    "tag-shorthand-class-or-id": {
      "comment": "Shorthand class or ID attribute",
      "begin": "(?=[#.])",
      "end": "$|(?=--|[^a-zA-Z0-9_$#.-])",
      "patterns": [
        {
          "include": "#javascript-placeholder"
        },
        {
          "match": "(?:[#.a-zA-Z0-9_-]+|\\$(?!{))+",
          "name": "entity.other.attribute-name.marko"
        }
      ]
    },
    "tag-name": {
      "comment": "Matches the tag name.",
      "patterns": [
        {
          "match": "\\G(style)\\b(\\.[a-zA-Z0-9$_-]+(?:\\.[a-zA-Z0-9$_-]+)*)|([a-zA-Z0-9_@](?:[a-zA-Z0-9_@-]+|:(?!=))*)",
          "captures": {
            "1": {
              "name": "support.type.builtin.marko"
            },
            "2": {
              "name": "storage.type.marko.css"
            },
            "3": {
              "patterns": [
                {
                  "name": "support.type.builtin.marko",
                  "match": "(attrs|style|effect|lifecycle)(?=\\b)"
                },
                {
                  "name": "keyword.control.flow.marko",
                  "match": "(for|if|while|else-if|else|try|await|return)(?=\\b)"
                },
                {
                  "name": "support.function.marko",
                  "match": "(macro|tag|async|let|const|set|get|id|html-comment)(?=\\b)(?![-:@])"
                },
                {
                  "comment": "Attribute tag.",
                  "name": "entity.other.attribute-name.marko",
                  "match": "@.+"
                },
                {
                  "comment": "Native or userland tag.",
                  "name": "entity.name.tag.marko",
                  "match": ".+"
                }
              ]
            }
          }
        },
        {
          "begin": "(?=[a-zA-Z0-9$_]|-[^-])",
          "end": "(?=[^a-zA-Z0-9$_-]|$)",
          "patterns": [
            {
              "include": "#javascript-placeholder"
            },
            {
              "match": "(?:[a-zA-Z0-9_-]+|\\$(?!{))+",
              "name": "entity.name.tag.marko"
            }
          ]
        }
      ]
    },
    "invalid-close-tag": {
      "name": "invalid.illegal.character-not-allowed-here.marko",
      "begin": "\\s*</.*?",
      "end": ">"
    }
  }
}
