Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit4136afb

Browse files
committed
feat: support notes auto ruby
1 parent8a1d831 commit4136afb

File tree

6 files changed

+175
-5
lines changed

6 files changed

+175
-5
lines changed

‎docs/components.d.ts‎

Lines changed: 97 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
/* eslint-disable */
22
//@ts-nocheck
3+
// biome-ignore lint: disable
4+
// oxlint-disable
5+
// ------
36
// Generated by unplugin-vue-components
47
// Read more: https://github.com/vuejs/core/pull/3399
5-
// biome-ignore lint: disable
8+
import{GlobalComponents}from'vue'
9+
610
export{}
711

812
/* prettier-ignore */
@@ -98,3 +102,95 @@ declare module 'vue' {
98102
Youtube:typeofimport('./node_modules/@slidev/client/builtin/Youtube.vue')['default']
99103
}
100104
}
105+
106+
// For TSX support
107+
declare global{
108+
constAddonGallery:typeofimport('./.vitepress/theme/components/AddonGallery.vue')['default']
109+
constAddonInfo:typeofimport('./.vitepress/theme/components/AddonInfo.vue')['default']
110+
constArrow:typeofimport('./node_modules/@slidev/client/builtin/Arrow.vue')['default']
111+
constAutoFitText:typeofimport('./node_modules/@slidev/client/builtin/AutoFitText.vue')['default']
112+
const'Carbon:chevronLeft':typeofimport('~icons/carbon/chevron-left')['default']
113+
const'Carbon:chevronRight':typeofimport('~icons/carbon/chevron-right')['default']
114+
const'Carbon:close':typeofimport('~icons/carbon/close')['default']
115+
const'Carbon:filterRemove':typeofimport('~icons/carbon/filter-remove')['default']
116+
const'Carbon:logoGithub':typeofimport('~icons/carbon/logo-github')['default']
117+
const'Carbon:logoTwitter':typeofimport('~icons/carbon/logo-twitter')['default']
118+
const'Carbon:presentationFile':typeofimport('~icons/carbon/presentation-file')['default']
119+
const'Carbon:reset':typeofimport('~icons/carbon/reset')['default']
120+
const'Carbon:search':typeofimport('~icons/carbon/search')['default']
121+
const'Carbon:tag':typeofimport('~icons/carbon/tag')['default']
122+
const'Carbon:video':typeofimport('~icons/carbon/video')['default']
123+
constCarbonApps:typeofimport('~icons/carbon/apps')['default']
124+
constCarbonArrowLeft:typeofimport('~icons/carbon/arrow-left')['default']
125+
constCarbonArrowRight:typeofimport('~icons/carbon/arrow-right')['default']
126+
constCarbonBadge:typeofimport('~icons/carbon/badge')['default']
127+
constCarbonDocumentPdf:typeofimport('~icons/carbon/document-pdf')['default']
128+
constCarbonDownload:typeofimport('~icons/carbon/download')['default']
129+
constCarbonEdit:typeofimport('~icons/carbon/edit')['default']
130+
constCarbonInformation:typeofimport('~icons/carbon/information')['default']
131+
constCarbonListBoxes:typeofimport('~icons/carbon/list-boxes')['default']
132+
constCarbonMaximize:typeofimport('~icons/carbon/maximize')['default']
133+
constCarbonMinimize:typeofimport('~icons/carbon/minimize')['default']
134+
constCarbonMoon:typeofimport('~icons/carbon/moon')['default']
135+
constCarbonPen:typeofimport('~icons/carbon/pen')['default']
136+
constCarbonSettingsAdjust:typeofimport('~icons/carbon/settings-adjust')['default']
137+
constCarbonSun:typeofimport('~icons/carbon/sun')['default']
138+
constCarbonTextAnnotationToggle:typeofimport('~icons/carbon/text-annotation-toggle')['default']
139+
constCarbonUserAvatar:typeofimport('~icons/carbon/user-avatar')['default']
140+
constCarbonUserSpeaker:typeofimport('~icons/carbon/user-speaker')['default']
141+
constCarbonVideo:typeofimport('~icons/carbon/video')['default']
142+
constCodeBlockWrapper:typeofimport('./node_modules/@slidev/client/builtin/CodeBlockWrapper.vue')['default']
143+
constCodeGroup:typeofimport('./node_modules/@slidev/client/builtin/CodeGroup.vue')['default']
144+
constCodiconAdd:typeofimport('~icons/codicon/add')['default']
145+
constCodiconEye:typeofimport('~icons/codicon/eye')['default']
146+
constCodiconGlobe:typeofimport('~icons/codicon/globe')['default']
147+
constCodiconLock:typeofimport('~icons/codicon/lock')['default']
148+
constCodiconRunAll:typeofimport('~icons/codicon/run-all')['default']
149+
constDemo:typeofimport('./.vitepress/theme/components/Demo.vue')['default']
150+
constDemoEditor:typeofimport('./.vitepress/theme/components/DemoEditor.vue')['default']
151+
constDemoSlide:typeofimport('./.vitepress/theme/components/DemoSlide.vue')['default']
152+
constEnvironment:typeofimport('./.vitepress/theme/components/Environment.vue')['default']
153+
constFeaturesAnimation:typeofimport('./.vitepress/theme/components/FeaturesAnimation.vue')['default']
154+
constFeaturesAnimationInner:typeofimport('./.vitepress/theme/components/FeaturesAnimationInner.vue')['default']
155+
constFeaturesOverview:typeofimport('./.vitepress/theme/components/FeaturesOverview.vue')['default']
156+
constFeatureTag:typeofimport('./.vitepress/theme/components/FeatureTag.vue')['default']
157+
constKaTexBlockWrapper:typeofimport('./node_modules/@slidev/client/builtin/KaTexBlockWrapper.vue')['default']
158+
constLandingPage:typeofimport('./.vitepress/theme/components/LandingPage.vue')['default']
159+
constLayout:typeofimport('./.vitepress/theme/components/Layout.vue')['default']
160+
constLightOrDark:typeofimport('./node_modules/@slidev/client/builtin/LightOrDark.vue')['default']
161+
constLink:typeofimport('./node_modules/@slidev/client/builtin/Link.vue')['default']
162+
constLinkCard:typeofimport('./.vitepress/theme/components/LinkCard.vue')['default']
163+
constLinkInline:typeofimport('./.vitepress/theme/components/LinkInline.vue')['default']
164+
constLogosVue:typeofimport('~icons/logos/vue')['default']
165+
constMdiAccountCircle:typeofimport('~icons/mdi/account-circle')['default']
166+
constMermaid:typeofimport('./node_modules/@slidev/client/builtin/Mermaid.vue')['default']
167+
constMonaco:typeofimport('./node_modules/@slidev/client/builtin/Monaco.vue')['default']
168+
constPlantUml:typeofimport('./node_modules/@slidev/client/builtin/PlantUml.vue')['default']
169+
constPoweredBySlidev:typeofimport('./node_modules/@slidev/client/builtin/PoweredBySlidev.vue')['default']
170+
constRenderWhen:typeofimport('./node_modules/@slidev/client/builtin/RenderWhen.vue')['default']
171+
constRouterLink:typeofimport('vue-router')['RouterLink']
172+
constRouterView:typeofimport('vue-router')['RouterView']
173+
constSeeAlso:typeofimport('./.vitepress/theme/components/SeeAlso.vue')['default']
174+
constShikiMagicMove:typeofimport('./node_modules/@slidev/client/builtin/ShikiMagicMove.vue')['default']
175+
constShowCaseInfo:typeofimport('./.vitepress/theme/components/ShowCaseInfo.vue')['default']
176+
constShowCases:typeofimport('./.vitepress/theme/components/ShowCases.vue')['default']
177+
constSimpleIconsGithub:typeofimport('~icons/simple-icons/github')['default']
178+
constSimpleIconsNpm:typeofimport('~icons/simple-icons/npm')['default']
179+
constSlideContainer:typeofimport('./.vitepress/theme/components/SlideContainer.vue')['default']
180+
constSlideCurrentNo:typeofimport('./node_modules/@slidev/client/builtin/SlideCurrentNo.vue')['default']
181+
constSlidesTotal:typeofimport('./node_modules/@slidev/client/builtin/SlidesTotal.vue')['default']
182+
constSlidevVideo:typeofimport('./node_modules/@slidev/client/builtin/SlidevVideo.vue')['default']
183+
constThemeGallery:typeofimport('./.vitepress/theme/components/ThemeGallery.vue')['default']
184+
constThemeInfo:typeofimport('./.vitepress/theme/components/ThemeInfo.vue')['default']
185+
constTheTweet:typeofimport('./.vitepress/theme/components/TheTweet.vue')['default']
186+
constToc:typeofimport('./node_modules/@slidev/client/builtin/Toc.vue')['default']
187+
constTocList:typeofimport('./node_modules/@slidev/client/builtin/TocList.vue')['default']
188+
constTransform:typeofimport('./node_modules/@slidev/client/builtin/Transform.vue')['default']
189+
constTweet:typeofimport('./node_modules/@slidev/client/builtin/Tweet.vue')['default']
190+
constTwemojiCatWithTearsOfJoy:typeofimport('~icons/twemoji/cat-with-tears-of-joy')['default']
191+
constUimRocket:typeofimport('~icons/uim/rocket')['default']
192+
constVClickGap:typeofimport('./node_modules/@slidev/client/builtin/VClickGap.vue')['default']
193+
constVDrag:typeofimport('./node_modules/@slidev/client/builtin/VDrag.vue')['default']
194+
constVDragArrow:typeofimport('./node_modules/@slidev/client/builtin/VDragArrow.vue')['default']
195+
constYoutube:typeofimport('./node_modules/@slidev/client/builtin/Youtube.vue')['default']
196+
}

‎docs/features/notes-auto-ruby.md‎

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
---
2+
tags:[notes, presenter]
3+
description:Automatically add `<ruby>` tags to your notes.
4+
---
5+
6+
#Notes Auto Ruby
7+
8+
>Available since v52.4.0
9+
10+
When you write notes in your slides, you might want to add some ruby text to help pronouncing the some words. You can always add`<ruby>` tags to your notes manually, but Slidev also provides a convenient way to do this automatically by a global auto-replacement.
11+
12+
In the headmatter, you can set the`notesAutoRuby` option to a map of words to their ruby text:
13+
14+
```md
15+
---
16+
notesAutoRuby:
17+
日本語: ni hon go
18+
勉強: べんきょう
19+
---
20+
21+
# Your slides here
22+
23+
<!--
24+
私は日本語を勉強しています。
25+
-->
26+
```
27+
28+
And the notes will be rendered as:
29+
30+
<p>私は<ruby>日本語<rt>ni hon go</rt></ruby>を<ruby>勉強<rt>べんきょう</rt></ruby>しています。</p>
31+

‎packages/client/constants.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,5 @@ export const HEADMATTER_FIELDS = [
8484
'contextMenu',
8585
'wakeLock',
8686
'seoMeta',
87+
'notesAutoRuby',
8788
]

‎packages/slidev/node/vite/loaders.ts‎

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -366,14 +366,35 @@ export function createSlidesLoader(
366366

367367
functionrenderNote(text:string=''){
368368
letclickCount=0
369-
consthtml=notesMd.render(text
370-
// replace [click] marker with span
369+
constnotesAutoRuby:Record<string,string|undefined>=(data.headmatterasany).notesAutoRuby||{}
370+
371+
// Apply [click] marker
372+
letmd=text
373+
// replace [click] marker with span
371374
.replace(/\[click(?::(\d+))?\]/gi,(_,count=1)=>{
372375
clickCount+=Number(count)
373376
return`<span class="slidev-note-click-mark" data-clicks="${clickCount}"></span>`
374-
}),
375-
)
377+
})
378+
379+
// Apply notesAutoRuby
380+
constkeys=Object.keys(notesAutoRuby)
381+
.sort((b,a)=>b.length-a.length)
382+
// Add word boundaries to the keys when they are simple alphabets or numbers
383+
.map(i=>/^[\w-]+$/.test(i) ?`\\b${i}\\b` :i)
384+
385+
if(keys.length){
386+
constregex=newRegExp(`(${keys.join('|')})`,'g')
387+
md=md.replace(
388+
regex,
389+
(match)=>{
390+
if(notesAutoRuby[match])
391+
return`<ruby>${match}<rt>${notesAutoRuby[match]}</rt></ruby>`
392+
returnmatch
393+
},
394+
)
395+
}
376396

397+
consthtml=notesMd.render(md)
377398
returnhtml
378399
}
379400

‎packages/types/src/frontmatter.ts‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,18 @@ export interface HeadmatterConfig extends TransitionOptions {
270270
*@default {}
271271
*/
272272
seoMeta?:SeoMeta
273+
/**
274+
* Auto replace words with `<ruby>` tags in notes
275+
*
276+
*@default {}
277+
*
278+
*@example
279+
* ```yaml
280+
* notesAutoRuby:
281+
* 大丈夫: だいじょうぶ
282+
* ```
283+
*/
284+
notesAutoRuby?:Record<string,string>
273285
}
274286

275287
exportinterfaceFrontmatterextendsTransitionOptions{

‎packages/vscode/schema/headmatter.json‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,15 @@
511511
"markdownDescription":"Seo meta tags settings",
512512
"default": {}
513513
},
514+
"notesAutoRuby": {
515+
"type":"object",
516+
"additionalProperties": {
517+
"type":"string"
518+
},
519+
"description":"Auto replace words with `<ruby>` tags in notes",
520+
"markdownDescription":"Auto replace words with `<ruby>` tags in notes",
521+
"default": {}
522+
},
514523
"defaults": {
515524
"$ref":"#/definitions/Frontmatter",
516525
"description":"Default frontmatter options applied to all slides",

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp