mirror of
https://github.com/Kozea/WeasyPrint.git
synced 2024-10-05 00:21:15 +03:00
Naive implementation of inline-block evelements
This commit is contained in:
parent
2c0c83693f
commit
abd386796f
@ -460,10 +460,8 @@ def direction(keyword):
|
||||
@single_keyword
|
||||
def display(keyword):
|
||||
"""``display`` property validation."""
|
||||
if keyword in ('inline-block',):
|
||||
raise InvalidValues('value not supported yet')
|
||||
return keyword in (
|
||||
'inline', 'block', 'list-item', 'none',
|
||||
'inline', 'block', 'inline-block', 'list-item', 'none',
|
||||
'table', 'inline-table', 'table-caption',
|
||||
'table-row-group', 'table-header-group', 'table-footer-group',
|
||||
'table-row', 'table-column-group', 'table-column', 'table-cell')
|
||||
|
@ -266,25 +266,37 @@ def atomic_box(document, box, containing_block, device_size):
|
||||
else:
|
||||
inline_replaced_box_layout(box, containing_block, device_size)
|
||||
elif isinstance(box, boxes.InlineBlockBox):
|
||||
box = inline_block_box_layout(document, box, containing_block)
|
||||
box = inline_block_box_layout(
|
||||
document, box, containing_block, device_size)
|
||||
else:
|
||||
raise TypeError('Layout for %s not handled yet' % type(box).__name__)
|
||||
return box
|
||||
|
||||
|
||||
def inline_block_box_layout(document, box, containing_block):
|
||||
resolve_percentages(box, containing_block)
|
||||
if box.width == 'auto':
|
||||
from .preferred import shrink_to_fit
|
||||
preferred, minimum = shrink_to_fit(box)
|
||||
box.width = min(max(minimum, containing_block.width), preferred)
|
||||
def inline_block_box_layout(document, box, containing_block, device_size):
|
||||
# Avoid a circular import
|
||||
from .blocks import block_level_height
|
||||
box, _, _, _, _ = block_level_height(document, box,
|
||||
max_position_y=float('inf'),
|
||||
skip_stack=None,
|
||||
device_size=device_size,
|
||||
page_is_empty=True)
|
||||
from .preferred import shrink_to_fit
|
||||
|
||||
resolve_percentages(box, containing_block)
|
||||
|
||||
# http://www.w3.org/TR/CSS21/visudet.html#inlineblock-width
|
||||
if box.margin_left == 'auto':
|
||||
box.margin_left = 0
|
||||
if box.margin_right == 'auto':
|
||||
box.margin_right = 0
|
||||
|
||||
if box.width == 'auto':
|
||||
preferred, minimum = shrink_to_fit(box, containing_block.width)
|
||||
box.width = min(max(minimum, containing_block.width), preferred)
|
||||
|
||||
# TODO: don't set these wrong values
|
||||
box.position_x = containing_block.position_x
|
||||
box.position_y = containing_block.position_y
|
||||
box, _, _, _, _ = block_level_height(
|
||||
document, box, max_position_y=float('inf'), skip_stack=None,
|
||||
device_size=device_size, page_is_empty=True)
|
||||
|
||||
return box
|
||||
|
||||
|
||||
|
@ -21,13 +21,13 @@ from .percentages import resolve_percentages
|
||||
|
||||
|
||||
def shrink_to_fit(box, maximum_width=None):
|
||||
"""Return ``preferred_mimimum_width, preferred_width`` for ``box``.
|
||||
"""Return ``(preferred_width, preferred_mimimum_width)`` for ``box``.
|
||||
|
||||
If ``maximum_width`` is not ``None``, the preferred width is calculated to
|
||||
be smaller than this width.
|
||||
|
||||
"""
|
||||
return preferred_mimimum_width(box), preferred_width(box, maximum_width)
|
||||
return preferred_width(box, maximum_width), preferred_mimimum_width(box)
|
||||
|
||||
|
||||
def preferred_mimimum_width(box):
|
||||
@ -36,9 +36,9 @@ def preferred_mimimum_width(box):
|
||||
This is the width by breaking at every line-break opportunity.
|
||||
|
||||
"""
|
||||
if isinstance(box, boxes.BlockBox):
|
||||
if isinstance(box, boxes.BlockContainerBox):
|
||||
return block_preferred_minimum_width(box)
|
||||
elif isinstance(box, boxes.InlineBox):
|
||||
elif isinstance(box, (boxes.InlineBox, boxes.LineBox)):
|
||||
return inline_preferred_minimum_width(box)
|
||||
else:
|
||||
raise TypeError(
|
||||
@ -55,9 +55,9 @@ def preferred_width(box, maximum_width=None):
|
||||
be smaller than this width.
|
||||
|
||||
"""
|
||||
if isinstance(box, boxes.BlockBox):
|
||||
if isinstance(box, boxes.BlockContainerBox):
|
||||
return block_preferred_width(box, maximum_width)
|
||||
elif isinstance(box, boxes.InlineBox):
|
||||
elif isinstance(box, (boxes.InlineBox, boxes.LineBox)):
|
||||
return inline_preferred_width(box, maximum_width)
|
||||
else:
|
||||
raise TypeError(
|
||||
@ -66,10 +66,27 @@ def preferred_width(box, maximum_width=None):
|
||||
|
||||
def block_preferred_minimum_width(box):
|
||||
"""Return the preferred minimum width for a ``BlockBox``."""
|
||||
if box.width == 'auto':
|
||||
if box.children:
|
||||
return max(
|
||||
preferred_mimimum_width(child) for child in box.children)
|
||||
else:
|
||||
return 0
|
||||
else:
|
||||
# TODO: handle fixed and % widths
|
||||
raise TypeError('Width %s is unknown' % box.width)
|
||||
|
||||
|
||||
def block_preferred_width(box, maximum_width=None):
|
||||
"""Return the preferred width for a ``BlockBox``."""
|
||||
if box.width == 'auto':
|
||||
if box.children:
|
||||
return max(preferred_width(child) for child in box.children)
|
||||
else:
|
||||
return 0
|
||||
else:
|
||||
# TODO: handle fixed and % widths
|
||||
raise TypeError('Width %s is unknown' % box.width)
|
||||
|
||||
|
||||
def inline_preferred_minimum_width(box):
|
||||
|
Loading…
Reference in New Issue
Block a user