Hi Stuart,
Glad to hear you like it. Please feel free to incorporate the TOC 
generation into Asciidoc and/or the User Guide. Mihai Bazon's Javascript 
code, and my edits to it, are under the GPL.

And, thanks for writing Asciidoc. It's a great tool.
Troy

Stuart Rackham wrote:
> Hi Troy
>
> This is really neat, it's something a number of users have asked about.
>
> It would be be nice to incorporate your TOC generation into AsciiDoc. 
> Would you have an objections if I were to incorporate your notes into 
> the AsciiDoc User Guide (along with an acknowledgment of course)? I 
> assume, judging by the copyright notice, that  the JavaScript code in 
> the public domain.
>
>
> Kind regards
> Stuart
>
>
> Troy Hanson wrote:
>> I thought this tip may be useful for others, so I'm sharing it here.
>>
>> Asciidoc normally does not insert a TOC (table of contents) into HTML 
>> output. While this can be achieved using docbook-generated HTML, 
>> there is an alternative, if you prefer Asciidoc's native HTML rendering.
>>
>> To see it in action, first view this example document: 
>> http://tpl.sourceforge.net/userguide.html
>>
>> Notice the TOC that sits on the right-hand side. (Your browser needs 
>> to have Javascript enabled, and its only been tested in Firefox and 
>> IE, so hopefully it looks right on your browser). Incidentally you 
>> may also notice the "top" navigational links that appear to the right 
>> of H3-level headers.
>>
>> As you may have surmised, the TOC was dynamically generated by some 
>> Javascript. The styling of the TOC was done via CSS. To use this 
>> technique, I added this line into my Asciidoc text document where I 
>> wanted the TOC to appear:
>>
>> include::toc.txt[]
>>
>> I have pasted the content of toc.txt later in this email. (Thanks to 
>> Mihai Bazon, for the dynamic TOC code, which I have modified somewhat.)
>>
>> To style the TOC and the "top" links, I appended some custom CSS, 
>> shown at this end of the email, to the default stylesheet in 
>> asciidoc/stylesheets/xhtml11.css. (Actually, I copied xhtml11.css and 
>> xhtml11-quirks.css to new files tdh.css and tdh-quirks.css, 
>> respectively, and then added the CSS to tdh.css.)
>>
>> Then I ran Asciidoc using the command:
>>
>>  asciidoc --unsafe --out-file=html/userguide.html -a linkcss=1 -a 
>> theme=tdh txt/userguide.txt
>>
>> The resulting HTML document contains links to the external 
>> stylesheets, so I had to upload tdh.css and tdh-quirks.css to the 
>> webserver along with the HTML document.
>>
>> A couple of notes: I chose to derive the TOC from only the H2 and H3 
>> headers. And the "top" link accompanies H3 headers. These are 
>> hardcoded into the Javascript (while not elegant code, it does the 
>> job). Also, my version of asciidoc is 7.x so I don't know if any 
>> changes are needed with newer versions. Lastly, I want to point out 
>> that I'm not an expert in the finer details of Asciidoc so, while my 
>> approach works, perhaps there is a simpler technique.
>>
>> FILES
>> -------
>>
>> First, below this line is the content of "toc.txt". It ends at the 
>> "endif" line:
>>
>> ifdef::backend-xhtml11[]
>> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>  
>>
>> <div id="toc"></div>
>> <script>
>> window.onload=generate_TOC
>>
>> /* Author: Mihai Bazon, September 2002
>>  * http://students.infoiasi.ro/~mishoo
>>  *
>>  * Table Of Content generator
>>  * Version: 0.4
>>  *
>>  * Feel free to use this script under the terms of the GNU General 
>> Public
>>  * License, as long as you do not remove or alter this notice.
>>  */
>>
>>  /* modified by Troy D. Hanson, September 2006. License: GPL */
>>
>> function H_getText(el) {
>>   var text = "";
>>   for (var i = el.firstChild; i != null; i = i.nextSibling) {
>>     if (i.nodeType == 3 /* Node.TEXT_NODE, IE doesn't speak constants 
>> */)
>>       text += i.data;
>>     else if (i.firstChild != null)
>>       text += H_getText(i);
>>   }
>>   return text;
>> }
>>
>> function TOC_EL(el, text, level) {
>>   this.element = el;
>>   this.text = text;
>>   this.level = level;
>> }
>>
>> function getHeadlines(el) {
>>   var l = new Array;
>>   var rx = /[hH]([2-3])/;
>>   // internal recursive function that scans the DOM tree
>>   var rec = function (el) {
>>     for (var i = el.firstChild; i != null; i = i.nextSibling) {
>>       if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
>>         if (rx.exec(i.tagName))
>>           l[l.length] = new TOC_EL(i, H_getText(i), 
>> parseInt(RegExp.$1));
>>         rec(i);
>>       }
>>     }
>>   }
>>   rec(el);
>>   return l;
>> }
>>
>> function generate_TOC() {
>>   var parent = document.getElementById("toc");
>>   var toc_hdr = document.createElement("div");
>>   var toc_hdr_txt = document.createTextNode("CONTENTS");
>>   toc_hdr.appendChild(toc_hdr_txt);
>>   /* toc_hdr.setAttribute("id","hdr"); */
>>   toc_hdr.id = "hdr";
>>   parent.appendChild(toc_hdr);
>>   var hs = getHeadlines(document.getElementsByTagName("body")[0]);
>>   for (var i = 0; i < hs.length; ++i) {
>>     var hi = hs[i];
>>     var d = document.createElement("div");
>>     if (hi.element.id == "") hi.element.id = "gen" + i;
>>     var a = document.createElement("a");
>>     a.href = "#" + hi.element.id;
>>     a.appendChild(document.createTextNode(hi.text));
>>     d.appendChild(a);
>>     d.className = "level" + hi.level;
>>     parent.appendChild(d);
>>     if (hi.level == 3) {
>>         var dvtop = document.createElement("div");
>>         dvtop.className = "toplink";
>>         dvtop.appendChild(document.createTextNode("^top^"));
>>         dvtop.onclick=function(){scrollTo(0,0);};
>>         hi.element.appendChild(dvtop);
>>     }
>>   }
>> }
>> </script>
>> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>  
>>
>> endif::backend-xhtml11[]
>>
>>
>> Lastly, here is the custom CSS styling that I added to "tdh.css":
>>
>> #toc {
>>   float: right;
>>   font-family: sans-serif;   border: 1px solid #000;
>>   margin: 0px 0px 20px 20px;
>>   padding: 0px;
>>   background: #f0f0f0;
>>   font-size: 80%;
>> }
>>
>> #toc #hdr {
>>   color:#ffffff;
>>   background:#98b1c4;
>>   text-align:center;
>>   margin-bottom:5px;
>> }
>>
>> #toc a:visited, #toc a:link { color:#000; text-decoration: none }
>> #toc a:hover { color:#00f; text-decoration: underline; }
>>
>> #toc .level2 { margin-left: 1em; margin-top: 2px; margin-bottom: 2px; 
>> text-decoration: underline; }
>> #toc .level3 { margin-left: 2em; font-size: 0.8em }
>>
>> .toplink {
>>     float: right;
>>     font-size: 50%;
>>     cursor: pointer;
>> }
>>
>>
>>
>>
>>
>> _______________________________________________
>> Asciidoc-discuss mailing list
>> Asciidoc-discuss@metaperl.com
>> http://metaperl.com/cgi-bin/mailman/listinfo/asciidoc-discuss
>>


_______________________________________________
Asciidoc-discuss mailing list
Asciidoc-discuss@metaperl.com
http://metaperl.com/cgi-bin/mailman/listinfo/asciidoc-discuss

Reply via email to