11import os
22import webbrowser
33from enum import Enum
4+ from pathlib import Path
45from typing import Any , Callable , Dict , Generator , List , Optional , Type , Union
56
67import click
@@ -35,7 +36,7 @@ class Converter(BaseModel): # type: ignore
3536 assets_dir : str = "{basename}_assets"
3637 template : Optional [str ] = None
3738
38- def convert_to (self , dest : str ) -> None :
39+ def convert_to (self , dest : Path ) -> None :
3940 """Converts self, i.e., a list of presentations, into a given format."""
4041 raise NotImplementedError
4142
@@ -45,7 +46,7 @@ def load_template(self) -> str:
4546 An empty string is returned if no template is used."""
4647 return ""
4748
48- def open (self , file : str ) -> bool :
49+ def open (self , file : Path ) -> bool :
4950 """Opens a file, generated with converter, using appropriate application."""
5051 raise NotImplementedError
5152
@@ -285,12 +286,12 @@ class Config:
285286 use_enum_values = True
286287 extra = "forbid"
287288
288- def get_sections_iter (self ) -> Generator [str , None , None ]:
289+ def get_sections_iter (self , assets_dir : Path ) -> Generator [str , None , None ]:
289290 """Generates a sequence of sections, one per slide, that will be included into the html template."""
290291 for presentation_config in self .presentation_configs :
291292 for slide_config in presentation_config .slides :
292293 file = presentation_config .files [slide_config .start_animation ]
293- file = os . path . join ( self . assets_dir , os . path . basename ( file ))
294+ file = assets_dir / file . name
294295
295296 # TODO: document this
296297 # Videos are muted because, otherwise, the first slide never plays correctly.
@@ -312,26 +313,27 @@ def load_template(self) -> str:
312313 __name__ , "data/revealjs_template.html"
313314 ).decode ()
314315
315- def open (self , file : str ) -> bool :
316- return webbrowser .open (file )
316+ def open (self , file : Path ) -> bool :
317+ return webbrowser .open (file . absolute (). as_uri () )
317318
318- def convert_to (self , dest : str ) -> None :
319+ def convert_to (self , dest : Path ) -> None :
319320 """Converts this configuration into a RevealJS HTML presentation, saved to DEST."""
320- dirname = os .path .dirname (dest )
321- basename , ext = os .path .splitext (os .path .basename (dest ))
321+ dirname = dest .parent
322+ basename = dest .stem
323+ ext = dest .suffix
322324
323- self . assets_dir = self . assets_dir . format (
324- dirname = dirname , basename = basename , ext = ext
325+ assets_dir = Path (
326+ self . assets_dir . format ( dirname = dirname , basename = basename , ext = ext )
325327 )
326- full_assets_dir = os . path . join ( dirname , self . assets_dir )
328+ full_assets_dir = dirname / assets_dir
327329
328330 os .makedirs (full_assets_dir , exist_ok = True )
329331
330332 for presentation_config in self .presentation_configs :
331- presentation_config .concat_animations ().move_to (full_assets_dir )
333+ presentation_config .concat_animations ().copy_to (full_assets_dir )
332334
333335 with open (dest , "w" ) as f :
334- sections = "" .join (self .get_sections_iter ())
336+ sections = "" .join (self .get_sections_iter (full_assets_dir ))
335337
336338 revealjs_template = self .load_template ()
337339 content = revealjs_template .format (sections = sections , ** self .dict ())
@@ -396,7 +398,7 @@ def callback(ctx: Context, param: Parameter, value: bool) -> None:
396398@click .command ()
397399@click .argument ("scenes" , nargs = - 1 )
398400@folder_path_option
399- @click .argument ("dest" )
401+ @click .argument ("dest" , type = click . Path ( dir_okay = False , path_type = Path ) )
400402@click .option (
401403 "--to" ,
402404 type = click .Choice (["html" ], case_sensitive = False ),
@@ -423,21 +425,21 @@ def callback(ctx: Context, param: Parameter, value: bool) -> None:
423425 "--use-template" ,
424426 "template" ,
425427 metavar = "FILE" ,
426- type = click .Path (exists = True , dir_okay = False ),
428+ type = click .Path (exists = True , dir_okay = False , path_type = Path ),
427429 help = "Use the template given by FILE instead of default one. To echo the default template, use `--show-template`." ,
428430)
429431@show_template_option
430432@show_config_options
431433@verbosity_option
432434def convert (
433435 scenes : List [str ],
434- folder : str ,
435- dest : str ,
436+ folder : Path ,
437+ dest : Path ,
436438 to : str ,
437439 open_result : bool ,
438440 force : bool ,
439441 config_options : Dict [str , str ],
440- template : Optional [str ],
442+ template : Optional [Path ],
441443) -> None :
442444 """
443445 Convert SCENE(s) into a given format and writes the result in DEST.
0 commit comments