arborium (tree-sitter) renders each token as a flat <span class="hl-…">, which the X4's no-descendant-selector stylesheet can still target. The sanitizer strips class attributes, so language hints never reached the database. annotate_hints now copies them onto <pre data-lang> before readability and sanitizing: pre/code classes, Rouge and GitHub wrapper divs, SyntaxHighlighter's brush:, and data-lang style attributes. ammonia keeps only canonical values. Highlighting runs at render time for the web article page and both EPUB editions, so stored articles benefit too. Unhinted blocks are guessed from content (JSON that parses, shebangs, leading <script>/<style>, then betlang at >= 0.5). A borderline block also takes the article's prevailing language when that language is among its top candidates. Anything else stays plain, since wrong colours are worse than none. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
80 lines
3.3 KiB
TOML
80 lines
3.3 KiB
TOML
[package]
|
|
name = "daily-epub"
|
|
version = "0.3.0"
|
|
edition = "2024"
|
|
|
|
[dependencies]
|
|
ammonia = "4.1.4"
|
|
anyhow = "1.0.104"
|
|
arborium = { version = "2.18.2", default-features = false, features = ["lang-asm", "lang-awk", "lang-bash", "lang-c", "lang-c-sharp", "lang-clojure", "lang-cmake", "lang-commonlisp", "lang-cpp", "lang-css", "lang-d", "lang-dart", "lang-diff", "lang-dockerfile", "lang-elisp", "lang-elixir", "lang-elm", "lang-erlang", "lang-fish", "lang-fsharp", "lang-gleam", "lang-glsl", "lang-go", "lang-graphql", "lang-groovy", "lang-haskell", "lang-hcl", "lang-html", "lang-ini", "lang-java", "lang-javascript", "lang-jq", "lang-json", "lang-julia", "lang-kotlin", "lang-lean", "lang-lua", "lang-make", "lang-matlab", "lang-nix", "lang-objc", "lang-ocaml", "lang-odin", "lang-perl", "lang-php", "lang-powershell", "lang-prolog", "lang-proto", "lang-python", "lang-r", "lang-ruby", "lang-rust", "lang-scala", "lang-scheme", "lang-scss", "lang-solidity", "lang-sql", "lang-starlark", "lang-swift", "lang-toml", "lang-tsx", "lang-typescript", "lang-verilog", "lang-vhdl", "lang-vim", "lang-x86asm", "lang-xml", "lang-yaml", "lang-zig", "lang-zsh"] }
|
|
askama = "0.16.0"
|
|
async-trait = "0.1.92"
|
|
axum = "0.8.9"
|
|
axum-login = { git = "https://github.com/maxcountryman/axum-login.git", rev = "151c72d7a1b4646830f86b4332e6bd6e34d719a7", version = "0.18.0" }
|
|
base64 = "0.23.1"
|
|
betlang = "0.1.1"
|
|
clap = { version = "4.6.6", features = ["derive"] }
|
|
dom_smoothie = "0.18.0"
|
|
epub-builder = "0.8.3"
|
|
figment = { version = "0.10.19", features = ["toml", "env"] }
|
|
futures = "0.3.34"
|
|
hex = "0.4.3"
|
|
hmac = "0.13.0"
|
|
image = "0.25.10"
|
|
jiff = { version = "0.2.35", features = ["serde"] }
|
|
lettre = { version = "0.11", default-features = false, features = ["builder", "smtp-transport", "tokio1", "tokio1-rustls-tls", "hostname"] }
|
|
libc = "0.2.189"
|
|
password-auth = "1.0.0"
|
|
percent-encoding = "2.3.2"
|
|
rand = "0.10.2"
|
|
reqwest = { version = "0.13.4", default-features = false, features = [
|
|
"rustls",
|
|
"gzip",
|
|
"json",
|
|
"charset",
|
|
"http2",
|
|
"query",
|
|
"system-proxy",
|
|
] }
|
|
resvg = "0.48.1"
|
|
rpassword = "7.5.4"
|
|
scraper = "0.27.0"
|
|
serde = { version = "1.0.229", features = ["derive"] }
|
|
serde_json = "1.0.151"
|
|
sha2 = "0.11.0"
|
|
sqlx = { version = "0.9.0", default-features = false, features = [
|
|
"derive",
|
|
"json",
|
|
"macros",
|
|
"migrate",
|
|
"runtime-tokio",
|
|
"sqlite",
|
|
"tls-rustls-ring",
|
|
] }
|
|
thiserror = "2.0.20"
|
|
time = "0.3.55"
|
|
tiny-skia = "0.12.0"
|
|
tokio = { version = "1.53.1", features = ["full"] }
|
|
tokio-util = { version = "0.7.19", features = ["io"] }
|
|
toml = "1.1.4"
|
|
toml_edit = "0.25"
|
|
tower-http = { version = "0.7.0", features = ["trace", "fs", "request-id"] }
|
|
tower_governor = { version = "0.8.0", features = ["axum"] }
|
|
tracing = "0.1.44"
|
|
tracing-subscriber = { version = "0.3.23", features = ["env-filter"] }
|
|
url = { version = "2.5.8", features = ["serde"] }
|
|
zip = { version = "6", default-features = false, features = ["deflate"] }
|
|
|
|
[profile.release]
|
|
# Per-request cost in the web server is JSON decode and template render, both
|
|
# CPU-bound and spread across crates; whole-program LTO and one codegen unit
|
|
# buy a slice of that for a longer release build (tests use the dev profile).
|
|
lto = "fat"
|
|
codegen-units = 1
|
|
|
|
[dev-dependencies]
|
|
figment = { version = "0.10.19", features = ["test", "toml", "env"] }
|
|
roxmltree = "0.21.1"
|
|
tempfile = "3.27.0"
|
|
tower = { version = "0.5.3", features = ["util"] }
|