diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2024-09-25 02:00:16 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-25 01:00:16 +0000 |
commit | 6c26c1ed96da2fc869bddbfdbdc833f176f3f736 (patch) | |
tree | cbc917e8451d2c8510c913e0d52262a838d19498 | |
parent | c4f7b2ac0095293d01b77c0ad15aaeaf148e1845 (diff) |
feat(fmt): better error on malfored HTML files (#25853)
Improves syntax errors for HTML formatter.
`broken.html`
```html
<div class=container > content
```
```
$ deno fmt broken.html
Error formatting: /Users/ib/dev/deno/tests/specs/fmt/html/broken.html
syntax error 'expect close tag' at line 3, column 0
Checked 1 file
```
```
$ ./target/debug/deno fmt broken.html
Error formatting: /Users/ib/dev/deno/tests/specs/fmt/html/broken.html
Syntax error (expect close tag) at file:///Users/ib/dev/deno/tests/specs/fmt/html/broken.html:3:0
Checked 1 file
```
-rw-r--r-- | cli/tools/fmt.rs | 35 | ||||
-rw-r--r-- | tests/specs/fmt/html/__test__.jsonc | 4 | ||||
-rw-r--r-- | tests/specs/fmt/html/broken.html | 2 | ||||
-rw-r--r-- | tests/specs/fmt/html/broken.out | 4 |
4 files changed, 44 insertions, 1 deletions
diff --git a/cli/tools/fmt.rs b/cli/tools/fmt.rs index 7a3c0de4b..a7f4fd554 100644 --- a/cli/tools/fmt.rs +++ b/cli/tools/fmt.rs @@ -33,6 +33,7 @@ use deno_core::error::AnyError; use deno_core::futures; use deno_core::parking_lot::Mutex; use deno_core::unsync::spawn_blocking; +use deno_core::url::Url; use log::debug; use log::info; use log::warn; @@ -435,7 +436,39 @@ pub fn format_html( }, ) .map_err(|error| match error { - markup_fmt::FormatError::Syntax(error) => AnyError::from(error), + markup_fmt::FormatError::Syntax(error) => { + // TODO(bartlomieju): rework when better error support in `markup_fmt` lands + fn inner( + error: &markup_fmt::SyntaxError, + file_path: &Path, + ) -> Option<String> { + let error_str = format!("{}", error); + let error_str = error_str.strip_prefix("syntax error '")?; + + let reason = error_str + .split("' at") + .collect::<Vec<_>>() + .first() + .map(|s| s.to_string())?; + + let url = Url::from_file_path(file_path).ok()?; + + let error_msg = format!( + "Syntax error ({}) at {}:{}:{}\n", + reason, + url.as_str(), + error.line, + error.column + ); + Some(error_msg) + } + + if let Some(error_msg) = inner(&error, file_path) { + AnyError::from(generic_error(error_msg)) + } else { + AnyError::from(error) + } + } markup_fmt::FormatError::External(errors) => { let last = errors.len() - 1; AnyError::msg( diff --git a/tests/specs/fmt/html/__test__.jsonc b/tests/specs/fmt/html/__test__.jsonc index 7f3169423..2e6d08d4c 100644 --- a/tests/specs/fmt/html/__test__.jsonc +++ b/tests/specs/fmt/html/__test__.jsonc @@ -8,6 +8,10 @@ "well_formatted": { "args": "fmt --check well_formatted.html", "output": "Checked 1 file\n" + }, + "broken": { + "args": "fmt broken.html", + "output": "broken.out" } } } diff --git a/tests/specs/fmt/html/broken.html b/tests/specs/fmt/html/broken.html new file mode 100644 index 000000000..a579b7872 --- /dev/null +++ b/tests/specs/fmt/html/broken.html @@ -0,0 +1,2 @@ +<div class=container > content + diff --git a/tests/specs/fmt/html/broken.out b/tests/specs/fmt/html/broken.out new file mode 100644 index 000000000..c2815552e --- /dev/null +++ b/tests/specs/fmt/html/broken.out @@ -0,0 +1,4 @@ +Error formatting: [WILDCARD]broken.html + Syntax error (expect close tag) at file://[WILDCARD]broken.html:3:0 + +Checked 1 file |