aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorObserverOfTime <chronobserver@disroot.org>2023-08-04 14:50:28 +0300
committerObserverOfTime <chronobserver@disroot.org>2023-08-13 10:34:57 +0300
commit5b3dd8cff1064db583ddd3edd314e94a02ea1bef (patch)
tree2a8ae4546d07a867531e7f861e48c004050ecf7f
parentfixup: php injections (diff)
downloadnvim-treesitter-5b3dd8cff1064db583ddd3edd314e94a02ea1bef.tar
nvim-treesitter-5b3dd8cff1064db583ddd3edd314e94a02ea1bef.tar.gz
nvim-treesitter-5b3dd8cff1064db583ddd3edd314e94a02ea1bef.tar.bz2
nvim-treesitter-5b3dd8cff1064db583ddd3edd314e94a02ea1bef.tar.lz
nvim-treesitter-5b3dd8cff1064db583ddd3edd314e94a02ea1bef.tar.xz
nvim-treesitter-5b3dd8cff1064db583ddd3edd314e94a02ea1bef.tar.zst
nvim-treesitter-5b3dd8cff1064db583ddd3edd314e94a02ea1bef.zip
feat: add xml & dtd parsers
-rw-r--r--README.md2
-rw-r--r--lockfile.json6
-rw-r--r--lua/nvim-treesitter/parsers.lua21
-rw-r--r--queries/dtd/folds.scm4
-rw-r--r--queries/dtd/highlights.scm121
-rw-r--r--queries/dtd/injections.scm1
-rw-r--r--queries/http/injections.scm4
-rw-r--r--queries/hurl/injections.scm2
-rw-r--r--queries/xml/folds.scm5
-rw-r--r--queries/xml/highlights.scm53
-rw-r--r--queries/xml/indents.scm16
-rw-r--r--queries/xml/injections.scm29
12 files changed, 261 insertions, 3 deletions
diff --git a/README.md b/README.md
index bfb9ac117..5a7cae35a 100644
--- a/README.md
+++ b/README.md
@@ -207,6 +207,7 @@ We are looking for maintainers to add more parsers and to write query files for
- [x] [diff](https://github.com/the-mikedavis/tree-sitter-diff) (maintained by @gbprod)
- [x] [dockerfile](https://github.com/camdencheek/tree-sitter-dockerfile) (maintained by @camdencheek)
- [x] [dot](https://github.com/rydesun/tree-sitter-dot) (maintained by @rydesun)
+- [x] [dtd](https://github.com/ObserverOfTime/tree-sitter-xml) (maintained by @ObserverOfTime)
- [x] [ebnf](https://github.com/RubixDev/ebnf) (experimental, maintained by @RubixDev)
- [x] [eex](https://github.com/connorlay/tree-sitter-eex) (maintained by @connorlay)
- [x] [elixir](https://github.com/elixir-lang/tree-sitter-elixir) (maintained by @connorlay)
@@ -371,6 +372,7 @@ We are looking for maintainers to add more parsers and to write query files for
- [x] [wgsl](https://github.com/szebniok/tree-sitter-wgsl) (maintained by @szebniok)
- [x] [wgsl_bevy](https://github.com/theHamsta/tree-sitter-wgsl-bevy) (maintained by @theHamsta)
- [x] [wing](https://github.com/winglang/wing) (experimental, maintained by @gshpychka)
+- [x] [xml](https://github.com/ObserverOfTime/tree-sitter-xml) (maintained by @ObserverOfTime)
- [x] [yaml](https://github.com/ikatyang/tree-sitter-yaml) (maintained by @stsewd)
- [x] [yang](https://github.com/Hubro/tree-sitter-yang) (maintained by @Hubro)
- [x] [yuck](https://github.com/Philipp-M/tree-sitter-yuck) (maintained by @Philipp-M, @amaanq)
diff --git a/lockfile.json b/lockfile.json
index 4501e7956..3a15ebf32 100644
--- a/lockfile.json
+++ b/lockfile.json
@@ -101,6 +101,9 @@
"dot": {
"revision": "9ab85550c896d8b294d9b9ca1e30698736f08cea"
},
+ "dtd": {
+ "revision": "9deacbfb79cb3527a0396255beb17e1bba3f2052"
+ },
"ebnf": {
"revision": "8e635b0b723c620774dfb8abf382a7f531894b40"
},
@@ -593,6 +596,9 @@
"wing": {
"revision": "9399564d1e32864c6af2d49c0dcd1f76d54443f2"
},
+ "xml": {
+ "revision": "9deacbfb79cb3527a0396255beb17e1bba3f2052"
+ },
"yaml": {
"revision": "0e36bed171768908f331ff7dff9d956bae016efb"
},
diff --git a/lua/nvim-treesitter/parsers.lua b/lua/nvim-treesitter/parsers.lua
index 53ccce0df..08817b5df 100644
--- a/lua/nvim-treesitter/parsers.lua
+++ b/lua/nvim-treesitter/parsers.lua
@@ -42,6 +42,9 @@ for ft, lang in pairs {
quarto = "markdown",
dosini = "ini",
confini = "ini",
+ svg = "xml",
+ xsd = "xml",
+ xslt = "xml",
} do
register_lang(lang, ft)
end
@@ -356,6 +359,15 @@ list.dot = {
maintainers = { "@rydesun" },
}
+list.dtd = {
+ install_info = {
+ url = "https://github.com/ObserverOfTime/tree-sitter-xml",
+ files = { "src/parser.c", "src/scanner.c" },
+ location = "tree-sitter-dtd",
+ },
+ maintainers = { "@ObserverOfTime" },
+}
+
list.ebnf = {
install_info = {
url = "https://github.com/RubixDev/ebnf",
@@ -1745,6 +1757,15 @@ list.wing = {
experimental = true,
}
+list.xml = {
+ install_info = {
+ url = "https://github.com/ObserverOfTime/tree-sitter-xml",
+ files = { "src/parser.c", "src/scanner.c" },
+ location = "tree-sitter-xml",
+ },
+ maintainers = { "@ObserverOfTime" },
+}
+
list.yaml = {
install_info = {
url = "https://github.com/ikatyang/tree-sitter-yaml",
diff --git a/queries/dtd/folds.scm b/queries/dtd/folds.scm
new file mode 100644
index 000000000..ba7ea121b
--- /dev/null
+++ b/queries/dtd/folds.scm
@@ -0,0 +1,4 @@
+[
+ (conditionalSect)
+ (Comment)
+] @fold
diff --git a/queries/dtd/highlights.scm b/queries/dtd/highlights.scm
new file mode 100644
index 000000000..ba34f0bfe
--- /dev/null
+++ b/queries/dtd/highlights.scm
@@ -0,0 +1,121 @@
+;; XML declaration
+
+(XMLDecl "xml" @preproc)
+
+(XMLDecl [ "version" "encoding" ] @tag.attribute)
+
+(XMLDecl (EncName) @string.special)
+
+(XMLDecl (VersionNum) @number)
+
+;; Processing instructions
+
+(PI) @preproc
+
+;; Element declaration
+
+(elementdecl
+ "ELEMENT" @define
+ (Name) @tag)
+
+(contentspec
+ (_ (Name) @tag.attribute))
+
+"#PCDATA" @type.builtin
+
+[ "EMPTY" "ANY" ] @type.qualifier
+
+[ "*" "?" "+" ] @character.special
+
+;; Entity declaration
+
+(GEDecl
+ "ENTITY" @define
+ (Name) @constant)
+
+(GEDecl (EntityValue) @string)
+
+(NDataDecl
+ "NDATA" @keyword
+ (Name) @label)
+
+;; Parsed entity declaration
+
+(PEDecl
+ "ENTITY" @define
+ "%" @operator
+ (Name) @function.macro)
+
+(PEDecl (EntityValue) @string)
+
+;; Notation declaration
+
+(NotationDecl
+ "NOTATION" @preproc
+ (Name) @label)
+
+((NotationDecl
+ (ExternalID
+ (SystemLiteral (URI) @string.special))
+ (#set! "priority" 105)))
+
+;; Attlist declaration
+
+(AttlistDecl
+ "ATTLIST" @define
+ (Name) @tag)
+
+(AttDef (Name) @tag.attribute)
+
+(AttDef (Enumeration (Nmtoken) @string))
+
+[
+ (StringType)
+ (TokenizedType)
+] @type.builtin
+
+(NotationType "NOTATION" @type.builtin)
+
+[
+ "#REQUIRED"
+ "#IMPLIED"
+ "#FIXED"
+] @attribute
+
+;; Entities
+
+(EntityRef) @constant
+
+((EntityRef) @constant.builtin
+ (#any-of? @constant.builtin
+ "&amp;" "&lt;" "&gt;" "&quot;" "&apos;"))
+
+(CharRef) @character
+
+(PEReference) @function.macro
+
+;; External references
+
+[ "PUBLIC" "SYSTEM" ] @keyword
+
+(PubidLiteral) @string.special
+
+(SystemLiteral (URI) @text.uri)
+
+;; Delimiters & punctuation
+
+[ "<?" "?>" "<!" ">" "]]>" ] @tag.delimiter
+
+[ "(" ")" "[" ] @punctuation.bracket
+
+[ "\"" "'" ] @punctuation.delimiter
+
+[ "," "|" "=" ] @operator
+
+;; Misc
+
+[ "INCLUDE" "IGNORE" ] @include
+
+(Comment) @comment @spell
+
+(ERROR) @error
diff --git a/queries/dtd/injections.scm b/queries/dtd/injections.scm
new file mode 100644
index 000000000..ed5557a05
--- /dev/null
+++ b/queries/dtd/injections.scm
@@ -0,0 +1 @@
+(Comment) @comment
diff --git a/queries/http/injections.scm b/queries/http/injections.scm
index 7f06e336d..cc17373dc 100644
--- a/queries/http/injections.scm
+++ b/queries/http/injections.scm
@@ -4,8 +4,8 @@
((json_body) @injection.content
(#set! injection.language "json"))
-; ((xml_body) @injection.content
-; (#set! injection.language "xml"))
+((xml_body) @injection.content
+ (#set! injection.language "xml"))
; ((graphql_body) @injection.content
; (#set! injection.language "graphql")) ; Not used as of now..
diff --git a/queries/hurl/injections.scm b/queries/hurl/injections.scm
index 3d961258f..363e90046 100644
--- a/queries/hurl/injections.scm
+++ b/queries/hurl/injections.scm
@@ -3,7 +3,7 @@
(#set! injection.language "json"))
((xml) @injection.content
- (#set! injection.language "html"))
+ (#set! injection.language "xml"))
(multiline_string
(multiline_string_type) @_lang
diff --git a/queries/xml/folds.scm b/queries/xml/folds.scm
new file mode 100644
index 000000000..494e8c00a
--- /dev/null
+++ b/queries/xml/folds.scm
@@ -0,0 +1,5 @@
+[
+ (element)
+ (doctypedecl)
+ (Comment)
+] @fold
diff --git a/queries/xml/highlights.scm b/queries/xml/highlights.scm
new file mode 100644
index 000000000..e47636ac4
--- /dev/null
+++ b/queries/xml/highlights.scm
@@ -0,0 +1,53 @@
+; inherits: dtd
+
+;; XML declaration
+
+(XMLDecl "standalone" @tag.attribute)
+
+(XMLDecl [ "yes" "no" ] @boolean)
+
+;; Processing instructions
+
+(XmlModelPI "xml-model" @preproc)
+
+(StyleSheetPI "xml-stylesheet" @preproc)
+
+(PseudoAtt (Name) @tag.attribute)
+
+(PseudoAtt (PseudoAttValue) @string)
+
+;; Doctype declaration
+
+(doctypedecl "DOCTYPE" @define)
+
+(doctypedecl (Name) @type.definition)
+
+;; Tags
+
+(STag (Name) @tag)
+
+(ETag (Name) @tag)
+
+(EmptyElemTag (Name) @tag)
+
+;; Attributes
+
+(Attribute (Name) @tag.attribute)
+
+(Attribute (AttValue) @string)
+
+;; Text
+
+(CharData) @text @spell
+
+((CDSect
+ (CDStart) @text.environment
+ (CData) @text.literal
+ "]]>" @text.environment)
+ (#set! "priority" 105))
+
+;; Delimiters & punctuation
+
+[ "<" "</" "/>" ] @tag.delimiter
+
+"]" @punctuation.bracket
diff --git a/queries/xml/indents.scm b/queries/xml/indents.scm
new file mode 100644
index 000000000..24cd75cfa
--- /dev/null
+++ b/queries/xml/indents.scm
@@ -0,0 +1,16 @@
+(element) @indent.begin
+
+[
+ (Attribute)
+ (AttlistDecl)
+ (contentspec)
+] @indent.align
+
+(ETag) @indent.dedent
+
+(doctypedecl) @indent.ignore
+
+[
+ (Comment)
+ (ERROR)
+] @indent.auto
diff --git a/queries/xml/injections.scm b/queries/xml/injections.scm
new file mode 100644
index 000000000..99b3a9cc8
--- /dev/null
+++ b/queries/xml/injections.scm
@@ -0,0 +1,29 @@
+((Comment) @injection.content
+ (#set! injection.language "comment"))
+
+; SVG style
+((element
+ (STag (Name) @_name)
+ (content) @injection.content)
+ (#eq? @_name "style")
+ (#set! injection.combined)
+ (#set! injection.include-children)
+ (#set! injection.language "css"))
+
+; SVG script
+((element
+ (STag (Name) @_name)
+ (content) @injection.content)
+ (#eq? @_name "script")
+ (#set! injection.combined)
+ (#set! injection.include-children)
+ (#set! injection.language "javascript"))
+
+; phpMyAdmin dump
+((element
+ (STag (Name) @_name)
+ (content) @injection.content)
+ (#eq? @_name "pma:table")
+ (#set! injection.combined)
+ (#set! injection.include-children)
+ (#set! injection.language "sql"))