canvas-editor首行缩进

canvas-editor中渲染部分的源码都在Draw.ts里,能找到computeRowList方法中并没有实现首行缩进相关的逻辑,但是实现了element.type === ElementType.TAB的缩进,如图:canvas-editor源码-Tab缩进
因此我们可以基于tab进行首行缩进的逻辑编写,在main.ts末尾(初始化脚本内部)添加如下内容:

  // 段落首行缩进按钮const indentParagraphsDom = document.querySelector<HTMLDivElement>('.menu-item__indent-paragraphs')!indentParagraphsDom.onclick = function () {console.log('indent paragraphs')const data = instance.command.getValue()console.log('data: ', data)// 插入tab符const tabElement: IElement = {type: ElementType.TAB,value: ''}if (data && data.data && Array.isArray(data.data.main)) {const newMain = data.data.main.flatMap(item => {// 检查是否为段落(不是标题或换行符)if (typeof item === 'object' &&!item.type &&typeof item.value === 'string' &&item.value.trim() !== '' &&item.value !== '\n') {// 如果是段落,在前面插入制表符对象return [tabElement,item]}return [item]})const fixedData = { ...data.data, main: newMain }console.log('fixedData: ', fixedData)// 更新编辑器内容instance.command.executeSetValue(fixedData)}const newdata = instance.command.getValue()console.log('newdata: ', newdata)}

我们就可以用一个按钮来直接控制全文正文部分进行首行缩进
在这里插入图片描述
更进一步的,如果想要一键切换缩进/不缩进可以这样写:

// 段落首行缩进按钮
const indentParagraphsDom = document.querySelector<HTMLDivElement>('.menu-item__indent-paragraphs'
)!
indentParagraphsDom.onclick = function () {console.log('indent paragraphs')const data = instance.command.getValue()console.log('data: ', data)if (data && data.data && Array.isArray(data.data.main)) {let shouldRemoveTabs = falseconst newMain: IElement[] = []// 检查是否存在制表符shouldRemoveTabs = data.data.main.some((item, index) => item.type === ElementType.TAB && index + 1 < data.data.main.length && typeof data.data.main[index + 1] === 'object' &&!data.data.main[index + 1].type &&typeof data.data.main[index + 1].value === 'string' &&data.data.main[index + 1].value.trim() !== '' &&data.data.main[index + 1].value !== '\n')console.log('shouldRemoveTabs:', shouldRemoveTabs)for (let i = 0; i < data.data.main.length; i++) {const item = data.data.main[i]if (shouldRemoveTabs) {// 移除制表符if (item.type !== ElementType.TAB) {newMain.push(item)}} else {// 添加制表符if (typeof item === 'object' &&!item.type &&typeof item.value === 'string' &&item.value.trim() !== '' &&item.value !== '\n') {// 如果是段落,在前面添加制表符if (i === 0 || data.data.main[i-1].type !== ElementType.TAB) {newMain.push({ type: ElementType.TAB, value: '' })}}newMain.push(item)}}const fixedData = { ...data.data, main: newMain }console.log('fixedData: ', fixedData)// 更新编辑器内容instance.command.executeSetValue(fixedData)}const newdata = instance.command.getValue()console.log('newdata: ', newdata)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/457264.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GoogleChrome和Edge浏览器闪屏问题

GoogleChrome和Edge浏览器闪屏问题 文章目录 GoogleChrome和Edge浏览器闪屏问题 买了电脑半年, GoogleChrome和edge浏览器出现了一个令人头疼的问题–闪屏, 就是打开这两个浏览器之后, 就会出现电脑屏幕一闪一闪的, 过一会就看不见了, 跟黑夜里的闪电一样, 遇到这种情况我都会直…

《 C++ 修炼全景指南:十七 》彻底攻克图论!轻松解锁最短路径、生成树与高效图算法

摘要 1、引言 1.1、什么是图&#xff1f; 图&#xff08;Graph&#xff09;是计算机科学和离散数学中一种重要的数据结构&#xff0c;用来表示一组对象之间的关系。一个图由顶点&#xff08;也称为节点&#xff0c;Vertex&#xff09;和边&#xff08;Edge&#xff09;组成。…

【Python爬虫实战】Selenium自动化网页操作入门指南

#1024程序员节&#xff5c;征文# &#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、准备工作 &#xff08;一&#xff09;安装 Selenium 库 &#xff0…

VMware Workstation Pro 16 搭建 android-x86过程问题罗列

1、搭建完成后&#xff0c;app安装显示软件包解析失败或app打开闪退 测试了android-x86_64-9.0-r2这个版本&#xff0c;发现按照网上部署arm库方法没有成功&#xff0c;最后使用android-x86-7.1-r5版本解决了问题 2、android-x86网络连接不通 虚拟机网络设置选择桥接模式 安…

低代码平台如何通过AI赋能,实现更智能的业务自动化?

引言 随着数字化转型的加速推进&#xff0c;企业在日常运营中面临的业务复杂性与日俱增。如何快速响应市场需求&#xff0c;优化流程&#xff0c;并降低开发成本&#xff0c;成为各行业共同关注的核心问题。低代码平台作为一种能够快速构建应用程序的工具&#xff0c;因其可视化…

Springboot 使用EasyExcel导出Excel文件

Springboot 使用EasyExcel导出Excel文件 Excel导出系列目录&#xff1a;引入依赖创建导出模板类创建图片转化器 逻辑处理controllerservice 导出效果遗留问题 Excel导出系列目录&#xff1a; 【Springboot 使用EasyExcel导出Excel文件】 【Springboot 使用POI导出Excel文件】 …

如何提高游戏的游戏性

改进游戏玩法是一个动态的过程&#xff0c;需要深入了解是什么让玩家保持参与、挑战和兴奋&#xff0c;以获得更多。优秀游戏的核心是平衡——乐趣和难度的无缝结合&#xff0c;让玩家在不感到沮丧的情况下为自己的技能感到奖励。微调这种平衡通常涉及调整难度曲线&#xff0c;…

HTML+JavaScript案例分享: 打造经典俄罗斯方块,详解实现全过程

在本文中,我们将深入探讨如何使用 JavaScript 实现经典的俄罗斯方块游戏。俄罗斯方块是一款广为人知的益智游戏,通过操纵各种形状的方块,使其在游戏区域内排列整齐,以消除完整的行来获得分数。 效果图如下: 一、游戏界面与布局 我们首先使用 HTML 和 CSS 来创建游戏的界面…

力扣283-- 移动零

开始做梦的地方 力扣283 &#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 何解&#xff1f; 1&#xff0c;暴力枚举&#xff1a…

Vue前端开发2.2 数据绑定

文章目录 一、初识数据绑定&#xff08;一&#xff09;数据绑定概述&#xff08;二&#xff09;数据绑定构成1、定义数据2、输出数据 &#xff08;三&#xff09;数据绑定案例演示1、创建单文件组件2、切换页面显示组件 &#xff08;四&#xff09;将Vue引入HTML页面中1、概述2…

高效文本编辑与导航:Vim中的三种基本模式及粘滞位的深度解析

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

sheng的学习笔记-AI基础-正确率/召回率/F1指标/ROC曲线

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 分类准确度问题 假设有一个癌症预测系统&#xff0c;输入体检信息&#xff0c;可以判断是否有癌症。如果癌症产生的概率只有0.1%&#xff0c;那么系统预测所有人都是健康&#xff0c;即可达到99.9%的准确率。 但显然这样的…

Linux中级(DNS域名解析服务器)

一。产生原因1.IP地址&#xff1a;是互联网上计算机唯一的逻辑地址&#xff0c;通过IP地址实现不同计算机之间的相互通信&#xff0c;每台联网计算机都需要通过IP地址来互相联系和分别&#xff0c;但由于IP地址是由一串容易混淆的数字串构成&#xff0c;人们很难记忆所有计算机…

MySql中的锁的分类

锁的分类 MySQL锁可以按模式分类为&#xff1a;乐观锁与悲观锁。按粒度分可以分为全局锁、表级锁、页级锁、行级锁。按属性可以分为&#xff1a;共享锁、排它锁。按状态分为&#xff1a;意向共享锁、意向排它锁。按算法分为&#xff1a;间隙锁、临键锁、记录锁。 二、全局锁、表…

3-petalinux2018.3 摸索记录 - 命令驱动 _ 交叉编译链

一、命令行控制GPIO 对于ps端设备&#xff0c;在板卡的linux系统中&#xff0c;切换到/sys/class/gpio路径下可以看到目前挂载的gpio设备。 export&#xff1a; 导入用户空间 gpiochip&#xff1a; 系统中gpio寄存器信息 unexport&#xff1a; 移除用户空间 以MIO40和MIO42…

数据结构------手撕链表(一)【不带头单向非循环】

文章目录 链表概念链表的使用LinkedList 的几种遍历方式单链表的模拟实现&#xff08;不带头&#xff09;链表面试题 观察ArrayList 顺序表的源码发现&#xff0c;底层是使用数组实现的。由于其底层是一段连续空间&#xff0c;当在ArrayList任意位置插入或者删除元素时&#xf…

Java基础(7)图书管理系统

目录 1.前言 2.正文 2.1思路 2.2Book包 2.3people包 2.4operation包 2.5主函数 3.小结 1.前言 哈喽大家好吖&#xff0c;今天来给前面Java基础的学习来一个基础的实战&#xff0c;做一个简单的图书管理系统&#xff0c;这里边综合利用了我们之前学习到的类和对象&…

研发运营一体化(DevOps)能力成熟度模型

目录 应用设计 安全风险管理 技术运 持续交付 敏捷开发管理 基于微服务的端到端持续交付流水线案例 应用设计 安全风险管理 技术运 持续交付

Android调用系统相机录像并设置参数

最近要做一个 Android上的录像功能&#xff0c;由于之前做拍照功能完全是用自定义方式&#xff0c;太麻烦。故这次决定直接调用系统相机来录像。 一、添加权限 首先&#xff0c;添加必要的权限 <!-- 授予该程序使用摄像头的权限 --><uses-permission android:name&q…

Could not find artifact cn.hutool:hutool-all:jar:8.1 in central 导入Hutool报错

<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.9</version></dependency> 引入hutool 8.1版本的工具…