Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@

All notable changes to the Path Server will be documented in this file.

## Unreleased

### Added
- **Core**: Added MDX language support. ([#43](https://github.com/kunlinglio/path-server/pull/43))

## [1.3.1] - 2026-05-29
Path Server is now published to Zed extensions! You can now install it via `zed: install extension`.

Expand Down
1 change: 1 addition & 0 deletions extensions/zed/extension.toml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ languages = [
"Luau",
"Makefile",
"Markdown",
"MDX",
"Nim",
"Nix",
"OCaml",
Expand Down
1 change: 1 addition & 0 deletions src/document/language.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ pub enum Language {
luau,
makefile,
markdown,
mdx,
nim,
nix,
ocaml,
Expand Down
66 changes: 49 additions & 17 deletions src/parser/tree_sitter/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ pub mod ts_languages {
Language::typescript => Some(get_ts_language()),
Language::python => Some(get_python_language()),
Language::rust => Some(get_rust_language()),
Language::markdown => Some(get_md_language()),
Language::markdown | Language::mdx => Some(get_md_language()),
Language::html => Some(get_html_language()),
Language::c => Some(get_c_language()),
Language::c_plus_plus => Some(get_cpp_language()),
Expand Down Expand Up @@ -170,7 +170,9 @@ pub fn extract_strings(document: &Document) -> PathServerResult<Option<Vec<PathC
};

let candidates = match document.language {
Language::markdown => ts_markdown::extract_strings(&document.text, &tree.root_node())?,
Language::markdown | Language::mdx => {
ts_markdown::extract_strings(&document.text, &tree.root_node())?
}
Language::html => {
ts_html::extract_strings(&document.text, &tree.root_node(), &document.language)
}
Expand Down Expand Up @@ -221,22 +223,23 @@ mod tests {
is_last: bool,
language: &Language,
) {
let inline_tree = if language == &Language::markdown && node.kind() == "inline" {
let mut inline_parser = tree_sitter::Parser::new();
inline_parser
.set_language(&ts_languages::get_md_inline_language())
.expect("failed to set inline language");
inline_parser
.set_included_ranges(&vec![node.range()])
.expect("failed to set included ranges");
Some(
let inline_tree =
if matches!(language, Language::markdown | Language::mdx) && node.kind() == "inline" {
let mut inline_parser = tree_sitter::Parser::new();
inline_parser
.parse(source, None)
.expect("failed to parse inline source"),
)
} else {
None
};
.set_language(&ts_languages::get_md_inline_language())
.expect("failed to set inline language");
inline_parser
.set_included_ranges(&vec![node.range()])
.expect("failed to set included ranges");
Some(
inline_parser
.parse(source, None)
.expect("failed to parse inline source"),
)
} else {
None
};
let node = if let Some(inline_tree) = &inline_tree {
&inline_tree.root_node()
} else {
Expand Down Expand Up @@ -490,6 +493,35 @@ Project Timer is a lightweight VS Code extension that tracks the time you spend
);
}

#[test]
fn test_mdx_extract_strings_with_markdown_parser() {
let mdx = r#"
import Demo from './components/Demo'

![Hero](./public/hero.png)

<Demo image="./assets/demo.png" />
"#;

assert!(tree_sitter_supported("mdx"));

let doc = Document::new(mdx.to_string(), "mdx").expect("failed to create MDX document");
let res = extract_strings(&doc).unwrap().unwrap();
eprintln!("{:?}", res);
assert!(
res.iter().any(|c| c.content == "./components/Demo"),
"missing path in MDX import"
);
assert!(
res.iter().any(|c| c.content == "./public/hero.png"),
"missing path in MDX markdown link"
);
assert!(
res.iter().any(|c| c.content == "./assets/demo.png"),
"missing path in MDX JSX attribute"
);
}

#[test]
fn test_html_extract_string() {
let simple = r#" <script src="echarts.min.js"></script>"#;
Expand Down
Loading