feat: enable extended markdown parsing with table support in post rendering
This commit is contained in:
parent
245fd83ec8
commit
81d3d72a48
@ -2,14 +2,14 @@
|
|||||||
|
|
||||||
use dioxus::prelude::*;
|
use dioxus::prelude::*;
|
||||||
|
|
||||||
#[cfg(feature = "server")]
|
|
||||||
use crate::auth::session::get_session_from_ctx;
|
|
||||||
#[cfg(feature = "server")]
|
#[cfg(feature = "server")]
|
||||||
use crate::api::utils::{db_conn_error, query_error};
|
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::db::pool::get_conn;
|
||||||
use crate::models::post::{Post, PostStats, PostStatus, Tag};
|
use crate::models::post::{Post, PostStats, PostStatus, Tag};
|
||||||
use crate::models::user::{User, UserRole};
|
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)
|
// 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 {
|
fn clean_html(input: &str) -> String {
|
||||||
let mut builder = ammonia::Builder::default();
|
let mut builder = ammonia::Builder::default();
|
||||||
builder
|
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"])
|
.add_tags(&["details", "summary"])
|
||||||
.url_relative(ammonia::UrlRelative::PassThrough)
|
.url_relative(ammonia::UrlRelative::PassThrough)
|
||||||
.add_tag_attributes("a", &["class", "aria-hidden", "aria-label"])
|
.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("h4", &["id", "class"])
|
||||||
.add_tag_attributes("h5", &["id", "class"])
|
.add_tag_attributes("h5", &["id", "class"])
|
||||||
.add_tag_attributes("h6", &["id", "class"]);
|
.add_tag_attributes("h6", &["id", "class"]);
|
||||||
|
|
||||||
builder.clean(input).to_string()
|
builder.clean(input).to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,10 +154,10 @@ struct RenderedContent {
|
|||||||
|
|
||||||
#[cfg(feature = "server")]
|
#[cfg(feature = "server")]
|
||||||
fn render_markdown_enhanced(md: &str) -> RenderedContent {
|
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
|
// 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 headings: Vec<(u8, String, String)> = Vec::new(); // (level, text, id)
|
||||||
let mut current_heading: Option<(u8, String)> = None;
|
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);
|
let toc_html = generate_toc_html(&headings);
|
||||||
|
|
||||||
// 3. Generate HTML with heading anchors
|
// 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 html = String::new();
|
||||||
let mut heading_idx = 0;
|
let mut heading_idx = 0;
|
||||||
let mut in_heading = false;
|
let mut in_heading = false;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user