Skip to content

Commit d776236

Browse files
committed
refactor(core): extract renderPageSfcBlocksToVue method
1 parent 9d245a4 commit d776236

File tree

6 files changed

+38
-27
lines changed

6 files changed

+38
-27
lines changed
Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { renderPageSfcBlocksToVue } from '../../page/index.js'
12
import type { App, Page } from '../../types/index.js'
23

34
/**
@@ -9,14 +10,6 @@ export const preparePageComponent = async (
910
): Promise<void> => {
1011
await app.writeTemp(
1112
page.componentFilePathRelative,
12-
[
13-
// #688: wrap the content of `<template>` with a `<div>` to avoid some potential issues of fragment component
14-
`${page.sfcBlocks.template?.tagOpen}<div>${page.sfcBlocks.template?.contentStripped}</div>${page.sfcBlocks.template?.tagClose}\n`,
15-
// hoist `<script>`, `<style>` and other custom blocks
16-
page.sfcBlocks.script?.content,
17-
page.sfcBlocks.scriptSetup?.content,
18-
...page.sfcBlocks.styles.map((item) => item.content),
19-
...page.sfcBlocks.customBlocks.map((item) => item.content),
20-
].join('\n'),
13+
renderPageSfcBlocksToVue(page.sfcBlocks),
2114
)
2215
}

packages/core/src/page/createPage.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { App, Page, PageOptions } from '../types/index.js'
22
import { inferPagePath } from './inferPagePath.js'
3-
import { renderPageContent } from './renderPageContent.js'
3+
import { parsePageContent } from './parsePageContent.js'
44
import { resolvePageChunkInfo } from './resolvePageChunkInfo.js'
55
import { resolvePageComponentInfo } from './resolvePageComponentInfo.js'
66
import { resolvePageDate } from './resolvePageDate.js'
@@ -39,7 +39,7 @@ export const createPage = async (
3939
markdownEnv,
4040
sfcBlocks,
4141
title,
42-
} = renderPageContent({
42+
} = parsePageContent({
4343
app,
4444
content,
4545
filePath,

packages/core/src/page/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
export * from './createPage.js'
22
export * from './inferPagePath.js'
3-
export * from './renderPageContent.js'
3+
export * from './parsePageContent.js'
4+
export * from './renderPageSfcBlocksToVue.js'
45
export * from './resolvePageChunkInfo.js'
56
export * from './resolvePageComponentInfo.js'
67
export * from './resolvePageDate.js'

packages/core/src/page/renderPageContent.ts renamed to packages/core/src/page/parsePageContent.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import type { App, PageFrontmatter, PageOptions } from '../types/index.js'
1010
/**
1111
* Render page content and extract related info
1212
*/
13-
export const renderPageContent = ({
13+
export const parsePageContent = ({
1414
app,
1515
content,
1616
filePath,
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import type { MarkdownSfcBlocks } from '@vuepress/markdown'
2+
3+
/**
4+
* Render page sfc blocks to vue component
5+
*/
6+
export const renderPageSfcBlocksToVue = (
7+
sfcBlocks: MarkdownSfcBlocks,
8+
): string =>
9+
[
10+
// #688: wrap the content of `<template>` with a `<div>` to avoid some potential issues of fragment component
11+
`${sfcBlocks.template?.tagOpen}<div>${sfcBlocks.template?.contentStripped}</div>${sfcBlocks.template?.tagClose}\n`,
12+
// hoist `<script>`, `<style>` and other custom blocks
13+
sfcBlocks.script?.content,
14+
sfcBlocks.scriptSetup?.content,
15+
...sfcBlocks.styles.map((item) => item.content),
16+
...sfcBlocks.customBlocks.map((item) => item.content),
17+
].join('\n')

packages/core/tests/page/renderPageContent.spec.ts renamed to packages/core/tests/page/parsePageContent.spec.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { createMarkdown } from '@vuepress/markdown'
22
import { path } from '@vuepress/utils'
33
import { describe, expect, it } from 'vitest'
44
import type { Bundler } from '../../src/index.js'
5-
import { createBaseApp, renderPageContent } from '../../src/index.js'
5+
import { createBaseApp, parsePageContent } from '../../src/index.js'
66

77
const app = createBaseApp({
88
source: path.resolve(__dirname, 'fake-source'),
@@ -11,8 +11,8 @@ const app = createBaseApp({
1111
})
1212
app.markdown = createMarkdown()
1313

14-
it('should render page content correctly', () => {
15-
const resolved = renderPageContent({
14+
it('should parse page content correctly', () => {
15+
const result = parsePageContent({
1616
app,
1717
content: `\
1818
foobar
@@ -25,7 +25,7 @@ const msg = 'msg'
2525
options: {},
2626
})
2727

28-
expect(resolved).toEqual({
28+
expect(result).toEqual({
2929
contentRendered: '<p>foobar</p>\n',
3030
deps: [],
3131
frontmatter: {},
@@ -66,7 +66,7 @@ const msg = 'msg'
6666

6767
describe('page title', () => {
6868
it('should use title in frontmatter', () => {
69-
const resolved = renderPageContent({
69+
const result = parsePageContent({
7070
app,
7171
content: '# title in header',
7272
filePath: null,
@@ -78,37 +78,37 @@ describe('page title', () => {
7878
},
7979
})
8080

81-
expect(resolved.title).toEqual('title in frontmatter')
81+
expect(result.title).toEqual('title in frontmatter')
8282
})
8383

8484
it('should use title in the first h1 header', () => {
85-
const resolved = renderPageContent({
85+
const result = parsePageContent({
8686
app,
8787
content: '# title in header',
8888
filePath: null,
8989
filePathRelative: null,
9090
options: {},
9191
})
9292

93-
expect(resolved.title).toEqual('title in header')
93+
expect(result.title).toEqual('title in header')
9494
})
9595

9696
it('should use empty title', () => {
97-
const resolved = renderPageContent({
97+
const result = parsePageContent({
9898
app,
9999
content: '',
100100
filePath: null,
101101
filePathRelative: null,
102102
options: {},
103103
})
104104

105-
expect(resolved.title).toEqual('')
105+
expect(result.title).toEqual('')
106106
})
107107
})
108108

109109
describe('page frontmatter', () => {
110110
it('should merge markdown frontmatter and options frontmatter', () => {
111-
const resolved = renderPageContent({
111+
const result = parsePageContent({
112112
app,
113113
content: `\
114114
---
@@ -124,14 +124,14 @@ title: title in markdown frontmatter
124124
},
125125
})
126126

127-
expect(resolved.frontmatter).toEqual({
127+
expect(result.frontmatter).toEqual({
128128
title: 'title in markdown frontmatter',
129129
description: 'description in options frontmatter',
130130
})
131131
})
132132

133133
it('should use fields from markdown frontmatter first', () => {
134-
const resolved = renderPageContent({
134+
const result = parsePageContent({
135135
app,
136136
content: `\
137137
---
@@ -147,7 +147,7 @@ title: title in markdown frontmatter
147147
},
148148
})
149149

150-
expect(resolved.frontmatter).toEqual({
150+
expect(result.frontmatter).toEqual({
151151
title: 'title in markdown frontmatter',
152152
})
153153
})

0 commit comments

Comments
 (0)