` tag.");
+make_tag!(Alert);
#[cfg(test)]
mod test {
diff --git a/tasks/website/src/linter/rules/mod.rs b/tasks/website/src/linter/rules/mod.rs
index 88cafd8dfd6eb..01b7926c0fc74 100644
--- a/tasks/website/src/linter/rules/mod.rs
+++ b/tasks/website/src/linter/rules/mod.rs
@@ -12,6 +12,7 @@ use std::{
};
use doc_page::render_rule_docs_page;
+use html::HtmlWriter;
use oxc_linter::table::RuleTable;
use pico_args::Arguments;
use table::render_rules_table;
diff --git a/tasks/website/src/linter/rules/table.rs b/tasks/website/src/linter/rules/table.rs
index 963f899328d1e..68f939cd6f7f8 100644
--- a/tasks/website/src/linter/rules/table.rs
+++ b/tasks/website/src/linter/rules/table.rs
@@ -1,9 +1,12 @@
use oxc_linter::table::RuleTable;
-// `cargo run -p website linter-rules > /path/to/oxc/oxc-project.github.io/src/docs/guide/usage/linter/generated-rules.md`
-//
+/// Renders the website's Rules page. Each [`category`] gets its own table with
+/// links to documentation pages for each rule.
+///
/// `docs_prefix` is a path prefix to the base URL all rule documentation pages
/// share in common.
+///
+/// [`category`]: oxc_linter::RuleCategory
pub fn render_rules_table(table: &RuleTable, docs_prefix: &str) -> String {
let total = table.total;
let turned_on_by_default_count = table.turned_on_by_default_count;
diff --git a/tasks/website/src/linter/rules/test.rs b/tasks/website/src/linter/rules/test.rs
index 5238ee060afde..672352b7a3403 100644
--- a/tasks/website/src/linter/rules/test.rs
+++ b/tasks/website/src/linter/rules/test.rs
@@ -1,4 +1,4 @@
-use markdown::{to_html, to_html_with_options, Options};
+use markdown::{to_html_with_options, Options};
use oxc_diagnostics::NamedSource;
use scraper::{ElementRef, Html, Selector};
use std::sync::{Arc, OnceLock};
@@ -42,9 +42,13 @@ fn parse_type(filename: &str, source_text: &str, source_type: SourceType) -> Res
#[test]
fn test_rules_table() {
const PREFIX: &str = "/docs/guide/usage/linter/rules";
+ let options = Options::gfm();
let rendered_table = render_rules_table(table(), PREFIX);
- let html = to_html(&rendered_table);
- let jsx = format!("const Table = () => <>{html}>");
+ let rendered_html = to_html_with_options(&rendered_table, &options).unwrap();
+ assert!(rendered_html.contains(""));
+ let html = Html::parse_fragment(&rendered_html);
+ assert!(html.errors.is_empty(), "{:#?}", html.errors);
+ let jsx = format!("const Table = () => <>{rendered_html}>");
parse("rules-table", &jsx).unwrap();
}
@@ -70,7 +74,6 @@ fn test_doc_pages() {
// ensure code examples are valid
{
let html = Html::parse_fragment(docs);
- assert!(html.errors.is_empty(), "HTML parsing errors: {:#?}", html.errors);
for code_el in html.select(&code) {
let inner = code_el.inner_html();
let inner =