@@ -5,7 +5,8 @@ use std::{
5
5
sync:: { Arc , Mutex as SyncMutex } ,
6
6
} ;
7
7
8
- use log:: { debug, error, trace, warn} ;
8
+ use log:: { debug, error, info, trace, warn} ;
9
+ use parking_lot:: Mutex ;
9
10
use tinymist_query:: {
10
11
CompilerQueryRequest , CompilerQueryResponse , DiagnosticsMap , FoldRequestFeature ,
11
12
OnSaveExportRequest , PositionEncoding ,
@@ -34,8 +35,8 @@ use typst_ts_core::{
34
35
Bytes , Error , ImmutPath , TypstDocument , TypstWorld ,
35
36
} ;
36
37
37
- use super :: compile:: CompileActor as CompileActorInner ;
38
38
use super :: compile:: CompileClient as TsCompileClient ;
39
+ use super :: { compile:: CompileActor as CompileActorInner , render:: PdfExportConfig } ;
39
40
use crate :: actor:: render:: RenderActorRequest ;
40
41
use crate :: ConstConfig ;
41
42
@@ -62,11 +63,12 @@ pub fn create_server(
62
63
let root = compiler_driver. inner . world . root . as_ref ( ) . to_owned ( ) ;
63
64
let handler: CompileHandler = compiler_driver. handler . clone ( ) ;
64
65
66
+ let ontyped_render_tx = render_tx. clone ( ) ;
65
67
let driver = CompileExporter :: new ( compiler_driver) . with_exporter ( Box :: new (
66
68
move |_w : & dyn TypstWorld , doc| {
67
69
let _ = doc_sender. send ( Some ( doc) ) ;
68
70
// todo: is it right that ignore zero broadcast receiver?
69
- let _ = render_tx . send ( RenderActorRequest :: Render ) ;
71
+ let _ = ontyped_render_tx . send ( RenderActorRequest :: OnTyped ) ;
70
72
71
73
Ok ( ( ) )
72
74
} ,
@@ -84,11 +86,17 @@ pub fn create_server(
84
86
85
87
current_runtime. spawn ( server. spawn ( ) ) ;
86
88
87
- let this = CompileActor :: new ( diag_group, cfg. position_encoding , handler, client) ;
89
+ let this = CompileActor :: new (
90
+ diag_group,
91
+ cfg. position_encoding ,
92
+ handler,
93
+ client,
94
+ render_tx,
95
+ ) ;
88
96
89
97
// todo: less bug-prone code
90
98
if let Some ( entry) = entry {
91
- this. entry . lock ( ) . unwrap ( ) . replace ( entry. into ( ) ) ;
99
+ this. entry . lock ( ) . replace ( entry. into ( ) ) ;
92
100
}
93
101
94
102
this
@@ -289,8 +297,9 @@ pub struct CompileActor {
289
297
diag_group : String ,
290
298
position_encoding : PositionEncoding ,
291
299
handler : CompileHandler ,
292
- entry : Arc < SyncMutex < Option < ImmutPath > > > ,
300
+ entry : Arc < Mutex < Option < ImmutPath > > > ,
293
301
pub inner : CompileClient < CompileHandler > ,
302
+ render_tx : broadcast:: Sender < RenderActorRequest > ,
294
303
}
295
304
296
305
// todo: remove unsafe impl send
@@ -356,7 +365,7 @@ impl CompileActor {
356
365
// todo: more robust rollback logic
357
366
let entry = self . entry . clone ( ) ;
358
367
let should_change = {
359
- let mut entry = entry. lock ( ) . unwrap ( ) ;
368
+ let mut entry = entry. lock ( ) ;
360
369
let should_change = entry. as_ref ( ) . map ( |e| e != & path) . unwrap_or ( true ) ;
361
370
let prev = entry. clone ( ) ;
362
371
* entry = Some ( path. clone ( ) ) ;
@@ -373,6 +382,12 @@ impl CompileActor {
373
382
next. display( )
374
383
) ;
375
384
385
+ self . render_tx
386
+ . send ( RenderActorRequest :: ChangeExportPath ( Some (
387
+ next. with_extension ( "pdf" ) . into ( ) ,
388
+ ) ) )
389
+ . unwrap ( ) ;
390
+
376
391
// todo
377
392
let res = self . steal ( move |compiler| {
378
393
let root = compiler. compiler . world ( ) . workspace_root ( ) ;
@@ -386,7 +401,13 @@ impl CompileActor {
386
401
} ) ;
387
402
388
403
if res. is_err ( ) {
389
- let mut entry = entry. lock ( ) . unwrap ( ) ;
404
+ self . render_tx
405
+ . send ( RenderActorRequest :: ChangeExportPath (
406
+ prev. clone ( ) . map ( |e| e. with_extension ( "pdf" ) . into ( ) ) ,
407
+ ) )
408
+ . unwrap ( ) ;
409
+
410
+ let mut entry = entry. lock ( ) ;
390
411
if * entry == Some ( next) {
391
412
* entry = prev;
392
413
}
@@ -396,11 +417,25 @@ impl CompileActor {
396
417
397
418
// todo: trigger recompile
398
419
let files = FileChangeSet :: new_inserts ( vec ! [ ] ) ;
399
- self . inner . add_memory_changes ( MemoryEvent :: Update ( files) )
420
+ self . inner . add_memory_changes ( MemoryEvent :: Update ( files) ) ;
400
421
}
401
422
402
423
Ok ( ( ) )
403
424
}
425
+
426
+ pub ( crate ) fn change_export_pdf ( & self , export_pdf : crate :: ExportPdfMode ) {
427
+ let entry = self . entry . lock ( ) ;
428
+ let path = entry
429
+ . as_ref ( )
430
+ . map ( |e| e. clone ( ) . with_extension ( "pdf" ) . into ( ) ) ;
431
+ let _ = self
432
+ . render_tx
433
+ . send ( RenderActorRequest :: ChangeConfig ( PdfExportConfig {
434
+ path,
435
+ mode : export_pdf,
436
+ } ) )
437
+ . unwrap ( ) ;
438
+ }
404
439
}
405
440
406
441
impl SourceFileServer for CompileActor {
@@ -494,13 +529,15 @@ impl CompileActor {
494
529
position_encoding : PositionEncoding ,
495
530
handler : CompileHandler ,
496
531
inner : CompileClient < CompileHandler > ,
532
+ render_tx : broadcast:: Sender < RenderActorRequest > ,
497
533
) -> Self {
498
534
Self {
499
535
diag_group,
500
536
position_encoding,
501
537
handler,
502
- entry : Arc :: new ( SyncMutex :: new ( None ) ) ,
538
+ entry : Arc :: new ( Mutex :: new ( None ) ) ,
503
539
inner,
540
+ render_tx,
504
541
}
505
542
}
506
543
@@ -529,7 +566,10 @@ impl CompileActor {
529
566
}
530
567
}
531
568
532
- fn on_save_export ( & self , _path : PathBuf ) -> anyhow:: Result < ( ) > {
569
+ fn on_save_export ( & self , path : PathBuf ) -> anyhow:: Result < ( ) > {
570
+ info ! ( "CompileActor: on save export: {}" , path. display( ) ) ;
571
+ let _ = self . render_tx . send ( RenderActorRequest :: OnSaved ( path) ) ;
572
+
533
573
Ok ( ( ) )
534
574
}
535
575
0 commit comments