[whatwg] WA 1.0 - document outline suggestion
ROBO Design
robodesign at gmail.com
Wed Nov 16 06:00:18 PST 2005
Hello!
I see the WA 1.0 specification contains a great deal of prose describing
in minute detail how to build a conforming document outline, based on
sections and headings [1]. Very good.
Why not also add in DOM: document.outline ?
Maybe something similar has been suggested or maybe something regarding
this will be added, but here's my proposal.
For example:
<h1 id="a">bla</h1>
<p id="el1">Bla</p>
<h2 id="b">bla</h2>
<p id="el2">Bla</p>
<h3 id="c">bla</h3>
<p id="el3">Bla</p>
<h2 id="d">bla</h2>
<p id="el4">Bla</p>
<h2 id="e">bla</h2>
<p id="el5">Bla</h2>
<h1 id="f">bla</h1>
<p id="el6">Bla</p>
Would have the document.outline:
document.outline.item(0) = document.getElementById("a")
document.outline.item(1) = document.getElementById("f")
document.outline.item(2) = null
document.outline[0].item(0) = document.getElementById("b")
document.outline[0].item(1) = document.getElementById("d")
document.outline[0].item(2) = document.getElementById("e")
document.outline[0][1].item(0) = document.getElementById("c")
(Disclamer: the above code may not be accurately outlined, even if I read
the outlining algorithm ... it's a bit too much to remember. But ... the
purpose of the suggestion is not the accuracy of my outline :)
I don't know how to represent the above in prose, but I believe the
example is self describing enough (based on questions I can provide
further details).
The document.outline could also provide means to jump to those headings,
like document.outline.go(N) (and document.outline[N].go(N), etc).
If somebody likes complicated things: if N is not a number, it could be
interpreted as item(str) and go(str). Parsing it like this:
document.outline.item("0 2") = document.getElementById("e")
document.outline.item("0KJ-1!@0") = document.getElementById("c")
document.outline[0].item("1*//*+0") = document.getElementById("c")
Any (multiple) non-number character(s) become(s) a single space character.
str = trim(str.replace(/[^0-9]+/, ' '));
(Disclaimer: the above is not JS, it's something hybrid.)
Then split on spaces.
Last, but not least ... the document.outline could also provide a "flat
view" of the outline. Example based on the above code:
document.outline.flat(0) = document.outline.item(0)
document.outline.flat(1) = document.outline[0].item(0)
document.outline.flat(2) = document.outline[0].item(1)
document.outline.flat(3) = document.outline[0][1].item(0)
document.outline.flat(4) = document.outline[0].item(2)
document.outline.flat(5) = document.outline.item(1)
And .flat(N) should be available for each outline[N][N]...[N]. For example:
document.outline[0].flat(0) = document.outline[0].item(0)
document.outline[0].flat(1) = document.outline[0].item(1)
document.outline[0].flat(2) = document.outline[0][1].item(0)
document.outline[0].flat(3) = document.outline[0].item(2)
Next, add to HTMLElement (or maybe not to *all* HTML elements):
element.goHeading(N)
element.getHeading(N)
... where N is the heading depth. Consider this (based on the above sample
code):
document.getElementById("el3").getHeading(1) = document.getElementById("c")
document.getElementById("el3").getHeading(2) = document.getElementById("b")
document.getElementById("el3").getHeading(3) = document.getElementById("a")
Negative values should be treated like this:
document.getElementById("el3").getHeading(-1) =
document.getElementById("a")
document.getElementById("el3").getHeading(-2) =
document.getElementById("b")
document.getElementById("el3").getHeading(-3) =
document.getElementById("c")
getHeading(0) should return a HTMLCollection of all "parent headings",
starting with the closest:
[0] = document.getElementById("c")
[1] = document.getElementById("b")
[2] = document.getElementById("a")
goHeading(N) works like getHeading(N), except it returns true if the
browser found and scrolled to the heading, or false if the heading depth
is too high/low.
goHeading(0) should scroll back to the element itself.
The section and heading that applies to a node can be determined by the
already-defined algorithm [2].
I believe that there's an interest in document outlining since the
editor(s) of the specification dedicated part of their time in writing
2.5.11. section [1]. This is why I believe necessary to benefit web
authors too.
The use case of the above for authors: easy way of providing an accurate
table of contents to users, in page. They would no longer be required to
write advanced, prone to errors, scripts to generate the TOC based on the
algorithms described in the WA 1.0, nor they would be required to write
easy scripts that can be easily broken :).
As a final conclusion: my suggestion as a whole may not be desired (at
first), but it's like drag and drop, like menus and more. Table of
contents are something you see very often. Each TOC has its own way today.
Defining the algorithm of document outlining is actually something very
good which tries to bring order. Having DOM manipulation of the outline
would encourage authors to use the more accurate way of generating a TOC
in page. I am also aware that parts of the suggestion might be exaggerated
(like .item(str) and .flat(N)).
Some kind of disclaimer: I haven't got the time to read the entire
specification. Pardon me if this is already covered by the specification.
Thank you for taking the time to read and reply :).
[1] http://www.whatwg.org/specs/web-apps/current-work/#headings
[2] http://www.whatwg.org/specs/web-apps/current-work/#determining0
--
http://www.robodesign.ro
ROBO Design - We bring you the future
More information about the whatwg
mailing list