mirror of
https://github.com/fmhy/edit.git
synced 2025-07-30 07:42:18 +10:00
fix: properly index <h2>
sections
ref: https://github.com/wotakumoe/wotaku/pull/86
This commit is contained in:
parent
84ae282b2b
commit
d6b9979464
10 changed files with 347 additions and 295 deletions
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Copyright (c) taskylizard. All rights reserved.
|
||||
* Copyright (c) 2024 taskylizard
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -13,20 +13,53 @@
|
|||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import type { MarkdownRenderer } from 'vitepress'
|
||||
import { headers } from '../transformer/constants'
|
||||
|
||||
const titles = Object.keys(headers).map((key) => headers[key].title)
|
||||
const excluded = ['Credits']
|
||||
|
||||
export const headersPlugin = (md: MarkdownRenderer) => {
|
||||
// Add the Feedback component after the heading and close the container
|
||||
md.renderer.rules.heading_close = (tokens, idx, options, env, self) => {
|
||||
const result = self.renderToken(tokens, idx, options)
|
||||
const heading = tokens[idx - 1]
|
||||
const level = tokens[idx].tag.slice(1)
|
||||
if (!titles.includes(env.frontmatter.title) || level !== '2') return result
|
||||
// Add the Feedback component in the heading, before the link.
|
||||
//
|
||||
// Adding it after the link is closed prevents vitepress from properly
|
||||
// indexing the file's content.
|
||||
|
||||
return `<Feedback heading="${heading.content}" />${result}`
|
||||
md.renderer.rules.heading_open = (tokens, idx, options, env, self) => {
|
||||
const result = self.renderToken(tokens, idx, options)
|
||||
|
||||
const idxClose =
|
||||
idx +
|
||||
tokens.slice(idx).findIndex((token) => token.type === 'heading_close')
|
||||
if (idxClose <= idx) return result
|
||||
|
||||
const level = tokens[idx].tag.slice(1)
|
||||
if (excluded.includes(env.frontmatter.title) || level !== '2') return result
|
||||
|
||||
// Find the token for the link.
|
||||
//
|
||||
// The token after `heading_open` contains the link as a child token.
|
||||
const children = tokens[idx + 1].children || []
|
||||
const linkOpenToken = children.find((c) => c.type === 'link_open')
|
||||
if (!linkOpenToken) return result
|
||||
|
||||
const heading = tokens[idxClose - 1]
|
||||
|
||||
linkOpenToken.meta = linkOpenToken.meta || {}
|
||||
linkOpenToken.meta.feedback = {
|
||||
heading: heading.content
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
md.renderer.rules.link_open = (tokens, idx, options, env, self) => {
|
||||
const result = self.renderToken(tokens, idx, options)
|
||||
|
||||
const meta = tokens[idx].meta
|
||||
if (!meta || !meta.feedback) return result
|
||||
|
||||
const heading = meta.feedback.heading || ''
|
||||
if (!heading) return result
|
||||
|
||||
return `<Feedback heading="${heading}" />${result}`
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue