mirror of
https://github.com/purocean/yn.git
synced 2026-10-16 07:26:07 +08:00
feat(renderer): add global heading-number setting fallback
This commit is contained in:
@@ -419,6 +419,14 @@ const schema: SettingSchema = ({
|
||||
group: 'render',
|
||||
required: true,
|
||||
},
|
||||
'render.heading-number': {
|
||||
defaultValue: false,
|
||||
title: 'T_setting-panel.schema.render.heading-number',
|
||||
type: 'boolean',
|
||||
format: 'checkbox',
|
||||
group: 'render',
|
||||
required: true,
|
||||
},
|
||||
'render.text-autospace': {
|
||||
defaultValue: false,
|
||||
title: 'T_setting-panel.schema.render.text-autospace',
|
||||
|
||||
@@ -2,8 +2,13 @@ vi.mock('@fe/context', () => ({
|
||||
Plugin: class {},
|
||||
}))
|
||||
|
||||
vi.mock('@fe/services/setting', () => ({
|
||||
getSetting: vi.fn(),
|
||||
}))
|
||||
|
||||
import MarkdownIt from 'markdown-it'
|
||||
import markdownHeadingNumber from '../markdown-heading-number'
|
||||
import { getSetting } from '@fe/services/setting'
|
||||
|
||||
function createCtx (md: MarkdownIt) {
|
||||
md.renderer.rules.heading_open = function (tokens, idx, options, _env, slf) {
|
||||
@@ -19,6 +24,12 @@ function createCtx (md: MarkdownIt) {
|
||||
} as any
|
||||
}
|
||||
|
||||
const mockedGetSetting = vi.mocked(getSetting)
|
||||
|
||||
beforeEach(() => {
|
||||
mockedGetSetting.mockReset()
|
||||
})
|
||||
|
||||
describe('markdown-heading-number plugin', () => {
|
||||
test('registers theme/view styles and markdown renderer plugin', () => {
|
||||
const ctx = createCtx(new MarkdownIt())
|
||||
@@ -31,13 +42,23 @@ describe('markdown-heading-number plugin', () => {
|
||||
})
|
||||
|
||||
test('adds show-number class when front matter enables heading numbers', () => {
|
||||
mockedGetSetting.mockReturnValue(false)
|
||||
const md = new MarkdownIt()
|
||||
markdownHeadingNumber.register(createCtx(md))
|
||||
|
||||
expect(md.render('## Numbered', { attributes: { headingNumber: true } })).toContain('<h2 class="show-number">Numbered</h2>')
|
||||
})
|
||||
|
||||
test('falls back to global setting when front matter does not set heading number', () => {
|
||||
mockedGetSetting.mockReturnValue(true)
|
||||
const md = new MarkdownIt()
|
||||
markdownHeadingNumber.register(createCtx(md))
|
||||
|
||||
expect(md.render('## Fallback', {})).toContain('<h2 class="show-number">Fallback</h2>')
|
||||
})
|
||||
|
||||
test('leaves headings unchanged when heading numbers are disabled', () => {
|
||||
mockedGetSetting.mockReturnValue(false)
|
||||
const md = new MarkdownIt()
|
||||
markdownHeadingNumber.register(createCtx(md))
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import type { Plugin } from '@fe/context'
|
||||
import type { FrontMatterAttrs } from '@fe/types'
|
||||
import { getSetting } from '@fe/services/setting'
|
||||
|
||||
export default {
|
||||
name: 'markdown-heading-number',
|
||||
@@ -102,8 +103,9 @@ export default {
|
||||
const headingOpen = md.renderer.rules.heading_open!
|
||||
|
||||
md.renderer.rules.heading_open = function (tokens, idx, opt, env, slf) {
|
||||
const attrs: FrontMatterAttrs = env.attributes
|
||||
if (attrs.headingNumber) {
|
||||
const attrs: FrontMatterAttrs = env?.attributes || {}
|
||||
const headingNumber = attrs.headingNumber ?? getSetting('render.heading-number', false)
|
||||
if (headingNumber) {
|
||||
const token = tokens[idx]
|
||||
token.attrJoin('class', 'show-number')
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ import { basename, dirname } from '@fe/utils/path'
|
||||
import { getRepo } from './repo'
|
||||
import { t } from './i18n'
|
||||
import { getContentHtml, getHeadings, getPreviewStyles, getRenderEnv, getRenderIframe } from './view'
|
||||
import { getSetting } from '@fe/services/setting'
|
||||
|
||||
type HtmlExportOptions = Partial<NonNullable<ConvertOpts['fromHtmlOptions']>>
|
||||
|
||||
@@ -218,7 +219,8 @@ function buildHtml (title: string, body: string, options: HtmlExportOptions) {
|
||||
}
|
||||
const includeToc = options.includeToc || []
|
||||
const hasToc = includeToc.length > 0
|
||||
const headingNumber = !!(getRenderEnv()?.attributes?.headingNumber)
|
||||
const renderEnv = getRenderEnv()
|
||||
const headingNumber = renderEnv?.attributes?.headingNumber ?? getSetting('render.heading-number', false)
|
||||
const bodyHtml = enhanceCodeBlocks(body, codeOptions)
|
||||
const codeBlockAssets = buildCodeBlockAssets(codeOptions)
|
||||
|
||||
|
||||
@@ -449,6 +449,7 @@ export interface BuildInSettings {
|
||||
'render.md-sub': boolean,
|
||||
'render.md-sup': boolean,
|
||||
'render.md-cj-friendly': boolean,
|
||||
'render.heading-number': boolean,
|
||||
'render.multimd-multiline': boolean,
|
||||
'render.multimd-rowspan': boolean,
|
||||
'render.multimd-headerless': boolean,
|
||||
|
||||
@@ -438,6 +438,7 @@ const data = {
|
||||
'md-html': 'Enable HTML',
|
||||
'md-breaks': 'Convert \\n to <br>',
|
||||
'md-linkify': 'Auto convert URL-like text to links',
|
||||
'heading-number': 'Enable heading numbers in preview and export',
|
||||
'md-wiki-links': 'Enable Wiki Links - [[link]]',
|
||||
'md-hash-tags': 'Enable Hash Tags - #tag',
|
||||
'md-typographer': 'Enable some language-neutral replacement + quotes beautification',
|
||||
|
||||
@@ -439,6 +439,7 @@ const data: BaseLanguage = {
|
||||
'md-html': 'Включить HTML',
|
||||
'md-breaks': 'Преобразовать \\n в <br>',
|
||||
'md-linkify': 'Автоматическое преобразование текста, похожего на URL, в ссылки',
|
||||
'heading-number': 'Включить нумерацию заголовков',
|
||||
'md-wiki-links': 'Включить Wiki ссылки - [[ссылка]]',
|
||||
'md-hash-tags': 'Включить хештеги - #тег',
|
||||
'md-typographer': 'Включите некоторые языковые замены + улучшение кавычек',
|
||||
|
||||
@@ -429,6 +429,7 @@ const data: BaseLanguage = {
|
||||
'md-html': '启用 HTML',
|
||||
'md-breaks': '将 \\n 转换为 <br>',
|
||||
'md-linkify': '自动将类似 URL 的文本转换为链接',
|
||||
'heading-number': '启用标题编号',
|
||||
'md-wiki-links': '启用 Wiki 链接 - [[link]]',
|
||||
'md-hash-tags': '启用哈希标签 - #tag',
|
||||
'md-typographer': '启用排版美化,如 (c) -> ©',
|
||||
|
||||
@@ -429,6 +429,7 @@ const data: BaseLanguage = {
|
||||
'md-html': '啟用 HTML',
|
||||
'md-breaks': '將 \\n 轉換為 <br>',
|
||||
'md-linkify': '自動將類似 URL 的文字轉換為連結',
|
||||
'heading-number': '啟用標題編號',
|
||||
'md-wiki-links': '啟用 Wiki 連結 - [[link]]',
|
||||
'md-hash-tags': '啟用哈希標籤 - #tag',
|
||||
'md-typographer': '啟用排版美化,如 (c) -> ©',
|
||||
|
||||
Reference in New Issue
Block a user