diff --git a/tests/test_boxes.py b/tests/test_boxes.py index 9b8cffb1..ce7f4b29 100644 --- a/tests/test_boxes.py +++ b/tests/test_boxes.py @@ -9,7 +9,7 @@ import pytest from weasyprint.css import PageType, get_all_computed_styles from weasyprint.formatting_structure import boxes, build -from weasyprint.layout.pages import set_page_type_computed_styles +from weasyprint.layout.page import set_page_type_computed_styles from .testing_utils import ( FakeHTML, assert_no_logs, assert_tree, capture_logs, parse, parse_all, diff --git a/tests/test_css.py b/tests/test_css.py index 320ff583..a4d4eef4 100644 --- a/tests/test_css.py +++ b/tests/test_css.py @@ -14,7 +14,7 @@ from weasyprint import CSS, css, default_url_fetcher from weasyprint.css import ( PageType, get_all_computed_styles, parse_page_selectors) from weasyprint.css.computed_values import strut_layout -from weasyprint.layout.pages import set_page_type_computed_styles +from weasyprint.layout.page import set_page_type_computed_styles from weasyprint.urls import path2url from .testing_utils import ( diff --git a/weasyprint/css/__init__.py b/weasyprint/css/__init__.py index 88bf4ff0..f84e1cd4 100644 --- a/weasyprint/css/__init__.py +++ b/weasyprint/css/__init__.py @@ -238,7 +238,7 @@ def find_stylesheets(wrapper_element, device_media_type, url_fetcher, base_url, The output order is the same as the source order. """ - from ..html import element_has_link_type # Work around circular imports. + from ..html import element_has_link_type for wrapper in wrapper_element.query_all('style', 'link'): element = wrapper.etree_element diff --git a/weasyprint/document.py b/weasyprint/document.py index 282b6559..b0803774 100644 --- a/weasyprint/document.py +++ b/weasyprint/document.py @@ -28,7 +28,7 @@ from .formatting_structure.build import build_formatting_structure from .html import W3C_DATE_RE, get_html_metadata from .images import get_image_from_uri as original_get_image_from_uri from .layout import LayoutContext, layout_document -from .layout.percentages import percentage +from .layout.percent import percentage from .logger import LOGGER, PROGRESS_LOGGER from .text.ffi import ffi, pango from .text.fonts import FontConfiguration diff --git a/weasyprint/draw.py b/weasyprint/draw.py index 5662b60b..e1416dfe 100644 --- a/weasyprint/draw.py +++ b/weasyprint/draw.py @@ -15,7 +15,7 @@ from xml.etree import ElementTree from .formatting_structure import boxes from .images import SVGImage from .layout import replaced -from .layout.backgrounds import BackgroundLayer +from .layout.background import BackgroundLayer from .stacking import StackingContext from .text.ffi import ffi, harfbuzz, pango, units_from_double, units_to_double from .text.line_break import get_last_word_end diff --git a/weasyprint/formatting_structure/build.py b/weasyprint/formatting_structure/build.py index 536886f1..7b81f6ac 100644 --- a/weasyprint/formatting_structure/build.py +++ b/weasyprint/formatting_structure/build.py @@ -71,7 +71,7 @@ def build_formatting_structure(element_tree, style_for, get_image_from_uri, target_collector.check_pending_targets() box.is_for_root_element = True - # If this is changed, maybe update weasy.layout.pages.make_margin_boxes() + # If this is changed, maybe update weasy.layout.page.make_margin_boxes() process_whitespace(box) box = anonymous_table_boxes(box) box = flex_boxes(box) diff --git a/weasyprint/images.py b/weasyprint/images.py index 964af123..918b460d 100644 --- a/weasyprint/images.py +++ b/weasyprint/images.py @@ -14,7 +14,7 @@ from xml.etree import ElementTree import pydyf from PIL import Image -from .layout.percentages import percentage +from .layout.percent import percentage from .logger import LOGGER from .svg import SVG from .urls import URLFetchingError, fetch diff --git a/weasyprint/layout/__init__.py b/weasyprint/layout/__init__.py index 729532ff..073b51bf 100644 --- a/weasyprint/layout/__init__.py +++ b/weasyprint/layout/__init__.py @@ -21,8 +21,8 @@ from functools import partial from ..formatting_structure import boxes from ..logger import PROGRESS_LOGGER from .absolute import absolute_box_layout, absolute_layout -from .backgrounds import layout_backgrounds -from .pages import make_all_pages, make_margin_boxes +from .background import layout_backgrounds +from .page import make_all_pages, make_margin_boxes def initialize_page_maker(context, root_box): diff --git a/weasyprint/layout/absolute.py b/weasyprint/layout/absolute.py index a5062b44..251941cd 100644 --- a/weasyprint/layout/absolute.py +++ b/weasyprint/layout/absolute.py @@ -6,9 +6,9 @@ from ..formatting_structure import boxes from .min_max import handle_min_max_width -from .percentages import resolve_percentages, resolve_position_percentages +from .percent import resolve_percentages, resolve_position_percentages from .preferred import shrink_to_fit -from .tables import table_wrapper_width +from .table import table_wrapper_width class AbsolutePlaceholder: @@ -187,6 +187,8 @@ def absolute_height(box, context, containing_block): def absolute_block(context, box, containing_block, fixed_boxes): + from .block import block_container_layout + cb_x, cb_y, cb_width, cb_height = containing_block translate_box_width, translate_x = absolute_width( @@ -200,9 +202,6 @@ def absolute_block(context, box, containing_block, fixed_boxes): if box.is_table_wrapper: table_wrapper_width(context, box, (cb_width, cb_height)) - # avoid a circular import - from .blocks import block_container_layout - new_box, _, _, _, _ = block_container_layout( context, box, max_position_y=float('inf'), skip_stack=None, page_is_empty=False, absolute_boxes=absolute_boxes, @@ -223,7 +222,6 @@ def absolute_block(context, box, containing_block, fixed_boxes): def absolute_flex(context, box, containing_block_sizes, fixed_boxes, containing_block): - # Avoid a circular import from .flex import flex_layout # TODO: this function is really close to absolute_block, we should have @@ -302,8 +300,8 @@ def absolute_box_layout(context, box, containing_block, fixed_boxes): def absolute_replaced(context, box, containing_block): - # avoid a circular import - from .inlines import inline_replaced_box_width_height + from .inline import inline_replaced_box_width_height + inline_replaced_box_width_height(box, containing_block) cb_x, cb_y, cb_width, cb_height = containing_block diff --git a/weasyprint/layout/backgrounds.py b/weasyprint/layout/background.py similarity index 99% rename from weasyprint/layout/backgrounds.py rename to weasyprint/layout/background.py index 3093e1ea..a9ccbb5d 100644 --- a/weasyprint/layout/backgrounds.py +++ b/weasyprint/layout/background.py @@ -9,7 +9,7 @@ from itertools import cycle from ..formatting_structure import boxes from . import replaced -from .percentages import percentage, resolve_radii_percentages +from .percent import percentage, resolve_radii_percentages Background = namedtuple('Background', 'color, layers, image_rendering') BackgroundLayer = namedtuple( diff --git a/weasyprint/layout/blocks.py b/weasyprint/layout/block.py similarity index 99% rename from weasyprint/layout/blocks.py rename to weasyprint/layout/block.py index da5ff5f4..e28ea6f4 100644 --- a/weasyprint/layout/blocks.py +++ b/weasyprint/layout/block.py @@ -8,15 +8,15 @@ from ..formatting_structure import boxes from .absolute import AbsolutePlaceholder, absolute_layout -from .columns import columns_layout +from .column import columns_layout from .flex import flex_layout from .float import avoid_collisions, float_layout, get_clearance -from .inlines import ( +from .inline import ( iter_line_boxes, min_max_auto_replaced, replaced_box_height, replaced_box_width) from .min_max import handle_min_max_width -from .percentages import resolve_percentages, resolve_position_percentages -from .tables import table_layout, table_wrapper_width +from .percent import resolve_percentages, resolve_position_percentages +from .table import table_layout, table_wrapper_width def block_level_layout(context, box, max_position_y, skip_stack, diff --git a/weasyprint/layout/columns.py b/weasyprint/layout/column.py similarity index 99% rename from weasyprint/layout/columns.py rename to weasyprint/layout/column.py index c52d7fc8..0a5d90fc 100644 --- a/weasyprint/layout/columns.py +++ b/weasyprint/layout/column.py @@ -9,15 +9,14 @@ from math import floor from .absolute import absolute_layout -from .percentages import resolve_percentages +from .percent import resolve_percentages def columns_layout(context, box, max_position_y, skip_stack, containing_block, page_is_empty, absolute_boxes, fixed_boxes, adjoining_margins): """Lay out a multi-column ``box``.""" - # Avoid circular imports - from .blocks import ( + from .block import ( block_box_layout, block_level_layout, block_level_width, collapse_margin) diff --git a/weasyprint/layout/flex.py b/weasyprint/layout/flex.py index b120a60c..a06ed4d2 100644 --- a/weasyprint/layout/flex.py +++ b/weasyprint/layout/flex.py @@ -11,9 +11,9 @@ from math import log10 from ..css.properties import Dimension from ..formatting_structure import boxes -from .percentages import resolve_one_percentage, resolve_percentages +from .percent import resolve_one_percentage, resolve_percentages from .preferred import max_content_width, min_content_width -from .tables import find_in_flow_baseline +from .table import find_in_flow_baseline class FlexLine(list): @@ -22,8 +22,7 @@ class FlexLine(list): def flex_layout(context, box, max_position_y, skip_stack, containing_block, page_is_empty, absolute_boxes, fixed_boxes): - # Avoid a circular import - from . import blocks, preferred + from . import block, preferred context.create_block_formatting_context() resume_at = None @@ -101,7 +100,7 @@ def flex_layout(context, box, max_position_y, skip_stack, containing_block, if parent_box.margin_right == 'auto': box.margin_right = parent_box.margin_right = 0 if isinstance(parent_box, boxes.FlexBox): - blocks.block_level_width(parent_box, containing_block) + block.block_level_width(parent_box, containing_block) else: parent_box.width = preferred.flex_max_content_width( context, parent_box) @@ -154,7 +153,7 @@ def flex_layout(context, box, max_position_y, skip_stack, containing_block, new_child.style['height'] = 'auto' new_child.style['min_height'] = Dimension(0, 'px') new_child.style['max_height'] = Dimension(float('inf'), 'px') - new_child = blocks.block_level_layout( + new_child = block.block_level_layout( context, new_child, float('inf'), child_skip_stack, parent_box, page_is_empty, [], [], [], False)[0] content_size = new_child.height @@ -213,7 +212,7 @@ def flex_layout(context, box, max_position_y, skip_stack, containing_block, else: new_child = child.copy() new_child.width = float('inf') - new_child = blocks.block_level_layout( + new_child = block.block_level_layout( context, new_child, float('inf'), child_skip_stack, parent_box, page_is_empty, absolute_boxes, fixed_boxes, adjoining_margins=[], discard=False)[0] @@ -228,7 +227,7 @@ def flex_layout(context, box, max_position_y, skip_stack, containing_block, else: new_child = child.copy() new_child.width = 0 - new_child = blocks.block_level_layout( + new_child = block.block_level_layout( context, new_child, float('inf'), child_skip_stack, parent_box, page_is_empty, absolute_boxes, fixed_boxes, adjoining_margins=[], discard=False)[0] @@ -248,7 +247,7 @@ def flex_layout(context, box, max_position_y, skip_stack, containing_block, # Step 4 # TODO: the whole step has to be fixed if axis == 'width': - blocks.block_level_width(box, containing_block) + block.block_level_width(box, containing_block) else: if box.style['height'] != 'auto': box.height = box.style['height'].value @@ -460,9 +459,9 @@ def flex_layout(context, box, max_position_y, skip_stack, containing_block, child_copy = child.copy_with_children(child.children) else: child_copy = child.copy() - blocks.block_level_width(child_copy, parent_box) + block.block_level_width(child_copy, parent_box) new_child, _, _, adjoining_margins, _ = ( - blocks.block_level_layout_switch( + block.block_level_layout_switch( context, child_copy, float('inf'), child_skip_stack, parent_box, page_is_empty, absolute_boxes, fixed_boxes, adjoining_margins=[], discard=False)) @@ -473,8 +472,7 @@ def flex_layout(context, box, max_position_y, skip_stack, containing_block, # As flex items margins never collapse (with other flex items # or with the flex container), we can add the adjoining margins # to the child bottom margin. - child.margin_bottom += blocks.collapse_margin( - adjoining_margins) + child.margin_bottom += block.collapse_margin(adjoining_margins) else: child.width = min_content_width(context, child, outer=False) @@ -841,7 +839,7 @@ def flex_layout(context, box, max_position_y, skip_stack, containing_block, for line in flex_lines: for i, child in line: if child.is_flex_item: - new_child, child_resume_at = blocks.block_level_layout_switch( + new_child, child_resume_at = block.block_level_layout_switch( context, child, max_position_y, child_skip_stack, box, page_is_empty, absolute_boxes, fixed_boxes, adjoining_margins=[], discard=False)[:2] diff --git a/weasyprint/layout/float.py b/weasyprint/layout/float.py index 4eed8af3..22d60b3d 100644 --- a/weasyprint/layout/float.py +++ b/weasyprint/layout/float.py @@ -8,9 +8,9 @@ from ..formatting_structure import boxes from .min_max import handle_min_max_width -from .percentages import resolve_percentages, resolve_position_percentages +from .percent import resolve_percentages, resolve_position_percentages from .preferred import shrink_to_fit -from .tables import table_wrapper_width +from .table import table_wrapper_width @handle_min_max_width @@ -23,10 +23,9 @@ def float_width(box, context, containing_block): def float_layout(context, box, containing_block, absolute_boxes, fixed_boxes): """Set the width and position of floating ``box``.""" - # Avoid circular imports - from .blocks import block_container_layout + from .block import block_container_layout from .flex import flex_layout - from .inlines import inline_replaced_box_width_height + from .inline import inline_replaced_box_width_height cb_width, cb_height = (containing_block.width, containing_block.height) resolve_percentages(box, (cb_width, cb_height)) diff --git a/weasyprint/layout/inlines.py b/weasyprint/layout/inline.py similarity index 99% rename from weasyprint/layout/inlines.py rename to weasyprint/layout/inline.py index f6036022..87adfdec 100644 --- a/weasyprint/layout/inlines.py +++ b/weasyprint/layout/inline.py @@ -16,10 +16,10 @@ from .absolute import AbsolutePlaceholder, absolute_layout from .flex import flex_layout from .float import avoid_collisions, float_layout from .min_max import handle_min_max_height, handle_min_max_width -from .percentages import resolve_one_percentage, resolve_percentages +from .percent import resolve_one_percentage, resolve_percentages from .preferred import ( inline_min_content_width, shrink_to_fit, trailing_whitespace_size) -from .tables import find_in_flow_baseline, table_wrapper_width +from .table import find_in_flow_baseline, table_wrapper_width def iter_line_boxes(context, box, position_y, skip_stack, containing_block, @@ -440,7 +440,7 @@ def first_letter_to_box(box, skip_stack, first_letter_style): @handle_min_max_width def replaced_box_width(box, containing_block): """Set the used width for replaced boxes (inline- or block-level).""" - from .blocks import block_level_width + from .block import block_level_width width, height, ratio = box.replacement.get_intrinsic_size( box.style['image_resolution'], box.style['font_size']) @@ -596,8 +596,7 @@ def atomic_box(context, box, position_x, skip_stack, containing_block, def inline_block_box_layout(context, box, position_x, skip_stack, containing_block, absolute_boxes, fixed_boxes): - # Avoid a circular import - from .blocks import block_container_layout + from .block import block_container_layout resolve_percentages(box, containing_block) @@ -625,9 +624,9 @@ def inline_block_box_layout(context, box, position_x, skip_stack, def inline_block_baseline(box): - """ - Return the y position of the baseline for an inline block - from the top of its margin box. + """Return the y position of the baseline for an inline block. + + Position is taken from the top of its margin box. http://www.w3.org/TR/CSS21/visudet.html#propdef-vertical-align diff --git a/weasyprint/layout/pages.py b/weasyprint/layout/page.py similarity index 99% rename from weasyprint/layout/pages.py rename to weasyprint/layout/page.py index f8f4b4db..1efd8196 100644 --- a/weasyprint/layout/pages.py +++ b/weasyprint/layout/page.py @@ -12,9 +12,9 @@ from ..css import PageType, computed_from_cascaded from ..formatting_structure import boxes, build from ..logger import PROGRESS_LOGGER from .absolute import absolute_layout -from .blocks import block_container_layout, block_level_layout +from .block import block_container_layout, block_level_layout from .min_max import handle_min_max_height, handle_min_max_width -from .percentages import resolve_percentages +from .percent import resolve_percentages from .preferred import max_content_width, min_content_width diff --git a/weasyprint/layout/percentages.py b/weasyprint/layout/percent.py similarity index 100% rename from weasyprint/layout/percentages.py rename to weasyprint/layout/percent.py diff --git a/weasyprint/layout/preferred.py b/weasyprint/layout/preferred.py index 345f3ee5..7623b94d 100644 --- a/weasyprint/layout/preferred.py +++ b/weasyprint/layout/preferred.py @@ -374,8 +374,7 @@ def table_and_columns_preferred_widths(context, box, outer=True): http://dbaron.org/css/intrinsic/ """ - # Avoid a circular import - from .tables import distribute_excess_width + from .table import distribute_excess_width table = box.get_wrapped_table() result = context.tables.get(table) @@ -732,7 +731,7 @@ def flex_max_content_width(context, box, outer=True): def trailing_whitespace_size(context, box): """Return the size of the trailing whitespace of ``box``.""" - from .inlines import split_first_line, split_text_box + from .inline import split_first_line, split_text_box while isinstance(box, (boxes.InlineBox, boxes.LineBox)): if not box.children: diff --git a/weasyprint/layout/replaced.py b/weasyprint/layout/replaced.py index 96b9854e..95493e58 100644 --- a/weasyprint/layout/replaced.py +++ b/weasyprint/layout/replaced.py @@ -7,7 +7,7 @@ """ -from .percentages import percentage +from .percent import percentage def default_image_sizing(intrinsic_width, intrinsic_height, intrinsic_ratio, diff --git a/weasyprint/layout/tables.py b/weasyprint/layout/table.py similarity index 98% rename from weasyprint/layout/tables.py rename to weasyprint/layout/table.py index fe5be9b2..dc2b2337 100644 --- a/weasyprint/layout/tables.py +++ b/weasyprint/layout/table.py @@ -8,15 +8,14 @@ from ..formatting_structure import boxes from ..logger import LOGGER -from .percentages import resolve_one_percentage, resolve_percentages +from .percent import resolve_one_percentage, resolve_percentages from .preferred import max_content_width, table_and_columns_preferred_widths def table_layout(context, table, max_position_y, skip_stack, containing_block, page_is_empty, absolute_boxes, fixed_boxes): """Layout for a table box.""" - # Avoid a circular import - from .blocks import ( + from .block import ( block_container_layout, block_level_page_break, find_earlier_page_break) @@ -526,7 +525,10 @@ def table_layout(context, table, max_position_y, skip_stack, containing_block, def add_top_padding(box, extra_padding): - """Increase the top padding of a box. This also translates the children. + """Increase the top padding of a box. + + This also translates the children. + """ box.padding_top += extra_padding for child in box.children: @@ -534,7 +536,7 @@ def add_top_padding(box, extra_padding): def fixed_table_layout(box): - """Run the fixed table layout and return a list of column widths + """Run the fixed table layout and return a list of column widths. http://www.w3.org/TR/CSS21/tables.html#fixed-table-layout @@ -748,8 +750,7 @@ def table_wrapper_width(context, wrapper, containing_block): def cell_baseline(cell): - """ - Return the y position of a cell’s baseline from the top of its border box. + """Return the y position of a cell baseline from the top of its border box. See http://www.w3.org/TR/CSS21/tables.html#height-layout @@ -764,9 +765,10 @@ def cell_baseline(cell): def find_in_flow_baseline(box, last=False, baseline_types=(boxes.LineBox,)): - """ - Return the absolute Y position for the first (or last) in-flow baseline - if any, or None. + """Return the absolute y position for the first (or last) in-flow baseline. + + If there’s no in-flow baseline, return None. + """ # TODO: synthetize baseline when needed # See https://www.w3.org/TR/css-align-3/#synthesize-baseline