07f9d9ed26
This commit introduces a new module `analyze::render` to handle the
rendering of Markdown content produced by the LLM into safe HTML.
The LLM output now includes a custom `==text==` highlighting convention
to indicate sections that require doctor review due to potential
transcription errors or incomplete information. This highlighting is
converted into `<mark>` tags in the final HTML.
To ensure security, all LLM-generated Markdown is first HTML-escaped.
This prevents any malicious HTML or script injection from being executed
in the browser. Only the custom `<mark>` tags are preserved as
functional HTML elements.
The process is as follows:
1. The raw Markdown from the LLM is processed.
2. All HTML special characters (`<`, `>`, `&`, `"`, `'`) are escaped.
3. The `==text==` highlights are replaced with `<mark>text</mark>`.
4. The resulting string is parsed as Markdown by `pulldown-cmark`.
5. The parsed Markdown is converted to HTML, which is then safe to
inject into the Askama template using the `|safe` filter.
The `Cargo.toml` and `Cargo.lock` files have been updated to include the
`pulldown-cmark` dependency. The `document.html` template has been
modified to use a `div` with the class `doc-content` instead of a `pre`
tag, allowing the rendered HTML to be displayed correctly. The
`handle_document_view` function now calls the new `md_to_html` rendering
function.
33 lines
1.0 KiB
TOML
33 lines
1.0 KiB
TOML
[package]
|
|
name = "doctate-server"
|
|
version = "0.1.0"
|
|
edition = "2024"
|
|
default-run = "doctate-server"
|
|
|
|
[dependencies]
|
|
axum = { version = "0.8", features = ["multipart"] }
|
|
tokio = { version = "1", features = ["full"] }
|
|
reqwest = { version = "0.12", default-features = false, features = ["json", "multipart", "rustls-tls"] }
|
|
tempfile = "3"
|
|
askama = "0.12"
|
|
tracing = "0.1"
|
|
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
|
tracing-appender = "0.2"
|
|
dotenvy = "0.15"
|
|
uuid = { version = "1", features = ["v4", "serde"] }
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
toml = "0.8"
|
|
tower-http = { version = "0.6", features = ["limit", "trace"] }
|
|
rand = "0.8"
|
|
bcrypt = "0.15"
|
|
axum-extra = { version = "0.12", features = ["cookie", "form"] }
|
|
time = { version = "0.3.47", features = ["local-offset", "parsing", "formatting", "macros"] }
|
|
toml_edit = "0.25.11"
|
|
rpassword = "7.4.0"
|
|
pulldown-cmark = { version = "0.13", default-features = false, features = ["html"] }
|
|
|
|
[dev-dependencies]
|
|
tower = { version = "0.5", features = ["util"] }
|
|
wiremock = "0.6"
|