filetype: html

detect:
    filename: "\\.htm[l]?$"

rules:
    # Doctype is case-insensitive
    - preproc: "<!(?i)(DOCTYPE html.*)>"
    # Opening tag
    - symbol.tag:
        start: "<(a|abbr|acronym|address|applet|area|article|aside|audio|b|base|bdi|bdo|big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|dialog|dir|div|dl|dt|em|embed|fieldset|figcaption|figure|font|footer|form|frame|frameset|h[1-6]|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|main|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|section|select|small|source|span|strike|strong|sub|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|track|tt|u|ul|var|video|wbr)\\b"
        end: ">"
        rules:
          - identifier: "\\b(placeholder|style|alt|bgcolor|height|href|id|(aria|data)\\-.+|label|longdesc|name|on(click|focus|load|mouseover)|size|span|src|target|type|value|width|class|charset|content|rel|integrity|crossorigin|for|onsubmit|lang|role)\\b"
          - special: "\\b(required)\\b"
          # Match double-quote strings
          - constant.string:
                start: "\""
                end: "\""
                skip: "\\\\."
                rules:
                  - constant.specialChar: "\\\\."
                  - constant.string.url: "((ftp(s)?|http(s)?|git|chrome)://[^\\s]+)"
          # Match single-quote strings
          - constant.string:
                start: "'"
                end: "'"
                skip: "\\\\."
                rules:
                  - constant.specialChar: "\\\\."
                  - constant.string.url: "((ftp(s)?|http(s)?|git|chrome)://[^\\s]+)"
          # Highlight the equals and any colon between words
          - symbol: "\\b(=|:\\b)"

    # Closing tag
    - symbol.tag:
        start: "</(a|abbr|acronym|address|applet|area|article|aside|audio|b|base|bdi|bdo|big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|dialog|dir|div|dl|dt|em|embed|fieldset|figcaption|figure|font|footer|form|frame|frameset|h[1-6]|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|main|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|section|select|small|source|span|strike|strong|sub|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|track|tt|u|ul|var|video|wbr)\\b"
        end: ">"
        rules:
          # Anything in the closing tag is an error
          - error: "."

    # Reserved entities like a&#12; &nbsp; and &#x12A;
    - special: "(([a-zA-Z]&#[0-9]+|&[a-zA-Z]+|&#[a-zA-Z0-9]+);)"

    # TODO: Add `limit-rules` to both the `default` rules below once it's implemented into Micro
    - default:
        start: "<script.*?>"
        end: "</script.*?>"
        limit-group: symbol.tag
        rules:
          - include: "javascript"

    - default:
        start: "<style.*?>"
        end: "</style.*?>"
        limit-group: symbol.tag
        rules:
          - include: "css"

    # This weird empty comment thing is technically valid
    - comment: "<!>"

    - comment.block:
        start: "<!\\-\\-"
        end: "\\-\\->"
        rules:
          - todo: "(FIXME|NOTE|TODO):?"
          # While technically not a "true" error, these are recommended to not be used inside a comment
          - error: "(\\-\\-|>)"
