@@ -100,20 +100,15 @@ def blog_add_posts(context):
100100 posts = []
101101 # posts from the file system
102102 if context ["blog" ]["posts_path" ]:
103- posts_path = os .path .join (
104- context ["source_path" ], * context ["blog" ]["posts_path" ].split ("/" )
105- )
106- for fname in os .listdir (posts_path ):
107- if fname .startswith ("index." ):
103+ posts_path = context ["source_path" ] / context ["blog" ]["posts_path" ]
104+ for fname in posts_path .iterdir ():
105+ if fname .name .startswith ("index." ):
108106 continue
109- link = (
110- f"/{ context ['blog' ]['posts_path' ]} "
111- f"/{ os .path .splitext (fname )[0 ]} .html"
112- )
107+ link = f"/{ context ['blog' ]['posts_path' ]} /{ fname .stem } .html"
113108 md = markdown .Markdown (
114109 extensions = context ["main" ]["markdown_extensions" ]
115110 )
116- with open (os . path . join ( posts_path , fname ), encoding = "utf-8" ) as f :
111+ with fname . open (encoding = "utf-8" ) as f :
117112 html = md .convert (f .read ())
118113 title = md .Meta ["title" ][0 ]
119114 summary = re .sub (tag_expr , "" , html )
@@ -386,15 +381,15 @@ def get_callable(obj_as_str: str) -> object:
386381 return obj
387382
388383
389- def get_context (config_fname : str , ** kwargs ):
384+ def get_context (config_fname : pathlib . Path , ** kwargs ):
390385 """
391386 Load the config yaml as the base context, and enrich it with the
392387 information added by the context preprocessors defined in the file.
393388 """
394- with open (config_fname , encoding = "utf-8" ) as f :
389+ with config_fname . open (encoding = "utf-8" ) as f :
395390 context = yaml .safe_load (f )
396391
397- context ["source_path" ] = os . path . dirname ( config_fname )
392+ context ["source_path" ] = config_fname . parent
398393 context .update (kwargs )
399394
400395 preprocessors = (
@@ -409,14 +404,13 @@ def get_context(config_fname: str, **kwargs):
409404 return context
410405
411406
412- def get_source_files (source_path : str ) -> typing .Generator [str , None , None ]:
407+ def get_source_files (source_path : pathlib . Path ) -> typing .Generator [str , None , None ]:
413408 """
414409 Generate the list of files present in the source directory.
415410 """
416- for root , dirs , fnames in os .walk (source_path ):
417- root_rel_path = os .path .relpath (root , source_path )
418- for fname in fnames :
419- yield os .path .join (root_rel_path , fname )
411+ for path in source_path .rglob ("*" ):
412+ if path .is_file ():
413+ yield path .relative_to (source_path )
420414
421415
422416def extend_base_template (content : str , base_template : str ) -> str :
@@ -432,26 +426,27 @@ def extend_base_template(content: str, base_template: str) -> str:
432426
433427
434428def main (
435- source_path : str ,
436- target_path : str ,
429+ source_path : pathlib . Path ,
430+ target_path : pathlib . Path ,
437431) -> int :
438432 """
439433 Copy every file in the source directory to the target directory.
440434
441435 For ``.md`` and ``.html`` files, render them with the context
442436 before copying them. ``.md`` files are transformed to HTML.
443437 """
438+
444439 # Sanity check: validate that versions.json is valid JSON
445- versions_path = os . path . join ( source_path , "versions.json" )
446- with open (versions_path , encoding = "utf-8" ) as f :
440+ versions_path = source_path / "versions.json"
441+ with versions_path . open (encoding = "utf-8" ) as f :
447442 try :
448443 json .load (f )
449444 except json .JSONDecodeError as e :
450445 raise RuntimeError (
451446 f"Invalid versions.json: { e } . Ensure it is valid JSON."
452447 ) from e
453448
454- config_fname = os . path . join ( source_path , "config.yml" )
449+ config_fname = source_path / "config.yml"
455450
456451 shutil .rmtree (target_path , ignore_errors = True )
457452 os .makedirs (target_path , exist_ok = True )
@@ -460,23 +455,22 @@ def main(
460455 context = get_context (config_fname , target_path = target_path )
461456 sys .stderr .write ("Context generated\n " )
462457
463- templates_path = os . path . join ( source_path , context ["main" ]["templates_path" ])
458+ templates_path = source_path / context ["main" ]["templates_path" ]
464459 jinja_env = jinja2 .Environment (loader = jinja2 .FileSystemLoader (templates_path ))
465460
466461 for fname in get_source_files (source_path ):
467- if os . path . normpath ( fname ) in context ["main" ]["ignore" ]:
462+ if fname . as_posix ( ) in context ["main" ]["ignore" ]:
468463 continue
469-
470464 sys .stderr .write (f"Processing { fname } \n " )
471- dirname = os . path . dirname ( fname )
472- os . makedirs ( os . path . join ( target_path , dirname ), exist_ok = True )
465+ dirname = fname . parent
466+ ( target_path / dirname ). mkdir ( parents = True , exist_ok = True )
473467
474- extension = os . path . splitext ( fname )[ - 1 ]
468+ extension = fname . suffix
475469 if extension in (".html" , ".md" ):
476- with open ( os . path . join ( source_path , fname ), encoding = "utf-8" ) as f :
470+ with ( source_path / fname ). open ( encoding = "utf-8" ) as f :
477471 content = f .read ()
478472 if extension == ".md" :
479- if "pdeps/" in fname :
473+ if len ( fname . parts ) > 1 and fname . parts [ 1 ] == "pdeps" :
480474 from markdown .extensions .toc import TocExtension
481475
482476 body = markdown .markdown (
@@ -503,17 +497,13 @@ def main(
503497 # Python-Markdown doesn't let us config table attributes by hand
504498 body = body .replace ("<table>" , '<table class="table table-bordered">' )
505499 content = extend_base_template (body , context ["main" ]["base_template" ])
506- context ["base_url" ] = "" . join ([ "../" ] * os . path . normpath ( fname ). count ( "/" ) )
500+ context ["base_url" ] = "../" * ( len ( fname . parents ) - 1 )
507501 content = jinja_env .from_string (content ).render (** context )
508- fname_html = os .path .splitext (fname )[0 ] + ".html"
509- with open (
510- os .path .join (target_path , fname_html ), "w" , encoding = "utf-8"
511- ) as f :
502+ fname_html = fname .with_suffix (".html" ).name
503+ with (target_path / dirname / fname_html ).open ("w" , encoding = "utf-8" ) as f :
512504 f .write (content )
513505 else :
514- shutil .copy (
515- os .path .join (source_path , fname ), os .path .join (target_path , dirname )
516- )
506+ shutil .copy (source_path / fname , target_path / fname )
517507
518508
519509if __name__ == "__main__" :
@@ -525,4 +515,4 @@ def main(
525515 "--target-path" , default = "build" , help = "directory where to write the output"
526516 )
527517 args = parser .parse_args ()
528- sys .exit (main (args .source_path , args .target_path ))
518+ sys .exit (main (pathlib . Path ( args .source_path ), pathlib . Path ( args .target_path ) ))
0 commit comments