- From: Paul Sawyer <pauldsawyer@yahoo.com>
- Date: Thu, 9 Nov 2006 18:46:13 -0500
- To: <www-style@w3.org>
Since no one has responded to my post on this topic on November 7, 2006 I thought I should explain my suggestion a little more thoroughly. The problem as Anne van Kesteren originally pointed out is that the CSS2.1 counter model does not provide a way to produce hierarchically numbered sections with headers. Anne's example was: With a structure such as: <section> <h>LEVEL 1</h> <section> <h>LEVEL 2</h> </section> <section> <h>LEVEL 2</h> </section> </section> ... I can't really find the a way to get an outline such as: 1 LEVEL 1 1.1 LEVEL 2 1.2 LEVEL 2 To state the problem more generally, CSS2.1 does not provide a way to hierarchically number elements that directly nest within themselves. This type of numbering is very widely used, in technical books and documents. As L. David Baron pointed out, there is no way to tweak the existing CSS counter model with out breaking other important counter behaviors. I believe that there needs to be a way to hierarchically number elements that directly nest within themselves. In the example above, I believe that the "section" element should be able to hierarchically number itself (without any help from the "h" element). My solution does not change the existing counter behavior at all and it does not invent a whole new counter model it just adds the missing functionality to the current model. My solution is also very ease to implement in a UA. Currently when a UA traverses the document tree to generate the counter values for each node and it encounters a counter-reset, it must determine if the referencing element is a following sibling or a nested element. If it is a following sibling, it simply resets the current instance of the counter. However, if the referencing element is at a lower nesting level (lower than the level that the current instance of the counter was created at), the UA must create new instance of the counter and reset that. My solution is to add a new property, which might be called "counter-nested-reset". counter-nested-reset would work similarly to counter-reset except that when the UA detects a counter-nested-reset on a following sibling, it does not perform the reset. counter-nested-reset only performs a reset when it occurs on a element that is at a lower level of nesting. Therefore, counter-nested-reset never actually resets an existing instance of a counter. It only resets when it creates a new instance of the counter. As I said, UAs already need to distinguish between following siblings and nested elements when processing counter-resets. Therefore, adding the code to process counter-nested-resets is extremely simple. The code is basically a copy of the code that processes counter-reset except that when a following sibling is detected it does nothing. The following style sheet would then produce the desired behavior with the above example: section {counter-nested-reset: item; counter-increment: item} h:before {content: counters(item, ".") " "} Note that with this system, an element that directly self-nests can keep track of its hierarchical numbering. Therefore, this system would allow hierarchically numbered list items to be directly nested within themselves which would also be a nice feature. Paul Sawyer
Received on Thursday, 9 November 2006 23:46:25 UTC