Compare commits
2 commits
6913498941
...
e3772d63a3
Author | SHA1 | Date | |
---|---|---|---|
|
e3772d63a3 | ||
|
e48dec20a3 |
3 changed files with 81 additions and 56 deletions
|
@ -1,30 +1,35 @@
|
||||||
import json
|
import json
|
||||||
|
|
||||||
class DataRange():
|
|
||||||
|
class DataRange:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.start = ""
|
self.start = ""
|
||||||
self.end = ""
|
self.end = ""
|
||||||
|
|
||||||
class Address():
|
|
||||||
|
class Address:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.region = ""
|
self.region = ""
|
||||||
self.country = ""
|
self.country = ""
|
||||||
|
|
||||||
class Organisation():
|
|
||||||
|
class Organisation:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.name = ""
|
self.name = ""
|
||||||
self.address = Address()
|
self.address = Address()
|
||||||
|
|
||||||
class CvPosition():
|
|
||||||
|
class CvPosition:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.role = ""
|
self.role = ""
|
||||||
self.organisation = Organisation()
|
self.organisation = Organisation()
|
||||||
self.date_range = DateRange()
|
self.date_range = DateRange()
|
||||||
|
|
||||||
|
|
||||||
class AcademicEnrolement(CvPosition):
|
class AcademicEnrolement(CvPosition):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
@ -32,7 +37,8 @@ class AcademicEnrolement(CvPosition):
|
||||||
self.program = ""
|
self.program = ""
|
||||||
self.grade = ""
|
self.grade = ""
|
||||||
|
|
||||||
class Award():
|
|
||||||
|
class Award:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.year = ""
|
self.year = ""
|
||||||
|
@ -40,18 +46,21 @@ class Award():
|
||||||
self.title = ""
|
self.title = ""
|
||||||
self.event = ""
|
self.event = ""
|
||||||
|
|
||||||
class CvSection():
|
|
||||||
|
class CvSection:
|
||||||
|
|
||||||
def __init__():
|
def __init__():
|
||||||
self.title = ""
|
self.title = ""
|
||||||
|
|
||||||
|
|
||||||
class CvRoles(CvSection):
|
class CvRoles(CvSection):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.roles = []
|
self.roles = []
|
||||||
|
|
||||||
class Author():
|
|
||||||
|
class Author:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.first_name = ""
|
self.first_name = ""
|
||||||
|
@ -60,27 +69,31 @@ class Author():
|
||||||
self.orcid = ""
|
self.orcid = ""
|
||||||
self.website = ""
|
self.website = ""
|
||||||
|
|
||||||
class Event():
|
|
||||||
|
class Event:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.title = ""
|
self.title = ""
|
||||||
self.address = Address()
|
self.address = Address()
|
||||||
self.date = ""
|
self.date = ""
|
||||||
|
|
||||||
class BibliographicItem():
|
|
||||||
|
class BibliographicItem:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.authors = []
|
self.authors = []
|
||||||
self.title = []
|
self.title = []
|
||||||
|
|
||||||
class TeachingRole():
|
|
||||||
|
class TeachingRole:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.title = ""
|
self.title = ""
|
||||||
self.course = ""
|
self.course = ""
|
||||||
self.institute = Organisation()
|
self.institute = Organisation()
|
||||||
|
|
||||||
class Cv():
|
|
||||||
|
class Cv:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.sections: list[CvSection] = []
|
self.sections: list[CvSection] = []
|
||||||
|
|
|
@ -3,14 +3,17 @@ import argparse
|
||||||
import logging
|
import logging
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from .site_generator import SiteGenerator
|
from .site_generator import generate, Config
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
def generate(source_dir:Path, build_dir: Path):
|
|
||||||
|
|
||||||
generator = SiteGenerator(source_dir, build_dir)
|
def cli_generate(source_dir: Path, build_dir: Path):
|
||||||
generator.run()
|
|
||||||
|
config = Config(source_dir.resolve(), build_dir.resolve())
|
||||||
|
|
||||||
|
generate(config)
|
||||||
|
|
||||||
|
|
||||||
def main_cli():
|
def main_cli():
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
|
@ -20,11 +23,12 @@ def main_cli():
|
||||||
help="Path to the build output",
|
help="Path to the build output",
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"--source_dir", type=Path, default=Path(),
|
"--source_dir", type=Path, default=Path(), help="Site source directory"
|
||||||
help="Site source directory")
|
)
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
generate(args.source_dir, args.build_dir)
|
cli_generate(args.source_dir, args.build_dir)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main_cli()
|
main_cli()
|
||||||
|
|
|
@ -1,51 +1,59 @@
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
|
from dataclasses import dataclass
|
||||||
|
|
||||||
from markdown_it import MarkdownIt
|
from markdown_it import MarkdownIt
|
||||||
|
|
||||||
class SiteGenerator():
|
|
||||||
|
|
||||||
def __init__(self, source_dir: Path,
|
@dataclass(frozen=True)
|
||||||
build_dir: Path):
|
class Config:
|
||||||
self.source_dir = source_dir.resolve()
|
source_dir: Path
|
||||||
self.build_dir = build_dir.resolve()
|
build_dir: Path
|
||||||
self.parser = MarkdownIt()
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
|
|
||||||
header_src = ""
|
|
||||||
footer_src = ""
|
|
||||||
|
|
||||||
header_path = self.source_dir / "templates/header.html"
|
|
||||||
footer_path = self.source_dir / "templates/footer.html"
|
|
||||||
if header_path.exists():
|
|
||||||
with open(header_path, 'r', encoding='utf-8') as f:
|
|
||||||
header_src = f.read()
|
|
||||||
|
|
||||||
if footer_path.exists():
|
|
||||||
with open(footer_path, 'r', encoding='utf-8') as f:
|
|
||||||
footer_src = f.read()
|
|
||||||
|
|
||||||
static_dir = self.source_dir / "static"
|
|
||||||
build_static_dir = self.build_dir / "static"
|
|
||||||
if static_dir.exists():
|
|
||||||
|
|
||||||
if build_static_dir.exists():
|
|
||||||
shutil.rmtree(build_static_dir)
|
|
||||||
|
|
||||||
shutil.copytree(static_dir, self.build_dir / "static")
|
|
||||||
|
|
||||||
for md_file in self.source_dir.glob('**/*.md'):
|
|
||||||
with open(md_file, 'r', encoding='utf-8') as f:
|
|
||||||
md_src = f.read()
|
|
||||||
|
|
||||||
md_dir = md_file.parent.relative_to(self.source_dir)
|
|
||||||
html_path = self.build_dir / md_dir / (str(md_file.stem) + ".html")
|
|
||||||
os.makedirs(html_path.parent, exist_ok=True)
|
|
||||||
|
|
||||||
html_src = self.parser.render(md_src)
|
|
||||||
with open(html_path, 'w', encoding='utf-8') as f:
|
|
||||||
f.write(header_src + html_src + footer_src)
|
|
||||||
|
|
||||||
|
|
||||||
|
def _read_if_exists(path: Path) -> str:
|
||||||
|
if path.exists():
|
||||||
|
with open(path, "r", encoding="utf-8") as f:
|
||||||
|
return f.read()
|
||||||
|
return ""
|
||||||
|
|
||||||
|
|
||||||
|
def _replace_content(src: Path, dst: Path):
|
||||||
|
if src.exists():
|
||||||
|
if dst.exists():
|
||||||
|
shutil.rmtree(dst)
|
||||||
|
shutil.copytree(src, dst)
|
||||||
|
|
||||||
|
|
||||||
|
def _write_file(path: Path, content: str):
|
||||||
|
os.makedirs(path.parent, exist_ok=True)
|
||||||
|
with open(path, "w", encoding="utf-8") as f:
|
||||||
|
f.write(content)
|
||||||
|
|
||||||
|
|
||||||
|
def _read_file(path: Path) -> str:
|
||||||
|
with open(path, "r", encoding="utf-8") as f:
|
||||||
|
return f.read()
|
||||||
|
|
||||||
|
|
||||||
|
def generate(config: Config):
|
||||||
|
|
||||||
|
static_dir = config.source_dir / "static"
|
||||||
|
build_static_dir = config.build_dir / "static"
|
||||||
|
_replace_content(static_dir, build_static_dir)
|
||||||
|
|
||||||
|
template_dir = config.source_dir / "templates"
|
||||||
|
header = _read_if_exists(template_dir / "header.html")
|
||||||
|
footer = _read_if_exists(template_dir / "footer.html")
|
||||||
|
|
||||||
|
parser = MarkdownIt()
|
||||||
|
sources = config.source_dir.glob("**/*.md")
|
||||||
|
|
||||||
|
for source in sources:
|
||||||
|
source_dir = source.parent.relative_to(config.source_dir)
|
||||||
|
output_path = config.build_dir / source_dir / (str(source.stem) + ".html")
|
||||||
|
|
||||||
|
content = _read_file(source)
|
||||||
|
output = parser.render(content)
|
||||||
|
_write_file(output_path, header + output + footer)
|
||||||
|
|
Loading…
Reference in a new issue