@@ -143,13 +143,20 @@ where
143143
144144/// Tracks the type of media transformation being applied
145145enum MediaTransform < ' s > {
146- /// Rostra media link - stores the event_id and alt text
147- RostraMedia ( ShortEventId , String ) ,
148- /// External embeddable media (YouTube, etc.) - stores the HTML, hostname,
149- /// and alt text
150- EmbeddableMedia ( String , String , String ) ,
151- /// Regular external image - stores the URL, link type, and alt text
152- ExternalImage ( Cow < ' s , str > , jotup:: SpanLinkType , String ) ,
146+ /// Rostra media link
147+ RostraMedia { event_id : ShortEventId , alt : String } ,
148+ /// External embeddable media (YouTube, etc.)
149+ EmbeddableMedia {
150+ html : String ,
151+ hostname : String ,
152+ alt : String ,
153+ } ,
154+ /// Regular external image
155+ ExternalImage {
156+ url : Cow < ' s , str > ,
157+ link_type : jotup:: SpanLinkType ,
158+ alt : String ,
159+ } ,
153160}
154161
155162/// Filter that transforms media elements:
@@ -189,8 +196,10 @@ where
189196 Event :: Start ( Container :: Image ( s, link_type) , _attr) => {
190197 if let Some ( event_id) = UiState :: extra_rostra_media_link ( & s) {
191198 // Store event_id to look up content later
192- self . container_stack
193- . push ( Some ( MediaTransform :: RostraMedia ( event_id, String :: new ( ) ) ) ) ;
199+ self . container_stack . push ( Some ( MediaTransform :: RostraMedia {
200+ event_id,
201+ alt : String :: new ( ) ,
202+ } ) ) ;
194203 // Don't emit Start yet - we'll emit everything in End
195204 Ok ( ( ) )
196205 } else {
@@ -201,18 +210,18 @@ where
201210 . and_then ( |u| u. host_str ( ) . map ( |h| h. to_string ( ) ) )
202211 . unwrap_or_default ( ) ;
203212 self . container_stack
204- . push ( Some ( MediaTransform :: EmbeddableMedia (
213+ . push ( Some ( MediaTransform :: EmbeddableMedia {
205214 html,
206215 hostname,
207- String :: new ( ) ,
208- ) ) ) ;
216+ alt : String :: new ( ) ,
217+ } ) ) ;
209218 } else {
210219 self . container_stack
211- . push ( Some ( MediaTransform :: ExternalImage (
212- s. clone ( ) ,
220+ . push ( Some ( MediaTransform :: ExternalImage {
221+ url : s. clone ( ) ,
213222 link_type,
214- String :: new ( ) ,
215- ) ) ) ;
223+ alt : String :: new ( ) ,
224+ } ) ) ;
216225 }
217226 // Start the lazy-load wrapper div
218227 self . inner
@@ -236,9 +245,9 @@ where
236245 // If we're inside a media transformation, capture the alt text
237246 if let Some ( Some ( transform) ) = self . container_stack . last_mut ( ) {
238247 match transform {
239- MediaTransform :: RostraMedia ( _ , alt)
240- | MediaTransform :: EmbeddableMedia ( _ , _ , alt)
241- | MediaTransform :: ExternalImage ( _ , _ , alt) => {
248+ MediaTransform :: RostraMedia { alt, .. }
249+ | MediaTransform :: EmbeddableMedia { alt, .. }
250+ | MediaTransform :: ExternalImage { alt, .. } => {
242251 // Append to alt text (may be split across multiple Str events)
243252 alt. push_str ( & s) ;
244253 Ok ( ( ) )
@@ -270,9 +279,9 @@ where
270279 _ => unreachable ! ( ) ,
271280 } ;
272281 match transform {
273- MediaTransform :: RostraMedia ( _ , alt)
274- | MediaTransform :: EmbeddableMedia ( _ , _ , alt)
275- | MediaTransform :: ExternalImage ( _ , _ , alt) => {
282+ MediaTransform :: RostraMedia { alt, .. }
283+ | MediaTransform :: EmbeddableMedia { alt, .. }
284+ | MediaTransform :: ExternalImage { alt, .. } => {
276285 alt. push ( ch) ;
277286 }
278287 }
@@ -285,9 +294,9 @@ where
285294 Event :: NonBreakingSpace | Event :: Softbreak => {
286295 if let Some ( Some ( transform) ) = self . container_stack . last_mut ( ) {
287296 match transform {
288- MediaTransform :: RostraMedia ( _ , alt)
289- | MediaTransform :: EmbeddableMedia ( _ , _ , alt)
290- | MediaTransform :: ExternalImage ( _ , _ , alt) => {
297+ MediaTransform :: RostraMedia { alt, .. }
298+ | MediaTransform :: EmbeddableMedia { alt, .. }
299+ | MediaTransform :: ExternalImage { alt, .. } => {
291300 alt. push ( ' ' ) ;
292301 }
293302 }
@@ -299,9 +308,9 @@ where
299308 Event :: Hardbreak => {
300309 if let Some ( Some ( transform) ) = self . container_stack . last_mut ( ) {
301310 match transform {
302- MediaTransform :: RostraMedia ( _ , alt)
303- | MediaTransform :: EmbeddableMedia ( _ , _ , alt)
304- | MediaTransform :: ExternalImage ( _ , _ , alt) => {
311+ MediaTransform :: RostraMedia { alt, .. }
312+ | MediaTransform :: EmbeddableMedia { alt, .. }
313+ | MediaTransform :: ExternalImage { alt, .. } => {
305314 alt. push ( '\n' ) ;
306315 }
307316 }
@@ -314,9 +323,9 @@ where
314323 Event :: Symbol ( s) => {
315324 if let Some ( Some ( transform) ) = self . container_stack . last_mut ( ) {
316325 match transform {
317- MediaTransform :: RostraMedia ( _ , alt)
318- | MediaTransform :: EmbeddableMedia ( _ , _ , alt)
319- | MediaTransform :: ExternalImage ( _ , _ , alt) => {
326+ MediaTransform :: RostraMedia { alt, .. }
327+ | MediaTransform :: EmbeddableMedia { alt, .. }
328+ | MediaTransform :: ExternalImage { alt, .. } => {
320329 // Render as :symbol_name:
321330 alt. push ( ':' ) ;
322331 alt. push_str ( & s) ;
@@ -340,7 +349,7 @@ where
340349 Event :: End => {
341350 if let Some ( Some ( transform) ) = self . container_stack . pop ( ) {
342351 match transform {
343- MediaTransform :: RostraMedia ( event_id, alt) => {
352+ MediaTransform :: RostraMedia { event_id, alt } => {
344353 // Look up the content to get mime type
345354 let url = format ! ( "/ui/media/{}/{}" , self . author_id, event_id) ;
346355 let alt = alt. trim ( ) ;
@@ -411,7 +420,11 @@ where
411420 self . inner . emit ( Event :: Str ( html. into ( ) ) ) . await ?;
412421 self . inner . emit ( Event :: End ) . await
413422 }
414- MediaTransform :: EmbeddableMedia ( html, hostname, alt) => {
423+ MediaTransform :: EmbeddableMedia {
424+ html,
425+ hostname,
426+ alt,
427+ } => {
415428 // Emit the load message and embedded HTML
416429 let alt = alt. trim ( ) ;
417430 let load_msg = if hostname. is_empty ( ) {
@@ -448,10 +461,14 @@ where
448461 // Close the div
449462 self . inner . emit ( Event :: End ) . await
450463 }
451- MediaTransform :: ExternalImage ( s, link_type, alt) => {
464+ MediaTransform :: ExternalImage {
465+ url,
466+ link_type,
467+ alt,
468+ } => {
452469 // Emit load message and the actual image
453470 let alt = alt. trim ( ) ;
454- let hostname = url:: Url :: parse ( & s )
471+ let hostname = url:: Url :: parse ( & url )
455472 . ok ( )
456473 . and_then ( |u| u. host_str ( ) . map ( |h| h. to_string ( ) ) )
457474 . unwrap_or_default ( ) ;
@@ -484,7 +501,7 @@ where
484501 AttributeKind :: Pair {
485502 key : Cow :: Borrowed ( "data-src" ) ,
486503 } ,
487- AttributeValue :: from ( s . clone ( ) ) ,
504+ AttributeValue :: from ( url . clone ( ) ) ,
488505 ) ) ;
489506 self . inner
490507 . emit ( Event :: Start (
0 commit comments