Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Weird bug with WeasyPrint 60.0 #1973

Closed
kesara opened this issue Sep 28, 2023 · 5 comments
Closed

Weird bug with WeasyPrint 60.0 #1973

kesara opened this issue Sep 28, 2023 · 5 comments
Labels
crash Problems preventing documents from being rendered

Comments

@kesara
Copy link
Contributor

kesara commented Sep 28, 2023

This is a weird bug because this happens when certain conditions are met.
This is the bare minimum, that I could construct to replicate the bug.
Sample HTML:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>WeasyPrint test</title>
    <style>
      p {float: left;}
    </style>
  </head>
  <body>
    <p>foobar</p>
    <pre>€
    </pre>
  </body>
</html>

Error:

$ weasyprint --version
WeasyPrint version 60.0

$ weasyprint -d -v test-wp.html test-wp.pdf
INFO: Step 1 - Fetching and parsing HTML - test-wp.html
INFO: Step 2 - Fetching and parsing CSS - CSS string
INFO: Step 3 - Applying CSS
INFO: Step 4 - Creating formatting structure
INFO: Step 5 - Creating layout - Page 1
Traceback (most recent call last):
  File "/Users/kesara/lab/xml2rfc/venv/bin/weasyprint", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/__main__.py", line 216, in main
    html.write_pdf(output, **options)
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/__init__.py", line 252, in write_pdf
    self.render(font_config, counter_style, **options)
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/__init__.py", line 209, in render
    return Document._render(self, font_config, counter_style, options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/document.py", line 270, in _render
    [Page(page_box) for page_box in page_boxes],
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/document.py", line 270, in <listcomp>
    [Page(page_box) for page_box in page_boxes],
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/__init__.py", line 130, in layout_document
    pages = list(make_all_pages(context, root_box, html, pages))
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/page.py", line 912, in make_all_pages
    page, resume_at = remake_page(i, context, root_box, html)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/page.py", line 848, in remake_page
    page, resume_at, next_page = make_page(
                                 ^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/page.py", line 646, in make_page
    root_box, resume_at, next_page, _, _, _ = block_level_layout(
                                              ^^^^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/block.py", line 59, in block_level_layout
    return block_level_layout_switch(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/block.py", line 75, in block_level_layout_switch
    return block_box_layout(
           ^^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/block.py", line 120, in block_box_layout
    result = block_container_layout(
             ^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/block.py", line 693, in block_container_layout
    next_page, new_children, new_max_lines) = _in_flow_layout(
                                              ^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/block.py", line 486, in _in_flow_layout
    collapsing_through, max_lines) = block_level_layout(
                                     ^^^^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/block.py", line 59, in block_level_layout
    return block_level_layout_switch(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/block.py", line 75, in block_level_layout_switch
    return block_box_layout(
           ^^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/block.py", line 120, in block_box_layout
    result = block_container_layout(
             ^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/block.py", line 693, in block_container_layout
    next_page, new_children, new_max_lines) = _in_flow_layout(
                                              ^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/block.py", line 486, in _in_flow_layout
    collapsing_through, max_lines) = block_level_layout(
                                     ^^^^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/block.py", line 59, in block_level_layout
    return block_level_layout_switch(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/block.py", line 75, in block_level_layout_switch
    return block_box_layout(
           ^^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/block.py", line 120, in block_box_layout
    result = block_container_layout(
             ^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/block.py", line 682, in block_container_layout
    new_footnotes, max_lines) = _linebox_layout(
                                ^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/block.py", line 323, in _linebox_layout
    for i, (line, resume_at) in enumerate(lines_iterator):
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/inline.py", line 38, in iter_line_boxes
    line, resume_at = get_next_linebox(
                      ^^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/inline.py", line 68, in get_next_linebox
    linebox.width = inline_min_content_width(
                    ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/preferred.py", line 200, in inline_min_content_width
    width = next(widths) if first_line else max(widths)
            ^^^^^^^^^^^^
  File "/Users/kesara/lab/xml2rfc/venv/lib/python3.11/site-packages/weasyprint/layout/preferred.py", line 312, in inline_line_widths
    child_text[resume_index:].decode(), child.style,
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xac in position 0: invalid start byte

This seemed to be caused by 0a03e3d

@Stanislasss
Copy link

Same here with:

documentation-wiki-1  | INFO:weasyprint.progress:Step 5 - Creating layout - Page 4
documentation-wiki-1  | Traceback (most recent call last):
documentation-wiki-1  |   File "/usr/local/bin/mkdocs", line 8, in <module>
documentation-wiki-1  |     sys.exit(cli())
documentation-wiki-1  |              ^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
documentation-wiki-1  |     return self.main(*args, **kwargs)
documentation-wiki-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1078, in main
documentation-wiki-1  |     rv = self.invoke(ctx)
documentation-wiki-1  |          ^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1688, in invoke
documentation-wiki-1  |     return _process_result(sub_ctx.command.invoke(sub_ctx))
documentation-wiki-1  |                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1434, in invoke
documentation-wiki-1  |     return ctx.invoke(self.callback, **ctx.params)
documentation-wiki-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/click/core.py", line 783, in invoke
documentation-wiki-1  |     return __callback(*args, **kwargs)
documentation-wiki-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/mkdocs/__main__.py", line 270, in serve_command
documentation-wiki-1  |     serve.serve(**kwargs)
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/mkdocs/commands/serve.py", line 86, in serve
documentation-wiki-1  |     builder(config)
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/mkdocs/commands/serve.py", line 67, in builder
documentation-wiki-1  |     build(config, live_server=None if is_clean else server, dirty=is_dirty)
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/mkdocs/commands/build.py", line 354, in build
documentation-wiki-1  |     config.plugins.on_post_build(config=config)
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/mkdocs/plugins.py", line 542, in on_post_build
documentation-wiki-1  |     return self.run_event('post_build', config=config)
documentation-wiki-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/mkdocs/plugins.py", line 509, in run_event
documentation-wiki-1  |     result = method(**kwargs)
documentation-wiki-1  |              ^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/mkdocs_with_pdf/plugin.py", line 135, in on_post_build
documentation-wiki-1  |     self.generator.on_post_build(config, self.config['output_path'])
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/mkdocs_with_pdf/generator.py", line 151, in on_post_build
documentation-wiki-1  |     render = html.render()
documentation-wiki-1  |              ^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/__init__.py", line 209, in render
documentation-wiki-1  |     return Document._render(self, font_config, counter_style, options)
documentation-wiki-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/document.py", line 270, in _render
documentation-wiki-1  |     [Page(page_box) for page_box in page_boxes],
documentation-wiki-1  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/document.py", line 270, in <listcomp>
documentation-wiki-1  |     [Page(page_box) for page_box in page_boxes],
documentation-wiki-1  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/__init__.py", line 130, in layout_document
documentation-wiki-1  |     pages = list(make_all_pages(context, root_box, html, pages))
documentation-wiki-1  |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/page.py", line 912, in make_all_pages
documentation-wiki-1  |     page, resume_at = remake_page(i, context, root_box, html)
documentation-wiki-1  |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/page.py", line 848, in remake_page
documentation-wiki-1  |     page, resume_at, next_page = make_page(
documentation-wiki-1  |                                  ^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/page.py", line 646, in make_page
documentation-wiki-1  |     root_box, resume_at, next_page, _, _, _ = block_level_layout(
documentation-wiki-1  |                                               ^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/block.py", line 59, in block_level_layout
documentation-wiki-1  |     return block_level_layout_switch(
documentation-wiki-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/block.py", line 75, in block_level_layout_switch
documentation-wiki-1  |     return block_box_layout(
documentation-wiki-1  |            ^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/block.py", line 120, in block_box_layout
documentation-wiki-1  |     result = block_container_layout(
documentation-wiki-1  |              ^^^^^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/block.py", line 693, in block_container_layout
documentation-wiki-1  |     next_page, new_children, new_max_lines) = _in_flow_layout(
documentation-wiki-1  |                                               ^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/block.py", line 486, in _in_flow_layout
documentation-wiki-1  |     collapsing_through, max_lines) = block_level_layout(
documentation-wiki-1  |                                      ^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/block.py", line 59, in block_level_layout
documentation-wiki-1  |     return block_level_layout_switch(
documentation-wiki-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/block.py", line 75, in block_level_layout_switch
documentation-wiki-1  |     return block_box_layout(
documentation-wiki-1  |            ^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/block.py", line 120, in block_box_layout
documentation-wiki-1  |     result = block_container_layout(
documentation-wiki-1  |              ^^^^^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/block.py", line 693, in block_container_layout
documentation-wiki-1  |     next_page, new_children, new_max_lines) = _in_flow_layout(
documentation-wiki-1  |                                               ^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/block.py", line 486, in _in_flow_layout
documentation-wiki-1  |     collapsing_through, max_lines) = block_level_layout(
documentation-wiki-1  |                                      ^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/block.py", line 59, in block_level_layout
documentation-wiki-1  |     return block_level_layout_switch(
documentation-wiki-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/block.py", line 75, in block_level_layout_switch
documentation-wiki-1  |     return block_box_layout(
documentation-wiki-1  |            ^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/block.py", line 120, in block_box_layout
documentation-wiki-1  |     result = block_container_layout(
documentation-wiki-1  |              ^^^^^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/block.py", line 693, in block_container_layout
documentation-wiki-1  |     next_page, new_children, new_max_lines) = _in_flow_layout(
documentation-wiki-1  |                                               ^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/block.py", line 486, in _in_flow_layout
documentation-wiki-1  |     collapsing_through, max_lines) = block_level_layout(
documentation-wiki-1  |                                      ^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/block.py", line 59, in block_level_layout
documentation-wiki-1  |     return block_level_layout_switch(
documentation-wiki-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/block.py", line 75, in block_level_layout_switch
documentation-wiki-1  |     return block_box_layout(
documentation-wiki-1  |            ^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/block.py", line 120, in block_box_layout
documentation-wiki-1  |     result = block_container_layout(
documentation-wiki-1  |              ^^^^^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/block.py", line 682, in block_container_layout
documentation-wiki-1  |     new_footnotes, max_lines) = _linebox_layout(
documentation-wiki-1  |                                 ^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/block.py", line 323, in _linebox_layout
documentation-wiki-1  |     for i, (line, resume_at) in enumerate(lines_iterator):
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/inline.py", line 38, in iter_line_boxes
documentation-wiki-1  |     line, resume_at = get_next_linebox(
documentation-wiki-1  |                       ^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/inline.py", line 68, in get_next_linebox
documentation-wiki-1  |     linebox.width = inline_min_content_width(
documentation-wiki-1  |                     ^^^^^^^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/preferred.py", line 200, in inline_min_content_width
documentation-wiki-1  |     width = next(widths) if first_line else max(widths)
documentation-wiki-1  |             ^^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/preferred.py", line 283, in inline_line_widths
documentation-wiki-1  |     lines = [next(lines)]
documentation-wiki-1  |              ^^^^^^^^^^^
documentation-wiki-1  |   File "/usr/local/lib/python3.11/site-packages/weasyprint/layout/preferred.py", line 312, in inline_line_widths
documentation-wiki-1  |     child_text[resume_index:].decode(), child.style,
documentation-wiki-1  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
documentation-wiki-1  | UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 0: invalid start byte

Up to 59 we had no issue.

@liZe liZe added the crash Problems preventing documents from being rendered label Sep 28, 2023
@liZe liZe closed this as completed in f5640de Sep 28, 2023
@liZe
Copy link
Member

liZe commented Sep 28, 2023

Thanks a lot for the stacktraces and the small snippet, it really helped!

@kesara @Stanislasss Does the fix work for you?

@kesara
Copy link
Contributor Author

kesara commented Sep 28, 2023

@liZe that fix is working. Thank you for the quick response.

@Stanislasss
Copy link

Thank you for the support.
Then we will wait until integration in the next version before upgrading 😉

@liZe
Copy link
Member

liZe commented Sep 29, 2023

Version 60.1 has been fixed, thanks a lot for the detailed report!

netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this issue Oct 15, 2023
Version 60.1
------------

Released on 2023-09-29.

Bug fixes:

* `#1973 <https://github.com/Kozea/WeasyPrint/issues/1973>`_:
  Fix crash caused by wrong UTF-8 indices


Version 60.0
------------

Released on 2023-09-25.

New features:

* `#1903 <https://github.com/Kozea/WeasyPrint/issues/1903>`_:
  Print form fields
* `#1922 <https://github.com/Kozea/WeasyPrint/pull/1922>`_:
  Add support for textLength and lengthAdjust in SVG text elements
* `#1965 <https://github.com/Kozea/WeasyPrint/issues/1965>`_:
  Handle <wbr> tag
* `#1970 <https://github.com/Kozea/WeasyPrint/pull/1970>`_:
  Handle y offset of glyphs
* `#1909 <https://github.com/Kozea/WeasyPrint/issues/1909>`_:
  Add a --timeout option

Bug fixes:

* `#1887 <https://github.com/Kozea/WeasyPrint/pull/1887>`_:
  Fix footnote-call displayed incorrectly for some fonts
* `#1890 <https://github.com/Kozea/WeasyPrint/pull/1890>`_:
  Fix page-margin boxes layout algorithm
* `#1908 <https://github.com/Kozea/WeasyPrint/pull/1908>`_:
  Fix IndexError when rendering PDF version 1.4
* `#1906 <https://github.com/Kozea/WeasyPrint/issues/1906>`_:
  Apply text transformations to first-letter pseudo elements
* `#1915 <https://github.com/Kozea/WeasyPrint/pull/1915>`_:
  Avoid footnote appearing before its call
* `#1934 <https://github.com/Kozea/WeasyPrint/pull/1934>`_:
  Fix balance before "column-span: all"
* `#1935 <https://github.com/Kozea/WeasyPrint/issues/1935>`_:
  Only draw required glyph with OpenType-SVG fonts
* `#1595 <https://github.com/Kozea/WeasyPrint/issues/1595>`_:
  Don’t draw clipPath when defined after reference
* `#1895 <https://github.com/Kozea/WeasyPrint/pull/1895>`_:
  Don’t ignore min-width when computing cell size
* `#1899 <https://github.com/Kozea/WeasyPrint/pull/1899>`_:
  Fix named pages inheritance
* `#1936 <https://github.com/Kozea/WeasyPrint/pull/1936>`_:
  Avoid page breaks caused by children of overflow hidden boxes
* `#1943 <https://github.com/Kozea/WeasyPrint/issues/1943>`_:
  Use bleed area for page’s painting area
* `#1946 <https://github.com/Kozea/WeasyPrint/issues/1946>`_:
  Use margin box of children to define available width for leaders
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
crash Problems preventing documents from being rendered
Projects
None yet
Development

No branches or pull requests

3 participants