mirror of https://github.com/status-im/codimd.git
Merge pull request #886 from SISheogorath/fix/ToCHeader
Refactor generation of ToC
This commit is contained in:
commit
af26992b55
|
@ -93,6 +93,10 @@
|
||||||
color: #777;
|
color: #777;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.toc .invisable-node {
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
|
||||||
.ui-toc {
|
.ui-toc {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
bottom: 20px;
|
bottom: 20px;
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
Toc.prototype._collectTitleElements = function () {
|
Toc.prototype._collectTitleElements = function () {
|
||||||
this._elTitlesNames = []
|
this._elTitlesNames = []
|
||||||
this.elTitleElements = []
|
this.elTitleElements = []
|
||||||
for (var i = 1; i < 7; i++) {
|
for (var i = 1; i < 6; i++) {
|
||||||
if (this.el.getElementsByTagName('h' + i).length) {
|
if (this.el.getElementsByTagName('h' + i).length) {
|
||||||
this._elTitlesNames.push('h' + i)
|
this._elTitlesNames.push('h' + i)
|
||||||
}
|
}
|
||||||
|
@ -44,59 +44,79 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Toc.prototype._createTocContent = function () {
|
Toc.prototype._createTocContent = function recursiveToc(level = 0, titleElements = [], titleNames = [], ulClass = undefined) {
|
||||||
this._elTitleElementsLen = this.elTitleElements.length
|
// Inititalize our elements from the toc object
|
||||||
if (!this._elTitleElementsLen) return
|
// which is only available on level 0
|
||||||
this.tocContent = ''
|
if (level === 0) {
|
||||||
this._tempLists = []
|
titleElements = this.elTitleElements
|
||||||
|
titleNames = this._elTitlesNames
|
||||||
|
ulClass = this.ulClass
|
||||||
|
}
|
||||||
|
// No need to do anything for an empty ToC
|
||||||
|
if (!titleElements.length) return
|
||||||
|
|
||||||
for (var i = 0; i < this._elTitleElementsLen; i++) {
|
var content = '<ul'
|
||||||
var j = i + 1
|
if (ulClass) {
|
||||||
this._elTitleElement = this.elTitleElements[i]
|
content += ' class="' + ulClass + '"'
|
||||||
this._elTitleElementName = this._elTitleElement.tagName
|
}
|
||||||
this._elTitleElementTitle = this._elTitleElement.textContent.replace(/"/g, '"')
|
content += '>\n'
|
||||||
this._elTitleElementText = (typeof this.process === 'function' ? this.process(this._elTitleElement) : this._elTitleElement.innerHTML).replace(/<(?:.|\n)*?>/gm, '')
|
var iterTag = titleNames[level]
|
||||||
var id = this._elTitleElement.getAttribute('id')
|
var recurse = false
|
||||||
if (!id) {
|
var openTag = false
|
||||||
this._elTitleElement.setAttribute('id', 'tip' + i)
|
|
||||||
id = '#tip' + i
|
|
||||||
} else {
|
|
||||||
id = '#' + id
|
|
||||||
}
|
|
||||||
|
|
||||||
this.tocContent += '<li><a href="' + id + '" title="'+ this._elTitleElementTitle +'">' + this._elTitleElementText + '</a>'
|
for (var element; element = titleElements.shift();) {
|
||||||
|
var elementTag = element.tagName.toLowerCase()
|
||||||
|
|
||||||
if (j !== this._elTitleElementsLen) {
|
// We only care about tags on our level to add them as list item
|
||||||
this._elNextTitleElementName = this.elTitleElements[j].tagName
|
if (elementTag == iterTag) {
|
||||||
if (this._elTitleElementName !== this._elNextTitleElementName) {
|
// Let's do some cleaning
|
||||||
var checkColse = false
|
var elementTitle = element.textContent.replace(/"/g, '"')
|
||||||
var y = 1
|
var elementText = (typeof this.process === 'function' ? this.process(element) : element.innerHTML).replace(/<(?:.|\n)*?>/gm, '')
|
||||||
for (var t = this._tempLists.length - 1; t >= 0; t--) {
|
var id = element.getAttribute('id')
|
||||||
if (this._tempLists[t].tagName === this._elNextTitleElementName) {
|
if (!id) {
|
||||||
checkColse = true
|
element.setAttribute('id', 'tip' + i)
|
||||||
break
|
id = '#tip' + i
|
||||||
}
|
|
||||||
y++
|
|
||||||
}
|
|
||||||
if (checkColse) {
|
|
||||||
this.tocContent += new Array(y + 1).join('</li></ul>')
|
|
||||||
this._tempLists.length = this._tempLists.length - y
|
|
||||||
} else {
|
|
||||||
this._tempLists.push(this._elTitleElement)
|
|
||||||
if (this.ulClass) { this.tocContent += '<ul class="' + this.ulClass + '">' } else { this.tocContent += '<ul>' }
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
this.tocContent += '</li>'
|
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)
|
||||||
} else {
|
} else {
|
||||||
if (this._tempLists.length) {
|
// When we end up here, met a higher level element
|
||||||
this.tocContent += new Array(this._tempLists.length + 1).join('</li></ul>')
|
// This is not our business so back into the list with the element and let's end this loop
|
||||||
} else {
|
titleElements.unshift(element)
|
||||||
this.tocContent += '</li>'
|
break
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.ulClass) { this.tocContent = '<ul class="' + this.ulClass + '">' + this.tocContent + '</ul>' } else { this.tocContent = '<ul>' + this.tocContent + '</ul>' }
|
|
||||||
|
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 () {
|
Toc.prototype._showToc = function () {
|
||||||
|
|
Loading…
Reference in New Issue