diff --git a/index.html b/index.html index 1eaa0157d..591a0f653 100644 --- a/index.html +++ b/index.html @@ -37,7 +37,7 @@ loadNavbar: true, mergeNavbar: true, maxLevel: 4, - subMaxLevel: 2, + subMaxLevel: 6, name: 'docsify', search: { noData: { diff --git a/src/core/event/scroll.js b/src/core/event/scroll.js index 946589996..eb063c5fc 100644 --- a/src/core/event/scroll.js +++ b/src/core/event/scroll.js @@ -1,8 +1,8 @@ -import Tweezer from 'tweezer.js'; import { isMobile } from '../util/env'; import * as dom from '../util/dom'; import { removeParams } from '../router/util'; import config from '../config'; +import Tweezer from 'tweezer.js'; const nav = {}; let hoverOver = false; @@ -38,6 +38,7 @@ function highlight(path) { const anchors = dom.findAll('.anchor'); const wrap = dom.find(sidebar, '.sidebar-nav'); let active = dom.find(sidebar, 'li.active'); + let parents = dom.findAll(sidebar, 'li.parent'); const doc = document.documentElement; const top = ((doc && doc.scrollTop) || document.body.scrollTop) - coverHeight; let last; @@ -70,6 +71,9 @@ function highlight(path) { li.classList.add('active'); active = li; + parents.forEach(node => node.classList.remove('parent')); + active = findParents(active); + // Scroll into view // https://github.com/vuejs/vuejs.org/blob/master/themes/vue/source/js/common.js#L282-L297 if (!hoverOver && dom.body.classList.contains('sticky')) { @@ -85,6 +89,31 @@ function highlight(path) { } } +function findParents(active) { + if (!active) { + return active; + } + + let top = active; + let node = active.parentNode; + + while (node) { + if (node.classList.contains('app-sub-sidebar')) { + node = node.parentNode; + continue; + } else if (node.classList.contains('has-children')) { + node.classList.add('parent'); + if (node.classList.contains('collapse')) { + top = node; + } + node = node.parentNode; + continue; + } else { + return top; + } + } +} + function getNavKey(path, id) { return `${decodeURIComponent(path)}?id=${decodeURIComponent(id)}`; } @@ -149,8 +178,12 @@ export function scrollIntoView(path, id) { const li = nav[getNavKey(path, id)]; const sidebar = dom.getNode('.sidebar'); const active = dom.find(sidebar, 'li.active'); + const parents = dom.findAll(sidebar, 'li.parent'); active && active.classList.remove('active'); + parents.forEach(node => node.classList.remove('parent')); + li && li.classList.add('active'); + findParents(li); } const scrollEl = dom.$.scrollingElement || dom.$.documentElement; diff --git a/src/core/event/sidebar.js b/src/core/event/sidebar.js index b15cb2afe..448453091 100644 --- a/src/core/event/sidebar.js +++ b/src/core/event/sidebar.js @@ -43,6 +43,13 @@ export function collapse(el) { target.nextSibling.classList.contains('app-sub-sidebar') ) { dom.toggleClass(target.parentNode, 'collapse'); + } else if ( + target.nodeName === 'SPAN' && + target.nextSibling && + target.nextSibling.classList && + target.nextSibling.classList.contains('section-link') + ) { + dom.toggleClass(target.parentNode, 'collapse'); } }); } diff --git a/src/core/render/compiler.js b/src/core/render/compiler.js index 4eaf51215..0638c321a 100644 --- a/src/core/render/compiler.js +++ b/src/core/render/compiler.js @@ -1,4 +1,3 @@ -import marked from 'marked'; import { isAbsolutePath, getPath, getParentPath } from '../router/util'; import { isFn, merge, cached, isPrimitive } from '../util/core'; import { tree as treeTpl } from './tpl'; @@ -12,6 +11,7 @@ import { paragraphCompiler } from './compiler/paragraph'; import { taskListCompiler } from './compiler/taskList'; import { taskListItemCompiler } from './compiler/taskListItem'; import { linkCompiler } from './compiler/link'; +import marked from 'marked'; const cachedLinks = {}; @@ -278,7 +278,7 @@ export class Compiler { } const tree = this.cacheTree[currentPath] || genTree(toc, level); - html = treeTpl(tree, '