diff --git a/packages/@vuepress/core/lib/prepare/AppContext.js b/packages/@vuepress/core/lib/prepare/AppContext.js index c1176a154b..235fbb5851 100644 --- a/packages/@vuepress/core/lib/prepare/AppContext.js +++ b/packages/@vuepress/core/lib/prepare/AppContext.js @@ -292,6 +292,7 @@ module.exports = class AppContext { async addPage (options) { options.permalinkPattern = this.siteConfig.permalink + options.siteConfig = this.siteConfig const page = new Page(options, this) await page.process({ markdown: this.markdown, diff --git a/packages/@vuepress/core/lib/prepare/Page.js b/packages/@vuepress/core/lib/prepare/Page.js index 04b7178a50..62851c15f0 100644 --- a/packages/@vuepress/core/lib/prepare/Page.js +++ b/packages/@vuepress/core/lib/prepare/Page.js @@ -45,7 +45,8 @@ module.exports = class Page { relative, permalink, frontmatter = {}, - permalinkPattern + permalinkPattern, + siteConfig }, context) { this.title = title this._meta = meta @@ -54,6 +55,7 @@ module.exports = class Page { this._permalink = permalink this.frontmatter = frontmatter this._permalinkPattern = permalinkPattern + this._siteConfig = siteConfig this._context = context if (relative) { @@ -108,9 +110,13 @@ module.exports = class Page { } // headers + this.headersToExtract = ['h2', 'h3'] + if (this._siteConfig.markdown && this._siteConfig.markdown.extractHeaders) { + this.headersToExtract = this._siteConfig.markdown.extractHeaders + } const headers = extractHeaders( this._strippedContent, - ['h2', 'h3'], + this.headersToExtract, markdown ) if (headers.length) { diff --git a/packages/@vuepress/core/lib/webpack/createBaseConfig.js b/packages/@vuepress/core/lib/webpack/createBaseConfig.js index c04aae63d5..c9eeafc80b 100644 --- a/packages/@vuepress/core/lib/webpack/createBaseConfig.js +++ b/packages/@vuepress/core/lib/webpack/createBaseConfig.js @@ -33,6 +33,7 @@ module.exports = function createBaseConfig ({ const inlineLimit = 10000 const config = new Config() + const markdownConfig = siteConfig.markdown config .mode(isProd && !env.isDebug ? 'production' : 'development') @@ -116,7 +117,7 @@ module.exports = function createBaseConfig ({ mdRule .use('markdown-loader') .loader(require.resolve('@vuepress/markdown-loader')) - .options({ sourceDir, markdown }) + .options({ sourceDir, markdown, markdownConfig }) config.module .rule('pug') diff --git a/packages/@vuepress/markdown-loader/index.js b/packages/@vuepress/markdown-loader/index.js index f4fd02ab9b..4661476bc1 100644 --- a/packages/@vuepress/markdown-loader/index.js +++ b/packages/@vuepress/markdown-loader/index.js @@ -22,6 +22,7 @@ module.exports = function (src) { const isServer = this.target === 'node' const options = getOptions(this) const { sourceDir } = options + const { markdownConfig } = options let { markdown } = options if (!markdown) { markdown = md() @@ -42,7 +43,11 @@ module.exports = function (src) { if (!isProd && !isServer) { const inferredTitle = inferTitle(frontmatter.data, frontmatter.content) - const headers = extractHeaders(content, ['h2', 'h3'], markdown) + let headersToExtract = ['h2', 'h3'] + if (markdownConfig && markdownConfig.extractHeaders) { + headersToExtract = markdownConfig.extractHeaders + } + const headers = extractHeaders(content, headersToExtract, markdown) delete frontmatter.content // diff frontmatter and title, since they are not going to be part of the diff --git a/packages/docs/docs/theme/default-theme-config.md b/packages/docs/docs/theme/default-theme-config.md index e921d46ce2..71c5fda210 100644 --- a/packages/docs/docs/theme/default-theme-config.md +++ b/packages/docs/docs/theme/default-theme-config.md @@ -154,6 +154,17 @@ module.exports = { } ``` +### Extract Headers + While preparing the page, headers are extracted from the markdown file and stored in `this.$page.headers`. By default, VuePress will extract `h2` and `h3` elements for you. + You can override the headers it pulls out in your `markdown` options. + ``` js +module.exports = { + markdown: { + extractHeaders: [ 'h2', 'h3', 'h4' ] + } +} +``` + ### Active Header Links By default, the nested header links and the hash in the URL are updated as the user scrolls to view the different sections of the page. This behavior can be disabled with the following theme config: