当前位置: 首页 > article >正文

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 = false
    const 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.kler.cn/news/366794.html

相关文章:

  • 【Linux学习】(5)软件包管理器yum|编辑器vim
  • OPPO携手比亚迪共同探索手机与汽车互融新时代
  • GPT打数模——电商品类货量预测及品类分仓规划
  • 文件下载漏洞
  • 【南方科技大学】CS315 Computer Security 【Lab6 IoT Security and Wireless Exploitation】
  • 华为HCIE-OpenEuler认证详解
  • Python爬虫,初识xpath(1)
  • leetcode day1 910+16
  • 【文献及模型、制图分享】长江中游经济区“水—能源—粮食”系统与城市绿色转型适配性研究
  • java中常见集合,非常重要!!!
  • 基于SSM农业信息管理系统的设计
  • LeetCode Hot 100:回溯
  • 基于微信小程序的智能社区服务管理系统
  • 阻塞队列——Java
  • SQL SERVER 2005/2008/2012/2016/2020 数据库状态为“可疑”的解决方法(亲测可用)
  • LeetCode - #127 单词接龙
  • 在 MySQL 中,添加索引后,插入、更新和删除操作的性能通常会变慢的原因
  • 2.插入排序(斗地主起牌)
  • 强化学习数学原理学习(一)
  • golang开发alertmanagerWebhook,实现prometheus+alertmanagerWebhook告警
  • 1.Linux按键驱动
  • AI绘画开源王者归来,Stable Diffusion 3.5 AI绘画模型开源发布
  • 矩阵的可解性:关于Ax=b的研究
  • WeakHashMap详解
  • 谷粒商城の订单服务分布式事务
  • 京准电钟:NTP网络授时服务器应用航管自控系统