1
1
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:
Guillaume Ayoub 2012-03-22 23:26:09 +01:00
parent 2c0c83693f
commit abd386796f
3 changed files with 48 additions and 21 deletions

View File

@ -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')

View File

@ -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

View File

@ -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):