%YAML 1.2 --- name: XML file_extensions: - xml - xsd - xslt - tld - dtml - rss - opml - svg first_line_match: |- (?x) ^(?: <\?xml\s | \s*<([\w-]+):Envelope\s+xmlns:\1\s*=\s*"http://schemas.xmlsoap.org/soap/envelope/"\s*> ) scope: text.xml variables: # This is the full XML Name production, but should not be used where namespaces # are possible. Those locations should use a qualified_name. name: '[[:alpha:]:_][[:alnum:]:_.-]*' # This is the form that allows a namespace prefix (ns:) followed by a local # name. The captures are: # 1: namespace prefix name # 2: namespace prefix colon # 3: local tag name qualified_name: '(?:([[:alpha:]_][[:alnum:]_.-]*)(:))?([[:alpha:]_][[:alnum:]_.-]*)' contexts: main: - match: '(<\?)(xml)(?=\s)' captures: 1: punctuation.definition.tag.begin.xml 2: entity.name.tag.xml push: - meta_scope: meta.tag.preprocessor.xml - match: \?> scope: punctuation.definition.tag.end.xml pop: true - match: '\s+{{qualified_name}}(=)?' captures: 1: entity.other.attribute-name.namespace.xml 2: entity.other.attribute-name.xml punctuation.separator.namespace.xml 3: entity.other.attribute-name.localname.xml 4: punctuation.separator.key-value.xml - include: double-quoted-string - include: single-quoted-string - match: '() captures: 1: punctuation.definition.tag.end.xml pop: true - include: internal-subset - include: comment - match: '(\s]*)' captures: 1: punctuation.definition.tag.begin.xml 2: entity.name.tag.namespace.xml 3: entity.name.tag.xml punctuation.separator.namespace.xml 4: entity.name.tag.localname.xml 5: invalid.illegal.bad-tag-name.xml push: - meta_scope: meta.tag.xml - match: /?> scope: punctuation.definition.tag.end.xml pop: true - include: tag-stuff - match: '( scope: punctuation.definition.tag.end.xml pop: true - include: tag-stuff - match: '(<\?)(xml-stylesheet|xml-model)(?=\s|\?>)' captures: 1: punctuation.definition.tag.begin.xml 2: entity.name.tag.xml push: - meta_scope: meta.tag.preprocessor.xml - match: \?> scope: punctuation.definition.tag.end.xml pop: true - include: tag-stuff - match: '(<\?)((?![xX][mM][lL]){{qualified_name}})(?=\s|\?>)' captures: 1: punctuation.definition.tag.begin.xml 2: entity.name.tag.xml push: - meta_scope: meta.tag.preprocessor.xml - match: \?> scope: punctuation.definition.tag.end.xml pop: true - include: entity - match: '' scope: punctuation.definition.string.end.xml pop: true - match: ']]>' scope: invalid.illegal.missing-entity.xml - include: should-be-entity should-be-entity: - match: '&' scope: invalid.illegal.bad-ampersand.xml - match: '<' scope: invalid.illegal.missing-entity.xml double-quoted-string: - match: '"' scope: punctuation.definition.string.begin.xml push: - meta_scope: string.quoted.double.xml - match: '"' scope: punctuation.definition.string.end.xml pop: true - include: entity - include: should-be-entity entity: - match: '(&)(?:{{name}}|#[0-9]+|#x\h+)(;)' scope: constant.character.entity.xml captures: 1: punctuation.definition.constant.xml 2: punctuation.definition.constant.xml comment: - match: '' scope: punctuation.definition.comment.end.xml pop: true - match: '-{2,}' scope: invalid.illegal.double-hyphen-within-comment.xml internal-subset: - match: \[ scope: punctuation.definition.constant.xml push: - meta_scope: meta.internalsubset.xml - match: \] pop: true - include: comment - include: entity-decl - include: element-decl - include: attlist-decl - include: notation-decl - include: parameter-entity entity-decl: - match: '(' scope: punctuation.definition.tag.end.xml pop: true - include: double-quoted-string - include: single-quoted-string element-decl: - match: '(' scope: punctuation.definition.tag.end.xml pop: true - match: '\b(EMPTY|ANY)\b' scope: constant.other.xml - include: element-parens element-parens: - match: \( scope: punctuation.definition.group.xml push: - match: (\))([*?+])? captures: 1: punctuation.definition.group.xml 2: keyword.operator.xml pop: true - match: '#PCDATA' scope: constant.other.xml - match: '[*?+]' scope: keyword.operator.xml - match: '[,|]' scope: punctuation.separator.xml - include: element-parens attlist-decl: - match: '(' scope: punctuation.definition.tag.end.xml pop: true - include: double-quoted-string - include: single-quoted-string notation-decl: - match: '(' scope: punctuation.definition.tag.end.xml pop: true - include: double-quoted-string - include: single-quoted-string parameter-entity: - match: '(%){{name}}(;)' scope: constant.character.parameter-entity.xml captures: 1: punctuation.definition.constant.xml 2: punctuation.definition.constant.xml single-quoted-string: - match: "'" scope: punctuation.definition.string.begin.xml push: - meta_scope: string.quoted.single.xml - match: "'" scope: punctuation.definition.string.end.xml pop: true - include: entity - include: should-be-entity tag-stuff: - match: '(?:\s+|^){{qualified_name}}\s*(=)' captures: 1: entity.other.attribute-name.namespace.xml 2: entity.other.attribute-name.xml punctuation.separator.namespace.xml 3: entity.other.attribute-name.localname.xml 4: punctuation.separator.key-value.xml - match: '(?:\s+|^)([[:alnum:]:_.-]+)\s*(=)' captures: 1: invalid.illegal.bad-attribute-name.xml 2: punctuation.separator.key-value.xml - include: double-quoted-string - include: single-quoted-string