tangled
alpha
login
or
join now
nonbinary.computer
/
weaver
atproto blogging
24
fork
atom
overview
issues
2
pulls
pipelines
couple fixes
Orual
1 month ago
74d7abbb
a8be2ece
+16
-13
4 changed files
expand all
collapse all
unified
split
crates
weaver-editor-core
src
writer
embed.rs
mod.rs
state.rs
tags.rs
+10
-8
crates/weaver-editor-core/src/writer/embed.rs
···
8
8
use jacquard::types::{ident::AtIdentifier, string::Rkey};
9
9
use markdown_weaver::{CowStr, EmbedType, Event};
10
10
use markdown_weaver_escape::{StrWrite, escape_html};
11
11
+
use smol_str::SmolStr;
11
12
12
13
use crate::render::{EmbedContentProvider, ImageResolver, WikilinkValidator};
13
14
use crate::syntax::{SyntaxSpanInfo, SyntaxType};
···
43
44
#[derive(Clone, Default)]
44
45
pub struct EditorImageResolver {
45
46
/// All resolved images: name -> resolved path info
46
46
-
images: HashMap<String, ResolvedImage>,
47
47
+
images: HashMap<SmolStr, ResolvedImage>,
47
48
}
48
49
49
50
impl EditorImageResolver {
···
52
53
}
53
54
54
55
/// Add a pending image with a data URL for immediate preview.
55
55
-
pub fn add_pending(&mut self, name: String, data_url: String) {
56
56
-
self.images.insert(name, ResolvedImage::Pending(data_url));
56
56
+
pub fn add_pending(&mut self, name: impl Into<SmolStr>, data_url: String) {
57
57
+
self.images
58
58
+
.insert(name.into(), ResolvedImage::Pending(data_url));
57
59
}
58
60
59
61
/// Promote a pending image to uploaded (draft) status.
···
64
66
ident: AtIdentifier<'static>,
65
67
) {
66
68
self.images
67
67
-
.insert(name.to_string(), ResolvedImage::Draft { blob_rkey, ident });
69
69
+
.insert(SmolStr::new(name), ResolvedImage::Draft { blob_rkey, ident });
68
70
}
69
71
70
72
/// Add an already-uploaded draft image.
71
73
pub fn add_uploaded(
72
74
&mut self,
73
73
-
name: String,
75
75
+
name: impl Into<SmolStr>,
74
76
blob_rkey: Rkey<'static>,
75
77
ident: AtIdentifier<'static>,
76
78
) {
77
79
self.images
78
78
-
.insert(name, ResolvedImage::Draft { blob_rkey, ident });
80
80
+
.insert(name.into(), ResolvedImage::Draft { blob_rkey, ident });
79
81
}
80
82
81
83
/// Add a published image.
82
84
pub fn add_published(
83
85
&mut self,
84
84
-
name: String,
86
86
+
name: impl Into<SmolStr>,
85
87
entry_rkey: Rkey<'static>,
86
88
ident: AtIdentifier<'static>,
87
89
) {
88
90
self.images
89
89
-
.insert(name, ResolvedImage::Published { entry_rkey, ident });
91
91
+
.insert(name.into(), ResolvedImage::Published { entry_rkey, ident });
90
92
}
91
93
92
94
/// Check if an image is pending upload.
+1
-1
crates/weaver-editor-core/src/writer/mod.rs
···
141
141
entry_index: Option<&'a weaver_common::EntryIndex>,
142
142
143
143
// === Misc ===
144
144
-
numbers: HashMap<String, usize>,
144
144
+
numbers: HashMap<SmolStr, usize>,
145
145
pending_blockquote_range: Option<Range<usize>>,
146
146
ref_collector: weaver_common::RefCollector,
147
147
}
+2
-2
crates/weaver-editor-core/src/writer/state.rs
···
272
272
#[derive(Debug, Clone, Default)]
273
273
pub struct FootnoteContext {
274
274
/// Maps footnote name -> (syntax_span_index, char_start)
275
275
-
pub ref_spans: HashMap<String, (usize, usize)>,
275
275
+
pub ref_spans: HashMap<SmolStr, (usize, usize)>,
276
276
/// Current footnote def being processed: (name, span_idx, char_start)
277
277
-
pub current_def: Option<(String, usize, usize)>,
277
277
+
pub current_def: Option<(SmolStr, usize, usize)>,
278
278
}
279
279
280
280
/// UTF-16 offset checkpoints for incremental tracking.
+3
-2
crates/weaver-editor-core/src/writer/tags.rs
···
5
5
6
6
use markdown_weaver::{Alignment, BlockQuoteKind, CodeBlockKind, EmbedType, Event, LinkType, Tag};
7
7
use markdown_weaver_escape::{StrWrite, escape_href, escape_html, escape_html_body_text};
8
8
+
use smol_str::ToSmolStr;
8
9
9
10
use crate::offset_map::OffsetMapping;
10
11
use crate::render::{EmbedContentProvider, ImageResolver, WikilinkValidator};
···
488
489
let lang_opt = if lang.is_empty() {
489
490
None
490
491
} else {
491
491
-
Some(smol_str::SmolStr::new(lang))
492
492
+
Some(lang.to_smolstr())
492
493
};
493
494
// Start buffering
494
495
self.code_block.buffer = Some((lang_opt, String::new()));
···
990
991
self.write("</span>")?;
991
992
992
993
// Store the definition info (no longer tracking syntax spans for hide/show)
993
993
-
self.footnotes.current_def = Some((name.to_string(), 0, char_start));
994
994
+
self.footnotes.current_def = Some((name.to_smolstr(), 0, char_start));
994
995
995
996
// Record offset mapping for the prefix
996
997
self.record_mapping(