[webkit-dev] HTML4 and CSS2 table column styling
Rob Burns
robburns1 at mac.com
Fri Mar 2 14:06:30 PST 2007
I started to post a reaply on this bug on HTML/CSS column issues,
when it grew to more listserv length post. So here it is.
I'm not totally clear why these table column issues are plaguing so
many browsers. I'm not yet that familiar with the WebKit codebase,
but the problems with implementing this do not seem that severe. This
is one area where IE has been able to get the upper hand (from what I
understand). It’s seems a bit confused too. The HTML4 recommendation
already begins to talk about these presentation properties (align,
width, etc.) being taken over by CSS. However, CSS seems to drop the
ball (by deprecating the <string> value for text-align for example).
Ideally, I think these features should be implemented through CSS.
Once WebKit was capable of presenting tables in flexible ways, I
imagine the HTML4 attribute behaviors could be implemented through
CSS. The only thing that I think pure CSS 2 could not handle, would
be extracting the character value from the 'char' attribute for use
as the <string> value in text-align. Regardless, implementing a 2D
table model within (nearly recommendation compliant?) CSS seems
pretty straight forward to me (though it does require a flexible
reading of the W3C recommendations). In doing so, WebKit would
provide features that content-creators want and it would also be
matching features provided by IE. Much of the barriers and objections
I hear raised about fixing these table-column issues stem from
thinking of CSS (which is a presentation layer) as too intricately
linked to the structural tree layer of a document.
Having said that, I think a complete implementation of table columns
requires more than just a consideration of inheritance. There are
three separate issues involved with table columns:
Properties of boxes displayed as table-column and table-column-group
(these are explicitly discussed in CSS recommendation):
border
background
width
visibility
computed values (both HTML attributes and CSS properties) which are
inherited by table-cells from table-columns or table-column-groups
Properties applied through contextual selectors descending from boxes
displayed as table-column and table-column-group (e.g.,
col#mySpecialColumn > td {color: blue;} )
We need to think in two dimensions (i.e., a table-cell has two
parents) All that's needed is to think of:
table-cell boxes as descendants of both table-row and table-column boxes
those "table-grid" (column and row) boxes can descend from their
corresponding table-row-group or table-column-group boxes
finally, those "table-grid-group" boxes descend from a common table
or inline-table box
All that's needed is to rank the precedence of the two parent
elements, whether considering inheritance on one hand and the
specificity of descendant selectors following the column or row path
on the other hand.
Elaborating on the proposed W3C CSS2.1 recommendation for determining
specificity:
count 1 if the declaration is from a 'style' attribute rather than a
rule with a selector, 0 otherwise (= a) (In HTML, values of an
element's "style" attribute are style sheet rules. These rules have
no selectors, so a=1, b=0, c=0, and d=0.)
count the number of ID attributes in the selector (= b)
count the number of other attributes and pseudo-classes in the
selector (= c)
count the number of element names and pseudo-elements in the selector
(= d)
count 0 if the rule’s owner declaration’s selector involves a
selector for a box with display table-column or table-column-group
(i.e., it descends from a column). 1 otherwise.
However, when considering certain properties, then reverse this: 1 if
the selector involves a table-column or table-column-group, 0
otherwise. (= e). The reversed properties could be up for debate. Or
they could be listed in another property (e.g.: "column-priority-
properties: text-align, font-family, font-size;"). Or this reversal
could just be skipped. However, I 'm thinking of the reversals made
in HTML4 with align (horizontal).
[…]
Concatenating the fourfive numbers a-b-c-d-e (in a number system with
a large base) gives the specificity.
This means that within the associated stylesheets, any 'display'
property rules taking a value of 'table-column' or 'table-column-
group' or 'table-cell" must be processed (cascaded) before any other
rules. Otherwise this alternate specificity calculation cannot be
performed. Once that has taken place it shouldn't require any
additional ivars (as far as I can tell): just a more elaborate
conditional statement.
Just as in the case of contextual selectors, a parallel issue arises
for inheritance. The inherited value for a table-cell could come from
either a table-row (and its group parent or the table itself) or a
table-column (and ultimately its group-column or group-row parent or
the table itself). However, the only extra conditional processing is
in considering inheritance from two parents rather than one.
Again, changing the recommendation inheritance passage slightly:
If the cascade results in a value, use it.
Otherwise, if the property is inherited and the element is not the
root of the document tree, use the computed value of the parent
element., except if it is display-table-cell. In that case check the
table-cell box’s parents to see if those have a cascade value other
than inherit. If so, apply this cascade value to the table-cell in
the following order of precedence: A) the table-row parent; B) the
table-column parent.
Otherwise use the property's initial value. The initial value of each
property is indicated in the property's definition.
This means that instead of checking one parent, WebKit checks two
parents. Beyond those parent boxes, this quickly converges back to
the same ancestor table box whether through the column path or the
row path. This also degrades gracefully to the W3C specification.
Only content creators setting properties on columns or column-groups
will notice any difference (which means they're likely looking for
this difference). Again, the algorithm could be made a bit more
intricate by swapping the priority between row and column as the
HTML4 spec does with cell align (horizontal) and valign. It may also
require an extra bool on table-row, table-column, table-row-group and
table-column-group boxes to indicate when their property (or perhaps
attribute) values are from a cascade.
This is a generalized solution that would probably be a W3C
recommendation if the relevant WG believed it could work. IE has
shown that much of this this can be done already. If WebKit shows how
its done, Mozilla and Opera could probably be convinced to follow.
Then the CSS3 Table module recommendation could make it law.
Again, I'm not yet familiar enough with the WebKit codebase to know
if there are practical implementation barriers to this approach.
Please reply if you know of any issues that could arise.
If this was done well enough, imagine this 2D Table Style Challenge
(to follow on the heels of the Acid2 challenge): display a transposed
table through CSS.
table {display: table;}
caption {display: table-caption;}
td, th {display: table-cell;}
tr {display: table-column;}
tbody {display: table-column-group}
col {display: table-row;}
colgroup {display: table-row-group;}
Now that would be separating semantics from presentation!
I welcome any suggestions anyone has on this. I may use this project
as an exercise to familiarize myself with the code. Most of WebKit's
table bugs are minor, but I think the one's surrounding column
styling are relatively fundamental.
Best wishes,
Rob
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/webkit-dev/attachments/20070302/2a8c207a/attachment.html
More information about the webkit-dev
mailing list