5.2. Autolayout Algorithm
Connected: An Internet Encyclopedia
5.2. Autolayout Algorithm
Up:
Connected: An Internet Encyclopedia
Up:
Requests For Comments
Up:
RFC 1942
Up:
5. Recommended Layout Algorithms
Prev: 5.1. Fixed Layout Algorithm
Next: 6. HTML Table DTD
5.2. Autolayout Algorithm
5.2. Autolayout Algorithm
If the COLS attribute is missing from the table start tag, then the
user agent should use the following autolayout algorithm. It uses two
passes through the table data and scales linearly with the size of
the table.
In the first pass, line wrapping is disabled, and the user agent
keeps track of the minimum and maximum width of each cell. The
maximum width is given by the widest line. As line wrap has been
disabled, paragraphs are treated as long lines unless broken by <BR>
elements. The minimum width is given by the widest word or image etc.
taking into account leading indents and list bullets etc. In other
words, if you were to format the cell's content in a window of its
own, determine the minimum width you could make the window before the
cell begins to overflow. Allowing user agents to split words will
minimize the need for horizontal scrolling or in the worst case
clipping of cell contents.
This process also applies to any nested tables occuring in cell
content. The minimum and maximum widths for cells in nested tables
are used to determine the minimum and maximum widths for these tables
and hence for the parent table cell itself. The algorithm is linear
with aggregate cell content, and broadly speaking independent of the
depth of nesting.
To cope with character alignment of cell contents, the algorithm
keeps three running min/max totals for each column: Left of align
char, right of align char and un-aligned. The minimum width for a
column is then: max(min_left + min_right, min_non-aligned).
The minimum and maximum cell widths are then used to determine the
corresponding minimum and maximum widths for the columns. These in
turn, are used to find the minimum and maximum width for the table.
Note that cells can contain nested tables, but this doesn't
complicate the code significantly. The next step is to assign column
widths according to the available space (i.e. the space between the
current left and right margins).
For cells which span multiple columns, a simple approach, as used by
Arena, is to evenly apportion the min/max widths to each of the
constituent columns. A slightly more complex approach is to use the
min/max widths of unspanned cells to weight how spanned widths are
apportioned. Experimental study suggests a blend of the two
approaches will give good results for a wide range of tables.
The table borders and intercell margins need to be included in
assigning column widths. There are three cases:
- The minimum table width is equal to or wider than the available
space. In this case, assign the minimum widths and allow the
user to scroll horizontally. For conversion to braille, it will
be necessary to replace the cells by references to notes
containing their full content. By convention these appear before
the table.
- The maximum table width fits within the available space. In this
case, set the columns to their maximum widths.
- The maximum width of the table is greater than the available
space, but the minimum table width is smaller. In this case,
find the difference between the available space and the minimum
table width, lets call it W. Lets also call D the difference
between maximum and minimum width of the table.
For each column, let d be the difference between maximum and
minimum width of that column. Now set the column's width to the
minimum width plus d times W over D. This makes columns with
large differences between minimum and maximum widths wider than
columns with smaller differences.
This assignment step is then repeated for nested tables using the
minimum and maximum widths derived for all such tables in the first
pass. In this case, the width of the parent (i.e. enclosing) table
cell plays the role of the current window size in the above
description. This process is repeated recursively for all nested
tables. The topmost table is then rendered using the assigned widths.
Nested tables are subsequently rendered as part of the parent table's
cell contents.
If the table width is specified with the WIDTH attribute, the user
agent attempts to set column widths to match. The WIDTH attribute is
not binding if this results in columns having less than their minimum
(i.e. indivisible) widths.
If relative widths are specified with the COL element, the algorithm
is modified to increase column widths over the minimum width to meet
the relative width constraints. The COL elements should be taken as
hints only, so columns shouldn't be set to less than their minimum
width. Similarly, columns shouldn't be made so wide that the table
stretches well beyond the extent of the window. If a COL element
specifies a relative width of zero, the column should always be set
to its minimum width.
Next: 6. HTML Table DTD
Connected: An Internet Encyclopedia
5.2. Autolayout Algorithm
|