feat: tumblr grammar with highlights, injections, and tests

This commit is contained in:
2026-05-17 05:50:17 +02:00
parent 1596154284
commit c61fa5c53b
11 changed files with 1950 additions and 55 deletions
+264 -9
View File
@@ -2,17 +2,272 @@
"$schema": "https://tree-sitter.github.io/tree-sitter/assets/schemas/grammar.schema.json",
"name": "tumblr",
"rules": {
"source_file": {
"type": "STRING",
"value": "hello"
"template": {
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "_node"
}
},
"_node": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "content"
},
{
"type": "SYMBOL",
"name": "block_open"
},
{
"type": "SYMBOL",
"name": "block_close"
},
{
"type": "SYMBOL",
"name": "lang_tag"
},
{
"type": "SYMBOL",
"name": "variable"
}
]
},
"content": {
"type": "TOKEN",
"content": {
"type": "PREC",
"value": -1,
"content": {
"type": "PATTERN",
"value": "([^{]|\\{[^A-Za-z/])+"
}
}
},
"block_open": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_block_open_start"
},
{
"type": "SYMBOL",
"name": "block_name"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "attributes"
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "}"
}
]
},
"block_close": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_block_close_start"
},
{
"type": "SYMBOL",
"name": "block_name"
},
{
"type": "STRING",
"value": "}"
}
]
},
"lang_tag": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_lang_start"
},
{
"type": "SYMBOL",
"name": "lang_text"
},
{
"type": "STRING",
"value": "}"
}
]
},
"variable": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "{"
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "variable_name"
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "-"
},
{
"type": "SYMBOL",
"name": "variable_modifier"
}
]
},
{
"type": "BLANK"
}
]
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "variable_prefix"
},
{
"type": "STRING",
"value": ":"
},
{
"type": "SYMBOL",
"name": "prefix_argument"
}
]
}
]
},
{
"type": "STRING",
"value": "}"
}
]
},
"attributes": {
"type": "REPEAT1",
"content": {
"type": "SYMBOL",
"name": "attribute"
}
},
"attribute": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_space"
},
{
"type": "SYMBOL",
"name": "attribute_name"
},
{
"type": "STRING",
"value": "="
},
{
"type": "SYMBOL",
"name": "attribute_value"
}
]
},
"attribute_name": {
"type": "PATTERN",
"value": "[A-Za-z_][A-Za-z0-9_-]*"
},
"attribute_value": {
"type": "PATTERN",
"value": "\"[^\"]*\""
},
"block_name": {
"type": "PATTERN",
"value": "[A-Za-z][A-Za-z0-9_]*"
},
"variable_name": {
"type": "PATTERN",
"value": "[A-Z][A-Za-z0-9_]*"
},
"variable_modifier": {
"type": "PATTERN",
"value": "[A-Za-z0-9]+"
},
"variable_prefix": {
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "text"
},
{
"type": "STRING",
"value": "color"
},
{
"type": "STRING",
"value": "font"
},
{
"type": "STRING",
"value": "image"
}
]
},
"prefix_argument": {
"type": "PATTERN",
"value": "[A-Za-z][A-Za-z0-9 _-]*"
},
"lang_text": {
"type": "PATTERN",
"value": "[^}]+"
},
"_block_open_start": {
"type": "PATTERN",
"value": "\\{[Bb][Ll][Oo][Cc][Kk]:"
},
"_block_close_start": {
"type": "PATTERN",
"value": "\\{\\/[Bb][Ll][Oo][Cc][Kk]:"
},
"_lang_start": {
"type": "PATTERN",
"value": "\\{[Ll][Aa][Nn][Gg]:"
},
"_space": {
"type": "PATTERN",
"value": "[ \\t]+"
}
},
"extras": [
{
"type": "PATTERN",
"value": "\\s"
}
],
"extras": [],
"conflicts": [],
"precedences": [],
"externals": [],
+207 -2
View File
@@ -1,12 +1,217 @@
[
{
"type": "source_file",
"type": "attribute",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "attribute_name",
"named": true
},
{
"type": "attribute_value",
"named": true
}
]
}
},
{
"type": "attributes",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "attribute",
"named": true
}
]
}
},
{
"type": "block_close",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "block_name",
"named": true
}
]
}
},
{
"type": "block_open",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "attributes",
"named": true
},
{
"type": "block_name",
"named": true
}
]
}
},
{
"type": "lang_tag",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "lang_text",
"named": true
}
]
}
},
{
"type": "template",
"named": true,
"root": true,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "block_close",
"named": true
},
{
"type": "block_open",
"named": true
},
{
"type": "content",
"named": true
},
{
"type": "lang_tag",
"named": true
},
{
"type": "variable",
"named": true
}
]
}
},
{
"type": "variable",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "prefix_argument",
"named": true
},
{
"type": "variable_modifier",
"named": true
},
{
"type": "variable_name",
"named": true
},
{
"type": "variable_prefix",
"named": true
}
]
}
},
{
"type": "variable_prefix",
"named": true,
"fields": {}
},
{
"type": "hello",
"type": "-",
"named": false
},
{
"type": ":",
"named": false
},
{
"type": "=",
"named": false
},
{
"type": "attribute_name",
"named": true
},
{
"type": "attribute_value",
"named": true
},
{
"type": "block_name",
"named": true
},
{
"type": "color",
"named": false
},
{
"type": "content",
"named": true
},
{
"type": "font",
"named": false
},
{
"type": "image",
"named": false
},
{
"type": "lang_text",
"named": true
},
{
"type": "prefix_argument",
"named": true
},
{
"type": "text",
"named": false
},
{
"type": "variable_modifier",
"named": true
},
{
"type": "variable_name",
"named": true
},
{
"type": "{",
"named": false
},
{
"type": "}",
"named": false
}
]
Generated
+1002 -36
View File
File diff suppressed because it is too large Load Diff