2024-07-10 16:17:23 +08:00
|
|
|
import { State, ViewModel } from "@guanghechen/viewmodel";
|
|
|
|
import type { Definition } from "@yozora/ast";
|
|
|
|
import type { INodeRendererMap } from "./types";
|
|
|
|
|
|
|
|
export type IReactMarkdownThemeScheme = "lighten" | "darken" | string;
|
|
|
|
|
2024-07-10 16:34:28 +08:00
|
|
|
export interface IReactMarkdownViewModelProperties {
|
2024-07-10 16:17:23 +08:00
|
|
|
/**
|
|
|
|
* Link / Image reference definitions.
|
|
|
|
*/
|
|
|
|
readonly definitionMap: Readonly<Record<string, Definition>>;
|
|
|
|
/**
|
|
|
|
* Prefer code wrap.
|
|
|
|
*
|
|
|
|
* !!! Since the lineno would be weird if the code is wrapped,
|
|
|
|
* !!! so the lineno will be hidden if the `preferCodeWrap` set to `true`.
|
|
|
|
*/
|
|
|
|
readonly preferCodeWrap: boolean;
|
|
|
|
/**
|
|
|
|
* Ast node renderer map.
|
|
|
|
*/
|
|
|
|
readonly rendererMap: Readonly<INodeRendererMap>;
|
|
|
|
/**
|
|
|
|
* Whether if show code lineno.
|
|
|
|
*/
|
|
|
|
readonly showCodeLineno: boolean;
|
|
|
|
/**
|
|
|
|
* React markdown theme scheme.
|
|
|
|
*/
|
|
|
|
readonly themeScheme: IReactMarkdownThemeScheme;
|
|
|
|
}
|
|
|
|
|
|
|
|
export class ReactMarkdownViewModel extends ViewModel {
|
|
|
|
public readonly definitionMap$: State<Readonly<Record<string, Definition>>>;
|
|
|
|
public readonly preferCodeWrap$ = new State<boolean>(false);
|
|
|
|
public readonly rendererMap$: State<Readonly<INodeRendererMap>>;
|
|
|
|
public readonly showCodeLineno$: State<boolean>;
|
|
|
|
public readonly themeScheme$: State<IReactMarkdownThemeScheme>;
|
|
|
|
|
2024-07-10 16:34:28 +08:00
|
|
|
constructor(properties: IReactMarkdownViewModelProperties) {
|
2024-07-10 16:17:23 +08:00
|
|
|
super();
|
|
|
|
|
2024-07-10 16:34:28 +08:00
|
|
|
const { definitionMap, rendererMap, showCodeLineno, themeScheme } = properties;
|
2024-07-10 16:17:23 +08:00
|
|
|
this.definitionMap$ = new State(definitionMap);
|
|
|
|
this.rendererMap$ = new State(rendererMap);
|
|
|
|
this.showCodeLineno$ = new State<boolean>(showCodeLineno);
|
|
|
|
this.themeScheme$ = new State<IReactMarkdownThemeScheme>(themeScheme);
|
|
|
|
}
|
|
|
|
}
|