ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â ð shadcn/directory/udecode/plate/(plugins)/(elements)/code-block.cn â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â
title: 代ç å docs:
æå¿«æ·æ·»å 代ç ååèœçæ¹åŒæ¯äœ¿çš CodeBlockKitïŒå®å
å«é¢é
眮ç CodeBlockPluginãCodeLinePlugin å CodeSyntaxPluginïŒæäŸè¯æ³é«äº®å Plate UI ç»ä»¶ã
CodeBlockElement: æž²æä»£ç å容åšCodeLineElement: æž²æåè¡ä»£ç CodeSyntaxLeaf: æž²æè¯æ³é«äº®ææ¬å°å¥ä»¶æ·»å å°äœ çæä»¶äžïŒ
import { createPlateEditor } from 'platejs/react';
import { CodeBlockKit } from '@/components/editor/plugins/code-block-kit';
const editor = createPlateEditor({
plugins: [
// ...å
¶ä»æä»¶,
...CodeBlockKit,
],
});
</Steps>
npm install @platejs/code-block lowlight
åšå建çŒèŸåšæ¶ïŒå°ä»£ç åæä»¶å å«å° Plate æä»¶æ°ç»äžã
import { CodeBlockPlugin, CodeLinePlugin, CodeSyntaxPlugin } from '@platejs/code-block/react';
import { createPlateEditor } from 'platejs/react';
const editor = createPlateEditor({
plugins: [
// ...å
¶ä»æä»¶,
CodeBlockPlugin,
CodeLinePlugin,
CodeSyntaxPlugin,
],
});
é 眮垊æè¯æ³é«äº®åèªå®ä¹ç»ä»¶çæä»¶ã
å 嫿æè¯èšçåºç¡è®Ÿçœ®ïŒ
import { CodeBlockPlugin, CodeLinePlugin, CodeSyntaxPlugin } from '@platejs/code-block/react';
import { all, createLowlight } from 'lowlight';
import { createPlateEditor } from 'platejs/react';
import { CodeBlockElement, CodeLineElement, CodeSyntaxLeaf } from '@/components/ui/code-block-node';
// å建å
嫿æè¯èšç lowlight å®äŸ
const lowlight = createLowlight(all);
const editor = createPlateEditor({
plugins: [
// ...å
¶ä»æä»¶,
CodeBlockPlugin.configure({
node: { component: CodeBlockElement },
options: { lowlight },
shortcuts: { toggle: { keys: 'mod+alt+8' } },
}),
CodeLinePlugin.withComponent(CodeLineElement),
CodeSyntaxPlugin.withComponent(CodeSyntaxLeaf),
],
});
èªå®ä¹è¯èšè®Ÿçœ®ïŒäŒåå äœç§¯ïŒïŒ
䞺äºäŒåå äœç§¯ïŒäœ å¯ä»¥åªæ³šåç¹å®è¯èšïŒ
import { createLowlight } from 'lowlight';
import css from 'highlight.js/lib/languages/css';
import js from 'highlight.js/lib/languages/javascript';
import ts from 'highlight.js/lib/languages/typescript';
import html from 'highlight.js/lib/languages/xml';
// å建 lowlight å®äŸ
const lowlight = createLowlight();
// åªæ³šåéèŠçè¯èš
lowlight.register('html', html);
lowlight.register('css', css);
lowlight.register('js', js);
lowlight.register('ts', ts);
const editor = createPlateEditor({
plugins: [
// ...å
¶ä»æä»¶,
CodeBlockPlugin.configure({
node: { component: CodeBlockElement },
options: {
lowlight,
defaultLanguage: 'js', // 讟眮é»è®€è¯èšïŒå¯éïŒ
},
shortcuts: { toggle: { keys: 'mod+alt+8' } },
}),
CodeLinePlugin.withComponent(CodeLineElement),
CodeSyntaxPlugin.withComponent(CodeSyntaxLeaf),
],
});
node.component: æå® CodeBlockElement æ¥æž²æä»£ç å容åšoptions.lowlight: çšäºè¯æ³é«äº®ç lowlight å®äŸoptions.defaultLanguage: æªæå®è¯èšæ¶äœ¿çšçé»è®€è¯èšshortcuts.toggle: å®ä¹åæ¢ä»£ç åçé®çå¿«æ·é®withComponent: 䞺代ç è¡åè¯æ³é«äº®æå®ç»ä»¶äœ å¯ä»¥å°æ€é¡¹ç®æ·»å å°èœ¬æ¢äžºå·¥å ·æ æé®äžïŒå°å蜬æ¢äžºä»£ç åïŒ
{
icon: <FileCodeIcon />,
label: '代ç ',
value: KEYS.codeBlock,
}
äœ å¯ä»¥å°æ€é¡¹ç®æ·»å å°æå ¥å·¥å ·æ æé®äžïŒæå ¥ä»£ç åå çŽ ïŒ
{
icon: <FileCodeIcon />,
label: '代ç ',
value: KEYS.codeBlock,
}
</Steps>
CodeBlockPluginisCodeBlockEmptyisSelectionAtCodeBlockStartindentCodeLineåŠæéåºå·²å±åŒæå æ 巊䟧æ é空çœå笊ïŒå猩è¿ä»£ç è¡ãé»è®€çŒ©è¿äžº 2 äžªç©ºæ Œã
<API name="indentCodeLine"> <APIOptions type="IndentCodeLineOptions"> <APIItem name="codeLine" type="ElementEntry"> èŠçŒ©è¿ç代ç è¡ã </APIItem> <APIItem name="indentDepth" type="number"> 代ç è¡ç猩è¿å€§å°ã - **é»è®€åŒ:** `2` </APIItem> </APIOptions> </API>insertCodeBlockéè¿å°èç¹è®Ÿäžºä»£ç è¡å¹¶çšä»£ç åå è£¹æ¥æå ¥ä»£ç åãåŠæå æ äžåšååŒå€ŽïŒååšä»£ç ååæå ¥æ¢è¡ã
<API name="insertCodeBlock"> <APIParameters> <APIItem name="insertNodesOptions" type="Omit<InsertNodesOptions, 'match'>" optional> æå ¥èç¹çé项ã </APIItem> </APIParameters> </API>insertCodeLineæå ¥ä»¥æå®çŒ©è¿æ·±åºŠåŒå€Žç代ç è¡ã
<API name="insertCodeLine"> <APIParameters> <APIItem name="indentDepth" type="number" optional> 代ç è¡ççŒ©è¿æ·±åºŠã - **é»è®€åŒ:** `0` </APIItem> </APIParameters> </API>outdentCodeLineåå°ä»£ç è¡ç猩è¿ïŒåŠæååšåç§»é€äž€äžªç©ºçœå笊ã
<API name="outdentCodeLine"> <APIOptions type="OutdentCodeLineOptions"> <APIItem name="codeLine" type="ElementEntry"> èŠåå°çŒ©è¿ç代ç è¡ã </APIItem> <APIItem name="codeBlock" type="ElementEntry"> å å«èŠåå°çŒ©è¿ä»£ç è¡ç代ç åã </APIItem> </APIOptions> </API>toggleCodeBlock忢çŒèŸåšäžç代ç åã
unwrapCodeBlockè§£é€çŒèŸåšäžç代ç åå 裹ã
â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ