diff --git a/CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.pbxproj b/CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.pbxproj
index 2dae242..6639b04 100644
--- a/CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.pbxproj
+++ b/CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.pbxproj
@@ -34,6 +34,8 @@
6CE117FC2CEA7CF80082D393 /* TreeSitterDart in Frameworks */ = {isa = PBXBuildFile; productRef = 6CE117FB2CEA7CF80082D393 /* TreeSitterDart */; };
6CEC70FE29C3A85000B61C7A /* TreeSitterRegex in Frameworks */ = {isa = PBXBuildFile; productRef = 6CEC70FD29C3A85000B61C7A /* TreeSitterRegex */; };
6CF2B8412CE978F100CBE5D1 /* TreeSitterDart in Frameworks */ = {isa = PBXBuildFile; productRef = 6CF2B8402CE978F100CBE5D1 /* TreeSitterDart */; };
+ 76BC51E22F03A6D50030E59A /* TreeSitterR in Frameworks */ = {isa = PBXBuildFile; productRef = 76BC51E12F03A6D50030E59A /* TreeSitterR */; };
+ 76BC51E52F03ACB50030E59A /* TreeSitterXML in Frameworks */ = {isa = PBXBuildFile; productRef = 76BC51E42F03ACB50030E59A /* TreeSitterXML */; };
8E74B41D2A4C88ED003A9550 /* TreeSitterHTML in Frameworks */ = {isa = PBXBuildFile; productRef = 8E74B41C2A4C88ED003A9550 /* TreeSitterHTML */; };
8E7B0EA92A5D9BB60040DDAB /* TreeSitterTOML in Frameworks */ = {isa = PBXBuildFile; productRef = 8E7B0EA82A5D9BB60040DDAB /* TreeSitterTOML */; };
8E7B8ABD2A5D916F00CFC1A7 /* TreeSitterPython in Frameworks */ = {isa = PBXBuildFile; productRef = 8E7B8ABC2A5D916F00CFC1A7 /* TreeSitterPython */; };
@@ -67,6 +69,7 @@
285BF67329AAA45B00641989 /* TreeSitterLua in Frameworks */,
8E87F9542A4B7DC1008C7E13 /* TreeSitterScala in Frameworks */,
6CE117F92CEA7BDC0082D393 /* TreeSitterDart in Frameworks */,
+ 76BC51E22F03A6D50030E59A /* TreeSitterR in Frameworks */,
2846B262296BA1CF005F60B6 /* TreeSitterDockerfile in Frameworks */,
9D73992A2A5A30A400CEF6E8 /* TreeSitterPerl in Frameworks */,
9D6E74512A2B9B2A0070701E /* TreeSitterOCaml in Frameworks */,
@@ -80,6 +83,7 @@
28B9F7AA290DDAC900245748 /* TreeSitterBash in Frameworks */,
28B3F030290C35F9000CD04D /* TreeSitterCPP in Frameworks */,
28B3F04E290C3698000CD04D /* TreeSitterJSON in Frameworks */,
+ 76BC51E52F03ACB50030E59A /* TreeSitterXML in Frameworks */,
28B3F033290C3608000CD04D /* TreeSitterCSharp in Frameworks */,
28B3F03F290C364D000CD04D /* TreeSitterGoMod in Frameworks */,
28B3F063290C372D000CD04D /* TreeSitterZig in Frameworks */,
@@ -204,6 +208,8 @@
6CF2B8402CE978F100CBE5D1 /* TreeSitterDart */,
6CE117F82CEA7BDC0082D393 /* TreeSitterDart */,
6CE117FB2CEA7CF80082D393 /* TreeSitterDart */,
+ 76BC51E12F03A6D50030E59A /* TreeSitterR */,
+ 76BC51E42F03ACB50030E59A /* TreeSitterXML */,
);
productName = "CodeLanguages-Container";
productReference = 28B3F00C290C207D000CD04D /* CodeLanguages_Container.framework */;
@@ -271,6 +277,8 @@
6C0B93A62B5DD95500323006 /* XCRemoteSwiftPackageReference "tree-sitter-css" */,
6C7CA2AB2CE9743E006D9D9A /* XCRemoteSwiftPackageReference "tree-sitter-objc" */,
6CE117FA2CEA7CF80082D393 /* XCRemoteSwiftPackageReference "tree-sitter-dart" */,
+ 76BC51E02F03A6D50030E59A /* XCRemoteSwiftPackageReference "tree-sitter-r" */,
+ 76BC51E32F03ACB50030E59A /* XCRemoteSwiftPackageReference "tree-sitter-xml" */,
);
productRefGroup = 28B3F00D290C207D000CD04D /* Products */;
projectDirPath = "";
@@ -712,6 +720,22 @@
kind = branch;
};
};
+ 76BC51E02F03A6D50030E59A /* XCRemoteSwiftPackageReference "tree-sitter-r" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/r-lib/tree-sitter-r/";
+ requirement = {
+ branch = main;
+ kind = branch;
+ };
+ };
+ 76BC51E32F03ACB50030E59A /* XCRemoteSwiftPackageReference "tree-sitter-xml" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/tree-sitter-grammars/tree-sitter-xml";
+ requirement = {
+ branch = master;
+ kind = branch;
+ };
+ };
8E74B41B2A4C88ED003A9550 /* XCRemoteSwiftPackageReference "tree-sitter-html" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/tree-sitter/tree-sitter-html.git";
@@ -947,6 +971,16 @@
isa = XCSwiftPackageProductDependency;
productName = TreeSitterDart;
};
+ 76BC51E12F03A6D50030E59A /* TreeSitterR */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 76BC51E02F03A6D50030E59A /* XCRemoteSwiftPackageReference "tree-sitter-r" */;
+ productName = TreeSitterR;
+ };
+ 76BC51E42F03ACB50030E59A /* TreeSitterXML */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 76BC51E32F03ACB50030E59A /* XCRemoteSwiftPackageReference "tree-sitter-xml" */;
+ productName = TreeSitterXML;
+ };
8E74B41C2A4C88ED003A9550 /* TreeSitterHTML */ = {
isa = XCSwiftPackageProductDependency;
package = 8E74B41B2A4C88ED003A9550 /* XCRemoteSwiftPackageReference "tree-sitter-html" */;
diff --git a/CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index 43c7efd..6333578 100644
--- a/CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -1,5 +1,5 @@
{
- "originHash" : "c940c7467f54711e27ceb0cef308954e1fdbcc20f3dd59d96d6efbe29d7a04ba",
+ "originHash" : "5e60d81c8d0e06861a13165c44b11a73cb723b4488da8e2c2bfb80f2a36fe37a",
"pins" : [
{
"identity" : "tree-sitter-agda",
@@ -235,6 +235,15 @@
"revision" : "4bfdd9033a2225cc95032ce77066b7aeca9e2efc"
}
},
+ {
+ "identity" : "tree-sitter-r",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/r-lib/tree-sitter-r/",
+ "state" : {
+ "branch" : "main",
+ "revision" : "0e6ef7741712c09dc3ee6e81c42e919820cc65ef"
+ }
+ },
{
"identity" : "tree-sitter-regex",
"kind" : "remoteSourceControl",
@@ -316,6 +325,15 @@
"revision" : "902031343056bc0b11f3e47b33f036a9cf59f58d"
}
},
+ {
+ "identity" : "tree-sitter-xml",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/tree-sitter-grammars/tree-sitter-xml",
+ "state" : {
+ "branch" : "master",
+ "revision" : "863dbc381f44f6c136a399e684383b977bb2beaa"
+ }
+ },
{
"identity" : "tree-sitter-yaml",
"kind" : "remoteSourceControl",
diff --git a/CodeLanguages-Container/CodeLanguages-Container/CodeLanguages_Container.h b/CodeLanguages-Container/CodeLanguages-Container/CodeLanguages_Container.h
index b27c35d..9243d99 100644
--- a/CodeLanguages-Container/CodeLanguages-Container/CodeLanguages_Container.h
+++ b/CodeLanguages-Container/CodeLanguages-Container/CodeLanguages_Container.h
@@ -50,6 +50,7 @@ extern TSLanguage *tree_sitter_ocaml_interface();
extern TSLanguage *tree_sitter_perl();
extern TSLanguage *tree_sitter_php();
extern TSLanguage *tree_sitter_python();
+extern TSLanguage *tree_sitter_r();
extern TSLanguage *tree_sitter_regex();
extern TSLanguage *tree_sitter_ruby();
extern TSLanguage *tree_sitter_rust();
@@ -60,6 +61,7 @@ extern TSLanguage *tree_sitter_toml();
extern TSLanguage *tree_sitter_tsx();
extern TSLanguage *tree_sitter_typescript();
extern TSLanguage *tree_sitter_verilog();
+extern TSLanguage *tree_sitter_xml();
extern TSLanguage *tree_sitter_yaml();
extern TSLanguage *tree_sitter_zig();
diff --git a/CodeLanguagesContainer.xcframework.zip b/CodeLanguagesContainer.xcframework.zip
index 9904c2a..cd4cc34 100644
Binary files a/CodeLanguagesContainer.xcframework.zip and b/CodeLanguagesContainer.xcframework.zip differ
diff --git a/README.md b/README.md
index aafc036..1433d8c 100644
--- a/README.md
+++ b/README.md
@@ -73,6 +73,7 @@ In order to add support for additional languages we have a complete guide on how
| [Perl](https://github.com/ganezdragon/tree-sitter-perl) | ✅ | _not available_ |
| [PHP](https://github.com/tree-sitter/tree-sitter-php) | ✅ | ✅ |
| [Python](https://github.com/tree-sitter/tree-sitter-python) | ✅ | ✅ |
+| [R](https://github.com/r-lib/tree-sitter-r) | ✅ | ✅ |
| [Regex](https://github.com/tree-sitter/tree-sitter-regex) | ✅ | ✅ |
| [Ruby](https://github.com/mattmassicotte/tree-sitter-ruby) | ✅ | ✅ |
| [Rust](https://github.com/tree-sitter/tree-sitter-rust) | ✅ | ✅ |
@@ -82,9 +83,28 @@ In order to add support for additional languages we have a complete guide on how
| [TOML](https://github.com/cengelbart39/tree-sitter-toml/tree/feature/spm) | ✅ | ✅ |
| [TypeScript/TSX](https://github.com/tree-sitter/tree-sitter-typescript) | ✅ | ✅ |
| [Verilog](https://github.com/tree-sitter/tree-sitter-verilog) | ✅ | _not available_ |
+| [XML](https://github.com/tree-sitter-grammars/tree-sitter-xml) | ✅ | ✅ |
| [YAML](https://github.com/tree-sitter-grammars/tree-sitter-yaml.git) | ✅ | ✅ |
| [Zig](https://github.com/tree-sitter-grammars/tree-sitter-zig.git) | ✅ | ✅ |
+## Building the Framework
+
+When adding new languages, you need to rebuild the binary framework using `./build_framework.sh`.
+
+### Troubleshooting
+
+If the build script fails with:
+```
+xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance
+```
+
+Run this command to point to your Xcode installation:
+```bash
+sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
+```
+
+Then run `./build_framework.sh` again.
+
## Related Repositories
diff --git a/Sources/CodeEditLanguages/CodeLanguage+Definitions.swift b/Sources/CodeEditLanguages/CodeLanguage+Definitions.swift
index 56ce3d4..66b5676 100644
--- a/Sources/CodeEditLanguages/CodeLanguage+Definitions.swift
+++ b/Sources/CodeEditLanguages/CodeLanguage+Definitions.swift
@@ -42,6 +42,7 @@ public extension CodeLanguage {
.perl,
.php,
.python,
+ .r,
.regex,
.ruby,
.rust,
@@ -52,6 +53,7 @@ public extension CodeLanguage {
.tsx,
.typescript,
.verilog,
+ .xml,
.yaml,
.zig
]
@@ -354,6 +356,17 @@ public extension CodeLanguage {
additionalIdentifiers: ["python2", "python3"]
)
+ /// A language structure for `R`
+ static let r: CodeLanguage = .init(
+ id: .r,
+ tsName: "r",
+ extensions: ["r", "R"],
+ lineCommentString: "#",
+ rangeCommentStrings: ("", ""),
+ documentationCommentStrings: [.single("#'")],
+ additionalIdentifiers: ["Rscript"]
+ )
+
/// A language structure for `Regex`
static let regex: CodeLanguage = .init(
id: .regex,
@@ -462,6 +475,15 @@ public extension CodeLanguage {
highlights: ["folds", "injections"]
)
+ /// A language structure for `XML`
+ static let xml: CodeLanguage = .init(
+ id: .xml,
+ tsName: "xml",
+ extensions: ["xml", "xsl", "xslt", "xsd", "svg", "plist"],
+ lineCommentString: "",
+ rangeCommentStrings: ("")
+ )
+
/// A language structure for `YAML`
static let yaml: CodeLanguage = .init(
id: .yaml,
diff --git a/Sources/CodeEditLanguages/CodeLanguage.swift b/Sources/CodeEditLanguages/CodeLanguage.swift
index f8b6681..6552a36 100644
--- a/Sources/CodeEditLanguages/CodeLanguage.swift
+++ b/Sources/CodeEditLanguages/CodeLanguage.swift
@@ -145,6 +145,8 @@ public struct CodeLanguage {
return tree_sitter_php()
case .python:
return tree_sitter_python()
+ case .r:
+ return tree_sitter_r()
case .regex:
return tree_sitter_regex()
case .ruby:
@@ -165,6 +167,8 @@ public struct CodeLanguage {
return tree_sitter_typescript()
case .verilog:
return tree_sitter_verilog()
+ case .xml:
+ return tree_sitter_xml()
case .yaml:
return tree_sitter_yaml()
case .zig:
diff --git a/Sources/CodeEditLanguages/Resources/tree-sitter-r/describe.scm b/Sources/CodeEditLanguages/Resources/tree-sitter-r/describe.scm
new file mode 100644
index 0000000..bc5e6f6
--- /dev/null
+++ b/Sources/CodeEditLanguages/Resources/tree-sitter-r/describe.scm
@@ -0,0 +1,32 @@
+(call
+ function: [
+ (identifier) @parent_function
+ (namespace_operator
+ lhs: (identifier) @parent_pkg (#eq? @parent_pkg "testthat")
+ rhs: (identifier) @parent_function
+ )
+ ] (#eq? @parent_function "describe")
+ arguments: (arguments
+ (argument
+ value: (string) @parent_desc
+ )
+ (argument
+ value: (braced_expression
+ body: (call
+ function: [
+ (identifier) @function
+ (namespace_operator
+ lhs: (identifier) @pkg (#eq? @pkg "testthat")
+ rhs: (identifier) @function
+ )
+ ] (#eq? @function "it")
+ arguments: (arguments
+ (argument
+ value: (string) @desc
+ )
+ )
+ ) @call
+ )
+ )
+ )
+) @parent_call
diff --git a/Sources/CodeEditLanguages/Resources/tree-sitter-r/highlights.scm b/Sources/CodeEditLanguages/Resources/tree-sitter-r/highlights.scm
new file mode 100644
index 0000000..c632d3e
--- /dev/null
+++ b/Sources/CodeEditLanguages/Resources/tree-sitter-r/highlights.scm
@@ -0,0 +1,112 @@
+; highlights.scm
+
+; Literals
+
+(integer) @number
+(float) @number
+(complex) @number
+
+(string) @string
+(string (string_content (escape_sequence) @string.escape))
+
+; Comments
+
+(comment) @comment
+
+; Operators
+
+[
+ "?" ":=" "=" "<-" "<<-" "->" "->>"
+ "~" "|>" "||" "|" "&&" "&"
+ "<" "<=" ">" ">=" "==" "!="
+ "+" "-" "*" "/" "::" ":::"
+ "**" "^" "$" "@" ":" "!"
+ "special"
+] @operator
+
+; Punctuation
+
+[
+ "(" ")"
+ "{" "}"
+ "[" "]"
+ "[[" "]]"
+] @punctuation.bracket
+
+(comma) @punctuation.delimiter
+
+; Variables
+
+(identifier) @variable
+
+; Functions
+
+(binary_operator
+ lhs: (identifier) @function
+ operator: "<-"
+ rhs: (function_definition)
+)
+
+(binary_operator
+ lhs: (identifier) @function
+ operator: "="
+ rhs: (function_definition)
+)
+
+; Calls
+
+(call function: (identifier) @function)
+
+; Parameters
+
+(parameters (parameter name: (identifier) @variable.parameter))
+(arguments (argument name: (identifier) @variable.parameter))
+
+; Namespace
+
+(namespace_operator lhs: (identifier) @namespace)
+
+(call
+ function: (namespace_operator rhs: (identifier) @function)
+)
+
+; Keywords
+
+(function_definition name: "function" @keyword.function)
+(function_definition name: "\\" @operator)
+
+[
+ "in"
+ (return)
+ (next)
+ (break)
+] @keyword
+
+[
+ "if"
+ "else"
+] @conditional
+
+[
+ "while"
+ "repeat"
+ "for"
+] @repeat
+
+[
+ (true)
+ (false)
+] @boolean
+
+[
+ (null)
+ (inf)
+ (nan)
+ (na)
+ (dots)
+ (dot_dot_i)
+] @constant.builtin
+
+; Error
+
+(ERROR) @error
diff --git a/Sources/CodeEditLanguages/Resources/tree-sitter-r/locals.scm b/Sources/CodeEditLanguages/Resources/tree-sitter-r/locals.scm
new file mode 100644
index 0000000..5d4697a
--- /dev/null
+++ b/Sources/CodeEditLanguages/Resources/tree-sitter-r/locals.scm
@@ -0,0 +1,18 @@
+; locals.scm
+
+(function_definition) @local.scope
+
+(argument name: (identifier) @local.definition)
+(parameter name: (identifier) @local.definition)
+
+(binary_operator
+ lhs: (identifier) @local.definition
+ operator: "<-")
+(binary_operator
+ lhs: (identifier) @local.definition
+ operator: "=")
+(binary_operator
+ operator: "->"
+ rhs: (identifier) @local.definition)
+
+(identifier) @local.reference
diff --git a/Sources/CodeEditLanguages/Resources/tree-sitter-r/tags.scm b/Sources/CodeEditLanguages/Resources/tree-sitter-r/tags.scm
new file mode 100644
index 0000000..35ca6c0
--- /dev/null
+++ b/Sources/CodeEditLanguages/Resources/tree-sitter-r/tags.scm
@@ -0,0 +1,33 @@
+(binary_operator
+ lhs: (identifier) @name
+ operator: "<-"
+ rhs: (function_definition)
+) @definition.function
+
+(binary_operator
+ lhs: (identifier) @name
+ operator: "="
+ rhs: (function_definition)
+) @definition.function
+
+(binary_operator
+ lhs: (string) @name
+ operator: "<-"
+ rhs: (function_definition)
+) @definition.function
+
+(binary_operator
+ lhs: (string) @name
+ operator: "="
+ rhs: (function_definition)
+) @definition.function
+
+(call
+ function: (identifier) @name
+) @reference.call
+
+(call
+ function: (namespace_operator
+ rhs: (identifier) @name
+ )
+) @reference.call
diff --git a/Sources/CodeEditLanguages/Resources/tree-sitter-r/test_that.scm b/Sources/CodeEditLanguages/Resources/tree-sitter-r/test_that.scm
new file mode 100644
index 0000000..de73262
--- /dev/null
+++ b/Sources/CodeEditLanguages/Resources/tree-sitter-r/test_that.scm
@@ -0,0 +1,22 @@
+(call
+ function: [
+ (identifier) @function
+ (namespace_operator
+ lhs: (identifier) @pkg (#eq? @pkg "testthat")
+ rhs: (identifier) @function
+ )
+ ] (#eq? @function "test_that")
+ arguments: [
+ (arguments
+ . (argument value: (string) @desc) . (comma) . (_) .
+ )
+ (arguments
+ . (_) . (comma) .
+ (argument
+ name: (identifier) @param
+ value: (string) @desc
+ ) (#eq? @param "desc")
+ .
+ )
+ ]
+) @call
diff --git a/Sources/CodeEditLanguages/Resources/tree-sitter-xml/highlights.scm b/Sources/CodeEditLanguages/Resources/tree-sitter-xml/highlights.scm
new file mode 100644
index 0000000..9861eea
--- /dev/null
+++ b/Sources/CodeEditLanguages/Resources/tree-sitter-xml/highlights.scm
@@ -0,0 +1,168 @@
+;; XML declaration
+
+"xml" @keyword
+
+[ "version" "encoding" "standalone" ] @property
+
+(EncName) @string.special
+
+(VersionNum) @number
+
+[ "yes" "no" ] @boolean
+
+;; Processing instructions
+
+(PI) @embedded
+
+(PI (PITarget) @keyword)
+
+;; Element declaration
+
+(elementdecl
+ "ELEMENT" @keyword
+ (Name) @tag)
+
+(contentspec
+ (_ (Name) @property))
+
+"#PCDATA" @type.builtin
+
+[ "EMPTY" "ANY" ] @string.special.symbol
+
+[ "*" "?" "+" ] @operator
+
+;; Entity declaration
+
+(GEDecl
+ "ENTITY" @keyword
+ (Name) @constant)
+
+(GEDecl (EntityValue) @string)
+
+(NDataDecl
+ "NDATA" @keyword
+ (Name) @label)
+
+;; Parsed entity declaration
+
+(PEDecl
+ "ENTITY" @keyword
+ "%" @operator
+ (Name) @constant)
+
+(PEDecl (EntityValue) @string)
+
+;; Notation declaration
+
+(NotationDecl
+ "NOTATION" @keyword
+ (Name) @constant)
+
+(NotationDecl
+ (ExternalID
+ (SystemLiteral (URI) @string.special)))
+
+;; Attlist declaration
+
+(AttlistDecl
+ "ATTLIST" @keyword
+ (Name) @tag)
+
+(AttDef (Name) @property)
+
+(AttDef (Enumeration (Nmtoken) @string))
+
+(DefaultDecl (AttValue) @string)
+
+[
+ (StringType)
+ (TokenizedType)
+] @type.builtin
+
+(NotationType "NOTATION" @type.builtin)
+
+[
+ "#REQUIRED"
+ "#IMPLIED"
+ "#FIXED"
+] @attribute
+
+;; Entities
+
+(EntityRef) @constant
+
+((EntityRef) @constant.builtin
+ (#any-of? @constant.builtin
+ "&" "<" ">" """ "'"))
+
+(CharRef) @constant
+
+(PEReference) @constant
+
+;; External references
+
+[ "PUBLIC" "SYSTEM" ] @keyword
+
+(PubidLiteral) @string.special
+
+(SystemLiteral (URI) @markup.link)
+
+;; Processing instructions
+
+(XmlModelPI "xml-model" @keyword)
+
+(StyleSheetPI "xml-stylesheet" @keyword)
+
+(PseudoAtt (Name) @property)
+
+(PseudoAtt (PseudoAttValue) @string)
+
+;; Doctype declaration
+
+(doctypedecl "DOCTYPE" @keyword)
+
+(doctypedecl (Name) @type)
+
+;; Tags
+
+(STag (Name) @tag)
+
+(ETag (Name) @tag)
+
+(EmptyElemTag (Name) @tag)
+
+;; Attributes
+
+(Attribute (Name) @property)
+
+(Attribute (AttValue) @string)
+
+;; Delimiters & punctuation
+
+[
+ "" "?>"
+ ""
+ "<" ">"
+ "" "/>"
+] @punctuation.delimiter
+
+[ "(" ")" "[" "]" ] @punctuation.bracket
+
+[ "\"" "'" ] @punctuation.delimiter
+
+[ "," "|" "=" ] @operator
+
+;; Text
+
+(CharData) @markup
+
+(CDSect
+ (CDStart) @markup.heading
+ (CData) @markup.raw
+ "]]>" @markup.heading)
+
+;; Misc
+
+(Comment) @comment
+
+(ERROR) @error
diff --git a/Sources/CodeEditLanguages/Resources/tree-sitter-zig/test-query-injections.scm b/Sources/CodeEditLanguages/Resources/tree-sitter-zig/test-query-injections.scm
new file mode 100644
index 0000000..f382edd
--- /dev/null
+++ b/Sources/CodeEditLanguages/Resources/tree-sitter-zig/test-query-injections.scm
@@ -0,0 +1,27 @@
+; vim: ft=query
+; format-ignore
+(((symbol) @constant
+ (#not-lua-match? @constant "^_*[A-Z][A-Z0-9_]*$"))
+; ^ @luap
+)
+
+; format-ignore
+(((tag
+ (attributes
+ (attribute
+ (attribute_name) @keyword)))
+ (#match? @keyword "^(:|v-bind|v-|\\@)"))
+; ^ @regex
+)
+
+((comment) @injection.language
+ .
+ [
+ (string_expression
+ (string_fragment) @injection.content)
+ (indented_string_expression
+ (string_fragment) @injection.content)
+ ]
+ (#gsub! @injection.language "#%s*([%w%p]+)%s*" "%1")
+ ; ^ @luap
+ (#set! injection.combined))
diff --git a/Sources/CodeEditLanguages/Resources/tree-sitter-zig/test.scm b/Sources/CodeEditLanguages/Resources/tree-sitter-zig/test.scm
new file mode 100644
index 0000000..56d7556
--- /dev/null
+++ b/Sources/CodeEditLanguages/Resources/tree-sitter-zig/test.scm
@@ -0,0 +1,50 @@
+; vim:ft=query
+; format-ignore
+(fenced_code_block (fenced_code_block_delimiter) @label
+ (info_string
+ (language) @_lang)
+ (#offset! @label 0 1 0 -1)
+ (#ft-conceal! @_lang))
+
+([
+ (list_marker_minus)
+ (list_marker_plus)
+ (list_marker_star)
+] @markup.list
+ (#offset-first-n! @markup.list 1)
+ (#set! conceal "•"))
+
+(list
+ (list_item
+ (list
+ (list_item
+ ([
+ (list_marker_minus)
+ (list_marker_plus)
+ (list_marker_star)
+ ] @markup.list
+ (#offset-first-n! @markup.list 1)
+ (#set! conceal "◦"))))))
+
+; comment
+(while_statement
+ [
+ "while"
+ "do"
+ ] @open.loop
+ "end" @close.loop) @scope.loop
+
+[
+ "toplevel"
+ "list"
+] @variable
+
+[
+ (parent
+ (child))+
+ (parent
+ (child))*
+ (parent
+ (child))?
+] @cap
+((
diff --git a/Sources/CodeEditLanguages/TreeSitterLanguage.swift b/Sources/CodeEditLanguages/TreeSitterLanguage.swift
index 850d4f4..5238f64 100644
--- a/Sources/CodeEditLanguages/TreeSitterLanguage.swift
+++ b/Sources/CodeEditLanguages/TreeSitterLanguage.swift
@@ -38,6 +38,7 @@ public enum TreeSitterLanguage: String {
case perl
case php
case python
+ case r
case regex
case ruby
case rust
@@ -48,6 +49,7 @@ public enum TreeSitterLanguage: String {
case tsx
case typescript
case verilog
+ case xml
case yaml
case zig
case plainText
diff --git a/Sources/CodeEditLanguages/TreeSitterModel.swift b/Sources/CodeEditLanguages/TreeSitterModel.swift
index 4ef8d58..8b5e460 100644
--- a/Sources/CodeEditLanguages/TreeSitterModel.swift
+++ b/Sources/CodeEditLanguages/TreeSitterModel.swift
@@ -78,6 +78,8 @@ public class TreeSitterModel {
return phpQuery
case .python:
return pythonQuery
+ case .r:
+ return rQuery
case .regex:
return regexQuery
case .ruby:
@@ -98,6 +100,8 @@ public class TreeSitterModel {
return typescriptQuery
case .verilog:
return nil
+ case .xml:
+ return xmlQuery
case .yaml:
return yamlQuery
case .zig:
@@ -237,6 +241,11 @@ public class TreeSitterModel {
return queryFor(.python)
}()
+ /// Query for `R` files.
+ public private(set) lazy var rQuery: Query? = {
+ return queryFor(.r)
+ }()
+
/// Query for `Regex` files.
public private(set) lazy var regexQuery: Query? = {
return queryFor(.regex)
@@ -282,6 +291,11 @@ public class TreeSitterModel {
return queryFor(.typescript)
}()
+ /// Query for `XML` files.
+ public private(set) lazy var xmlQuery: Query? = {
+ return queryFor(.xml)
+ }()
+
/// Query for `YAML` files.
public private(set) lazy var yamlQuery: Query? = {
return queryFor(.yaml)
diff --git a/Tests/CodeEditLanguagesTests/CodeEditLanguagesTests.swift b/Tests/CodeEditLanguagesTests/CodeEditLanguagesTests.swift
index c2feda0..0aa5580 100644
--- a/Tests/CodeEditLanguagesTests/CodeEditLanguagesTests.swift
+++ b/Tests/CodeEditLanguagesTests/CodeEditLanguagesTests.swift
@@ -613,6 +613,32 @@ final class CodeEditLanguagesTests: XCTestCase {
XCTAssertNotEqual(query?.patternCount, 0)
}
+// MARK: - R
+
+ func test_CodeLanguageR() throws {
+ let url = URL(fileURLWithPath: "~/path/to/file.r")
+ let language = CodeLanguage.detectLanguageFrom(url: url)
+
+ XCTAssertEqual(language.id, .r)
+ }
+
+ func test_CodeLanguageR2() throws {
+ let url = URL(fileURLWithPath: "~/path/to/file.R")
+ let language = CodeLanguage.detectLanguageFrom(url: url)
+
+ XCTAssertEqual(language.id, .r)
+ }
+
+ func test_FetchQueryR() throws {
+ var language = CodeLanguage.r
+ language.resourceURL = bundleURL
+
+ let data = try Data(contentsOf: language.queryURL!)
+ let query = try? Query(language: language.language!, data: data)
+ XCTAssertNotNil(query)
+ XCTAssertNotEqual(query?.patternCount, 0)
+ }
+
// MARK: - Ruby
func test_CodeLanguageRuby() throws {
@@ -782,6 +808,39 @@ final class CodeEditLanguagesTests: XCTestCase {
XCTAssertEqual(language.id, .verilog)
}
+// MARK: - XML
+
+ func test_CodeLanguageXML() throws {
+ let url = URL(fileURLWithPath: "~/path/to/file.xml")
+ let language = CodeLanguage.detectLanguageFrom(url: url)
+
+ XCTAssertEqual(language.id, .xml)
+ }
+
+ func test_CodeLanguageXML2() throws {
+ let url = URL(fileURLWithPath: "~/path/to/file.plist")
+ let language = CodeLanguage.detectLanguageFrom(url: url)
+
+ XCTAssertEqual(language.id, .xml)
+ }
+
+ func test_CodeLanguageXML3() throws {
+ let url = URL(fileURLWithPath: "~/path/to/file.svg")
+ let language = CodeLanguage.detectLanguageFrom(url: url)
+
+ XCTAssertEqual(language.id, .xml)
+ }
+
+ func test_FetchQueryXML() throws {
+ var language = CodeLanguage.xml
+ language.resourceURL = bundleURL
+
+ let data = try Data(contentsOf: language.queryURL!)
+ let query = try? Query(language: language.language!, data: data)
+ XCTAssertNotNil(query)
+ XCTAssertNotEqual(query?.patternCount, 0)
+ }
+
// MARK: - YAML
func test_CodeLanguageYAML() throws {