0.1.1 • Published 6 months ago
@istock-shell/editor v0.1.1
@istock-shell/editor
@istock-shell/editor 是一个专为命令行界面设计的富文本编辑器库,提供了强大的命令输入、编辑和语法高亮功能。它能够将普通的命令字符串转换成富有标签和样式的HTML内容,让命令、子命令、参数及选项参数等关键元素以更直观、美观的方式呈现给用户。同时支持HTML内容反向转换回原始的命令字符串,实现命令内容的双向处理。
✨ 特性
- 🎨 语法高亮: 自动识别命令、参数、选项等元素并应用不同样式
- 📝 富文本编辑: 支持复杂的命令输入和编辑操作
- 🔄 双向转换: HTML与纯文本之间的无损转换
- 📍 光标管理: 精确的光标定位和选择范围控制
- 📚 历史记录: 内置撤销/重做功能
- 🎯 事件系统: 完整的事件监听和自定义事件支持
- 🌏 中文输入: 完善的中文输入法支持
- 🔧 可扩展: 模块化设计,易于扩展和定制
📦 安装
npm install @istock-shell/editor
# 或
pnpm add @istock-shell/editor
# 或
yarn add @istock-shell/editor🚀 快速开始
基础用法
import { CommandEditor } from '@istock-shell/editor';
// 获取命令输入容器元素
const inputElement = document.getElementById('command-input') as HTMLElement;
// 创建编辑器实例
const editor = new CommandEditor(inputElement);
// 挂载编辑器(设置焦点和事件监听)
editor.onMount();
// 获取当前输入内容
console.log(editor.input);
// 设置输入内容
editor.handleCommandInput('ls -la /home');
// 追加内容
editor.handleCommandInputAppend(' --color=auto');事件监听
import { CommandEditor, CommandEditorEventNames } from '@istock-shell/editor';
import type { CommandEditorRecommendCmdEvent } from '@istock-shell/editor';
const editor = new CommandEditor(inputElement);
// 监听推荐命令事件
inputElement.addEventListener(CommandEditorEventNames.RecommendCmd, (event: CommandEditorRecommendCmdEvent) => {
console.log('推荐命令事件:', event.detail.data);
});
// 监听发送命令事件
inputElement.addEventListener(CommandEditorEventNames.SendCmd, (event) => {
console.log('发送命令:', event.detail.data);
});
// 监听重新渲染事件
inputElement.addEventListener(CommandEditorEventNames.ReRenderCmd, (event) => {
console.log('重新渲染命令');
});光标操作
import { CommandEditorCursor } from '@istock-shell/editor';
const cursor = new CommandEditorCursor(inputElement);
// 设置光标位置(基于文本偏移量)
cursor.setOffset(10);
// 移动到开始位置
cursor.moveToStart();
// 移动到结束位置
cursor.moveToEnd();
// 基于token偏移量移动
cursor.moveTokenOffset(2);
// 基于节点偏移量移动
cursor.moveNodeOffset(1);解析器使用
import { CommandEditorParser } from '@istock-shell/editor';
import type { CommandEditorContentNode } from '@istock-shell/editor';
import { TokenType } from '@istock-shell/command-parser';
const parser = new CommandEditorParser();
// DOM转文本
const text = parser.parseDomToText(inputElement);
// 虚拟节点转HTML
const vNodes: CommandEditorContentNode[] = [
{ id: 1, type: TokenType.command, value: 'ls' },
{ id: 2, type: TokenType.option, value: '-la' }
];
const html = parser.parseVNodeToHtml(vNodes);
// 虚拟节点转文本
const plainText = parser.parseVNodeToText(vNodes);📚 API 文档
CommandEditor
命令编辑器主类,提供完整的编辑功能。
属性
commandInput: HTMLElement- 只读,获取命令输入DOM元素input: string- 只读,获取当前输入的文本内容vNodes: CommandEditorContentNode[]- 只读,获取虚拟节点数组
方法
constructor(commandInput: HTMLElement)- 构造函数onMount(): void- 组件挂载,设置焦点并初始化事件监听handleCommandInput(input: string, offsetText?: string, options?: CommandEditorInputOption): void- 处理命令输入handleCommandInputAppend(str: string): void- 追加命令输入syncVNodeAndHtml(): void- 同步虚拟节点和HTMLgetCursorOffsetText(): number- 获取光标位置的文本偏移量destroy(): void- 销毁编辑器,清理资源
CommandEditorCursor
光标操作类,提供精确的光标控制功能。
属性
selection: Selection- 浏览器选择对象
方法
constructor(commandInput: HTMLElement)- 构造函数getOneRange(): Range- 获取当前有效的Range对象setOffset(offset: number): void- 根据文本偏移量设置光标位置moveToStart(): void- 移动光标到开始位置moveToEnd(): void- 移动光标到结束位置moveTokenOffset(offset: number): void- 基于token偏移量移动光标moveNodeOffset(offset: number): void- 基于节点偏移量移动光标
CommandEditorParser
解析器类,负责虚拟节点与DOM、文本之间的转换。
静态属性
blockTagNames: string[]- 块级标签名称数组brTagName: string- 换行标签名称spaceRegMatch: RegExp- 空格字符匹配正则表达式lineBreak: string- 换行符space: string- 空格字符
方法
parseDomToText(dom: HTMLElement): string- 将DOM元素解析为纯文本getOffsetTextForDom(dom: HTMLElement, range: CommandEditorRangInfo): number- 获取DOM中指定范围的文本偏移量parseVNodeToHtml(vNodes: CommandEditorContentNode[]): string- 将虚拟节点数组转换为HTML字符串parseVNodeToText(vNodes: CommandEditorContentNode[]): string- 将虚拟节点数组转换为纯文本findCursorInfoForDom(dom: HTMLElement, offset: number): CommandEditorRangInfo | null- 根据文本偏移量查找DOM中的光标位置信息
🎯 事件系统
事件类型
enum CommandEditorEventNames {
RecommendCmd = 'recommendCmd', // 推荐命令事件
SendCmd = 'sendCmd', // 发送命令事件
ReRenderCmd = 'reRenderCmd' // 重新渲染命令事件
}
enum CommandEditorActionTypes {
Auto = 'auto', // 自动操作
Up = 'up', // 向上操作
Down = 'down', // 向下操作
Undo = 'undo', // 撤销操作
Redo = 'redo' // 重做操作
}自定义事件
所有事件都遵循统一的事件结构:
type CommandEditorCustomEvent<Data = unknown> = {
detail: {
data: Data;
sourceEvent?: Event
};
} & Event;🔧 类型定义
// 内容节点类型
type CommandEditorContentNode = {
id?: number;
} & Token;
// 范围信息类型
type CommandEditorRangInfo = {
endContainer: Node;
endOffset: number;
};
// 输入选项类型
type CommandEditorInputOption = {
action?: CommandEditorActionTypes;
event?: Event;
};
// 推荐命令数据类型
type CommandEditorRecommendCmdData = {
action?: CommandEditorActionTypes;
target: CommandEditor;
};🎨 样式定制
编辑器生成的HTML结构支持CSS样式定制:
/* 命令样式 */
[data-type="command"] {
color: #0066cc;
font-weight: bold;
}
/* 选项样式 */
[data-type="option"] {
color: #cc6600;
}
/* 参数样式 */
[data-type="argument"] {
color: #009900;
}
/* 字符串样式 */
[data-type="string"] {
color: #cc0066;
}🔗 依赖
@istock-shell/command-parser- 命令解析器@istock-shell/util- 工具库
📄 许可证
本项目采用 Apache License 2.0 许可证。详情请参阅 LICENSE 文件。
🤝 贡献
欢迎提交 Issue 和 Pull Request 来帮助改进这个项目!
📞 支持
如果您在使用过程中遇到问题,请通过以下方式获取帮助:
- 提交 GitHub Issue
- 查看项目文档
- 联系项目维护者
0.1.1
6 months ago