def make_character_sheet( char_file: Union[str, Path], character: Optional[Character] = None, flatten: bool = False, output_format: str = "pdf", fancy_decorations: bool = False, debug: bool = False, use_tex_template: bool = False, ): """Prepare a PDF character sheet from the given character file. Parameters ---------- basename The basename for saving files (PDFs, etc). character If provided, will not load from the character file, just use file for PDF name flatten If true, the resulting PDF will look better and won't be fillable form. output_format Either "pdf" or "epub" to generate a PDF file or an EPUB file. fancy_decorations Use fancy page layout and decorations for extra sheets, namely the dnd style file: https://github.com/rpgtex/DND-5e-LaTeX-Template. debug Provide extra info and preserve temporary files. """ # Load properties from file if character is None: character_props = readers.read_sheet_file(char_file) character = _char.Character.load(character_props) # Load image file if present portrait_file = "" if character.portrait: portrait_file = char_file.stem + ".jpeg" # Set the fields in the FDF basename = char_file.stem char_base = basename + "_char" person_base = basename + "_person" sheets = [char_base + ".pdf"] pages = [] # Prepare the tex/html content content_suffix = format_suffixes[output_format] # Create a list of features and magic items content = make_character_content(character=character, content_format=content_suffix, fancy_decorations=fancy_decorations) # Typeset combined LaTeX file if output_format == "pdf": if use_tex_template: msavage_sheet(character=character, basename=char_base, portrait_file=portrait_file, debug=debug) # Fillable PDF forms else: sheets.append(person_base + ".pdf") char_pdf = create_character_pdf_template(character=character, basename=char_base, flatten=flatten) pages.append(char_pdf) person_pdf = create_personality_pdf_template( character=character, basename=person_base, portrait_file=portrait_file, flatten=flatten) pages.append(person_pdf) if character.is_spellcaster and not (use_tex_template): # Create spell sheet spell_base = "{:s}_spells".format(basename) create_spells_pdf_template(character=character, basename=spell_base, flatten=flatten) sheets.append(spell_base + ".pdf") # Combined with additional LaTeX pages with detailed character info features_base = "{:s}_features".format(basename) try: if len(content) > 2: latex.create_latex_pdf( tex="".join(content), basename=features_base, keep_temp_files=debug, use_dnd_decorations=fancy_decorations, ) sheets.append(features_base + ".pdf") final_pdf = f"{basename}.pdf" merge_pdfs(sheets, final_pdf, clean_up=not (debug)) except exceptions.LatexNotFoundError: log.warning( f"``pdflatex`` not available. Skipping features for {character.name}" ) elif output_format == "epub": epub.create_epub( chapters={character.name: "".join(content)}, basename=basename, title=character.name, use_dnd_decorations=fancy_decorations, ) else: raise exceptions.UnknownOutputFormat( f"Unknown output format requested: {output_format}. Valid options are:" " 'pdf', 'epub'")
def make_character_sheet( basename: str, character_props: Mapping, character: Character = None, flatten: bool = False, fancy_decorations: bool = False, debug: bool = False, ): """Prepare a PDF character sheet from the given character file. Parameters ---------- basename The basename for saving files (PDFs, etc). character_props Properties to load character from. character If provided, will not load from the character file, just use file for PDF name flatten If true, the resulting PDF will look better and won't be fillable form. fancy_decorations Use fancy page layout and decorations for extra sheets, namely the dnd style file: https://github.com/rpgtex/DND-5e-LaTeX-Template. debug Provide extra info and preserve temporary files. """ if character is None: character = _char.Character.load(character_props) # Set the fields in the FDF char_base = basename + "_char" sheets = [char_base + ".pdf"] pages = [] tex = [ jinja_env.get_template("preamble.tex").render( use_dnd_decorations=fancy_decorations, title="Features, Magical Items and Spells", ) ] # Start of PDF gen char_pdf = create_character_pdf_template( character=character, basename=char_base, flatten=flatten ) pages.append(char_pdf) if character.is_spellcaster: # Create spell sheet spell_base = "{:s}_spells".format(basename) create_spells_pdf_template( character=character, basename=spell_base, flatten=flatten ) sheets.append(spell_base + ".pdf") # end of PDF gen features_base = "{:s}_features".format(basename) # Create a list of subcasses if character.subclasses: tex.append( create_subclasses_tex(character, use_dnd_decorations=fancy_decorations) ) # Create a list of features if character.features: tex.append( create_features_tex(character, use_dnd_decorations=fancy_decorations) ) if character.magic_items: tex.append( create_magic_items_tex(character, use_dnd_decorations=fancy_decorations) ) # Create a list of spells if character.is_spellcaster: tex.append( create_spellbook_tex(character, use_dnd_decorations=fancy_decorations) ) # Create a list of Artificer infusions if getattr(character, "infusions", []): tex.append( create_infusions_tex(character, use_dnd_decorations=fancy_decorations) ) # Create a list of Druid wild_shapes if getattr(character, "wild_shapes", []): tex.append( create_druid_shapes_tex(character, use_dnd_decorations=fancy_decorations) ) tex.append( jinja_env.get_template("postamble.tex").render( use_dnd_decorations=fancy_decorations ) ) # Typeset combined LaTeX file try: if len(tex) > 2: latex.create_latex_pdf( tex="".join(tex), basename=features_base, keep_temp_files=debug, use_dnd_decorations=fancy_decorations, ) sheets.append(features_base + ".pdf") final_pdf = f"{basename}.pdf" merge_pdfs(sheets, final_pdf, clean_up=True) except exceptions.LatexNotFoundError: log.warning( f"``pdflatex`` not available. Skipping features for {character.name}" )