Right now, the ToC has an undefined variable i that was an index in the original ToC code. Since the major rewrite in 4fe062085324c50f2cfa062258559cf31858ef5f it's a recursive function without this index. The variable `i` was wrongly copied into its current place from the old code. This patch replaces the variable `i` with the index of the header element. Fix the undefined variable problem. Signed-off-by: Sheogorath <sheogorath@shivering-isles.com>
		
			
				
	
	
		
			145 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* eslint-env browser, jquery */
 | 
						|
/**
 | 
						|
 * md-toc.js v1.0.2
 | 
						|
 * https://github.com/yijian166/md-toc.js
 | 
						|
 */
 | 
						|
 | 
						|
(function (window) {
 | 
						|
  function Toc (id, options) {
 | 
						|
    this.el = document.getElementById(id)
 | 
						|
    if (!this.el) return
 | 
						|
    this.options = options || {}
 | 
						|
    this.tocLevel = parseInt(options.level) || 0
 | 
						|
    this.tocClass = options['class'] || 'toc'
 | 
						|
    this.ulClass = options['ulClass']
 | 
						|
    this.tocTop = parseInt(options.top) || 0
 | 
						|
    this.elChilds = this.el.children
 | 
						|
    this.process = options['process']
 | 
						|
    if (!this.elChilds.length) return
 | 
						|
    this._init()
 | 
						|
  }
 | 
						|
 | 
						|
  Toc.prototype._init = function () {
 | 
						|
    this._collectTitleElements()
 | 
						|
    this._createTocContent()
 | 
						|
    this._showToc()
 | 
						|
  }
 | 
						|
 | 
						|
  Toc.prototype._collectTitleElements = function () {
 | 
						|
    this._elTitlesNames = []
 | 
						|
    this.elTitleElements = []
 | 
						|
    for (var i = 1; i < 6; i++) {
 | 
						|
      if (this.el.getElementsByTagName('h' + i).length) {
 | 
						|
        this._elTitlesNames.push('h' + i)
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    this._elTitlesNames.length = this._elTitlesNames.length > this.tocLevel ? this.tocLevel : this._elTitlesNames.length
 | 
						|
 | 
						|
    for (var j = 0; j < this.elChilds.length; j++) {
 | 
						|
      this._elChildName = this.elChilds[j].tagName.toLowerCase()
 | 
						|
      if (this._elTitlesNames.toString().match(this._elChildName)) {
 | 
						|
        this.elTitleElements.push(this.elChilds[j])
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  Toc.prototype._createTocContent = function recursiveToc(level = 0, titleElements = [], titleNames = [], ulClass = undefined, index = 0) {
 | 
						|
    // Inititalize our elements from the toc object
 | 
						|
    // which is only available on level 0
 | 
						|
    if (level === 0) {
 | 
						|
      titleElements = this.elTitleElements
 | 
						|
      titleNames = this._elTitlesNames
 | 
						|
      ulClass = this.ulClass
 | 
						|
    }
 | 
						|
    // No need to do anything for an empty ToC
 | 
						|
    if (!titleElements.length) return
 | 
						|
 | 
						|
    var content = '<ul'
 | 
						|
    if (ulClass) {
 | 
						|
      content += ' class="' + ulClass + '"'
 | 
						|
    }
 | 
						|
    content += '>\n'
 | 
						|
    var iterTag = titleNames[level]
 | 
						|
    var recurse = false
 | 
						|
    var openTag = false
 | 
						|
 | 
						|
    for (var element; element = titleElements.shift();) {
 | 
						|
      var elementTag = element.tagName.toLowerCase()
 | 
						|
 | 
						|
      // We only care about tags on our level to add them as list item
 | 
						|
      if (elementTag == iterTag) {
 | 
						|
        // Let's do some cleaning
 | 
						|
        var elementTitle = element.textContent.replace(/"/g, '"')
 | 
						|
        var elementText = (typeof this.process === 'function' ? this.process(element) : element.innerHTML).replace(/<(?:.|\n)*?>/gm, '')
 | 
						|
        var id = element.getAttribute('id')
 | 
						|
        if (!id) {
 | 
						|
          element.setAttribute('id', 'tip' + ++index)
 | 
						|
          id = '#tip' + index
 | 
						|
        } else {
 | 
						|
          id = '#' + id
 | 
						|
        }
 | 
						|
        if (openTag) {
 | 
						|
          content += '</li>\n'
 | 
						|
          openTag = false
 | 
						|
        }
 | 
						|
        content += '<li><a href="' + id + '" title="'+ elementTitle +'">' + elementText + '</a>'
 | 
						|
        // Reset recursion. We need it for the next subsections
 | 
						|
        recurse = false
 | 
						|
        openTag = true
 | 
						|
      // Check if the current element has a lower level than ours, if so, we have to go down the rabbithole!
 | 
						|
      } else if (!recurse && titleNames.indexOf(elementTag.toLowerCase()) > level) {
 | 
						|
        recurse = true
 | 
						|
        if (!openTag) {
 | 
						|
          content += '<li class="invisable-node">'
 | 
						|
          openTag = true
 | 
						|
        }
 | 
						|
        // This element is for the lower lever, we have to re-add it before we send the list down there.
 | 
						|
        titleElements.unshift(element)
 | 
						|
        // Let's call ourself and get to the next level
 | 
						|
        content += recursiveToc(level + 1, titleElements, titleNames, ulClass, index)
 | 
						|
      } else {
 | 
						|
        // When we end up here, met a higher level element
 | 
						|
        // This is not our business so back into the list with the element and let's end this loop
 | 
						|
        titleElements.unshift(element)
 | 
						|
        break
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    if (openTag) {
 | 
						|
      content += '</li>\n'
 | 
						|
    }
 | 
						|
    content += '</ul>\n'
 | 
						|
 | 
						|
    // Set ToC content of the level 0 everything else pass things to the upper level!
 | 
						|
    if (level === 0) {
 | 
						|
      this.tocContent = content
 | 
						|
    } else {
 | 
						|
      return content
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  Toc.prototype._showToc = function () {
 | 
						|
    this.toc = document.createElement('div')
 | 
						|
    this.toc.innerHTML = this.tocContent
 | 
						|
    this.toc.setAttribute('class', this.tocClass)
 | 
						|
    if (!this.options.targetId) {
 | 
						|
      this.el.appendChild(this.toc)
 | 
						|
    } else {
 | 
						|
      document.getElementById(this.options.targetId).appendChild(this.toc)
 | 
						|
    }
 | 
						|
    var self = this
 | 
						|
    if (this.tocTop > -1) {
 | 
						|
      window.onscroll = function () {
 | 
						|
        var t = document.documentElement.scrollTop || document.body.scrollTop
 | 
						|
        if (t < self.tocTop) {
 | 
						|
          self.toc.setAttribute('style', 'position:absolute;top:' + self.tocTop + 'px;')
 | 
						|
        } else {
 | 
						|
          self.toc.setAttribute('style', 'position:fixed;top:10px;')
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
  window.Toc = Toc
 | 
						|
})(window)
 |