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. ;; 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 ; General syntax
(ERROR) @error (command_name) @function @nospell
(command_name) @function
(caption (caption
command: _ @function) 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_value_pair
key: (_) @parameter key: (_) @variable.parameter @nospell
value: (_)) value: (_))
[ (curly_group_spec
(line_comment) (text) @variable.parameter)
(block_comment)
(comment_environment)
] @comment
((line_comment) @preproc (brack_group_argc) @variable.parameter
(#lua-match? @preproc "^%% !TeX"))
[ [
(brack_group) (operator)
(brack_group_argc) "="
] @parameter "_"
"^"
[(operator) "="] @operator ] @operator
"\\item" @punctuation.special "\\item" @punctuation.special
((word) @punctuation.delimiter (delimiter) @punctuation.delimiter
(#eq? @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 (begin
command: _ @text.environment command: _ @module
name: (curly_group_text (text) @text.environment.name)) name: (curly_group_text
(text) @label @nospell))
(end (end
command: _ @text.environment command: _ @module
name: (curly_group_text (text) @text.environment.name)) name: (curly_group_text
(text) @label @nospell))
;; Definitions and references ; Definitions and references
(new_command_definition (new_command_definition
command: _ @function.macro command: _ @function.macro @nospell)
declaration: (curly_group_command_name (_) @function))
(old_command_definition (old_command_definition
command: _ @function.macro command: _ @function.macro @nospell)
declaration: (_) @function)
(let_command_definition (let_command_definition
command: _ @function.macro command: _ @function.macro @nospell)
declaration: (_) @function)
(environment_definition (environment_definition
command: _ @function.macro command: _ @function.macro @nospell
name: (curly_group_text (_) @text.reference)) name: (curly_group_text
(_) @label @nospell))
(theorem_definition (theorem_definition
command: _ @function.macro command: _ @function.macro @nospell
name: (curly_group_text (_) @text.environment.name)) name: (curly_group_text_list
(_) @label @nospell))
(paired_delimiter_definition (paired_delimiter_definition
command: _ @function.macro command: _ @function.macro @nospell
declaration: (curly_group_command_name (_) @function)) declaration: (curly_group_command_name
(_) @function))
(label_definition (label_definition
command: _ @function.macro command: _ @function.macro
name: (curly_group_text (_) @text.reference)) name: (curly_group_text
(_) @markup.link @nospell))
(label_reference_range (label_reference_range
command: _ @function.macro command: _ @function.macro
from: (curly_group_text (_) @text.reference) from: (curly_group_text
to: (curly_group_text (_) @text.reference)) (_) @markup.link)
to: (curly_group_text
(_) @markup.link))
(label_reference (label_reference
command: _ @function.macro command: _ @function.macro
names: (curly_group_text_list (_) @text.reference)) names: (curly_group_text_list
(_) @markup.link))
(label_number (label_number
command: _ @function.macro command: _ @function.macro
name: (curly_group_text (_) @text.reference) name: (curly_group_text
number: (_) @text.reference) (_) @markup.link)
number: (_) @markup.link)
(citation (citation
command: _ @function.macro command: _ @function.macro @nospell
keys: (curly_group_text_list) @text.reference) keys: (curly_group_text_list) @markup.link @nospell)
((hyperlink
command: _ @function @nospell
uri: (curly_group_uri
(_) @markup.link.url @nospell)) @_hyperlink)
(glossary_entry_definition (glossary_entry_definition
command: _ @function.macro command: _ @function.macro @nospell
name: (curly_group_text (_) @text.reference)) name: (curly_group_text
(_) @markup.link @nospell))
(glossary_entry_reference (glossary_entry_reference
command: _ @function.macro command: _ @function.macro
name: (curly_group_text (_) @text.reference)) name: (curly_group_text
(_) @markup.link))
(acronym_definition (acronym_definition
command: _ @function.macro command: _ @function.macro @nospell
name: (curly_group_text (_) @text.reference)) name: (curly_group_text
(_) @markup.link @nospell))
(acronym_reference (acronym_reference
command: _ @function.macro command: _ @function.macro
name: (curly_group_text (_) @text.reference)) name: (curly_group_text
(_) @markup.link))
(color_definition (color_definition
command: _ @function.macro command: _ @function.macro
name: (curly_group_text (_) @text.reference)) name: (curly_group_text
(color_reference (_) @markup.link))
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)
(math_environment (color_reference
(end command: _ @function.macro
command: _ @text.math name: (curly_group_text
name: (curly_group_text (text) @text.math))) (_) @markup.link)?)
;; Sectioning ; Sectioning
(title_declaration (title_declaration
command: _ @namespace command: _ @module
options: (brack_group (_) @text.title)? options: (brack_group
text: (curly_group (_) @text.title)) (_) @markup.heading.1)?
text: (curly_group
(_) @markup.heading.1))
(author_declaration (author_declaration
command: _ @namespace command: _ @module
authors: (curly_group_author_list authors: (curly_group_author_list
((author)+ @text.title))) (author)+ @markup.heading.1))
(chapter (chapter
command: _ @namespace command: _ @module
toc: (brack_group (_) @text.title)? toc: (brack_group
text: (curly_group (_) @text.title)) (_) @markup.heading.2)?
text: (curly_group
(_) @markup.heading.2))
(part (part
command: _ @namespace command: _ @module
toc: (brack_group (_) @text.title)? toc: (brack_group
text: (curly_group (_) @text.title)) (_) @markup.heading.2)?
text: (curly_group
(_) @markup.heading.2))
(section (section
command: _ @namespace command: _ @module
toc: (brack_group (_) @text.title)? toc: (brack_group
text: (curly_group (_) @text.title)) (_) @markup.heading.3)?
text: (curly_group
(_) @markup.heading.3))
(subsection (subsection
command: _ @namespace command: _ @module
toc: (brack_group (_) @text.title)? toc: (brack_group
text: (curly_group (_) @text.title)) (_) @markup.heading.4)?
text: (curly_group
(_) @markup.heading.4))
(subsubsection (subsubsection
command: _ @namespace command: _ @module
toc: (brack_group (_) @text.title)? toc: (brack_group
text: (curly_group (_) @text.title)) (_) @markup.heading.5)?
text: (curly_group
(_) @markup.heading.5))
(paragraph (paragraph
command: _ @namespace command: _ @module
toc: (brack_group (_) @text.title)? toc: (brack_group
text: (curly_group (_) @text.title)) (_) @markup.heading.6)?
text: (curly_group
(_) @markup.heading.6))
(subparagraph (subparagraph
command: _ @namespace command: _ @module
toc: (brack_group (_) @text.title)? toc: (brack_group
text: (curly_group (_) @text.title)) (_) @markup.heading.6)?
text: (curly_group
(_) @markup.heading.6))
;; Beamer frames ; Beamer frames
(generic_environment (generic_environment
(begin (begin
name: (curly_group_text name: (curly_group_text
(text) @text.environment.name) (text) @label)
(#any-of? @text.environment.name "frame")) (#any-of? @label "frame"))
. .
(curly_group (_) @text.title)) (curly_group
(_) @markup.heading))
((generic_command ((generic_command
command: (command_name) @_name command: (command_name) @_name
arg: (curly_group arg: (curly_group
(text) @text.title)) (_) @markup.heading))
(#eq? @_name "\\frametitle")) (#eq? @_name "\\frametitle"))
;; Formatting
((generic_command ((generic_command
command: (command_name) @_name command: (command_name) @_name
arg: (curly_group (_) @text.emphasis)) arg: (curly_group
(#eq? @_name "\\emph")) (_) @markup.italic))
(#any-of? @_name "\\emph" "\\textit" "\\mathit"))
((generic_command ((generic_command
command: (command_name) @_name command: (command_name) @_name
arg: (curly_group (_) @text.emphasis)) arg: (curly_group
(#match? @_name "^(\\\\textit|\\\\mathit)$")) (_) @markup.strong))
(#any-of? @_name "\\textbf" "\\mathbf"))
((generic_command (generic_command
command: (command_name) @_name (command_name) @keyword.conditional
arg: (curly_group (_) @text.strong)) (#lua-match? @keyword.conditional "^\\if[a-zA-Z@]+$"))
(#match? @_name "^(\\\\textbf|\\\\mathbf)$"))
((generic_command (generic_command
command: (command_name) @_name (command_name) @keyword.conditional
. (#any-of? @keyword.conditional "\\fi" "\\else"))
arg: (curly_group (_) @text.uri))
(#match? @_name "^(\\\\url|\\\\href)$"))
;; File inclusion commands ; File inclusion commands
(class_include (class_include
command: _ @include command: _ @keyword.import
path: (curly_group_path) @string) path: (curly_group_path) @string)
(package_include (package_include
command: _ @include command: _ @keyword.import
paths: (curly_group_path_list) @string) paths: (curly_group_path_list) @string)
(latex_include (latex_include
command: _ @include command: _ @keyword.import
path: (curly_group_path) @string) path: (curly_group_path) @string.special.path)
(verbatim_include
command: _ @keyword.import
path: (curly_group_path) @string.special.path)
(import_include (import_include
command: _ @include command: _ @keyword.import
directory: (curly_group_path) @string directory: (curly_group_path) @string.special.path
file: (curly_group_path) @string) file: (curly_group_path) @string.special.path)
(bibtex_include (bibstyle_include
command: _ @include command: _ @keyword.import
path: (curly_group_path) @string) path: (curly_group_path) @string)
(bibtex_include
command: _ @keyword.import
paths: (curly_group_path_list) @string.special.path)
(biblatex_include (biblatex_include
"\\addbibresource" @include "\\addbibresource" @keyword.import
glob: (curly_group_glob_pattern) @string.regex) glob: (curly_group_glob_pattern) @string.regexp)
(graphics_include (graphics_include
command: _ @include command: _ @keyword.import
path: (curly_group_path) @string) 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 (tikz_library_import
command: _ @include command: _ @keyword.import
paths: (curly_group_path_list) @string) paths: (curly_group_path_list) @string)
(text) @spell ; Turn spelling off for whole nodes
(inline_formula) @nospell [
(displayed_equation) @nospell (label_reference)
(key_value_pair) @nospell (label_reference_range)
(generic_environment (label_number)
begin: _ @nospell (glossary_entry_reference)
end: _ @nospell) (acronym_reference)
(citation (color_definition)
keys: _ @nospell) (color_reference)
(command_name) @nospell (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", "prettier": "^3.0.3",
"tree-sitter-cli": "^0.24.1", "tree-sitter-cli": "^0.24.1",
"prebuildify": "^6.0.0" "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", "name": "latex",
"word": "command_name", "word": "command_name",
"rules": { "rules": {

@ -6624,6 +6624,7 @@
{ {
"type": "source_file", "type": "source_file",
"named": true, "named": true,
"root": true,
"fields": {}, "fields": {},
"children": { "children": {
"multiple": true, "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
}
}