#![allow(missing_docs)]
use html_generator::accessibility::add_aria_attributes;
use html_generator::error::HtmlError;
type Result<T> = std::result::Result<T, HtmlError>;
fn convert_error(e: html_generator::accessibility::Error) -> HtmlError {
HtmlError::accessibility(
html_generator::error::ErrorKind::Other,
e.to_string(),
None,
)
}
fn main() -> Result<()> {
println!("\n๐งช ARIA Elements Generation Examples\n");
button_examples()?;
navigation_examples()?;
form_examples()?;
landmark_examples()?;
interactive_elements_examples()?;
modal_dialog_examples()?;
table_examples()?;
extra_emoji_examples()?;
dynamic_content_examples()?;
nested_interactive_examples()?;
complex_table_examples()?;
live_region_examples()?;
println!("\n๐ All ARIA element examples completed successfully!");
Ok(())
}
fn button_examples() -> Result<()> {
println!("๐ฆ Button ARIA Examples");
println!("---------------------------------------------");
let examples = [
("<button>Click me</button>", "Basic button"),
(
r#"<button><span class="icon">๐</span></button>"#,
"Icon button - magnifying glass",
),
(
r#"<button><span class="icon">๐</span></button>"#,
"Icon button - zoom in",
),
(
r#"<button><span class="icon">๐ง</span></button>"#,
"Icon button - wrench",
),
(
r#"<button><span class="icon">โ๏ธ</span></button>"#,
"Icon button - gear",
),
(
r#"<button><span class="icon">โ๏ธ</span></button>"#,
"Icon button - pencil",
),
(
r#"<button><span class="icon">๐๏ธ</span></button>"#,
"Icon button - trash",
),
(r#"<button type="button">Menu</button>"#, "Toggle button"),
(r#"<button disabled>Submit</button>"#, "Disabled button"),
(
r#"<button aria-haspopup="true">Profile</button>"#,
"Button with dropdown (aria-haspopup)",
),
];
for (html, description) in examples {
println!("\nTesting {}", description);
let enhanced =
add_aria_attributes(html, None).map_err(convert_error)?;
println!("Original: {}", html);
println!("Enhanced: {}", enhanced);
}
Ok(())
}
fn navigation_examples() -> Result<()> {
println!("\n๐ฆ Navigation ARIA Examples");
println!("---------------------------------------------");
let examples = [
("<nav><ul><li>Home</li></ul></nav>", "Main navigation"),
(
r#"<nav class="breadcrumb"><ol><li>Home</li><li>Products</li></ol></nav>"#,
"Breadcrumb",
),
(
r#"<nav class="sidebar"><ul><li>Settings</li></ul></nav>"#,
"Secondary navigation",
),
];
for (html, description) in examples {
println!("\nTesting {}", description);
let enhanced =
add_aria_attributes(html, None).map_err(convert_error)?;
println!("Original: {}", html);
println!("Enhanced: {}", enhanced);
}
Ok(())
}
fn form_examples() -> Result<()> {
println!("\n๐ฆ Form ARIA Examples");
println!("---------------------------------------------");
let examples = [
(
r#"<input type="text" placeholder="Enter name">"#,
"Text input",
),
(
r#"<input type="search" placeholder="Search...">"#,
"Search input",
),
(r#"<input type="checkbox" id="terms">"#, "Checkbox"),
(
r#"<div><input type="radio" name="option" value="1"><input type="radio" name="option" value="2"></div>"#,
"Radio group",
),
(
r#"<select><option>Choose...</option></select>"#,
"Select dropdown",
),
(
r#"<textarea placeholder="Enter description"></textarea>"#,
"Textarea",
),
(
r#"<div>
<label for="username">Username</label>
<input type="text" id="username" aria-describedby="usernameHelp">
<small id="usernameHelp">No spaces allowed</small>
</div>"#,
"Input with aria-describedby",
),
];
for (html, description) in examples {
println!("\nTesting {}", description);
let enhanced =
add_aria_attributes(html, None).map_err(convert_error)?;
println!("Original: {}", html);
println!("Enhanced: {}", enhanced);
}
Ok(())
}
fn landmark_examples() -> Result<()> {
println!("\n๐ฆ Landmark ARIA Examples");
println!("---------------------------------------------");
let examples = [
(r#"<header><h1>Site Title</h1></header>"#, "Header landmark"),
(
r#"<main><article>Content</article></main>"#,
"Main content landmark",
),
(
r#"<aside><div>Related content</div></aside>"#,
"Complementary landmark",
),
(
r#"<footer><p>Copyright 2024</p></footer>"#,
"Footer landmark",
),
];
for (html, description) in examples {
println!("\nTesting {}", description);
println!("This element has implicit ARIA roles, meaning it inherently conveys its landmark purpose to assistive technologies without needing explicit ARIA attributes. No major changes expected.");
let enhanced =
add_aria_attributes(html, None).map_err(convert_error)?;
println!("Original: {}", html);
println!("Enhanced: {}", enhanced);
}
Ok(())
}
fn interactive_elements_examples() -> Result<()> {
println!("\n๐ฆ Interactive Elements ARIA Examples");
println!("---------------------------------------------");
let examples = [
(
r#"<div role="tablist"><button>Tab 1</button><button>Tab 2</button></div>"#,
"Tabs",
),
(
r#"<div class="accordion"><button>Section 1</button><div>Content</div></div>"#,
"Accordion",
),
(r#"<button title="More information">?</button>"#, "Tooltip"),
(
r#"<button aria-haspopup="true">Open Menu</button><ul class="menu"><li>Item 1</li><li>Item 2</li></ul>"#,
"Button + Menu",
),
];
for (html, description) in examples {
println!("\nTesting {}", description);
let enhanced =
add_aria_attributes(html, None).map_err(convert_error)?;
println!("Original: {}", html);
println!("Enhanced: {}", enhanced);
}
Ok(())
}
fn modal_dialog_examples() -> Result<()> {
println!("\n๐ฆ Modal Dialog ARIA Examples");
println!("---------------------------------------------");
let examples = [
(
r#"<div class="modal" aria-hidden="true"><div class="modal-content"><button>Close</button></div></div>"#,
"Basic modal",
),
(
r#"<div class="modal alert" role="alertdialog"><div class="modal-content"><h2>Warning</h2><button>OK</button></div></div>"#,
"Alert dialog",
),
(
r#"<div class="modal" aria-modal="true"><div class="modal-content"><h2>Confirm</h2><button>Yes</button><button>No</button></div></div>"#,
"Confirmation dialog",
),
];
for (html, description) in examples {
println!("\nTesting {}", description);
let enhanced =
add_aria_attributes(html, None).map_err(convert_error)?;
println!("Original: {}", html);
println!("Enhanced: {}", enhanced);
}
Ok(())
}
fn table_examples() -> Result<()> {
println!("\n๐ฆ Table ARIA Examples");
println!("---------------------------------------------");
let examples = [
(
r#"<table><tr><th>Header</th></tr><tr><td>Data</td></tr></table>"#,
"Basic table",
),
(
r#"<table><tr><th class="sortable">Name</th></tr><tr><td>John</td></tr></table>"#,
"Sortable table",
),
(
r#"<table>
<tr><th colspan="2">Header</th></tr>
<tr><td>Data 1</td><td>Data 2</td></tr>
</table>"#,
"Complex table",
),
];
for (html, description) in examples {
println!("\nTesting {}", description);
let enhanced =
add_aria_attributes(html, None).map_err(convert_error)?;
println!("Original: {}", html);
println!("Enhanced: {}", enhanced);
}
Ok(())
}
fn extra_emoji_examples() -> Result<()> {
println!("\n๐ฆ Extra Emoji ARIA Examples");
println!("---------------------------------------------");
let examples = [
(
r#"<button>๐ซท ๐ซธ</button>"#,
"Left-right pushing hand buttons",
),
(r#"<div><span>๐</span> Note</div>"#, "Edit pencil icon"),
(r#"<div class="close-box">โ</div>"#, "Close box"),
(r#"<button><span>โก๏ธ</span></button>"#, "Lightning icon"),
(r#"<span>โ Info needed</span>"#, "Question mark usage"),
(r#"<p>Play โถ Pause โธ Stop โน</p>"#, "Media control emojis"),
];
for (html, description) in examples {
println!("\nTesting {}", description);
let enhanced =
add_aria_attributes(html, None).map_err(convert_error)?;
println!("Original: {}", html);
println!("Enhanced: {}", enhanced);
}
Ok(())
}
fn dynamic_content_examples() -> Result<()> {
println!("\n๐ฆ Dynamic Content ARIA Examples");
println!("---------------------------------------------");
println!("These examples illustrate how ARIA attributes can be updated at runtime.");
let accordion_html = r#"
<div class="accordion">
<button aria-expanded="false" aria-controls="section1-content">
Section 1
</button>
<div id="section1-content" hidden>
<p>Content for section 1</p>
</div>
</div>
"#;
println!("\nTesting Accordion with aria-expanded toggle");
println!("Explanation: The button uses `aria-expanded` to indicate the accordion state, while `aria-controls` associates it with the collapsible content.");
let enhanced_accordion = add_aria_attributes(accordion_html, None)
.map_err(convert_error)?;
println!("Original: {}", accordion_html);
println!("Enhanced: {}", enhanced_accordion);
let modal_html = r#"
<div class="modal" aria-hidden="true">
<div class="modal-content" role="dialog">
<h2>Welcome</h2>
<button>Close</button>
</div>
</div>
"#;
println!("\nTesting Modal with aria-hidden toggle");
println!("Explanation: When the modal opens, `aria-hidden` should be set to `false`, and focus is trapped inside the dialog for screen reader clarity.");
let enhanced_modal =
add_aria_attributes(modal_html, None).map_err(convert_error)?;
println!("Original: {}", modal_html);
println!("Enhanced: {}", enhanced_modal);
Ok(())
}
fn nested_interactive_examples() -> Result<()> {
println!("\n๐ฆ Nested Interactive Elements ARIA Examples");
println!("---------------------------------------------");
println!("These scenarios illustrate layered UI components with proper ARIA relationships.");
let nested_html = r##"
<div class="modal" aria-modal="true" role="dialog">
<div class="modal-content">
<h2>Settings</h2>
<button aria-haspopup="true" aria-controls="settings-menu">Preferences</button>
<ul id="settings-menu" class="menu" hidden>
<li><a href="#profile">Profile</a></li>
<li><a href="#privacy">Privacy</a></li>
</ul>
<button>Close</button>
</div>
</div>
"##;
println!("\nTesting Modal with nested menu");
println!("Explanation: `role=\"dialog\"` identifies the modal. The `Preferences` button indicates a submenu with `aria-haspopup` and `aria-controls` linking to the hidden menu.");
let enhanced_nested = add_aria_attributes(nested_html, None)
.map_err(convert_error)?;
println!("Original: {}", nested_html);
println!("Enhanced: {}", enhanced_nested);
Ok(())
}
fn complex_table_examples() -> Result<()> {
println!("\n๐ฆ Complex Table ARIA Examples");
println!("---------------------------------------------");
println!("Tables with row groups, column groups, and summary text for screen readers.");
let complex_table_html = r#"
<table aria-describedby="table-summary">
<caption>Quarterly Financial Report</caption>
<thead>
<tr>
<th rowspan="2">Region</th>
<th colspan="2">Q1</th>
<th colspan="2">Q2</th>
</tr>
<tr>
<th>Revenue</th>
<th>Expenses</th>
<th>Revenue</th>
<th>Expenses</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">North</th>
<td>$120k</td>
<td>$90k</td>
<td>$150k</td>
<td>$100k</td>
</tr>
<tr>
<th scope="row">South</th>
<td>$100k</td>
<td>$70k</td>
<td>$110k</td>
<td>$80k</td>
</tr>
</tbody>
</table>
<div id="table-summary" hidden>
This table shows quarterly revenue and expenses for different regions.
</div>
"#;
println!("\nTesting complex table with row/column headers");
println!("Explanation: Using `rowspan` and `colspan` properly, plus `aria-describedby` referencing a hidden summary for screen readers.");
let enhanced_table = add_aria_attributes(complex_table_html, None)
.map_err(convert_error)?;
println!("Original: {}", complex_table_html);
println!("Enhanced: {}", enhanced_table);
Ok(())
}
fn live_region_examples() -> Result<()> {
println!("\n๐ฆ Live Region ARIA Examples");
println!("---------------------------------------------");
println!("ARIA live regions help assistive technologies announce updates.");
let live_region_html = r#"
<div>
<button id="notify-btn">Notify</button>
<!--
The aria-live attribute here informs screen readers that any text change
within this container should be announced automatically.
-->
<div id="notification-area" aria-live="polite"></div>
</div>
"#;
println!("\nTesting live region usage");
println!("Explanation: `aria-live=\"polite\"` ensures new text in this region is read by screen readers without interrupting the user immediately.");
let enhanced_live_region =
add_aria_attributes(live_region_html, None)
.map_err(convert_error)?;
println!("Original: {}", live_region_html);
println!("Enhanced: {}", enhanced_live_region);
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_button_aria_attributes() -> Result<()> {
let html = "<button>Click me</button>";
let enhanced =
add_aria_attributes(html, None).map_err(convert_error)?;
assert!(enhanced.contains("aria-label"));
assert!(enhanced.contains(r#"role="button""#));
Ok(())
}
#[test]
fn test_navigation_aria_attributes() -> Result<()> {
let html = "<nav><ul><li>Home</li></ul></nav>";
let enhanced =
add_aria_attributes(html, None).map_err(convert_error)?;
assert!(enhanced.contains("aria-label"));
assert!(enhanced.contains(r#"role="navigation""#));
Ok(())
}
#[test]
fn test_form_aria_attributes() -> Result<()> {
let html = r#"<input type="text" placeholder="Enter name">"#;
let enhanced =
add_aria_attributes(html, None).map_err(convert_error)?;
assert!(enhanced.contains("aria-label"));
Ok(())
}
#[test]
fn test_landmark_aria_attributes() -> Result<()> {
let html = "<main><article>Content</article></main>";
let enhanced =
add_aria_attributes(html, None).map_err(convert_error)?;
assert!(enhanced.contains(r#"role="main""#));
Ok(())
}
#[test]
fn test_extra_emoji_examples() -> Result<()> {
let html = r#"<button>๐ซท ๐ซธ</button>"#;
let enhanced =
add_aria_attributes(html, None).map_err(convert_error)?;
assert!(enhanced.contains("aria-label"));
Ok(())
}
#[test]
fn test_dynamic_content_examples() -> Result<()> {
let accordion_html = r#"
<div class="accordion">
<button aria-expanded="false" aria-controls="section1-content">
Section 1
</button>
<div id="section1-content" hidden>
<p>Content for section 1</p>
</div>
</div>
"#;
let enhanced_accordion =
add_aria_attributes(accordion_html, None)
.map_err(convert_error)?;
assert!(enhanced_accordion.contains("aria-expanded"));
assert!(enhanced_accordion.contains("aria-controls"));
Ok(())
}
#[test]
fn test_live_region_examples() -> Result<()> {
let live_region_html = r#"
<div>
<button id="notify-btn">Notify</button>
<div id="notification-area" aria-live="polite"></div>
</div>
"#;
let enhanced_live_region =
add_aria_attributes(live_region_html, None)
.map_err(convert_error)?;
assert!(enhanced_live_region.contains(r#"aria-live="polite""#));
Ok(())
}
}