diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 406828e3ca6190f723a8abf77c5ffdf7dc605a82..e35514ded9fadf9c7b42739ccc6101569a9e5567 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -766,6 +766,12 @@ customCssWarn: "ã“ã®è¨å®šã¯å¿…ãšçŸ¥è˜ã®ã‚ã‚‹æ–¹ãŒè¡Œã£ã¦ãã ã•ã„ global: "ã‚°ãƒãƒ¼ãƒãƒ«" squareAvatars: "アイコンを四角形ã§è¡¨ç¤º" +_docs: + continueReading: "続ãã‚’èªã‚€" + features: "機能" + generalTopics: "一般的ãªãƒˆãƒ”ック" + advancedTopics: "高度ãªãƒˆãƒ”ック" + _ad: back: "戻る" reduceFrequencyOfThisAd: "ã“ã®åºƒå‘Šã®è¡¨ç¤ºé »åº¦ã‚’下ã’ã‚‹" diff --git a/src/client/pages/doc.vue b/src/client/pages/doc.vue index a4cf25033e0160df7210cb170424fe3c8ce6bf7e..58b352d638e9b86b0907d6f18cfd99232c05c61c 100644 --- a/src/client/pages/doc.vue +++ b/src/client/pages/doc.vue @@ -107,6 +107,7 @@ export default defineComponent({ padding: 32px; max-width: 800px; margin: 0 auto; + background: var(--panel); &.max-width_500px { padding: 16px; diff --git a/src/client/pages/docs.vue b/src/client/pages/docs.vue index e51528f83da6c150a79ca90b663ad7a27bd3596b..e677fe0cbe5b864d6bf11264eb7d481c68224620 100644 --- a/src/client/pages/docs.vue +++ b/src/client/pages/docs.vue @@ -1,14 +1,38 @@ <template> -<div> - <main class="_section"> - <div class="_content"> - <ul> - <li v-for="doc in docs" :key="doc.path"> - <MkA :to="`/docs/${doc.path}`">{{ doc.title }}</MkA> - </li> - </ul> +<div class="vtaihdtm"> + <div class="search"> + <MkInput v-model:value="query" :debounce="true" type="search"><template #icon><i class="fas fa-search"></i></template><span>{{ $ts.search }}</span></MkInput> + </div> + <MkFolder> + <template #header>{{ $ts._docs.generalTopics }}</template> + <div class="docs"> + <MkA v-for="doc in docs.filter(doc => doc.path.startsWith('general/'))" :key="doc.path" :to="`/docs/${doc.path}`" class="doc"> + <div class="title">{{ doc.title }}</div> + <div class="summary">{{ doc.summary }}</div> + <div class="read">{{ $ts._docs.continueReading }}</div> + </MkA> </div> - </main> + </MkFolder> + <MkFolder> + <template #header>{{ $ts._docs.features }}</template> + <div class="docs"> + <MkA v-for="doc in docs.filter(doc => doc.path.startsWith('features/'))" :key="doc.path" :to="`/docs/${doc.path}`" class="doc"> + <div class="title">{{ doc.title }}</div> + <div class="summary">{{ doc.summary }}</div> + <div class="read">{{ $ts._docs.continueReading }}</div> + </MkA> + </div> + </MkFolder> + <MkFolder> + <template #header>{{ $ts._docs.advancedTopics }}</template> + <div class="docs"> + <MkA v-for="doc in docs.filter(doc => doc.path.startsWith('advanced/'))" :key="doc.path" :to="`/docs/${doc.path}`" class="doc"> + <div class="title">{{ doc.title }}</div> + <div class="summary">{{ doc.summary }}</div> + <div class="read">{{ $ts._docs.continueReading }}</div> + </MkA> + </div> + </MkFolder> </div> </template> @@ -16,8 +40,15 @@ import { defineComponent } from 'vue'; import { url, lang } from '@client/config'; import * as symbols from '@client/symbols'; +import MkFolder from '@client/components/ui/folder.vue'; +import MkInput from '@client/components/ui/input.vue'; export default defineComponent({ + components: { + MkFolder, + MkInput, + }, + data() { return { [symbols.PAGE_INFO]: { @@ -25,6 +56,15 @@ export default defineComponent({ icon: 'fas fa-question-circle' }, docs: [], + query: null, + } + }, + + watch: { + query() { + fetch(`${url}/docs.json?lang=${lang}&q=${this.query}`).then(res => res.json()).then(docs => { + this.docs = docs; + }); } }, @@ -35,3 +75,48 @@ export default defineComponent({ }, }); </script> + +<style lang="scss" scoped> +.vtaihdtm { + background: var(--panel); + + > .search { + padding: 8px; + } + + .docs { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(270px, 1fr)); + grid-gap: 12px; + margin: var(--margin); + + > .doc { + display: inline-block; + padding: 16px; + border: solid 1px var(--divider); + border-radius: 6px; + + &:hover { + border: solid 1px var(--accent); + text-decoration: none; + } + + > .title { + font-weight: bold; + } + + > .summary { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-size: 0.9em; + } + + > .read { + color: var(--link); + font-size: 0.9em; + } + } + } +} +</style> diff --git a/src/client/router.ts b/src/client/router.ts index 4c3aa765e69c0bf4c9249c3de07cd8660a330af1..2081c1020cacd9eb8215df9dab04a82953d07faa 100644 --- a/src/client/router.ts +++ b/src/client/router.ts @@ -31,7 +31,7 @@ export const router = createRouter({ { path: '/docs', component: page('docs') }, { path: '/theme-editor', component: page('theme-editor') }, { path: '/advanced-theme-editor', component: page('advanced-theme-editor') }, - { path: '/docs/:doc', component: page('doc'), props: route => ({ doc: route.params.doc }) }, + { path: '/docs/:doc(.*)', component: page('doc'), props: route => ({ doc: route.params.doc }) }, { path: '/explore', component: page('explore') }, { path: '/explore/tags/:tag', props: true, component: page('explore') }, { path: '/search', component: page('search') }, diff --git a/src/docs/ja-JP/aiscript.md b/src/docs/ja-JP/advanced/aiscript.md similarity index 100% rename from src/docs/ja-JP/aiscript.md rename to src/docs/ja-JP/advanced/aiscript.md diff --git a/src/docs/ja-JP/api.md b/src/docs/ja-JP/advanced/api.md similarity index 100% rename from src/docs/ja-JP/api.md rename to src/docs/ja-JP/advanced/api.md diff --git a/src/docs/ja-JP/create-plugin.md b/src/docs/ja-JP/advanced/create-plugin.md similarity index 100% rename from src/docs/ja-JP/create-plugin.md rename to src/docs/ja-JP/advanced/create-plugin.md diff --git a/src/docs/ja-JP/reversi-bot.md b/src/docs/ja-JP/advanced/reversi-bot.md similarity index 100% rename from src/docs/ja-JP/reversi-bot.md rename to src/docs/ja-JP/advanced/reversi-bot.md diff --git a/src/docs/ja-JP/stream.md b/src/docs/ja-JP/advanced/stream.md similarity index 100% rename from src/docs/ja-JP/stream.md rename to src/docs/ja-JP/advanced/stream.md diff --git a/src/docs/ja-JP/custom-emoji.md b/src/docs/ja-JP/features/custom-emoji.md similarity index 100% rename from src/docs/ja-JP/custom-emoji.md rename to src/docs/ja-JP/features/custom-emoji.md diff --git a/src/docs/ja-JP/deck.md b/src/docs/ja-JP/features/deck.md similarity index 100% rename from src/docs/ja-JP/deck.md rename to src/docs/ja-JP/features/deck.md diff --git a/src/docs/ja-JP/follow.md b/src/docs/ja-JP/features/follow.md similarity index 100% rename from src/docs/ja-JP/follow.md rename to src/docs/ja-JP/features/follow.md diff --git a/src/docs/ja-JP/keyboard-shortcut.md b/src/docs/ja-JP/features/keyboard-shortcut.md similarity index 100% rename from src/docs/ja-JP/keyboard-shortcut.md rename to src/docs/ja-JP/features/keyboard-shortcut.md diff --git a/src/docs/ja-JP/mfm.md b/src/docs/ja-JP/features/mfm.md similarity index 100% rename from src/docs/ja-JP/mfm.md rename to src/docs/ja-JP/features/mfm.md diff --git a/src/docs/ja-JP/mute.md b/src/docs/ja-JP/features/mute.md similarity index 100% rename from src/docs/ja-JP/mute.md rename to src/docs/ja-JP/features/mute.md diff --git a/src/docs/ja-JP/pages.md b/src/docs/ja-JP/features/pages.md similarity index 100% rename from src/docs/ja-JP/pages.md rename to src/docs/ja-JP/features/pages.md diff --git a/src/docs/ja-JP/reaction.md b/src/docs/ja-JP/features/reaction.md similarity index 86% rename from src/docs/ja-JP/reaction.md rename to src/docs/ja-JP/features/reaction.md index 476af64e8b1d57a6d398fc035b4b0db7a52c11dc..fadce7af4ee2876d4b378bd9db44b85b52f84273 100644 --- a/src/docs/ja-JP/reaction.md +++ b/src/docs/ja-JP/features/reaction.md @@ -9,7 +9,6 @@ ## リモート投稿ã¸ã®ãƒªã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã«ã¤ã„㦠リアクションã¯Misskeyオリジナルã®æ©Ÿèƒ½ã§ã‚ã‚‹ãŸã‚ã€ãƒªãƒ¢ãƒ¼ãƒˆã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ãŒMisskeyã§ãªã„é™ã‚Šã¯ã€ã»ã¨ã‚“ã©ã®å ´åˆã€ŒLikeã€ã¨ã—ã¦ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティãŒé€ä¿¡ã•ã‚Œã¾ã™ã€‚一般的ã«ã¯Likeã¯ã€ŒãŠæ°—ã«å…¥ã‚Šã€ã¨ã—ã¦å®Ÿè£…ã•ã‚Œã¦ã„るよã†ã§ã™ã€‚ -ã¾ãŸã€ç›¸æ‰‹ãŒMisskeyã§ã‚ã£ãŸã¨ã—ã¦ã‚‚ã€ã‚«ã‚¹ã‚¿ãƒ 絵文å—リアクションã¯ä¼ã‚らãšã€è‡ªå‹•çš„ã«ã€ŒðŸ‘ã€ç‰ã«ãƒ•ã‚©ãƒ¼ãƒ«ãƒãƒƒã‚¯ã•ã‚Œã¾ã™ã€‚ ## リモートã‹ã‚‰ã®ãƒªã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã«ã¤ã„㦠リモートã‹ã‚‰ã€ŒLikeã€ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティをå—ä¿¡ã—ãŸã¨ãã€Misskeyã§ã¯ã€ŒðŸ‘ã€ã®ãƒªã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¨ã—ã¦è§£é‡ˆã•ã‚Œã¾ã™ã€‚ diff --git a/src/docs/ja-JP/theme.md b/src/docs/ja-JP/features/theme.md similarity index 100% rename from src/docs/ja-JP/theme.md rename to src/docs/ja-JP/features/theme.md diff --git a/src/docs/ja-JP/timelines.md b/src/docs/ja-JP/features/timelines.md similarity index 100% rename from src/docs/ja-JP/timelines.md rename to src/docs/ja-JP/features/timelines.md diff --git a/src/docs/ja-JP/general/misskey.md b/src/docs/ja-JP/general/misskey.md new file mode 100644 index 0000000000000000000000000000000000000000..13ef1609d81b24653fba3db9b4bd4b354ba7b8f4 --- /dev/null +++ b/src/docs/ja-JP/general/misskey.md @@ -0,0 +1,43 @@ +# Misskeyã«ã¤ã„㦠+ +Misskeyã¯ã‚ªãƒ¼ãƒ—ンソースã®åˆ†æ•£åž‹ãƒžã‚¤ã‚¯ãƒãƒ–ãƒã‚°ãƒ—ラットフォームプãƒã‚¸ã‚§ã‚¯ãƒˆã§ã™ã€‚ +開発ã¯syuiloã«ã‚ˆã£ã¦2014å¹´ã‹ã‚‰é–‹å§‹ã•ã‚Œã¾ã—ãŸã€‚ + +## 分散型ã¨ã¯ä½•ã‹ï¼Ÿ +分散(distributed)åž‹ã¨ã¯ã€éžä¸å¤®é›†æ¨©(decentralized)ã¨ã‚‚呼ã°ã‚Œã€ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ãŒå¤šæ•°ã®ã‚µãƒ¼ãƒãƒ¼ã«åˆ†æ•£ã—ã¦å˜åœ¨ã—ã€ãれらãŒç›¸äº’ã«é€šä¿¡ã™ã‚‹ã“ã¨ã§ã‚³ãƒ³ãƒ†ãƒ³ãƒ„共有ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’å½¢æˆã—ã¦ã„ã‚‹ã“ã¨ãŒç‰¹å¾´ã®ã‚µãƒ¼ãƒ“スã§ã™ã€‚ +å˜ä¸€ã®ã‚µãƒ¼ãƒãƒ¼ã—ã‹å˜åœ¨ã—ãªã„ã€ã‚‚ã—ãã¯è¤‡æ•°å˜åœ¨ã—ã¦ã‚‚互ã„ã«ç‹¬ç«‹ã—ã¦ã„ã‚‹å ´åˆã¯ä¸å¤®é›†æ¨©ãªã‚µãƒ¼ãƒ“スã¨è¨€ã‚ã‚Œã€ä¾‹ãˆã°Twitterã‚„Facebookãªã©ã»ã¨ã‚“ã©ã®ã‚µãƒ¼ãƒ“スãŒãã‚Œã«è©²å½“ã—ã¾ã™ã€‚ + +## 常ã«ã‚ªãƒ¼ãƒ—ンソース +Misskeyã¯ã“ã‚Œã¾ã§ã‚‚ã“ã‚Œã‹ã‚‰ã‚‚ã€ã‚ªãƒ¼ãƒ—ンソースã§ã‚り続ã‘ã¾ã™ã€‚オープンソースã¨ã¯ã€ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰(プãƒã‚°ãƒ©ãƒ )ãŒå…¬é–‹ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã§ã™ã€‚ソースコードã®ä¿®æ£ã‚„å†é…布ãŒå¯èƒ½ã§ã‚ã‚‹ã“ã¨ã‚’定義ã«å«ã‚ã‚‹ã“ã¨ã‚‚ã‚ã‚Šã¾ã™ã€‚ +Misskeyã®ã™ã¹ã¦ã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã¯å…¬é–‹ã•ã‚Œã¦ã„ã¦ã€èª°ã§ã‚‚自由ã«é–²è¦§ã€ä½¿ç”¨ã€ä¿®æ£ã€æ”¹å¤‰ã€å†é…布をã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ +オープンソースã¯ã€è‡ªåˆ†ã§å¥½ããªã‚ˆã†ã«å¤‰ãˆãŸã‚Šã€æœ‰å®³ãªå‡¦ç†ãŒå«ã¾ã‚Œã¦ã„ãªã„ã“ã¨ã‚’確èªã™ã‚‹ã“ã¨ãŒã§ããŸã‚Šã€èª°ã§ã‚‚開発ã«å‚åŠ ã§ãã‚‹ãªã©ã®ã€æ§˜ã€…ãªãƒ¡ãƒªãƒƒãƒˆãŒã‚ã‚Šã¾ã™ã€‚ +上述ã®åˆ†æ•£åž‹ã‚’実ç¾ã™ã‚‹ãŸã‚ã«ã‚‚ã€ã‚ªãƒ¼ãƒ—ンソースã§ã‚ã‚‹ã¨ã„ã†ã“ã¨ã¯å¿…è¦ä¸å¯æ¬ ãªè¦ç´ ã§ã™ã€‚ +å†ã³å¼•ãåˆã„ã«å‡ºã—ã¾ã™ãŒã€Twitterã‚„Facebookãªã©ã®åˆ©ç›Šã‚’å¾—ã¦ã„ã‚‹ã»ã¨ã‚“ã©ã®ã‚µãƒ¼ãƒ“スã¯ã‚ªãƒ¼ãƒ—ンソースã§ã¯ã‚ã‚Šã¾ã›ã‚“。 + +Misskeyã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã¯ã€[GitHub上ã§å…¬é–‹ã•ã‚Œã¦ã„ã¾ã™ã€‚](https://github.com/misskey-dev) + +## 開発ã«å‚åŠ ã™ã‚‹ã€é–‹ç™ºã‚’支æ´ã™ã‚‹ +Misskeyã®é–‹ç™ºã«è²¢çŒ®ã™ã‚‹ã«ã¯ã„ã‚ã„ã‚ãªæ–¹æ³•ãŒã‚ã‚Šã¾ã™ã€‚ + +### æ©Ÿèƒ½ã‚’è¿½åŠ ã—ãŸã‚Šã€ãƒã‚°ã‚’ä¿®æ£ã™ã‚‹ +ソフトウェアエンジニアã®ã‚¹ã‚ルをãŠæŒã¡ã®æ–¹ã§ã‚ã‚Œã°ã€ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’編集ã™ã‚‹å½¢ã§ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã«è²¢çŒ®ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + +### è°è«–ã«å‚åŠ ã™ã‚‹ +æ–°ã—ã„機能ã€ã¾ãŸã¯æ—¢å˜ã®æ©Ÿèƒ½ã«ã¤ã„ã¦æ„見を述ã¹ãŸã‚Šã€ä¸å…·åˆã‚’å ±å‘Šã—ãŸã‚Šã™ã‚‹ã“ã¨ã§ã‚‚貢献ã§ãã¾ã™ã€‚ +ãã®ã‚ˆã†ãªãƒ‡ã‚£ã‚¹ã‚«ãƒƒã‚·ãƒ§ãƒ³ã¯[GitHub](https://github.com/misskey-dev)上ã‹ã€[フォーラム](https://forum.misskey.io/)ç‰ã§è¡Œã‚ã‚Œã¾ã™ã€‚ + +### テã‚ストを翻訳ã™ã‚‹ +Misskeyã¯æ§˜ã€…ãªè¨€èªžã«å¯¾å¿œã—ã¦ã„ã¾ã™(i18n -internationalizationã®ç•¥- ã¨å‘¼ã°ã‚Œã¾ã™)。元ã®è¨€èªžã¯åŸºæœ¬çš„ã«æ—¥æœ¬èªžã§ã™ãŒã€æœ‰å¿—ã«ã‚ˆã£ã¦ä»–ã®è¨€èªžã¸ã¨ç¿»è¨³ã•ã‚Œã¦ã„ã¾ã™ã€‚ +ãã®ç¿»è¨³ä½œæ¥ã«åŠ ã‚ã£ã¦ã„ãŸã ãã“ã¨ã§ã‚‚Misskeyã«è²¢çŒ®ã§ãã¾ã™ã€‚ +Misskeyã¯[Crowdinã¨ã„ã†ã‚µãƒ¼ãƒ“スを使用ã—ã¦ç¿»è¨³ã®ç®¡ç†ã‚’è¡Œã£ã¦ã„ã¾ã™ã€‚](https://crowdin.com/project/misskey) + +### 感想を投稿ã™ã‚‹ +ä¸å…·åˆå ±å‘Šç‰ã ã‘ã§ã¯ãªãã€Misskeyã®è‰¯ã„点ã€æ¥½ã—ã„点ã¨ã„ã£ãŸãƒã‚¸ãƒ†ã‚£ãƒ–ãªæ„見もãœã²å…±æœ‰ã—ã¦ãã ã•ã„。開発ã®åŠ±ã¿ã«ãªã‚Šã€ãã‚Œã¯é–“接的ã§ã™ãŒãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã¸ã®è²¢çŒ®ã§ã™ã€‚ + +### 寄付をã™ã‚‹ +Misskeyã¯ãƒ“ジãƒã‚¹ã§ã¯ãªãã€åˆ©ç”¨ã¯ç„¡æ–™ã§ã‚ã‚‹ãŸã‚ã€åŽç›Šã¯çš†æ§˜ã‹ã‚‰ã®å¯„付ã®ã¿ã§ã™ã€‚(インスタンスã«ã‚ˆã£ã¦ã¯åºƒå‘ŠåŽå…¥ã‚’å¾—ã¦ã„るよã†ãªå ´åˆã‚‚ã‚ã‚Šã¾ã™ãŒã€ãã‚Œã¯é‹å–¶è€…ã®åŽå…¥ã§ã‚り開発者ã¸ã®åŽå…¥ã«ã¯ãªã‚Šã¾ã›ã‚“) +寄付をã—ã¦ã„ãŸã ã‘ã‚Œã°ã€ä»Šå¾Œã‚‚開発を続ã‘ã‚‹ã“ã¨ãŒå¯èƒ½ã«ãªã‚Šã€ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã¸ã®è²¢çŒ®ã«ãªã‚Šã¾ã™ã€‚ +寄付ã¯[Patreon](https://www.patreon.com/syuilo)ã§å—ã‘付ã‘ã¦ã„ã¾ã™ã€‚ + +## クレジット +Misskeyã®é–‹ç™ºè€…ã‚„ã€Misskeyã«å¯„付をã—ã¦ãã ã•ã£ãŸæ–¹ã®ä¸€è¦§ã¯[ã“ã¡ã‚‰](/about-misskey)ã§è¦‹ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ diff --git a/src/server/web/index.ts b/src/server/web/index.ts index 50fea757f25bcaf2f857b89c6776e0891916c9b8..a732e7f5b475ec9312ba9cd15470590ef299e226 100644 --- a/src/server/web/index.ts +++ b/src/server/web/index.ts @@ -121,14 +121,22 @@ router.get('/api.json', async ctx => { router.get('/docs.json', async ctx => { const lang = ctx.query.lang; + const query = ctx.query.q; if (!Object.keys(locales).includes(lang)) { ctx.body = []; return; } - const paths = glob.sync(__dirname + `/../../../src/docs/${lang}/*.md`); - const docs: { path: string; title: string; }[] = []; + const dirPath = `${__dirname}/../../../src/docs/${lang}`.replace(/\\/g, '/'); + const paths = glob.sync(`${dirPath}/**/*.md`); + const docs: { path: string; title: string; summary: string; }[] = []; for (const path of paths) { const md = fs.readFileSync(path, { encoding: 'utf8' }); + + if (query && query.length > 0) { + // TODO: カタカナをã²ã‚‰ãŒãªã«ã—ã¦æ¯”較ã™ã‚‹ãªã©ã—ãŸã„ + if (!md.includes(query)) continue; + } + const parsed = markdown.parse(md, {}); if (parsed.length === 0) return; @@ -147,9 +155,22 @@ router.get('/docs.json', async ctx => { } } + const firstParagrapfTokens = []; + while (buf[0].type !== 'paragraph_open') { + buf.shift(); + } + buf.shift(); + while (buf[0].type as string !== 'paragraph_close') { + const token = buf.shift(); + if (token) { + firstParagrapfTokens.push(token); + } + } + docs.push({ - path: path.split('/').pop()!.split('.')[0], - title: markdown.renderer.render(headingTokens, {}, {}) + path: path.replace(`${dirPath}/`, '').split('.')[0], + title: markdown.renderer.render(headingTokens, {}, {}), + summary: markdown.renderer.render(firstParagrapfTokens, {}, {}), }); }