8 个版本 (4 个稳定版)
2.0.0 | 2024年7月28日 |
---|---|
1.2.0 | 2024年4月6日 |
1.0.0 | 2024年3月31日 |
0.3.0 | 2024年3月26日 |
0.0.1 | 2024年3月20日 |
#77 in 文本编辑器
每月下载量:190
在 femark 中使用
17MB
532K SLoC
tree-sitter-rstml
Rust + html 语法用于 tree-sitter 解析器库。
Rust 网络框架,如 Leptos,依赖于嵌入在 Rust 代码中的 JSX 风格模板,使用 rstml 库。此项目使这些模板可以用于各种目的,如文本编辑器的语法高亮。
用法
由于 rstml 不是一个独立的语言,因此定义了两种语法以方便使用
rstml |
rust_with_rstml |
|
---|---|---|
语言 | 此语法仅解析 rstml 模板,无需将其包裹在 view! 宏调用中。 |
此语法以正常方式解析整个 Rust 源文件,但将任何 view! 宏调用解析为 rstml 模板。 |
预期用途 | 此语法旨在 注入 到 tree-sitter-rust 语法中。此方法提供了最大的灵活性,允许用户配置哪些应被解释为 rstml 宏。 | 在不支持 tree-sitter 注入的情况下,此语法是最好的选择。用户无法配置宏调用的行为。 |
示例有效代码 |
<div>Hello, world</div>
|
view! {
<div>Hello, world</div>
}
|
解析器位置 | rstml/src |
rust_with_rstml/src |
Rust 绑定使用 |
显示代码let code = "<div>Hello, world</div>";
let mut parser = tree_sitter::Parser::new();
parser.set_language(tree_sitter_rstml::language_rstml()).expect("Error loading rstml grammar");
let tree = parser.parse(code, None).unwrap();
|
显示代码let code = r#"
view! {
<div>hello, world</div>
}
"#;
let mut parser = tree_sitter::Parser::new();
parser.set_language(tree_sitter_rstml::language_rust_with_rstml()).expect("Error loading rust_with_rstml grammar");
let tree = parser.parse(code, None).unwrap();
|
JavaScript 绑定使用 |
显示代码const Parser = require('tree-sitter')
const code = '<div>Hello, world</div>'
const parser = new Parser()
parser.setLanguage(require('tree-sitter-rstml').rstml)
const tree = parser.parse(code)
|
显示代码const Parser = require('tree-sitter')
const code = `
view! {
<div>Hello, world</div>
}
`
const parser = new Parser()
parser.setLanguage(require('tree-sitter-rstml').rust_with_rstml)
const tree = parser.parse(code)
|
编辑器支持
Neovim
Neovim 的 tree-sitter 集成 支持语法高亮、缩进和代码折叠。
没有 rstml 高亮显示 |
有 rstml 高亮显示 |
---|---|
要使用 Neovim 支持与 nvim-treesitter,你应该
- 确保
"nvim-treesitter/nvim-treesitter"
已安装并正确配置。 - 使用您首选的包管理器安装
"rayliwell/tree-sitter-rstml"
插件。 - 确保在每次加载
nvim-treesitter
后运行require("tree-sitter-rstml").setup()
。
以下是一个使用 lazy.nvim 的示例配置。
require("lazy").setup({
{
"nvim-treesitter/nvim-treesitter",
build = ":TSUpdate",
config = function ()
local configs = require("nvim-treesitter.configs")
configs.setup({
ensure_installed = { "c", "lua", "vim", "vimdoc", "query", "rust" },
sync_install = false,
highlight = { enable = true },
indent = { enable = true },
})
end
},
{
"rayliwell/tree-sitter-rstml",
dependencies = { "nvim-treesitter" },
build = ":TSUpdate",
config = function ()
require("tree-sitter-rstml").setup()
end
},
-- Experimental automatic tag closing and renaming (optional)
{
"rayliwell/nvim-ts-autotag",
config = function()
require("nvim-ts-autotag").setup()
end,
},
})
[!NOTE] Neovim 的支持旨在与最新版本的 Neovim 和
nvim-treesitter
一起工作。如果您使用的是 Neovim 发行版,例如 LunarVim,则不支持保证。
NixVim(高级)
要使用与 flakes 的 NixVim 集成,您应该
- 将
github:rayliwell/tree-sitter-rstml
添加为 flake 输入。 - 在您的 NixVim 配置中导入
inputs.tree-sitter-rstml.nixvimModule
。
例如
{
description = "NixVim configuration with tree-sitter-rstml.";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
nixvim.url = "github:nix-community/nixvim";
tree-sitter-rstml.url = "github:rayliwell/tree-sitter-rstml/flake";
};
outputs =
{
system,
nixpkgs,
nixvim,
tree-sitter-rstml,
...
}:
let
forAllSystems =
function:
nixpkgs.lib.genAttrs [
"aarch64-darwin"
"aarch64-linux"
"x86_64-darwin"
"x86_64-linux"
] (system: function nixpkgs.legacyPackages.${system});
in
{
packages = forAllSystems (pkgs: {
default = nixvim.legacyPackages.${system}.makeNixvimWithModule {
inherit pkgs;
module = {
imports = [ tree-sitter-rstml.nixvimModule ];
};
};
});
};
}
Emacs
Emacs(29.1+)的 tree-sitter 集成 支持语法高亮和缩进。
在之前(rust-ts-mode ) |
之后(rstml-ts-mode ) |
---|---|
Emacs 的支持由 rstml-ts-mode
包提供。
您可以在项目的 GitHub 上了解更多信息。
致谢
本项目扩展并高度依赖于 tree-sitter-rust 语法。没有它的 贡献者 以及那些为更广泛的 tree-sitter 生态系统做出贡献的人,这一切都是不可能的。
此外,本项目基于 rstml 库的工作。它最初是 syn-rsx 的分支,该分支的创建者不幸已经 去世。
许可证
根据 MIT 许可证 许可。
版权 © 2024 Ryan Halliwell
依赖关系
~2.8–4MB
~72K SLoC