代码拉取完成,页面将自动刷新
同步操作将从 Yaohaixiao/outline.js 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
import trim from './utils/lang/trim'
import stripTags from './utils/lang/stripTags'
import isFunction from './utils/types/isFunction'
import _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'
import _getChaptersWithCode from './_getChaptersWithCode'
/**
* 根据文章中的 h1~h6 标签,自动分析返回文章章节数据
* ========================================================================
* @method getChaptersByHeadings
* @param {Array} headings
* @param {Boolean} [showCode]
* @param {Function} [chapterTextFilter]
* @return {*|*[]}
*/
const getChaptersByHeadings = (
headings,
showCode = true,
chapterTextFilter = null
) => {
let previous = 1
let level = 0
let text = ''
const chapters = []
headings.forEach((heading, i) => {
const tagName = heading.tagName
const headingLevel = tagName.replace(/h/i, '')
let current = parseInt(headingLevel, 10)
let pid = -1
// 场景1:当前标题是前一个标题的子标题
// 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;
// h2 (前一个标题)
// h3 (当前标题)
if (current > previous) {
level += 1
// 第一层级的 pid 是 -1
if (level === 1) {
pid = -1
} else {
pid = i - 1
}
}
// 场景2:当前标题和前一个标题层级相同
// 当前标题的(标题标签)序号 = 前一个标题的序号
// h2 (前一个标题)
// h2 (当前标题)
// 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别
// h2
// h4 (前一个标题)
// h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)
else if (current === previous || (current < previous && current > level)) {
// H1 的层级肯定是 1
if (current === 1) {
level = 1
pid = -1
} else {
pid = chapters[i - 1].pid
}
}
// 场景3:当前标题比前一个标题层级高
else if (current <= level) {
// H1 的层级肯定是 1
if (current === 1) {
level = 1
} else {
level = level - (previous - current)
if (level <= 1) {
level = 1
}
}
// 第一级的标题
if (level === 1) {
pid = -1
} else {
// 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID
pid = _getChapterParentIdByDiffer(chapters, previous - current, i)
}
}
previous = current
text = stripTags(trim(heading.innerHTML))
if (isFunction(chapterTextFilter)) {
text = chapterTextFilter(text)
}
chapters.push({
id: i,
pid: pid,
level: level,
rel: `heading-${i}`,
text,
tagName
})
})
return showCode ? _getChaptersWithCode(chapters) : chapters
}
export default getChaptersByHeadings
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。