CKEditor5 支持 WPS 贴贴文字图片,默认贴贴进入空白空格

简介: CKEditor5 支持 WPS 贴贴文字图片,默认贴贴进入空白空格

一、简介

  • 现在国内用 WPS 的人很多,有时候文档编辑好了,想直接贴贴到 CKEditor 编辑中,发现贴贴进去之后都是空格符号,显示空白的,无法识别内容,这个是 WPSOffice 的格式问题。
  • 想要支持 WPS 解析,那就必须要会 自定义编辑器自定义编辑器 步骤很简单并不难,然后官方提供了 Office 的解析插件 @ckeditor/ckeditor5-paste-from-office,现在只需要在这个插件的基础上加上 WPS 的解析代码,然后打包生成一个自定义编辑器,导入使用即可。

二、操作步骤

  • 按照下面调整完成之后, WPSOffice 都可以支持贴贴。
  • 在自定义编辑过程中,看项目中是否已经安装好了 @ckeditor/ckeditor5-paste-from-office,一般默认编辑器是有的,所以直接去找到 node_modules/@ckeditor/ckeditor5-paste-from-office 文件夹即可。
$ npm install --save-dev @ckeditor/ckeditor5-paste-from-office
  • 打开 ckeditor5-paste-from-office/src/filters 文件夹,调整过滤代码。


  • space.js 文件调整,这个是支持文字的。
export function normalizeSpacerunSpans( htmlDocument ) {
    htmlDocument.querySelectorAll( 'span[style*=spacerun]' ).forEach( el => {
        const innerTextLength = el.innerText.length || 0;
        el.innerHTML = Array( innerTextLength + 1 ).join( '\u00A0 ' ).substr( 0, innerTextLength );
    } );
}
  • 上面是原代码,调整为下面的代码,其实就是加了个 if 判断,其他代码没变。
export function normalizeSpacerunSpans( htmlDocument ) {
    htmlDocument.querySelectorAll( 'span[style*=spacerun]' ).forEach( el => {
        // 针对 wps 添加的判断
        if (el.childNodes[ 0 ].data) {
            const innerTextLength = el.innerText.length || 0;
            el.innerHTML = Array( innerTextLength + 1 ).join( '\u00A0 ' ).substr( 0, innerTextLength );
        }
    });
}
  • image.js 文件调整,这个是支持 WPS 图片的。
    只需要添加 if (!images) {} 这段代码放到 if (images) {} 之前即可。
function extractImageDataFromRtf( rtfData ) {
    if ( !rtfData ) {
        return [];
    }
    const regexPictureHeader = /{\\pict[\s\S]+?\\bliptag-?\d+(\\blipupi-?\d+)?({\\\*\\blipuid\s?[\da-fA-F]+)?[\s}]*?/;
    const regexPicture = new RegExp( '(?:(' + regexPictureHeader.source + '))([\\da-fA-F\\s]+)\\}', 'g' );
    const images = rtfData.match( regexPicture );
    const result = [];
    // 针对 wps 添加的判断
    if (!images) {
        regexPictureHeader = /{\\pict[\s\S]+?(\\pngblip-?\d+)?(\\wmetafile8-?\d+)?{\\\*\\blipuid\s?[\da-fA-F]+[\s}]*?/;
        regexPicture = new RegExp( '(?:(' + regexPictureHeader.source + '))([\\da-fA-F\\s]+)\\}', 'g' );
        images = rtfData.match( regexPicture );
    }
    if ( images ) {
        for ( const image of images ) {
            let imageType = false;
            if ( image.includes( '\\pngblip' ) ) {
                imageType = 'image/png';
            } else if ( image.includes( '\\jpegblip' ) ) {
                imageType = 'image/jpeg';
            }
            if ( imageType ) {
                result.push( {
                    hex: image.replace( regexPictureHeader, '' ).replace( /[^\da-fA-F]/g, '' ),
                    type: imageType
                } );
            }
         }
    }
    return result;
}


相关文章
|
开发工具 git
|
JavaScript 前端开发 测试技术
使用Selenium执行JavaScript脚本:探索Web自动化的新领域
本文介绍了如何在Selenium中使用JavaScript解决自动化测试中的复杂问题。Selenium的`execute_script`函数用于同步执行JS,例如滑动页面、操作时间控件等。在滑动操作示例中,通过JS将页面滚动到底部,点击下一页并获取页面信息。对于只读时间控件,利用JS去除readonly属性并设置新日期。使用JS扩展了Selenium的功能,提高了测试效率和精准度,适用于各种自动化测试场景。
|
存储 移动开发 前端开发
HTML基础知识:构建网页的基石
【10月更文挑战第11天】HTML基础知识:构建网页的基石
653 0
|
移动开发 资源调度 JavaScript
Vue移动端网页(H5)预览pdf文件(pdfh5和vue-pdf)
这篇文章介绍了在Vue移动端网页中使用`pdfh5`和`vue-pdf`两个插件来实现PDF文件的预览,包括滚动查看、缩放、添加水印、分页加载、跳转指定页数等功能。
8488 1
Vue移动端网页(H5)预览pdf文件(pdfh5和vue-pdf)
|
关系型数据库 MySQL 数据库
MySQL的语法涵盖了数据定义、数据操作、数据查询和数据控制等多个方面
MySQL的语法涵盖了数据定义、数据操作、数据查询和数据控制等多个方面
234 6
|
机器学习/深度学习 人工智能 自然语言处理
【人工智能】学习人工智能需要学习哪些课程,从入门到进阶到高级课程区分
基于人工智能的多学科特性和其广泛的应用领域,学习这一技术涉及从基础理论到实践应用的各个层面。入门阶段应重点掌握数学基础、编程语言学习以及数据结构和算法等。进阶阶段需要深入机器学习、深度学习以及自然语言处理等专题。高级课程则包括专业核心课程、认知心理学与神经科学基础以及计算机图形学等课程
804 1
|
存储 开发框架 JavaScript
程序与技术分享:CKEditor与CKFinder使用
程序与技术分享:CKEditor与CKFinder使用
437 0
|
JavaScript
Vue CKEditor5 自定义编辑器详细流程(插件安装使用流程)
Vue CKEditor5 自定义编辑器详细流程(插件安装使用流程)
1664 0
|
负载均衡 算法 Linux
深度解析:Linux内核调度器的演变与优化策略
【4月更文挑战第5天】 在本文中,我们将深入探讨Linux操作系统的核心组成部分——内核调度器。文章将首先回顾Linux内核调度器的发展历程,从早期的简单轮转调度(Round Robin)到现代的完全公平调度器(Completely Fair Scheduler, CFS)。接着,分析当前CFS面临的挑战以及社区提出的各种优化方案,最后提出未来可能的发展趋势和研究方向。通过本文,读者将对Linux调度器的原理、实现及其优化有一个全面的认识。
440 8