Merge commit '7b06f6ed394308e7407a1703d2724128c45fc9d7'

pull/813/head
Wilfred Hughes 2025-01-21 08:39:54 +07:00
commit d51fb186be
5 changed files with 286 additions and 165 deletions

@ -1,252 +1,344 @@
;; Based on the nvim-treesitter highlighting, which is under the Apache license.
;; https://github.com/nvim-treesitter/nvim-treesitter/blob/f0b50973f334a7a5bb5831cb52b9fd4c770e6cba/queries/latex/highlights.scm
;; https://github.com/nvim-treesitter/nvim-treesitter/blob/07bd1b53bf465e42d53253b48b7437892d6c45e8/queries/latex/highlights.scm
;; General syntax
(ERROR) @error
; General syntax
(command_name) @function @nospell
(command_name) @function
(caption
command: _ @function)
; Turn spelling on for text
(text) @spell
; \text, \intertext, \shortintertext, ...
(text_mode
command: _ @function @nospell
content: (curly_group
(_) @none @spell))
; Variables, parameters
(placeholder) @variable
(key_value_pair
key: (_) @parameter
key: (_) @variable.parameter @nospell
value: (_))
[
(line_comment)
(block_comment)
(comment_environment)
] @comment
(curly_group_spec
(text) @variable.parameter)
((line_comment) @preproc
(#lua-match? @preproc "^%% !TeX"))
(brack_group_argc) @variable.parameter
[
(brack_group)
(brack_group_argc)
] @parameter
[(operator) "="] @operator
(operator)
"="
"_"
"^"
] @operator
"\\item" @punctuation.special
((word) @punctuation.delimiter
(#eq? @punctuation.delimiter "&"))
(delimiter) @punctuation.delimiter
(math_delimiter
left_command: _ @punctuation.delimiter
left_delimiter: _ @punctuation.delimiter
right_command: _ @punctuation.delimiter
right_delimiter: _ @punctuation.delimiter)
["[" "]" "{" "}"] @punctuation.bracket ; "(" ")" has no syntactical meaning in LaTeX
[
"["
"]"
"{"
"}"
] @punctuation.bracket ; "(" ")" has no syntactical meaning in LaTeX
;; General environments
; General environments
(begin
command: _ @text.environment
name: (curly_group_text (text) @text.environment.name))
command: _ @module
name: (curly_group_text
(text) @label @nospell))
(end
command: _ @text.environment
name: (curly_group_text (text) @text.environment.name))
command: _ @module
name: (curly_group_text
(text) @label @nospell))
;; Definitions and references
; Definitions and references
(new_command_definition
command: _ @function.macro
declaration: (curly_group_command_name (_) @function))
command: _ @function.macro @nospell)
(old_command_definition
command: _ @function.macro
declaration: (_) @function)
command: _ @function.macro @nospell)
(let_command_definition
command: _ @function.macro
declaration: (_) @function)
command: _ @function.macro @nospell)
(environment_definition
command: _ @function.macro
name: (curly_group_text (_) @text.reference))
command: _ @function.macro @nospell
name: (curly_group_text
(_) @label @nospell))
(theorem_definition
command: _ @function.macro
name: (curly_group_text (_) @text.environment.name))
command: _ @function.macro @nospell
name: (curly_group_text_list
(_) @label @nospell))
(paired_delimiter_definition
command: _ @function.macro
declaration: (curly_group_command_name (_) @function))
command: _ @function.macro @nospell
declaration: (curly_group_command_name
(_) @function))
(label_definition
command: _ @function.macro
name: (curly_group_text (_) @text.reference))
command: _ @function.macro
name: (curly_group_text
(_) @markup.link @nospell))
(label_reference_range
command: _ @function.macro
from: (curly_group_text (_) @text.reference)
to: (curly_group_text (_) @text.reference))
command: _ @function.macro
from: (curly_group_text
(_) @markup.link)
to: (curly_group_text
(_) @markup.link))
(label_reference
command: _ @function.macro
names: (curly_group_text_list (_) @text.reference))
command: _ @function.macro
names: (curly_group_text_list
(_) @markup.link))
(label_number
command: _ @function.macro
name: (curly_group_text (_) @text.reference)
number: (_) @text.reference)
command: _ @function.macro
name: (curly_group_text
(_) @markup.link)
number: (_) @markup.link)
(citation
command: _ @function.macro
keys: (curly_group_text_list) @text.reference)
command: _ @function.macro @nospell
keys: (curly_group_text_list) @markup.link @nospell)
((hyperlink
command: _ @function @nospell
uri: (curly_group_uri
(_) @markup.link.url @nospell)) @_hyperlink)
(glossary_entry_definition
command: _ @function.macro
name: (curly_group_text (_) @text.reference))
command: _ @function.macro @nospell
name: (curly_group_text
(_) @markup.link @nospell))
(glossary_entry_reference
command: _ @function.macro
name: (curly_group_text (_) @text.reference))
command: _ @function.macro
name: (curly_group_text
(_) @markup.link))
(acronym_definition
command: _ @function.macro
name: (curly_group_text (_) @text.reference))
command: _ @function.macro @nospell
name: (curly_group_text
(_) @markup.link @nospell))
(acronym_reference
command: _ @function.macro
name: (curly_group_text (_) @text.reference))
command: _ @function.macro
name: (curly_group_text
(_) @markup.link))
(color_definition
command: _ @function.macro
name: (curly_group_text (_) @text.reference))
(color_reference
command: _ @function.macro
name: (curly_group_text (_) @text.reference))
;; Math
[
(displayed_equation)
(inline_formula)
] @text.math
(math_environment
(begin
command: _ @text.math
name: (curly_group_text (text) @text.math)))
(math_environment
(text) @text.math)
command: _ @function.macro
name: (curly_group_text
(_) @markup.link))
(math_environment
(end
command: _ @text.math
name: (curly_group_text (text) @text.math)))
(color_reference
command: _ @function.macro
name: (curly_group_text
(_) @markup.link)?)
;; Sectioning
; Sectioning
(title_declaration
command: _ @namespace
options: (brack_group (_) @text.title)?
text: (curly_group (_) @text.title))
command: _ @module
options: (brack_group
(_) @markup.heading.1)?
text: (curly_group
(_) @markup.heading.1))
(author_declaration
command: _ @namespace
command: _ @module
authors: (curly_group_author_list
((author)+ @text.title)))
(author)+ @markup.heading.1))
(chapter
command: _ @namespace
toc: (brack_group (_) @text.title)?
text: (curly_group (_) @text.title))
command: _ @module
toc: (brack_group
(_) @markup.heading.2)?
text: (curly_group
(_) @markup.heading.2))
(part
command: _ @namespace
toc: (brack_group (_) @text.title)?
text: (curly_group (_) @text.title))
command: _ @module
toc: (brack_group
(_) @markup.heading.2)?
text: (curly_group
(_) @markup.heading.2))
(section
command: _ @namespace
toc: (brack_group (_) @text.title)?
text: (curly_group (_) @text.title))
command: _ @module
toc: (brack_group
(_) @markup.heading.3)?
text: (curly_group
(_) @markup.heading.3))
(subsection
command: _ @namespace
toc: (brack_group (_) @text.title)?
text: (curly_group (_) @text.title))
command: _ @module
toc: (brack_group
(_) @markup.heading.4)?
text: (curly_group
(_) @markup.heading.4))
(subsubsection
command: _ @namespace
toc: (brack_group (_) @text.title)?
text: (curly_group (_) @text.title))
command: _ @module
toc: (brack_group
(_) @markup.heading.5)?
text: (curly_group
(_) @markup.heading.5))
(paragraph
command: _ @namespace
toc: (brack_group (_) @text.title)?
text: (curly_group (_) @text.title))
command: _ @module
toc: (brack_group
(_) @markup.heading.6)?
text: (curly_group
(_) @markup.heading.6))
(subparagraph
command: _ @namespace
toc: (brack_group (_) @text.title)?
text: (curly_group (_) @text.title))
command: _ @module
toc: (brack_group
(_) @markup.heading.6)?
text: (curly_group
(_) @markup.heading.6))
;; Beamer frames
; Beamer frames
(generic_environment
(begin
name: (curly_group_text
(text) @text.environment.name)
(#any-of? @text.environment.name "frame"))
(text) @label)
(#any-of? @label "frame"))
.
(curly_group (_) @text.title))
(curly_group
(_) @markup.heading))
((generic_command
command: (command_name) @_name
arg: (curly_group
(text) @text.title))
(#eq? @_name "\\frametitle"))
(_) @markup.heading))
(#eq? @_name "\\frametitle"))
;; Formatting
((generic_command
command: (command_name) @_name
arg: (curly_group (_) @text.emphasis))
(#eq? @_name "\\emph"))
arg: (curly_group
(_) @markup.italic))
(#any-of? @_name "\\emph" "\\textit" "\\mathit"))
((generic_command
command: (command_name) @_name
arg: (curly_group (_) @text.emphasis))
(#match? @_name "^(\\\\textit|\\\\mathit)$"))
arg: (curly_group
(_) @markup.strong))
(#any-of? @_name "\\textbf" "\\mathbf"))
((generic_command
command: (command_name) @_name
arg: (curly_group (_) @text.strong))
(#match? @_name "^(\\\\textbf|\\\\mathbf)$"))
(generic_command
(command_name) @keyword.conditional
(#lua-match? @keyword.conditional "^\\if[a-zA-Z@]+$"))
((generic_command
command: (command_name) @_name
.
arg: (curly_group (_) @text.uri))
(#match? @_name "^(\\\\url|\\\\href)$"))
(generic_command
(command_name) @keyword.conditional
(#any-of? @keyword.conditional "\\fi" "\\else"))
;; File inclusion commands
; File inclusion commands
(class_include
command: _ @include
command: _ @keyword.import
path: (curly_group_path) @string)
(package_include
command: _ @include
command: _ @keyword.import
paths: (curly_group_path_list) @string)
(latex_include
command: _ @include
path: (curly_group_path) @string)
command: _ @keyword.import
path: (curly_group_path) @string.special.path)
(verbatim_include
command: _ @keyword.import
path: (curly_group_path) @string.special.path)
(import_include
command: _ @include
directory: (curly_group_path) @string
file: (curly_group_path) @string)
command: _ @keyword.import
directory: (curly_group_path) @string.special.path
file: (curly_group_path) @string.special.path)
(bibtex_include
command: _ @include
(bibstyle_include
command: _ @keyword.import
path: (curly_group_path) @string)
(bibtex_include
command: _ @keyword.import
paths: (curly_group_path_list) @string.special.path)
(biblatex_include
"\\addbibresource" @include
glob: (curly_group_glob_pattern) @string.regex)
"\\addbibresource" @keyword.import
glob: (curly_group_glob_pattern) @string.regexp)
(graphics_include
command: _ @include
path: (curly_group_path) @string)
command: _ @keyword.import
path: (curly_group_path) @string.special.path)
(svg_include
command: _ @keyword.import
path: (curly_group_path) @string.special.path)
(inkscape_include
command: _ @keyword.import
path: (curly_group_path) @string.special.path)
(tikz_library_import
command: _ @include
command: _ @keyword.import
paths: (curly_group_path_list) @string)
(text) @spell
(inline_formula) @nospell
(displayed_equation) @nospell
(key_value_pair) @nospell
(generic_environment
begin: _ @nospell
end: _ @nospell)
(citation
keys: _ @nospell)
(command_name) @nospell
; Turn spelling off for whole nodes
[
(label_reference)
(label_reference_range)
(label_number)
(glossary_entry_reference)
(acronym_reference)
(color_definition)
(color_reference)
(class_include)
(package_include)
(latex_include)
(verbatim_include)
(import_include)
(bibstyle_include)
(bibtex_include)
(biblatex_include)
(graphics_include)
(svg_include)
(inkscape_include)
(tikz_library_import)
] @nospell
; Math
[
(displayed_equation)
(inline_formula)
] @markup.math @nospell
(math_environment
(_) @markup.math)
; Comments
[
(line_comment)
(block_comment)
(comment_environment)
] @comment @spell
((line_comment) @keyword.directive @nospell
(#lua-match? @keyword.directive "^%% !TeX"))
((line_comment) @keyword.directive @nospell
(#lua-match? @keyword.directive "^%%&"))

@ -50,16 +50,5 @@
"prettier": "^3.0.3",
"tree-sitter-cli": "^0.24.1",
"prebuildify": "^6.0.0"
},
"tree-sitter": [
{
"scope": "source.tex",
"file-types": [
"tex",
"sty",
"cls",
"aux"
]
}
]
}
}

@ -1,4 +1,5 @@
{
"$schema": "https://tree-sitter.github.io/tree-sitter/assets/schemas/grammar.schema.json",
"name": "latex",
"word": "command_name",
"rules": {

@ -6624,6 +6624,7 @@
{
"type": "source_file",
"named": true,
"root": true,
"fields": {},
"children": {
"multiple": true,

@ -0,0 +1,38 @@
{
"grammars": [
{
"name": "@pfoerster/latex",
"camelcase": "PfoersterLatex",
"scope": "source.tex",
"path": ".",
"file-types": [
"tex",
"sty",
"cls",
"aux"
]
}
],
"metadata": {
"version": "0.4.0",
"license": "MIT",
"description": "LaTeX grammar for the tree-sitter parsing library",
"authors": [
{
"name": "Patrick Förster",
"email": "patrick.foerster@outlook.de"
}
],
"links": {
"repository": "git+https://github.com/latex-lsp/tree-sitter-latex.git"
}
},
"bindings": {
"c": true,
"go": true,
"node": true,
"python": true,
"rust": true,
"swift": true
}
}