#rstml #web-framework #incremental #syntax-highlighting #parser

tree-sitter-rstml

Rust + html 语法用于 tree-sitter 解析器库

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 文本编辑器

Download history 7/week @ 2024-04-15 18/week @ 2024-04-22 1/week @ 2024-04-29 2/week @ 2024-05-13 18/week @ 2024-05-20 21/week @ 2024-05-27 16/week @ 2024-06-03 10/week @ 2024-06-10 9/week @ 2024-06-17 19/week @ 2024-06-24 4/week @ 2024-07-01 6/week @ 2024-07-08 15/week @ 2024-07-15 112/week @ 2024-07-22 53/week @ 2024-07-29

每月下载量:190
femark 中使用

MIT 许可证

17MB
532K SLoC

C 531K SLoC // 0.0% comments Scheme 1K SLoC // 0.0% comments JavaScript 136 SLoC // 0.2% comments Rust 44 SLoC

tree-sitter-rstml

GitHub License GitHub last commit (branch) GitHub Tag NPM Version Crates.io Version docs.rs

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 高亮显示
before after

要使用 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
before after

Emacs 的支持由 rstml-ts-mode 包提供。

您可以在项目的 GitHub 上了解更多信息。

致谢

本项目扩展并高度依赖于 tree-sitter-rust 语法。没有它的 贡献者 以及那些为更广泛的 tree-sitter 生态系统做出贡献的人,这一切都是不可能的。

此外,本项目基于 rstml 库的工作。它最初是 syn-rsx 的分支,该分支的创建者不幸已经 去世

许可证

根据 MIT 许可证 许可。

版权 © 2024 Ryan Halliwell

依赖关系

~2.8–4MB
~72K SLoC