mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-06-23 15:30:45 -04:00
Add support for _SECTION_ in templates
This commit is contained in:
parent
4e3e0f8461
commit
93b5adacdb
@ -791,7 +791,7 @@ def test_merge_fonts():
|
|||||||
PAGE_NUMBER_TEMPLATE = '<footer><div style="margin: auto">_PAGENUM_</div></footer>'
|
PAGE_NUMBER_TEMPLATE = '<footer><div style="margin: auto">_PAGENUM_</div></footer>'
|
||||||
|
|
||||||
|
|
||||||
def add_header_footer(manager, opts, pdf_doc, container, page_number_display_map, page_layout, page_margins_map, pdf_metadata, report_progress):
|
def add_header_footer(manager, opts, pdf_doc, container, page_number_display_map, page_layout, page_margins_map, pdf_metadata, report_progress, toc=None):
|
||||||
header_template, footer_template = opts.pdf_header_template, opts.pdf_footer_template
|
header_template, footer_template = opts.pdf_header_template, opts.pdf_footer_template
|
||||||
if not footer_template and opts.pdf_page_numbers:
|
if not footer_template and opts.pdf_page_numbers:
|
||||||
footer_template = PAGE_NUMBER_TEMPLATE
|
footer_template = PAGE_NUMBER_TEMPLATE
|
||||||
@ -801,6 +801,7 @@ def add_header_footer(manager, opts, pdf_doc, container, page_number_display_map
|
|||||||
name = create_skeleton(container)
|
name = create_skeleton(container)
|
||||||
root = container.parsed(name)
|
root = container.parsed(name)
|
||||||
body = root[-1]
|
body = root[-1]
|
||||||
|
body.attrib.pop('id', None)
|
||||||
body.set('style', 'margin: 0; padding: 0; border-width: 0')
|
body.set('style', 'margin: 0; padding: 0; border-width: 0')
|
||||||
skeleton = xml2text(root, method='html')
|
skeleton = xml2text(root, method='html')
|
||||||
job = job_for_name(container, name, Margins(0, 0, 0, 0), page_layout)
|
job = job_for_name(container, name, Margins(0, 0, 0, 0), page_layout)
|
||||||
@ -828,6 +829,43 @@ def add_header_footer(manager, opts, pdf_doc, container, page_number_display_map
|
|||||||
}}
|
}}
|
||||||
'''.format(justify=justify)))
|
'''.format(justify=justify)))
|
||||||
|
|
||||||
|
def create_toc_stack(iterator):
|
||||||
|
ans = []
|
||||||
|
for level, child in iterator:
|
||||||
|
pdf_loc = getattr(child, 'pdf_loc', None)
|
||||||
|
if pdf_loc is not None and pdf_loc.pagenum > 0:
|
||||||
|
ans.append((level, pdf_loc.pagenum, child.title))
|
||||||
|
return ans
|
||||||
|
|
||||||
|
def stack_to_map(stack):
|
||||||
|
ans = []
|
||||||
|
stack_pos = 0
|
||||||
|
current, page_for_current, level_for_current = '', -1, -1
|
||||||
|
stack_len = len(stack)
|
||||||
|
for page in range(1, pdf_doc.page_count() + 1):
|
||||||
|
while stack_pos < stack_len:
|
||||||
|
level, pagenum, title = stack[stack_pos]
|
||||||
|
if pagenum != page:
|
||||||
|
break
|
||||||
|
if pagenum != page_for_current or level > level_for_current:
|
||||||
|
page_for_current = pagenum
|
||||||
|
level_for_current = level
|
||||||
|
current = title
|
||||||
|
stack_pos += 1
|
||||||
|
ans.append(current)
|
||||||
|
return ans
|
||||||
|
|
||||||
|
if toc is None:
|
||||||
|
page_toc_map = stack_to_map(())
|
||||||
|
toplevel_toc_map = stack_to_map(())
|
||||||
|
else:
|
||||||
|
page_toc_map = stack_to_map(create_toc_stack(toc.iterdescendants(level=0)))
|
||||||
|
|
||||||
|
def tc():
|
||||||
|
for x in toc:
|
||||||
|
yield 0, x
|
||||||
|
toplevel_toc_map = stack_to_map(create_toc_stack(tc()))
|
||||||
|
|
||||||
def create_iframe(margins, f, is_footer=False):
|
def create_iframe(margins, f, is_footer=False):
|
||||||
style = {
|
style = {
|
||||||
'margin-left': '{}pt'.format(margins.left),
|
'margin-left': '{}pt'.format(margins.left),
|
||||||
@ -840,15 +878,17 @@ def add_header_footer(manager, opts, pdf_doc, container, page_number_display_map
|
|||||||
)
|
)
|
||||||
|
|
||||||
def format_template(template, page_num):
|
def format_template(template, page_num):
|
||||||
# TODO: _SECTION_ and _TOP_LEVEL_SECTION_
|
|
||||||
template = template.replace('_PAGENUM_', unicode_type(page_number_display_map[page_num]))
|
|
||||||
extra_style = 'header, footer { margin: 0; padding: 0; border-width: 0; height: 100vh; display: flex; align-items: center }'
|
extra_style = 'header, footer { margin: 0; padding: 0; border-width: 0; height: 100vh; display: flex; align-items: center }'
|
||||||
if page_num % 2:
|
if page_num % 2:
|
||||||
extra_style += '.even_page { display: none }'
|
extra_style += '.even_page { display: none }'
|
||||||
else:
|
else:
|
||||||
extra_style += '.odd_page { display: none }'
|
extra_style += '.odd_page { display: none }'
|
||||||
|
|
||||||
|
template = template.replace('_PAGENUM_', unicode_type(page_number_display_map[page_num]))
|
||||||
template = template.replace('_TITLE_', prepare_string_for_xml(pdf_metadata.title, True))
|
template = template.replace('_TITLE_', prepare_string_for_xml(pdf_metadata.title, True))
|
||||||
template = template.replace('_AUTHOR_', prepare_string_for_xml(pdf_metadata.author, True))
|
template = template.replace('_AUTHOR_', prepare_string_for_xml(pdf_metadata.author, True))
|
||||||
|
template = template.replace('_TOP_LEVEL_SECTION_', prepare_string_for_xml(toplevel_toc_map[page_num - 1]))
|
||||||
|
template = template.replace('_SECTION_', prepare_string_for_xml(page_toc_map[page_num - 1]))
|
||||||
template += '<style>{}</style>'.format(extra_style)
|
template += '<style>{}</style>'.format(extra_style)
|
||||||
repl = skeleton.replace('</body>', template + '</body>', 1)
|
repl = skeleton.replace('</body>', template + '</body>', 1)
|
||||||
if repl == skeleton:
|
if repl == skeleton:
|
||||||
@ -937,13 +977,17 @@ def convert(opf_path, opts, metadata=None, output_path=None, log=default_log, co
|
|||||||
report_progress(0.75, _('Added links to PDF content'))
|
report_progress(0.75, _('Added links to PDF content'))
|
||||||
|
|
||||||
pdf_metadata = PDFMetadata(metadata)
|
pdf_metadata = PDFMetadata(metadata)
|
||||||
add_header_footer(manager, opts, pdf_doc, container, page_number_display_map, page_layout, page_margins_map, pdf_metadata, report_progress)
|
add_header_footer(
|
||||||
|
manager, opts, pdf_doc, container,
|
||||||
|
page_number_display_map, page_layout, page_margins_map,
|
||||||
|
pdf_metadata, report_progress, toc if has_toc else None)
|
||||||
|
|
||||||
merge_fonts(pdf_doc)
|
merge_fonts(pdf_doc)
|
||||||
num_removed = dedup_type3_fonts(pdf_doc)
|
num_removed = dedup_type3_fonts(pdf_doc)
|
||||||
if num_removed:
|
if num_removed:
|
||||||
log('Removed', num_removed, 'duplicated Type3 glyphs')
|
log('Removed', num_removed, 'duplicated Type3 glyphs')
|
||||||
|
|
||||||
|
# TODO: Add a url interceptor to ensure nothing outside the container is read
|
||||||
# TODO: dedup images
|
# TODO: dedup images
|
||||||
# TODO: Support for mathematics
|
# TODO: Support for mathematics
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user