Skip to content

Commit e237d74

Browse files
committed
feat: edit frontmatter in side editor
1 parent c46addf commit e237d74

File tree

7 files changed

+38
-17
lines changed

7 files changed

+38
-17
lines changed

demo/starter/slides.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ mdc: true
2424

2525
# Welcome to Slidev
2626

27-
Presentation slides for developers
27+
Presentation slides for developers11111111111111
2828

2929
<div class="pt-12">
3030
<span @click="$slidev.nav.next" class="px-2 py-1 rounded cursor-pointer" hover="bg-white bg-opacity-10">
@@ -47,7 +47,8 @@ The last comment block of each slide will be treated as slide notes. It will be
4747
-->
4848

4949
---
50-
transition: fade-out
50+
transition: fade-1
51+
class: text-center
5152
---
5253

5354
# What is Slidev?
@@ -117,6 +118,7 @@ Hover on the bottom-left corner to see the navigation's controls panel, [learn m
117118
---
118119
layout: two-cols
119120
layoutClass: gap-16
121+
class: text-center
120122
---
121123

122124
# Table of contents
@@ -553,7 +555,7 @@ Learn More: [Mermaid Diagrams](https://sli.dev/guide/features/mermaid) and [Plan
553555
---
554556
foo: bar
555557
dragPos:
556-
square: 691,32,167,_,-16
558+
square: 655,30,167,_,-16
557559
---
558560

559561
# Draggable Elements
@@ -579,7 +581,7 @@ Double-click on the draggable elements to edit their positions.
579581
</v-drag>
580582
```
581583

582-
<v-drag pos="663,206,261,_,-15">
584+
<v-drag pos="577,349,261,_,-15">
583585
<div text-center text-3xl border border-main rounded>
584586
Double-click me!
585587
</div>
@@ -593,7 +595,7 @@ Double-click on the draggable elements to edit their positions.
593595
<v-drag-arrow two-way />
594596
```
595597

596-
<v-drag-arrow pos="67,452,253,46" two-way op70 />
598+
<v-drag-arrow pos="67,452,436,-8" two-way op70 />
597599

598600
---
599601
src: ./pages/imported-slides.md

packages/client/internals/SideEditor.vue

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,16 @@ const tab = ref<'content' | 'note'>('content')
1717
const content = ref('')
1818
const note = ref('')
1919
const dirty = ref(false)
20-
const frontmatter = ref<any>({})
2120
2221
const { info, update } = useDynamicSlideInfo(currentSlideNo)
2322
2423
watch(
2524
info,
2625
(v) => {
27-
frontmatter.value = v?.frontmatter || {}
28-
2926
if (!isInputting.value) {
3027
note.value = (v?.note || '').trim()
31-
content.value = (v?.content || '').trim()
28+
const frontmatterPart = v?.frontmatterRaw?.trim() ? `---\n${v.frontmatterRaw.trim()}\n---\n\n` : ''
29+
content.value = frontmatterPart + (v?.content || '').trim()
3230
dirty.value = false
3331
}
3432
},
@@ -37,10 +35,17 @@ watch(
3735
3836
async function save() {
3937
dirty.value = false
38+
39+
let frontmatterRaw: string | undefined
40+
const contentOnly = content.value.trim().replace(/^---\n([\s\S]*?)\n---\n/, (_, f) => {
41+
frontmatterRaw = f
42+
return ''
43+
})
44+
4045
await update({
4146
note: note.value || undefined,
42-
content: content.value,
43-
// frontmatter: frontmatter.value,
47+
content: contentOnly,
48+
frontmatterRaw,
4449
})
4550
}
4651

packages/parser/src/fs.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,14 +103,11 @@ export async function load(userRoot: string, filepath: string, loadedSource: Rec
103103
}
104104
else {
105105
slides.push({
106+
...slide,
106107
index: slides.length,
107108
importChain,
108109
source: slide,
109110
frontmatter: { ...slide.frontmatter, ...frontmatterOverride },
110-
content: slide.content,
111-
note: slide.note,
112-
title: slide.title,
113-
level: slide.level,
114111
})
115112
}
116113
}

packages/slidev/node/vite/loaders.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type { ResolvedSlidevOptions, SlideInfo, SlidePatch, SlidevServerOptions
44
import * as parser from '@slidev/parser/fs'
55
import equal from 'fast-deep-equal'
66
import type { LoadResult } from 'rollup'
7+
import YAML from 'yaml'
78
import { getBodyJson, updateFrontmatterPatch } from '../utils'
89
import { templates } from '../virtual'
910
import { templateTitleRendererMd } from '../virtual/titles'
@@ -91,6 +92,18 @@ export function createSlidesLoader(
9192

9293
if (body.content)
9394
slide.content = slide.source.content = body.content
95+
if (body.frontmatterRaw != null) {
96+
if (body.frontmatterRaw.trim() === '') {
97+
slide.source.frontmatterDoc = slide.source.frontmatterStyle = undefined
98+
}
99+
else {
100+
const parsed = YAML.parseDocument(body.frontmatterRaw)
101+
if (parsed.errors.length)
102+
console.error('ERROR when saving frontmatter', parsed.errors)
103+
else
104+
slide.source.frontmatterDoc = parsed
105+
}
106+
}
94107
if (body.note)
95108
slide.note = slide.source.note = body.note
96109
if (body.frontmatter)

packages/slidev/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@
117117
"vite-plugin-vue-server-ref": "^0.4.2",
118118
"vitefu": "^0.2.5",
119119
"vue": "^3.4.33",
120+
"yaml": "^2.4.5",
120121
"yargs": "^17.7.2"
121122
},
122123
"devDependencies": {

packages/types/src/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export type FrontmatterStyle = 'frontmatter' | 'yaml'
88
export interface SlideInfoBase {
99
frontmatter: Record<string, any>
1010
content: string
11+
frontmatterRaw?: string
1112
note?: string
1213
title?: string
1314
level?: number
@@ -33,7 +34,6 @@ export interface SourceSlideInfo extends SlideInfoBase {
3334
* Slides import by this slide.
3435
*/
3536
imports?: SourceSlideInfo[]
36-
frontmatterRaw?: string
3737
frontmatterDoc?: YAML.Document
3838
frontmatterStyle?: FrontmatterStyle
3939
}
@@ -57,7 +57,7 @@ export interface SlideInfo extends SlideInfoBase {
5757
/**
5858
* Editable fields for a slide
5959
*/
60-
export type SlidePatch = Partial<Pick<SlideInfoBase, 'content' | 'note'>> & {
60+
export type SlidePatch = Partial<Pick<SlideInfoBase, 'content' | 'note' | 'frontmatterRaw'>> & {
6161
skipHmr?: boolean
6262
/**
6363
* The frontmatter patch (only the changed fields)

pnpm-lock.yaml

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)