mirror of
https://github.com/hedgedoc/hedgedoc.git
synced 2024-11-22 01:36:29 -05:00
feat(renderer): Add intermediate class for markdown renderer extensions with event emitter
Signed-off-by: Tilman Vatteroth <git@tilmanvatteroth.de>
This commit is contained in:
parent
b615ef49a3
commit
37e1482c46
6 changed files with 24 additions and 8 deletions
|
@ -0,0 +1,16 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2023 The HedgeDoc developers (see AUTHORS file)
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
import { MarkdownRendererExtension } from './markdown-renderer-extension'
|
||||||
|
import type { EventEmitter2 } from 'eventemitter2'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for Markdown renderer extensions that need an event emitter.
|
||||||
|
*/
|
||||||
|
export abstract class EventMarkdownRendererExtension extends MarkdownRendererExtension {
|
||||||
|
constructor(protected readonly eventEmitter: EventEmitter2) {
|
||||||
|
super()
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,15 +5,12 @@
|
||||||
*/
|
*/
|
||||||
import type { NodeProcessor } from '../../node-preprocessors/node-processor'
|
import type { NodeProcessor } from '../../node-preprocessors/node-processor'
|
||||||
import type { ComponentReplacer } from '../../replace-components/component-replacer'
|
import type { ComponentReplacer } from '../../replace-components/component-replacer'
|
||||||
import type { EventEmitter2 } from 'eventemitter2'
|
|
||||||
import type MarkdownIt from 'markdown-it'
|
import type MarkdownIt from 'markdown-it'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for Markdown extensions.
|
* Base class for Markdown extensions.
|
||||||
*/
|
*/
|
||||||
export abstract class MarkdownRendererExtension {
|
export abstract class MarkdownRendererExtension {
|
||||||
constructor(protected readonly eventEmitter?: EventEmitter2) {}
|
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
public configureMarkdownIt(markdownIt: MarkdownIt): void {
|
public configureMarkdownIt(markdownIt: MarkdownIt): void {
|
||||||
return
|
return
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
*/
|
*/
|
||||||
import { tocSlugify } from '../../../editor-page/table-of-contents/toc-slugify'
|
import { tocSlugify } from '../../../editor-page/table-of-contents/toc-slugify'
|
||||||
import { MarkdownRendererExtension } from '../base/markdown-renderer-extension'
|
import { EventMarkdownRendererExtension } from '../base/event-markdown-renderer-extension'
|
||||||
import type { TocAst } from '@hedgedoc/markdown-it-plugins'
|
import type { TocAst } from '@hedgedoc/markdown-it-plugins'
|
||||||
import { toc } from '@hedgedoc/markdown-it-plugins'
|
import { toc } from '@hedgedoc/markdown-it-plugins'
|
||||||
import equal from 'fast-deep-equal'
|
import equal from 'fast-deep-equal'
|
||||||
|
@ -13,7 +13,7 @@ import type MarkdownIt from 'markdown-it'
|
||||||
/**
|
/**
|
||||||
* Adds table of content to the markdown rendering.
|
* Adds table of content to the markdown rendering.
|
||||||
*/
|
*/
|
||||||
export class TableOfContentsMarkdownExtension extends MarkdownRendererExtension {
|
export class TableOfContentsMarkdownExtension extends EventMarkdownRendererExtension {
|
||||||
public static readonly EVENT_NAME = 'TocChange'
|
public static readonly EVENT_NAME = 'TocChange'
|
||||||
private lastAst: TocAst | undefined = undefined
|
private lastAst: TocAst | undefined = undefined
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,9 @@ export const useMarkdownExtensions = (
|
||||||
const extensionEventEmitter = useExtensionEventEmitter()
|
const extensionEventEmitter = useExtensionEventEmitter()
|
||||||
const frontendConfig = useFrontendConfig()
|
const frontendConfig = useFrontendConfig()
|
||||||
return useMemo(() => {
|
return useMemo(() => {
|
||||||
|
if (!extensionEventEmitter) {
|
||||||
|
throw new Error("can't build markdown render extensions without event emitter.")
|
||||||
|
}
|
||||||
return [
|
return [
|
||||||
...optionalAppExtensions.flatMap((extension) =>
|
...optionalAppExtensions.flatMap((extension) =>
|
||||||
extension.buildMarkdownRendererExtensions({
|
extension.buildMarkdownRendererExtensions({
|
||||||
|
|
|
@ -14,7 +14,7 @@ import { Fragment } from 'react'
|
||||||
|
|
||||||
export interface MarkdownRendererExtensionOptions {
|
export interface MarkdownRendererExtensionOptions {
|
||||||
frontendConfig: FrontendConfig
|
frontendConfig: FrontendConfig
|
||||||
eventEmitter?: EventEmitter2
|
eventEmitter: EventEmitter2
|
||||||
}
|
}
|
||||||
|
|
||||||
export abstract class AppExtension {
|
export abstract class AppExtension {
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
*/
|
*/
|
||||||
import { MarkdownRendererExtension } from '../../../components/markdown-renderer/extensions/base/markdown-renderer-extension'
|
import { EventMarkdownRendererExtension } from '../../../components/markdown-renderer/extensions/base/event-markdown-renderer-extension'
|
||||||
import type { ComponentReplacer } from '../../../components/markdown-renderer/replace-components/component-replacer'
|
import type { ComponentReplacer } from '../../../components/markdown-renderer/replace-components/component-replacer'
|
||||||
import { TaskListReplacer } from './task-list-replacer'
|
import { TaskListReplacer } from './task-list-replacer'
|
||||||
import { taskLists } from '@hedgedoc/markdown-it-plugins'
|
import { taskLists } from '@hedgedoc/markdown-it-plugins'
|
||||||
|
@ -12,7 +12,7 @@ import type MarkdownIt from 'markdown-it'
|
||||||
/**
|
/**
|
||||||
* Adds support for interactive checkbox lists to the markdown rendering using the github checklist syntax.
|
* Adds support for interactive checkbox lists to the markdown rendering using the github checklist syntax.
|
||||||
*/
|
*/
|
||||||
export class TaskListMarkdownExtension extends MarkdownRendererExtension {
|
export class TaskListMarkdownExtension extends EventMarkdownRendererExtension {
|
||||||
public configureMarkdownIt(markdownIt: MarkdownIt): void {
|
public configureMarkdownIt(markdownIt: MarkdownIt): void {
|
||||||
taskLists(markdownIt, {
|
taskLists(markdownIt, {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
|
|
Loading…
Reference in a new issue