Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. var asciidoc = {  // Namespace.
  2.  
  3. /////////////////////////////////////////////////////////////////////
  4. // Table Of Contents generator
  5. /////////////////////////////////////////////////////////////////////
  6.  
  7. /* Author: Mihai Bazon, September 2002
  8.  * http://students.infoiasi.ro/~mishoo
  9.  *
  10.  * Table Of Content generator
  11.  * Version: 0.4
  12.  *
  13.  * Feel free to use this script under the terms of the GNU General Public
  14.  * License, as long as you do not remove or alter this notice.
  15.  */
  16.  
  17.  /* modified by Troy D. Hanson, September 2006. License: GPL */
  18.  /* modified by Stuart Rackham, 2006, 2009. License: GPL */
  19.  
  20. // toclevels = 1..4.
  21. toc: function (toclevels) {
  22.  
  23.   function getText(el) {
  24.     var text = "";
  25.     for (var i = el.firstChild; i != null; i = i.nextSibling) {
  26.       if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
  27.         text += i.data;
  28.       else if (i.firstChild != null)
  29.         text += getText(i);
  30.     }
  31.     return text;
  32.   }
  33.  
  34.   function TocEntry(el, text, toclevel) {
  35.     this.element = el;
  36.     this.text = text;
  37.     this.toclevel = toclevel;
  38.   }
  39.  
  40.   function tocEntries(el, toclevels) {
  41.     var result = new Array;
  42.     var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
  43.     // Function that scans the DOM tree for header elements (the DOM2
  44.     // nodeIterator API would be a better technique but not supported by all
  45.     // browsers).
  46.     var iterate = function (el) {
  47.       for (var i = el.firstChild; i != null; i = i.nextSibling) {
  48.         if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
  49.           var mo = re.exec(i.tagName);
  50.           if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
  51.             result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
  52.           }
  53.           iterate(i);
  54.         }
  55.       }
  56.     }
  57.     iterate(el);
  58.     return result;
  59.   }
  60.  
  61.   var toc = document.getElementById("toc");
  62.   var entries = tocEntries(document.getElementById("content"), toclevels);
  63.   for (var i = 0; i < entries.length; ++i) {
  64.     var entry = entries[i];
  65.     if (entry.element.id == "")
  66.       entry.element.id = "_toc_" + i;
  67.     var a = document.createElement("a");
  68.     a.href = "#" + entry.element.id;
  69.     a.appendChild(document.createTextNode(entry.text));
  70.     var div = document.createElement("div");
  71.     div.appendChild(a);
  72.     div.className = "toclevel" + entry.toclevel;
  73.     toc.appendChild(div);
  74.   }
  75.   if (entries.length == 0)
  76.     toc.parentNode.removeChild(toc);
  77. },
  78.  
  79.  
  80. /////////////////////////////////////////////////////////////////////
  81. // Footnotes generator
  82. /////////////////////////////////////////////////////////////////////
  83.  
  84. /* Based on footnote generation code from:
  85.  * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
  86.  */
  87.  
  88. footnotes: function () {
  89.   var cont = document.getElementById("content");
  90.   var noteholder = document.getElementById("footnotes");
  91.   var spans = cont.getElementsByTagName("span");
  92.   var refs = {};
  93.   var n = 0;
  94.   for (i=0; i<spans.length; i++) {
  95.     if (spans[i].className == "footnote") {
  96.       n++;
  97.       // Use [\s\S] in place of . so multi-line matches work.
  98.       // Because JavaScript has no s (dotall) regex flag.
  99.       note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
  100.       noteholder.innerHTML +=
  101.         "<div class='footnote' id='_footnote_" + n + "'>" +
  102.         "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
  103.         n + "</a>. " + note + "</div>";
  104.       spans[i].innerHTML =
  105.         "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
  106.         "' title='View footnote' class='footnote'>" + n + "</a>]";
  107.       var id =spans[i].getAttribute("id");
  108.       if (id != null) refs["#"+id] = n;
  109.     }
  110.   }
  111.   if (n == 0)
  112.     noteholder.parentNode.removeChild(noteholder);
  113.   else {
  114.     // Process footnoterefs.
  115.     for (i=0; i<spans.length; i++) {
  116.       if (spans[i].className == "footnoteref") {
  117.         var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
  118.         href = href.match(/#.*/)[0];  // Because IE return full URL.
  119.         n = refs[href];
  120.         spans[i].innerHTML =
  121.           "[<a href='#_footnote_" + n +
  122.           "' title='View footnote' class='footnote'>" + n + "</a>]";
  123.       }
  124.     }
  125.   }
  126. }
  127.  
  128. }
  129.