Add setfont utility.
This commit is contained in:
parent
6826aa15b7
commit
621ced7b22
1 changed files with 85 additions and 0 deletions
85
epubfile.py
85
epubfile.py
|
@ -1402,6 +1402,8 @@ The simple python .epub scripting tool.
|
||||||
|
|
||||||
{normalize}
|
{normalize}
|
||||||
|
|
||||||
|
{setfont}
|
||||||
|
|
||||||
TO SEE DETAILS ON EACH COMMAND, RUN
|
TO SEE DETAILS ON EACH COMMAND, RUN
|
||||||
> epubfile.py <command>
|
> epubfile.py <command>
|
||||||
'''
|
'''
|
||||||
|
@ -1488,6 +1490,16 @@ normalize:
|
||||||
|
|
||||||
> epubfile.py normalize book.epub
|
> epubfile.py normalize book.epub
|
||||||
'''.strip(),
|
'''.strip(),
|
||||||
|
|
||||||
|
setfont='''
|
||||||
|
setfont:
|
||||||
|
Set the font for every page in the whole book.
|
||||||
|
|
||||||
|
A stylesheet called epubfile_setfont.css will be created that sets
|
||||||
|
* { font-family: ... !important } with a font file of your choice.
|
||||||
|
|
||||||
|
> epubfile.py setfont book.epub font.ttf
|
||||||
|
'''.strip(),
|
||||||
)
|
)
|
||||||
|
|
||||||
DOCSTRING = betterhelp.add_previews(DOCSTRING, SUB_DOCSTRINGS)
|
DOCSTRING = betterhelp.add_previews(DOCSTRING, SUB_DOCSTRINGS)
|
||||||
|
@ -1692,6 +1704,74 @@ def normalize_argparse(args):
|
||||||
book.move_nav_to_end()
|
book.move_nav_to_end()
|
||||||
book.save(epub)
|
book.save(epub)
|
||||||
|
|
||||||
|
def setfont_argparse(args):
|
||||||
|
book = Epub(args.epub)
|
||||||
|
|
||||||
|
css_id = 'epubfile_setfont'
|
||||||
|
css_basename = 'epubfile_setfont.css'
|
||||||
|
|
||||||
|
try:
|
||||||
|
book.assert_id_not_exists(css_id)
|
||||||
|
except IDExists:
|
||||||
|
if not getpermission.getpermission(f'Overwrite {css_id}?'):
|
||||||
|
return
|
||||||
|
book.delete_file(css_id)
|
||||||
|
|
||||||
|
font = pathclass.Path(args.font)
|
||||||
|
|
||||||
|
for existing_font in book.get_fonts():
|
||||||
|
font_path = book.get_filepath(existing_font)
|
||||||
|
if font_path.basename == font.basename:
|
||||||
|
font_id = existing_font
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
font_id = book.easy_add_file(font)
|
||||||
|
font_path = book.get_filepath(font_id)
|
||||||
|
|
||||||
|
# The font_path may have come from an existing font in the book, so we have
|
||||||
|
# no guarantees about its path layout. The css file, however, is definitely
|
||||||
|
# going to be inside OEBPS/Styles since we're the ones creating it.
|
||||||
|
# So, we should be getting the correct number of .. in the relative path.
|
||||||
|
family = font_path.basename
|
||||||
|
relative = font_path.relative_to(book.opf_filepath.parent.with_child('Styles'))
|
||||||
|
|
||||||
|
css = f'''
|
||||||
|
@font-face {{
|
||||||
|
font-family: '{family}';
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
src: url("{relative}");
|
||||||
|
}}
|
||||||
|
|
||||||
|
* {{
|
||||||
|
font-family: '{family}' !important;
|
||||||
|
}}
|
||||||
|
'''
|
||||||
|
|
||||||
|
book.add_file(
|
||||||
|
id=css_id,
|
||||||
|
basename=css_basename,
|
||||||
|
content=css,
|
||||||
|
)
|
||||||
|
css_path = book.get_filepath(css_id)
|
||||||
|
|
||||||
|
for text_id in book.get_texts():
|
||||||
|
text_path = book.get_filepath(text_id)
|
||||||
|
relative = css_path.relative_to(text_path)
|
||||||
|
soup = book.read_file(text_id, soup=True)
|
||||||
|
head = soup.head
|
||||||
|
if head.find('link', {'id': css_id}):
|
||||||
|
continue
|
||||||
|
link = soup.new_tag('link')
|
||||||
|
link['id'] = css_id
|
||||||
|
link['href'] = css_path.relative_to(text_path.parent)
|
||||||
|
link['rel'] = 'stylesheet'
|
||||||
|
link['type'] = 'text/css'
|
||||||
|
head.append(link)
|
||||||
|
book.write_file(text_id, soup)
|
||||||
|
|
||||||
|
book.save(args.epub)
|
||||||
|
|
||||||
def main(argv):
|
def main(argv):
|
||||||
parser = argparse.ArgumentParser(description=__doc__)
|
parser = argparse.ArgumentParser(description=__doc__)
|
||||||
subparsers = parser.add_subparsers()
|
subparsers = parser.add_subparsers()
|
||||||
|
@ -1732,6 +1812,11 @@ def main(argv):
|
||||||
p_normalize.add_argument('epubs', nargs='+', default=[])
|
p_normalize.add_argument('epubs', nargs='+', default=[])
|
||||||
p_normalize.set_defaults(func=normalize_argparse)
|
p_normalize.set_defaults(func=normalize_argparse)
|
||||||
|
|
||||||
|
p_setfont = subparsers.add_parser('setfont')
|
||||||
|
p_setfont.add_argument('epub')
|
||||||
|
p_setfont.add_argument('font')
|
||||||
|
p_setfont.set_defaults(func=setfont_argparse)
|
||||||
|
|
||||||
return betterhelp.subparser_main(
|
return betterhelp.subparser_main(
|
||||||
argv,
|
argv,
|
||||||
parser,
|
parser,
|
||||||
|
|
Loading…
Reference in a new issue