[Doc-SIG] Cleaning up HTML output (part 1 - 'name' and numerical ids)

David Goodger goodger@users.sourceforge.net
Mon, 08 Jul 2002 21:48:26 -0400

>>> And numerical id's aren't very use-friendly.

[David Goodger]
>> Docutils actually uses names wherever possible.  I don't know that
>> it could be improved much, but if you do, please let me know.

> Well, let's take an example from your test.txt output:
>  | <div class="section" id="structural-elements"
>  |  name="structural-elements">
>  | <h1><a href="#id21">Structural Elements</a></h1>
> 'name' is not a valid attribute for <div>, <li>, or most of the
> other elements in HTML. It's used in forms, and it's used in the
> anchor tag.

I see from the HTML spec that that's true.  I guess I implemented
"name" and "id" everywhere as an over-liberal interpretation of the
XHTML 1.0 spec (Appendix C, section 8 "Fragment Identifiers"), where
it says:

    In XML, URIs [RFC2396] that end with fragment identifiers of the
    form "#foo" do not refer to elements with an attribute name="foo";
    rather, they refer to elements with an attribute defined to be of
    type ID, e.g., the id attribute in HTML 4. Many existing HTML
    clients don't support the use of ID-type attributes in this way,
    so identical values may be supplied for both of these attributes
    to ensure maximum forward and backward compatibility (e.g., <a
    id="foo" name="foo">...</a>).


Patches to rectify this and any other oversights/mistakes/bugs are
always welcome.

> The above code should be written one of three ways:
> <div class="section" id="structural-elements">
> <h1>Structural Elements</h1>
> The first only works in browsers that support the 'id' attribute for
> targets, but it is a cleaner syntax.

Should we be supporting older browsers?  Or can we write code to the
latest & greatest specs exclusively?

> <div class="section">
> <h1><a id="structural-elements" name="structural-elements">
> Structural Elements</a></h1>
> The second is redundant.

But better for older browsers.  Also, it would be tricky to implement,
since the ID skips from the container (<div>, a Docutils section) to
the header/title.

> <div class="section">
> <h1><a name="structural-elements">Structural Elements</a></h1>
> The third is not ideal, but it works in every HTML browser I have
> ever come across.

It's also deprecated in the latest specs.  Will future browsers ever
stop supporting it?

> You use the numerical ids to have headings refer back to their
> respective section entries in the table of contents. I don't see
> that this is a particularly necessary behavior to have--you can just
> link back to the table of contents as a whole, if you really want
> to.

That could be optional behavior, specified either by a command-line
option or as a "contents" directive attribute (or both; perhaps both
would be best).  I'll enter it in the "To Do" list; patches are
welcome.  I modeled the current TOC behavior on GNU HTML documents.

> Ideally, you'd put in a <link> to the table of contents in the
> <head>:
>     <link rel="toc" href="#table-of-contents"
>      title="Table of Contents">
> and leave it at that.

I don't understand how that is supposed to work.  Could you supply an
example or a reference?

> Unfortunatly, most browsers don't support <link>.

So perhaps it's a non-issue?

> If linking back to the corresponding toc entry is important to you,
> then identify the entries with the section's id preceded by 'toc-'.
> For example:
>   <li id="toc-structural-elements"><a href="#structural-elements">
>       Structural Elements</a></li>
> or
>   <li><a href="#structural-elements" name="toc-structural-elements">
>       Structural Elements</a></li>

Since I normally don't read the raw HTML, and it's not *intended* to
be read in raw form, I don't think the form of the IDs is that
important.  If you do... patches are welcome.

David Goodger  <goodger@users.sourceforge.net>  Open-source projects:
  - Python Docutils: http://docutils.sourceforge.net/
    (includes reStructuredText: http://docutils.sf.net/rst.html)
  - The Go Tools Project: http://gotools.sourceforge.net/