feat: enable extended markdown parsing with table support in post rendering

This commit is contained in:
xfy 2026-06-04 18:06:46 +08:00
parent 245fd83ec8
commit 81d3d72a48

View File

@ -2,14 +2,14 @@
use dioxus::prelude::*;
#[cfg(feature = "server")]
use crate::auth::session::get_session_from_ctx;
#[cfg(feature = "server")]
use crate::api::utils::{db_conn_error, query_error};
#[cfg(feature = "server")]
use crate::auth::session::get_session_from_ctx;
use crate::db::pool::get_conn;
use crate::models::post::{Post, PostStats, PostStatus, Tag};
use crate::models::user::{User, UserRole};
use crate::utils::text::{count_words, auto_summary};
use crate::utils::text::{auto_summary, count_words};
// ============================================================================
// Server-side helpers (only compiled when server feature is enabled)
@ -122,7 +122,15 @@ async fn ensure_unique_slug(
fn clean_html(input: &str) -> String {
let mut builder = ammonia::Builder::default();
builder
.add_generic_attributes(&["class", "aria-hidden", "aria-label", "id", "role", "accesskey", "title"])
.add_generic_attributes(&[
"class",
"aria-hidden",
"aria-label",
"id",
"role",
"accesskey",
"title",
])
.add_tags(&["details", "summary"])
.url_relative(ammonia::UrlRelative::PassThrough)
.add_tag_attributes("a", &["class", "aria-hidden", "aria-label"])
@ -133,7 +141,7 @@ fn clean_html(input: &str) -> String {
.add_tag_attributes("h4", &["id", "class"])
.add_tag_attributes("h5", &["id", "class"])
.add_tag_attributes("h6", &["id", "class"]);
builder.clean(input).to_string()
}
@ -146,10 +154,10 @@ struct RenderedContent {
#[cfg(feature = "server")]
fn render_markdown_enhanced(md: &str) -> RenderedContent {
use pulldown_cmark::{Event, Tag, TagEnd, HeadingLevel};
use pulldown_cmark::{Event, HeadingLevel, Options, Tag, TagEnd};
// 1. Parse markdown and collect headings for TOC
let parser = pulldown_cmark::Parser::new(md);
let parser = pulldown_cmark::Parser::new_ext(md, Options::all());
let mut headings: Vec<(u8, String, String)> = Vec::new(); // (level, text, id)
let mut current_heading: Option<(u8, String)> = None;
@ -190,7 +198,7 @@ fn render_markdown_enhanced(md: &str) -> RenderedContent {
let toc_html = generate_toc_html(&headings);
// 3. Generate HTML with heading anchors
let parser = pulldown_cmark::Parser::new(md);
let parser = pulldown_cmark::Parser::new_ext(md, Options::ENABLE_TABLES);
let mut html = String::new();
let mut heading_idx = 0;
let mut in_heading = false;