diff --git a/Cargo.lock b/Cargo.lock index 1c32895..d32438a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -433,6 +433,7 @@ dependencies = [ "tree-sitter-r", "tree-sitter-ruby", "tree-sitter-rust", + "tree-sitter-svelte-ng", "tree-sitter-swift", "tree-sitter-toml-ng", "tree-sitter-typescript", @@ -3092,6 +3093,16 @@ dependencies = [ "tree-sitter-language", ] +[[package]] +name = "tree-sitter-svelte-ng" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef0a71f9cf5e94373cc86c64893630c8a29bb25d3390a248268d08af2165fa37" +dependencies = [ + "cc", + "tree-sitter-language", +] + [[package]] name = "tree-sitter-swift" version = "0.7.1" diff --git a/Cargo.toml b/Cargo.toml index 1e33f56..7ae4ad1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -64,6 +64,7 @@ tree-sitter-python = "<0.26.0" tree-sitter-r = "1.1.0" tree-sitter-ruby = "0.23.1" tree-sitter-rust = "<0.25.0" +tree-sitter-svelte-ng = "1.0.2" tree-sitter-swift = "<0.8.0" tree-sitter-toml-ng = "<0.8.0" tree-sitter-typescript = "0.23.2" diff --git a/README.md b/README.md index 074e96f..bb08a76 100644 --- a/README.md +++ b/README.md @@ -153,6 +153,7 @@ Codebook is in active development. As better dictionaries are added, words that | Python | ✅ | | Ruby | ✅ | | Rust | ✅ | +| Svelte | ⚠️ | | Swift | ⚠️ | | TOML | ✅ | | TypeScript | ✅ | diff --git a/crates/codebook/Cargo.toml b/crates/codebook/Cargo.toml index 74270ae..64f0978 100644 --- a/crates/codebook/Cargo.toml +++ b/crates/codebook/Cargo.toml @@ -52,6 +52,7 @@ tree-sitter-rust.workspace = true tree-sitter-swift.workspace = true tree-sitter-toml-ng.workspace = true tree-sitter-typescript.workspace = true +tree-sitter-svelte-ng.workspace = true tree-sitter-vhdl.workspace = true codebook-tree-sitter-typst.workspace = true tree-sitter-yaml.workspace = true diff --git a/crates/codebook/src/dictionaries/repo.rs b/crates/codebook/src/dictionaries/repo.rs index efa45d5..3a22930 100644 --- a/crates/codebook/src/dictionaries/repo.rs +++ b/crates/codebook/src/dictionaries/repo.rs @@ -175,6 +175,10 @@ static TEXT_DICTIONARIES: LazyLock> = LazyLock::new(|| { "csharp", "https://raw.githubusercontent.com/streetsidesoftware/cspell-dicts/refs/heads/main/dictionaries/csharp/csharp.txt", ), + TextRepo::new( + "svelte", + "https://raw.githubusercontent.com/streetsidesoftware/cspell-dicts/refs/heads/main/dictionaries/svelte/src/svelte.txt", + ), ] }); diff --git a/crates/codebook/src/queries.rs b/crates/codebook/src/queries.rs index 02b11e0..357c359 100644 --- a/crates/codebook/src/queries.rs +++ b/crates/codebook/src/queries.rs @@ -25,6 +25,7 @@ pub enum LanguageType { R, Ruby, Rust, + Svelte, Swift, TOML, Text, @@ -177,6 +178,13 @@ pub static LANGUAGE_SETTINGS: &[LanguageSetting] = &[ query: include_str!("queries/go.scm"), extensions: &["go"], }, + LanguageSetting { + type_: LanguageType::Svelte, + ids: &["svelte"], + dictionary_ids: &["svelte"], + query: include_str!("queries/svelte.scm"), + extensions: &["svelte"], + }, LanguageSetting { type_: LanguageType::Swift, ids: &["swift"], @@ -319,6 +327,7 @@ impl LanguageSetting { LanguageType::R => Some(tree_sitter_r::LANGUAGE.into()), LanguageType::Ruby => Some(tree_sitter_ruby::LANGUAGE.into()), LanguageType::Rust => Some(tree_sitter_rust::LANGUAGE.into()), + LanguageType::Svelte => Some(tree_sitter_svelte_ng::LANGUAGE.into()), LanguageType::Swift => Some(tree_sitter_swift::LANGUAGE.into()), LanguageType::TOML => Some(tree_sitter_toml_ng::LANGUAGE.into()), LanguageType::Text => None, diff --git a/crates/codebook/src/queries/svelte.scm b/crates/codebook/src/queries/svelte.scm new file mode 100644 index 0000000..50d64ed --- /dev/null +++ b/crates/codebook/src/queries/svelte.scm @@ -0,0 +1,17 @@ +; HTML comments +(comment) @comment + +; Visible text nodes between HTML tags +(text) @string + +; Quoted attribute values — e.g. alt="descriptoin", title="Wellcome" +(quoted_attribute_value) @string + +; JavaScript / TypeScript inside "#; + + let processor = utils::get_processor(); + let misspelled = processor + .spell_check(sample_text, Some(LanguageType::Svelte), None) + .to_vec(); + println!("Misspelled: {misspelled:#?}"); + + assert_eq!(misspelled.len(), 5); + assert!(misspelled.iter().any(|w| w.word == "mesage")); + assert!(misspelled.iter().any(|w| w.word == "Helo")); + assert!(misspelled.iter().any(|w| w.word == "Wrold")); + assert!(misspelled.iter().any(|w| w.word == "naeme")); + assert!(misspelled.iter().any(|w| w.word == "Welcom")); +} + +#[test] +fn test_svelte_style() { + utils::init_logging(); + let sample_text = r#" + "#; + + let processor = utils::get_processor(); + let misspelled = processor + .spell_check(sample_text, Some(LanguageType::Svelte), None) + .to_vec(); + println!("Misspelled: {misspelled:#?}"); + + assert_eq!(misspelled.len(), 3); + assert!(misspelled.iter().any(|w| w.word == "backgrond")); + assert!(misspelled.iter().any(|w| w.word == "wieght")); + assert!(misspelled.iter().any(|w| w.word == "bordre")); +}