feat: support markdown

This commit is contained in:
guanghechen 2024-07-10 16:17:23 +08:00
parent bd230ddd4f
commit 85d144a1e9
34 changed files with 2350 additions and 4 deletions

View file

@ -0,0 +1,32 @@
import { useStateValue } from "@guanghechen/react-viewmodel";
import type { Code } from "@yozora/ast";
import { useNodeRendererContext, type INodeRenderer, IReactMarkdownThemeScheme } from "../context";
import { CodeRendererInner } from "./inner/CodeRendererInner";
/**
* Render `code`
*
* @see https://www.npmjs.com/package/@yozora/ast#code
* @see https://www.npmjs.com/package/@yozora/tokenizer-indented-code
* @see https://www.npmjs.com/package/@yozora/tokenizer-fenced-code
*/
export const CodeRenderer: INodeRenderer<Code> = props => {
const { lang } = props;
const value: string = props.value.replace(/[\r\n]+$/, ""); // Remove trailing line endings.
const { viewmodel } = useNodeRendererContext();
const preferCodeWrap: boolean = useStateValue(viewmodel.preferCodeWrap$);
const showCodeLineno: boolean = useStateValue(viewmodel.showCodeLineno$);
const themeScheme: IReactMarkdownThemeScheme = useStateValue(viewmodel.themeScheme$);
const darken: boolean = themeScheme === "darken";
return (
<CodeRendererInner
darken={darken}
lang={lang ?? "text"}
value={value}
preferCodeWrap={preferCodeWrap}
showCodeLineno={showCodeLineno}
/>
);
};