@@ -144,6 +166,121 @@ fn App() -> impl IntoView {
}
}
+fn rules_view() -> AnyView {
+ view! {
+
{render_rule_text(READING_RULES_CAVEAT)}
+ {READING_RULES.iter().map(|section| {
+ let section_id = format!("rule-section-{}", section.number);
+ let heading_id = section_id.clone();
+ view! {
+
+
+
{format!("{:02}", section.number)}
+
{render_rule_text(section.title)}
+
+ {section.blocks.iter().map(render_rule_block).collect_view()}
+
+ }
+ }).collect_view()}
+ }
+ .into_any()
+}
+
+fn render_rule_block(block: &RuleBlock) -> AnyView {
+ match block {
+ RuleBlock::Paragraph(text) => view! {
+
{render_rule_text(text)}
+ }
+ .into_any(),
+ RuleBlock::Subheading(text) => view! {
+
{render_rule_text(text)}
+ }
+ .into_any(),
+ RuleBlock::Table(table) => rule_table_view(*table),
+ RuleBlock::Bullets(items) => view! {
+
+ {items.iter().map(|item| view! { - {render_rule_text(item)}
}).collect_view()}
+
+ }
+ .into_any(),
+ RuleBlock::Steps(items) => view! {
+
+ {items.iter().map(|item| view! { - {render_rule_text(item)}
}).collect_view()}
+
+ }
+ .into_any(),
+ }
+}
+
+fn rule_table_view(table: RuleTable) -> AnyView {
+ view! {
+
+
+
+
+ {table.headers.iter().enumerate().map(|(text_index, header)| view! {
+ | {render_rule_text(header)} |
+ {table.audio_columns.iter().filter(|column| column.after_text_column == text_index + 1).map(|column| view! {
+ {render_rule_text(column.header)} |
+ }).collect_view()}
+ }).collect_view()}
+
+
+
+ {table.rows.iter().enumerate().map(|(row_index, row)| {
+ let audio_cells = table.audio_rows.get(row_index).copied().unwrap_or(&[]);
+ view! {
+
+ {row.iter().enumerate().map(|(text_index, cell)| view! {
+ | {render_rule_text(cell)} |
+ {table.audio_columns.iter().enumerate().filter(|(_, column)| column.after_text_column == text_index + 1).map(|(audio_index, _)| {
+ let paths = audio_cells.get(audio_index).copied().unwrap_or(&[]);
+ rule_audio_cell_view(paths)
+ }).collect_view()}
+ }).collect_view()}
+
+ }
+ }).collect_view()}
+
+
+
+ }
+ .into_any()
+}
+
+fn rule_audio_cell_view(paths: &'static [&'static str]) -> AnyView {
+ view! {
+
+ {paths.iter().map(|path| view! {
+
+ }).collect_view()}
+ |
+ }
+ .into_any()
+}
+
+fn render_rule_text(text: &'static str) -> AnyView {
+ text.split('`')
+ .enumerate()
+ .map(|(index, fragment)| {
+ if index % 2 == 0 {
+ view! { {fragment} }.into_any()
+ } else {
+ view! {
{fragment} }.into_any()
+ }
+ })
+ .collect_view()
+ .into_any()
+}
+
fn render_reading_text(
reading_text: &'static ReadingText,
selected_id: RwSignal