tangled
alpha
login
or
join now
nonbinary.computer
/
weaver
atproto blogging
24
fork
atom
overview
issues
2
pulls
pipelines
js crate optimization
Orual
1 month ago
38220c7c
5ba1942a
+165
-57
12 changed files
expand all
collapse all
unified
split
.gitignore
Cargo.lock
Cargo.toml
crates
weaver-app
Cargo.toml
weaver-common
Cargo.toml
weaver-editor-core
Cargo.toml
weaver-editor-crdt
Cargo.toml
weaver-embed-worker
Cargo.toml
weaver-renderer
Cargo.toml
src
atproto
writer.rs
lib.rs
weaver-renderer-js
Cargo.toml
+2
.gitignore
···
26
26
27
27
# Deciduous database (local)
28
28
.deciduous/
29
29
+
30
30
+
!.cargo/config.toml
+23
-10
Cargo.lock
···
7675
7675
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
7676
7676
7677
7677
[[package]]
7678
7678
+
name = "onig"
7679
7679
+
version = "6.5.1"
7680
7680
+
source = "registry+https://github.com/rust-lang/crates.io-index"
7681
7681
+
checksum = "336b9c63443aceef14bea841b899035ae3abe89b7c486aaf4c5bd8aafedac3f0"
7682
7682
+
dependencies = [
7683
7683
+
"bitflags 2.10.0",
7684
7684
+
"libc",
7685
7685
+
"once_cell",
7686
7686
+
"onig_sys",
7687
7687
+
]
7688
7688
+
7689
7689
+
[[package]]
7690
7690
+
name = "onig_sys"
7691
7691
+
version = "69.9.1"
7692
7692
+
source = "registry+https://github.com/rust-lang/crates.io-index"
7693
7693
+
checksum = "c7f86c6eef3d6df15f23bcfb6af487cbd2fed4e5581d58d5bf1f5f8b7f6727dc"
7694
7694
+
dependencies = [
7695
7695
+
"cc",
7696
7696
+
"pkg-config",
7697
7697
+
]
7698
7698
+
7699
7699
+
[[package]]
7678
7700
name = "oorandom"
7679
7701
version = "11.1.5"
7680
7702
source = "registry+https://github.com/rust-lang/crates.io-index"
···
10619
10641
"flate2",
10620
10642
"fnv",
10621
10643
"once_cell",
10644
10644
+
"onig",
10622
10645
"plist",
10623
10646
"regex-syntax",
10624
10647
"serde",
···
10626
10649
"serde_json",
10627
10650
"thiserror 2.0.17",
10628
10651
"walkdir",
10629
10629
-
"yaml-rust",
10630
10652
]
10631
10653
10632
10654
[[package]]
···
13330
13352
version = "0.8.15"
13331
13353
source = "registry+https://github.com/rust-lang/crates.io-index"
13332
13354
checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3"
13333
13333
-
13334
13334
-
[[package]]
13335
13335
-
name = "yaml-rust"
13336
13336
-
version = "0.4.5"
13337
13337
-
source = "registry+https://github.com/rust-lang/crates.io-index"
13338
13338
-
checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
13339
13339
-
dependencies = [
13340
13340
-
"linked-hash-map",
13341
13341
-
]
13342
13355
13343
13356
[[package]]
13344
13357
name = "yaml-rust2"
+10
Cargo.toml
···
95
95
96
96
[profile.android-dev]
97
97
inherits = "dev"
98
98
+
99
99
+
100
100
+
# [profile.release]
101
101
+
# opt-level = "z"
102
102
+
# debug = false
103
103
+
# lto = true
104
104
+
# codegen-units = 1
105
105
+
# panic = "abort"
106
106
+
# incremental = false
107
107
+
# strip = true
+19
-1
crates/weaver-app/Cargo.toml
···
70
70
http = "1.3"
71
71
reqwest = { version = "0.12", default-features = false, features = ["json"] }
72
72
dioxus-free-icons = { version = "0.9", features = ["font-awesome-brands"] }
73
73
-
syntect = { workspace = true, default-features = false, features = ["default-fancy"]}
73
73
+
# syntect configured per-target below
74
74
# diesel = { version = "2.3", features = ["sqlite", "returning_clauses_for_sqlite_3_35", "chrono", "serde_json"] }
75
75
# diesel_migrations = { version = "2.3", features = ["sqlite"] }
76
76
tokio = { version = "1.28", features = ["sync"] }
···
101
101
webbrowser = "1.0.6"
102
102
reqwest = { version = "0.12", default-features = false, features = ["json"] }
103
103
ring = { version = "0.17", default-features = false, features = ["alloc"] }
104
104
+
# Native: full syntect with onig
105
105
+
syntect = { workspace = true, default-features = false, features = [
106
106
+
"parsing",
107
107
+
"html",
108
108
+
"default-syntaxes",
109
109
+
"default-themes",
110
110
+
"plist-load",
111
111
+
"regex-onig"
112
112
+
] }
104
113
105
114
[target.'cfg(all(target_family = "wasm", target_os = "unknown"))'.dependencies]
106
115
reqwest = { version = "0.12", default-features = false, features = ["json"] }
107
116
tracing-wasm = "0.2"
117
117
+
# WASM: syntect with fancy-regex (no onig for wasm)
118
118
+
syntect = { workspace = true, default-features = false, features = [
119
119
+
"parsing",
120
120
+
"html",
121
121
+
"default-syntaxes",
122
122
+
"default-themes",
123
123
+
"plist-load",
124
124
+
"regex-fancy"
125
125
+
] }
108
126
#sqlite-wasm-rs = { version = "0.4", default-features = false, features = ["precompiled", "relaxed-idb"] }
109
127
time = { version = "0.3", features = ["wasm-bindgen"] }
110
128
console_error_panic_hook = "0.1"
+1
-2
crates/weaver-common/Cargo.toml
···
6
6
publish = false
7
7
8
8
[features]
9
9
-
default = ["dev"]
10
10
-
dev = []
9
9
+
default = [ "use-index"]
11
10
native = ["jacquard/dns"]
12
11
use-index = []
13
12
iroh = ["dep:iroh", "dep:iroh-gossip", "dep:iroh-tickets"]
+20
-2
crates/weaver-editor-core/Cargo.toml
···
13
13
markdown-weaver = { workspace = true }
14
14
markdown-weaver-escape = { workspace = true }
15
15
weaver-common = { path = "../weaver-common" }
16
16
-
weaver-renderer = { path = "../weaver-renderer" }
16
16
+
# Only needs syntax-highlighting, not CSS generation
17
17
+
weaver-renderer = { path = "../weaver-renderer", default-features = false, features = ["syntax-highlighting"] }
17
18
weaver-api = { path = "../weaver-api" }
18
19
jacquard = { workspace = true }
19
19
-
syntect = { workspace = true }
20
20
+
21
21
+
# Native: syntect with onig
22
22
+
[target.'cfg(not(all(target_family = "wasm", target_os = "unknown")))'.dependencies]
23
23
+
syntect = { workspace = true, default-features = false, features = [
24
24
+
"parsing",
25
25
+
"html",
26
26
+
"default-syntaxes",
27
27
+
"regex-onig"
28
28
+
] }
29
29
+
30
30
+
# WASM: syntect with fancy-regex
31
31
+
[target.'cfg(all(target_family = "wasm", target_os = "unknown"))'.dependencies]
32
32
+
syntect = { workspace = true, default-features = false, features = [
33
33
+
"parsing",
34
34
+
"html",
35
35
+
"default-syntaxes",
36
36
+
"regex-fancy"
37
37
+
] }
20
38
21
39
[dev-dependencies]
+2
-2
crates/weaver-editor-crdt/Cargo.toml
···
29
29
futures-util = "0.3"
30
30
n0-future = { workspace = true }
31
31
32
32
-
# Optional weaver-specific deps
33
33
-
weaver-renderer = { path = "../weaver-renderer", optional = true }
32
32
+
# Optional weaver-specific deps - only syntax-highlighting needed
33
33
+
weaver-renderer = { path = "../weaver-renderer", optional = true, default-features = false, features = ["syntax-highlighting"] }
34
34
35
35
[target.'cfg(all(target_family = "wasm", target_os = "unknown"))'.dependencies]
36
36
gloo-worker = { version = "0.5", features = ["futures"] }
+2
-1
crates/weaver-embed-worker/Cargo.toml
···
11
11
12
12
[dependencies]
13
13
weaver-common = { path = "../weaver-common", features = ["cache", "perf"] }
14
14
-
weaver-renderer = { path = "../weaver-renderer" }
14
14
+
# WASM target - only syntax-highlighting, not syntax-css
15
15
+
weaver-renderer = { path = "../weaver-renderer", default-features = false, features = ["syntax-highlighting"] }
15
16
jacquard = { workspace = true }
16
17
serde = { workspace = true }
17
18
tracing = { workspace = true }
+13
-5
crates/weaver-renderer-js/Cargo.toml
···
9
9
[lib]
10
10
crate-type = ["cdylib", "rlib"]
11
11
12
12
+
[features]
13
13
+
default = ["syntax-highlighting"]
14
14
+
syntax-highlighting = ["weaver-renderer/syntax-highlighting"]
15
15
+
12
16
[dependencies]
13
13
-
weaver-renderer = { path = "../weaver-renderer" }
17
17
+
weaver-renderer = { path = "../weaver-renderer", default-features = false }
14
18
weaver-common = { path = "../weaver-common" }
15
19
weaver-api = { path = "../weaver-api" }
16
16
-
jacquard = { workspace = true }
20
20
+
jacquard = { workspace = true, default-features = false }
17
21
markdown-weaver = { workspace = true }
18
22
markdown-weaver-escape = { workspace = true }
19
23
···
24
28
js-sys = "0.3"
25
29
console_error_panic_hook = "0.1"
26
30
27
27
-
[profile.release]
28
28
-
lto = true
29
29
-
opt-level = "z"
31
31
+
[package.metadata.wasm-pack.profile.dev]
32
32
+
# Disable wasm-opt (default for dev)
33
33
+
wasm-opt = false
34
34
+
35
35
+
[package.metadata.wasm-pack.profile.release]
36
36
+
# Enable with size optimization
37
37
+
wasm-opt = ['-Oz', '--enable-bulk-memory-opt', '--enable-nontrapping-float-to-int']
+25
-6
crates/weaver-renderer/Cargo.toml
···
6
6
publish = false
7
7
8
8
[features]
9
9
-
default = []
9
9
+
default = ["syntax-highlighting", "syntax-css"]
10
10
pckt = []
11
11
+
# Basic syntax highlighting (code_pretty.rs) - works in WASM
12
12
+
syntax-highlighting = ["dep:syntect"]
13
13
+
# CSS generation from themes (css.rs) - native only, needs plist + themes
14
14
+
syntax-css = ["syntax-highlighting"]
11
15
12
16
[dependencies]
13
17
n0-future.workspace = true
···
18
22
markdown-weaver = { workspace = true }
19
23
http = "1.3.1"
20
24
url = "2.5.4"
21
21
-
syntect = { workspace = true, default-features = false, features = ["default-fancy"]}
22
25
markdown-weaver-escape = { workspace = true, features = ["std"] }
23
26
thiserror.workspace = true
24
27
tracing.workspace = true
···
33
36
smol_str = { version = "0.3", features = ["serde"] }
34
37
pulldown-latex = "0.6"
35
38
mime-sniffer = "0.1.3"
36
36
-
reqwest = { version = "0.12.7", default-features = false, features = [
37
37
-
"json",
38
38
-
"rustls-tls",
39
39
-
] }
40
39
40
40
+
# Native: full syntect with onig (fast) + themes for CSS generation
41
41
[target.'cfg(not(all(target_family = "wasm", target_os = "unknown")))'.dependencies]
42
42
+
syntect = { workspace = true, default-features = false, features = [
43
43
+
"parsing",
44
44
+
"html",
45
45
+
"default-syntaxes",
46
46
+
"default-themes",
47
47
+
"plist-load",
48
48
+
"regex-onig"
49
49
+
], optional = true }
42
50
regex = { version = "1.12" }
43
51
tokio = { version = "1.28", features = ["rt", "time"] }
44
52
tokio-util = { version = "0.7.14", features = ["rt"] }
45
53
ignore = "0.4.23"
54
54
+
reqwest = { version = "0.12.7", default-features = false, features = [
55
55
+
"json",
56
56
+
"rustls-tls",
57
57
+
] }
46
58
59
59
+
# WASM: minimal syntect with fancy-regex (pure Rust), no themes
47
60
[target.'cfg(all(target_family = "wasm", target_os = "unknown"))'.dependencies]
61
61
+
syntect = { workspace = true, default-features = false, features = [
62
62
+
"parsing",
63
63
+
"html",
64
64
+
"default-syntaxes",
65
65
+
"regex-fancy"
66
66
+
], optional = true }
48
67
regex-lite = { version = "0.1" }
49
68
50
69
[dev-dependencies]
+46
-28
crates/weaver-renderer/src/atproto/writer.rs
···
968
968
self.close_wrapper()
969
969
}
970
970
TagEnd::CodeBlock => {
971
971
-
use std::sync::LazyLock;
972
972
-
use syntect::parsing::SyntaxSet;
973
973
-
static SYNTAX_SET: LazyLock<SyntaxSet> =
974
974
-
LazyLock::new(|| SyntaxSet::load_defaults_newlines());
971
971
+
#[cfg(feature = "syntax-highlighting")]
972
972
+
{
973
973
+
use std::sync::LazyLock;
974
974
+
use syntect::parsing::SyntaxSet;
975
975
+
static SYNTAX_SET: LazyLock<SyntaxSet> =
976
976
+
LazyLock::new(|| SyntaxSet::load_defaults_newlines());
975
977
976
976
-
if let Some((lang, buffer)) = self.code_buffer.take() {
977
977
-
if let Some(ref lang_str) = lang {
978
978
-
// Use a temporary String buffer for syntect
979
979
-
let mut temp_output = String::new();
980
980
-
match crate::code_pretty::highlight(
981
981
-
&SYNTAX_SET,
982
982
-
Some(lang_str),
983
983
-
&buffer,
984
984
-
&mut temp_output,
985
985
-
) {
986
986
-
Ok(_) => {
987
987
-
self.write(&temp_output)?;
988
988
-
}
989
989
-
Err(_) => {
990
990
-
// Fallback to plain code block
991
991
-
self.write("<pre><code class=\"language-")?;
992
992
-
escape_html(&mut self.writer, lang_str)?;
993
993
-
self.write("\">")?;
994
994
-
escape_html_body_text(&mut self.writer, &buffer)?;
995
995
-
self.write("</code></pre>\n")?;
978
978
+
if let Some((lang, buffer)) = self.code_buffer.take() {
979
979
+
if let Some(ref lang_str) = lang {
980
980
+
let mut temp_output = String::new();
981
981
+
match crate::code_pretty::highlight(
982
982
+
&SYNTAX_SET,
983
983
+
Some(lang_str),
984
984
+
&buffer,
985
985
+
&mut temp_output,
986
986
+
) {
987
987
+
Ok(_) => {
988
988
+
self.write(&temp_output)?;
989
989
+
}
990
990
+
Err(_) => {
991
991
+
self.write("<pre><code class=\"language-")?;
992
992
+
escape_html(&mut self.writer, lang_str)?;
993
993
+
self.write("\">")?;
994
994
+
escape_html_body_text(&mut self.writer, &buffer)?;
995
995
+
self.write("</code></pre>\n")?;
996
996
+
}
996
997
}
998
998
+
} else {
999
999
+
self.write("<pre><code>")?;
1000
1000
+
escape_html_body_text(&mut self.writer, &buffer)?;
1001
1001
+
self.write("</code></pre>\n")?;
997
1002
}
998
1003
} else {
999
999
-
self.write("<pre><code>")?;
1004
1004
+
self.write("</code></pre>\n")?;
1005
1005
+
}
1006
1006
+
Ok(())
1007
1007
+
}
1008
1008
+
#[cfg(not(feature = "syntax-highlighting"))]
1009
1009
+
{
1010
1010
+
if let Some((lang, buffer)) = self.code_buffer.take() {
1011
1011
+
if let Some(ref lang_str) = lang {
1012
1012
+
self.write("<pre><code class=\"language-")?;
1013
1013
+
escape_html(&mut self.writer, lang_str)?;
1014
1014
+
self.write("\">")?;
1015
1015
+
} else {
1016
1016
+
self.write("<pre><code>")?;
1017
1017
+
}
1000
1018
escape_html_body_text(&mut self.writer, &buffer)?;
1019
1019
+
self.write("</code></pre>\n")?;
1020
1020
+
} else {
1001
1021
self.write("</code></pre>\n")?;
1002
1022
}
1003
1003
-
} else {
1004
1004
-
self.write("</code></pre>\n")?;
1023
1023
+
Ok(())
1005
1024
}
1006
1006
-
Ok(())
1007
1025
}
1008
1026
TagEnd::List(true) => {
1009
1027
self.write("</ol>\n")?;
+2
crates/weaver-renderer/src/lib.rs
···
26
26
27
27
pub mod atproto;
28
28
pub mod base_html;
29
29
+
#[cfg(feature = "syntax-highlighting")]
29
30
pub mod code_pretty;
31
31
+
#[cfg(feature = "syntax-css")]
30
32
pub mod css;
31
33
pub mod facet;
32
34
pub mod leaflet;