page-index
Dieses Plugin ermöglicht eine Übersicht über alle speicherbaren Dokumente. So kann bspw. der Bearbeitungsstand in der Seitenleiste angezeigt werden.
Standardmässig wird in der Seitenleiste der Bearbeitungsstand in zwei Fällen angezeigt:
- Auf einer Seite sind Statusdokument vorhanden, deren Fortschritt bestimmt werden kann (sog.
TaskableDocuments, bspw.task_stateoderprogress_state). - In einer Kategorie befinden sich direkt untergeordnete Seiten mit Statusdokumenten.
Dieses Verhalten kann über das Frontmatter der Seite angepasst werden:
---
sidebar_custom_props:
taskable_state: 'show'
---
---
sidebar_custom_props:
taskable_state: 'hide'
---
Page index
Der Seitenindex ist ein Baum aller speicherbaren Dokumente in der aktuellen Seite.
Im dev-Modus wird er automatisch aktualisiert, wenn sich die Seite ändert.
Page Index
[]
Für Plugin-Autoren
@tdev/page-read-check als BeispielDas Plugin @tdev/page-read-check implementiert das iTaskableDocument-Interface und wird daher automatisch im Seitenindex erfasst.
Es dient als Beispiel und Referenz, wie ein Statusdokument implementiert werden kann, damit es im Seitenindex erfasst wird.
Wenn ein Plugin ein weiteres Statusdokument implementiert, das im Seitenindex erfasst werden soll, müssen folgende Schritte durchgeführt werden:
- In der
siteConfigdie neue Komponente für dasremark-Plugin registrieren:siteConfig.tsimport { PageIndexPluginDefaultOptions } from './src/siteConfig/markdownPluginConfigs';
const indexPluginOptions = {
...PageIndexPluginDefaultOptions,
components: [
...PageIndexPluginDefaultOptions.components,
{
name: 'MyNewTaskableDocument',
docTypeExtractor: (node: MdxJsxFlowElement) => 'my_new_taskable_document'
}
]
};
export const pageIndexPluginConfig = [pageIndexPlugin, indexPluginOptions]; - Im
index.tsdes neuen Plugins den neuen Dokumenttyp importieren:packages/<scope>/<new-plugin>/index.tsdeclare module '@tdev-api/document' {
export interface TaskableDocumentMapping {
['my_new_taskable_document']: MyNewTaskableData;
}
export interface TaskableTypeModelMapping {
['my_new_taskable_document']: MyNewTaskableDocument;
}
}iTaskableDocumentDas neue
MyNewTaskableDocument-Modell muss das InterfaceiTaskableDocument<'my_new_taskable_document'>implementieren, damit es im Seitenindex als Statusdokument erkannt wird. - Im
apiDocumentProvidersden neuen Dokumenttyp registrieren:und den neuen Dokumenttyp imsiteConfig.tsconst getSiteConfig = () => {
apiDocumentProviders: {
...,
require.resolve('@scope/new-plugin/register')
}
}ComponentStoreregistrieren:packages/<scope>/<new-plugin>/register.tsconst register = () => {
rootStore.documentStore.registerFactory('my_new_taskable_document', createModel);
rootStore.componentStore.registerTaskableDocumentType(new ModelMeta({}));
};
Installation
docusaurus.config.tsimport pageIndexPlugin from './packages/tdev/page-index/plugin';
export default {
// ...
plugins: [
// ...
pageIndexPlugin
]
};
theme/DocSidebarItem/index.tsxSee the swizzled component of this page. This should be synced with the updateTdev.config.yaml by default.
remark config
import pageProgressStatePlugin from '@tdev/page-index/remark-plugin';
export const PageIndexPluginDefaultOptions: PageIndexPluginOptions = {
components: [
{
name: 'Answer',
docTypeExtractor: (node) => {
return (
getAnswerDocumentType(
node.attributes.find((a) => a.type === 'mdxJsxAttribute' && a.name === 'type')
?.value as string
) || 'unknown'
);
}
},
{
name: 'ProgressState',
docTypeExtractor: () => 'progress_state'
},
{
name: 'TaskState',
docTypeExtractor: () => 'task_state'
},
{
name: 'QuillV2',
docTypeExtractor: () => 'quill_v2'
},
{
name: 'String',
docTypeExtractor: () => 'string'
},
{
name: 'CmsText',
docTypeExtractor: () => 'cms_text'
},
{
name: 'CmsCode',
docTypeExtractor: () => 'cms_text'
},
{
name: 'Restricted',
docTypeExtractor: () => 'restricted'
},
{
name: 'DynamicDocumentRoots',
docTypeExtractor: () => 'dynamic_document_roots'
}
],
persistedCodeType: (node: Code) => {
if (node.lang === 'html') {
return 'script';
}
const liveLangMatch = /(live_[a-zA-Z0-9-_]+)/.exec(node.meta || '');
const liveCode = liveLangMatch ? liveLangMatch[1] : null;
switch (liveCode) {
case 'live_py':
case 'live_bry':
// legacy name, TODO. should be 'brython_code'?
return 'script';
case 'live_pyo':
return 'pyodide_code';
default:
return 'code';
}
}
};
export const pageIndexPluginConfig = [pageIndexPlugin, PageIndexPluginDefaultOptions];