summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2024-09-25 02:00:16 +0100
committerGitHub <noreply@github.com>2024-09-25 01:00:16 +0000
commit6c26c1ed96da2fc869bddbfdbdc833f176f3f736 (patch)
treecbc917e8451d2c8510c913e0d52262a838d19498
parentc4f7b2ac0095293d01b77c0ad15aaeaf148e1845 (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.rs35
-rw-r--r--tests/specs/fmt/html/__test__.jsonc4
-rw-r--r--tests/specs/fmt/html/broken.html2
-rw-r--r--tests/specs/fmt/html/broken.out4
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