#2896·WeasyPrint

`calc` adding a percentage and an absolute value in `object-position` leads to an exception

Author: alexandergitterCreated Aug 17, 2026Updated Aug 19, 2026
Labelscrash

The following example crashes WeasyPrint 69.0 with an exception:

xml
<img style="object-position: calc(50% + 1px) 0;" src="https://picsum.photos/200">

It appears to be somehow related to the combination of the percentage + an absolute value. Here's the exception I get:

Traceback (most recent call last):
  File "/home/alex/src/WeasyPrint/weasyprint/css/__init__.py", line 1269, in __missing__
    raise Exception
Exception

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/home/alex/src/WeasyPrint/weasyprint/__main__.py", line 236, in <module>
    main()
  File "/home/alex/src/WeasyPrint/weasyprint/__main__.py", line 229, in main
    html.write_pdf(output, **options)
  File "/home/alex/src/WeasyPrint/weasyprint/__init__.py", line 269, in write_pdf
    return document.write_pdf(target, zoom, finisher, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/alex/src/WeasyPrint/weasyprint/document.py", line 343, in write_pdf
    pdf = generate_pdf(self, target, zoom, **options)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/alex/src/WeasyPrint/weasyprint/pdf/__init__.py", line 223, in generate_pdf
    page.paint(stream, scale)
  File "/home/alex/src/WeasyPrint/weasyprint/document.py", line 87, in paint
    draw_page(self._page_box, stream)
  File "/home/alex/src/WeasyPrint/weasyprint/draw/__init__.py", line 29, in draw_page
    draw_stacking_context(stream, stacking_context)
  File "/home/alex/src/WeasyPrint/weasyprint/draw/__init__.py", line 123, in draw_stacking_context
    draw_stacking_context(stream, child_context)
  File "/home/alex/src/WeasyPrint/weasyprint/draw/__init__.py", line 123, in draw_stacking_context
    draw_stacking_context(stream, child_context)
  File "/home/alex/src/WeasyPrint/weasyprint/draw/__init__.py", line 118, in draw_stacking_context
    draw_block_level(
  File "/home/alex/src/WeasyPrint/weasyprint/draw/__init__.py", line 652, in draw_block_level
    draw_replacedbox(stream, block)
  File "/home/alex/src/WeasyPrint/weasyprint/draw/__init__.py", line 595, in draw_replacedbox
    draw_width, draw_height, draw_x, draw_y = replaced.replacedbox_layout(box)
                                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/alex/src/WeasyPrint/weasyprint/layout/replaced.py", line 89, in replacedbox_layout
    position = box.style['object_position']
               ~~~~~~~~~^^^^^^^^^^^^^^^^^^^
  File "/home/alex/src/WeasyPrint/weasyprint/css/__init__.py", line 1278, in __missing__
    function.source_line, function.source_column, function.serialize())
    ^^^^^^^^^^^^^^^^^^^^
AttributeError: 'tuple' object has no attribute 'source_line'