diff --git a/src/core/event/index.js b/src/core/event/index.js index 6c469a5..8489fc1 100644 --- a/src/core/event/index.js +++ b/src/core/event/index.js @@ -6,13 +6,13 @@ import { scrollIntoView } from './scroll' export function eventMixin (proto) { proto.$resetEvents = function () { scrollIntoView(this.route.query.id) - sidebar.getAndActive('nav') + sidebar.getAndActive(this.router, 'nav') } } export function initEvent (vm) { // Bind toggle button - sidebar.btn('button.sidebar-toggle') + sidebar.btn('button.sidebar-toggle', vm.router) // Bind sticky effect if (vm.config.coverpage) { !isMobile && on('scroll', sidebar.sticky) diff --git a/src/core/event/scroll.js b/src/core/event/scroll.js index 9019d33..3c833dc 100644 --- a/src/core/event/scroll.js +++ b/src/core/event/scroll.js @@ -1,6 +1,5 @@ import { isMobile } from '../util/env' import * as dom from '../util/dom' -import { parse } from '../router/hash' const nav = {} let hoverOver = false @@ -53,7 +52,7 @@ function highlight () { } } -export function scrollActiveSidebar () { +export function scrollActiveSidebar (router) { if (isMobile) return const sidebar = dom.getNode('.sidebar') @@ -66,7 +65,7 @@ export function scrollActiveSidebar () { let href = a.getAttribute('href') if (href !== '/') { - href = parse(href).query.id + href = router.parse(href).query.id } nav[decodeURIComponent(href)] = li diff --git a/src/core/event/sidebar.js b/src/core/event/sidebar.js index 32ae19c..d977743 100644 --- a/src/core/event/sidebar.js +++ b/src/core/event/sidebar.js @@ -1,12 +1,11 @@ import { isMobile } from '../util/env' import * as dom from '../util/dom' -import { getHash } from '../router/hash' const title = dom.$.title /** * Toggle button */ -export function btn (el) { +export function btn (el, router) { const toggle = _ => dom.body.classList.toggle('close') el = dom.getNode(el) @@ -21,7 +20,7 @@ export function btn (el) { dom.body.classList.contains('close') && toggle() ) dom.on(sidebar, 'click', _ => - setTimeout((_ => getAndActive(sidebar, true, true), 0)) + setTimeout((_ => getAndActive(router, sidebar, true, true), 0)) ) } @@ -39,16 +38,17 @@ export function sticky () { /** * Get and active link + * @param {object} router * @param {string|element} el * @param {Boolean} isParent acitve parent * @param {Boolean} autoTitle auto set title * @return {element} */ -export function getAndActive (el, isParent, autoTitle) { +export function getAndActive (router, el, isParent, autoTitle) { el = dom.getNode(el) const links = dom.findAll(el, 'a') - const hash = '#' + getHash() + const hash = router.toURL(router.getCurrentPath()) let target links diff --git a/src/core/global-api.js b/src/core/global-api.js index e73bbe4..1e5fa12 100644 --- a/src/core/global-api.js +++ b/src/core/global-api.js @@ -1,14 +1,14 @@ import * as util from './util' import * as dom from './util/dom' -import * as render from './render/compiler' -import * as route from './router/hash' +import { Compiler } from './render/compiler' import { slugify } from './render/slugify' import { get } from './fetch/ajax' import marked from 'marked' import prism from 'prismjs' export default function () { - window.Docsify = { util, dom, render, route, get, slugify } + window.Docsify = { util, dom, get, slugify } + window.DocsifyCompiler = Compiler window.marked = marked window.Prism = prism } diff --git a/src/core/render/compiler.js b/src/core/render/compiler.js index 9ae3c9c..914d479 100644 --- a/src/core/render/compiler.js +++ b/src/core/render/compiler.js @@ -17,24 +17,24 @@ export class Compiler { this.contentBase = getBasePath(config.base) const renderer = this._initRenderer() - let runner + let compile const mdConf = config.markdown || {} if (isFn(mdConf)) { - runner = mdConf(marked, renderer) + compile = mdConf(marked, renderer) } else { marked.setOptions(merge(mdConf, { renderer: merge(renderer, mdConf.renderer) })) - runner = marked + compile = marked } - this.runner = cached(text => { + this.compile = cached(text => { let html = '' if (!text) return text - html = runner(text) + html = compile(text) html = emojify(html) slugify.clear() @@ -119,7 +119,7 @@ export class Compiler { let html = '' if (text) { - html = this.runner(text) + html = this.compile(text) html = html.match(/]*>([\s\S]+)<\/ul>/g)[0] } else { const tree = this.cacheTree[currentPath] || genTree(this.toc, level) @@ -151,7 +151,7 @@ export class Compiler { } article (text) { - return this.runner(text) + return this.compile(text) } /** @@ -159,7 +159,7 @@ export class Compiler { */ cover (text) { const cacheToc = this.toc.slice() - const html = this.runner(text) + const html = this.compile(text) this.toc = cacheToc.slice() diff --git a/src/core/render/index.js b/src/core/render/index.js index f215a76..58bf325 100644 --- a/src/core/render/index.js +++ b/src/core/render/index.js @@ -1,14 +1,14 @@ import * as dom from '../util/dom' -import { getAndActive, sticky } from '../event/sidebar' -import { scrollActiveSidebar, scroll2Top } from '../event/scroll' -import cssVars from '../util/polyfill/css-vars' import * as tpl from './tpl' -import { Compiler } from './compiler' -import { callHook } from '../init/lifecycle' -import { getBasePath, getPath, isAbsolutePath } from '../router/util' -import { isPrimitive } from '../util/core' -import { isMobile } from '../util/env' +import cssVars from '../util/polyfill/css-vars' import tinydate from 'tinydate' +import { callHook } from '../init/lifecycle' +import { Compiler } from './compiler' +import { getAndActive, sticky } from '../event/sidebar' +import { getBasePath, getPath, isAbsolutePath } from '../router/util' +import { isMobile } from '../util/env' +import { isPrimitive } from '../util/core' +import { scrollActiveSidebar, scroll2Top } from '../event/scroll' function executeScript () { const script = dom.findAll('.markdown-section>script') @@ -86,13 +86,13 @@ export function renderMixin (proto) { const { maxLevel, subMaxLevel, autoHeader, loadSidebar } = this.config this._renderTo('.sidebar-nav', this.compiler.sidebar(text, maxLevel)) - const activeEl = getAndActive('.sidebar-nav', true, true) + const activeEl = getAndActive(this.router, '.sidebar-nav', true, true) if (loadSidebar && activeEl) { activeEl.parentNode.innerHTML += this.compiler.subSidebar(subMaxLevel) } // bind event this.activeLink = activeEl - scrollActiveSidebar() + scrollActiveSidebar(this.router) if (autoHeader && activeEl) { const main = dom.getNode('#main') @@ -106,13 +106,13 @@ export function renderMixin (proto) { } proto._renderNav = function (text) { - text && this._renderTo('nav', this.compiler.runner(text)) - getAndActive('nav') + text && this._renderTo('nav', this.compiler.compile(text)) + getAndActive(this.router, 'nav') } proto._renderMain = function (text, opt = {}) { callHook(this, 'beforeEach', text, result => { - let html = this.isHTML ? result : this.compiler.runner(result) + let html = this.isHTML ? result : this.compiler.compile(result) if (opt.updatedAt) { html = formatUpdated(html, opt.updatedAt, this.config.formatUpdated) } diff --git a/src/core/router/hash.js b/src/core/router/hash.js deleted file mode 100644 index fb441f0..0000000 --- a/src/core/router/hash.js +++ /dev/null @@ -1,80 +0,0 @@ -import { merge, cached } from '../util/core' -import { parseQuery, stringifyQuery, cleanPath } from './util' -export * from './util' - -function replaceHash (path) { - const i = window.location.href.indexOf('#') - window.location.replace( - window.location.href.slice(0, i >= 0 ? i : 0) + '#' + path - ) -} - -const replaceSlug = cached(path => { - return path - .replace('#', '?id=') - // .replace(/\?(\w+)=/g, (_, slug) => slug === 'id' ? '?id=' : `&${slug}=`) -}) -/** - * Normalize the current url - * - * @example - * domain.com/docs/ => domain.com/docs/#/ - * domain.com/docs/#/#slug => domain.com/docs/#/?id=slug - */ -export function normalize () { - let path = getHash() - - path = replaceSlug(path) - - if (path.charAt(0) === '/') return replaceHash(path) - replaceHash('/' + path) -} - -export function getHash () { - // We can't use window.location.hash here because it's not - // consistent across browsers - Firefox will pre-decode it! - const href = window.location.href - const index = href.indexOf('#') - return index === -1 ? '' : href.slice(index + 1) -} - -/** - * Parse the url - * @param {string} [path=window.location.herf] - * @return {object} { path, query } - */ -export function parse (path = window.location.href) { - let query = '' - - const queryIndex = path.indexOf('?') - if (queryIndex >= 0) { - query = path.slice(queryIndex + 1) - path = path.slice(0, queryIndex) - } - - const hashIndex = path.indexOf('#') - if (hashIndex) { - path = path.slice(hashIndex + 1) - } - - return { path, query: parseQuery(query) } -} - -/** - * to URL - * @param {string} path - * @param {object} qs query params - * @param {string} currentRoute optional current route - */ -export function toURL (path, params, currentRoute) { - const local = currentRoute && path[0] === '#' - const route = parse(replaceSlug(path)) - - route.query = merge({}, route.query, params) - path = route.path + stringifyQuery(route.query) - path = path.replace(/\.md(\?)|\.md$/, '$1') - - if (local) path = currentRoute + path - - return cleanPath('#/' + path) -} diff --git a/src/core/router/history/hash.js b/src/core/router/history/hash.js index ab940a3..acb72d8 100644 --- a/src/core/router/history/hash.js +++ b/src/core/router/history/hash.js @@ -1,7 +1,7 @@ import { History } from './base' import { merge, cached, noop } from '../../util/core' -import { parseQuery, stringifyQuery, cleanPath } from '../util' import { on } from '../../util/dom' +import { parseQuery, stringifyQuery, cleanPath } from '../util' function replaceHash (path) { const i = location.href.indexOf('#') diff --git a/src/core/util/index.js b/src/core/util/index.js index bfcc8b2..eba6598 100644 --- a/src/core/util/index.js +++ b/src/core/util/index.js @@ -1,2 +1,3 @@ export * from './core' export * from './env' +export * from '../router/util' diff --git a/src/plugins/search/component.js b/src/plugins/search/component.js index 66ddc54..d0428a4 100644 --- a/src/plugins/search/component.js +++ b/src/plugins/search/component.js @@ -138,9 +138,9 @@ function updateNoData (text, path) { } } -export function init (opts) { +export function init (opts, vm) { dom = Docsify.dom - const keywords = Docsify.route.parse().query.s + const keywords = vm.router.parse().query.s style() tpl(opts, keywords) diff --git a/src/plugins/search/index.js b/src/plugins/search/index.js index 8f6124c..db3ca57 100644 --- a/src/plugins/search/index.js +++ b/src/plugins/search/index.js @@ -24,7 +24,7 @@ const install = function (hook, vm) { const isAuto = CONFIG.paths === 'auto' hook.mounted(_ => { - initComponet(CONFIG) + initComponet(CONFIG, vm) !isAuto && initSearch(CONFIG, vm) }) hook.doneEach(_ => { @@ -33,4 +33,4 @@ const install = function (hook, vm) { }) } -window.$docsify.plugins = [].concat(install, window.$docsify.plugins) +$docsify.plugins = [].concat(install, $docsify.plugins) diff --git a/src/plugins/search/search.js b/src/plugins/search/search.js index 3345160..faea690 100644 --- a/src/plugins/search/search.js +++ b/src/plugins/search/search.js @@ -14,18 +14,18 @@ function escapeHtml (string) { return String(string).replace(/[&<>"'\/]/g, s => entityMap[s]) } -function getAllPaths () { +function getAllPaths (router) { const paths = [] helper.dom.findAll('a:not([data-nosearch])') .map(node => { const href = node.href const originHref = node.getAttribute('href') - const path = helper.route.parse(href).path + const path = router.parse(href).path if (path && paths.indexOf(path) === -1 && - !helper.route.isAbsolutePath(originHref)) { + !Docsify.util.isAbsolutePath(originHref)) { paths.push(path) } }) @@ -38,10 +38,10 @@ function saveData (maxAge) { localStorage.setItem('docsify.search.index', JSON.stringify(INDEXS)) } -export function genIndex (path, content = '') { +export function genIndex (path, content = '', router) { const tokens = window.marked.lexer(content) const slugify = window.Docsify.slugify - const toURL = Docsify.route.toURL + const toURL = router.toURL const index = {} let slug @@ -145,7 +145,7 @@ export function init (config, vm) { return } - const paths = isAuto ? getAllPaths() : config.paths + const paths = isAuto ? getAllPaths(vm.router) : config.paths const len = paths.length let count = 0 @@ -155,7 +155,7 @@ export function init (config, vm) { helper .get(vm.router.getFile(path)) .then(result => { - INDEXS[path] = genIndex(path, result) + INDEXS[path] = genIndex(path, result, vm.router) len === ++count && saveData(config.maxAge) }) })