一、需求
在项目开发的过程中,发布文章的时候会需要从word复制到富文本编辑中并发布。这时候就需要从word复制过来的时候保持原有格式与样式,该居中的居中,该加粗的加粗。
二、选择tinymce的原因
对比与市场上的很多其他富文本编辑器,tinymce是唯一一个从word复制过来的时候基本保持原有样式的富文本,符合我在项目开发中的需求。
三、实现
3.1安装vue-cli3
如果本身安装有vue-cli2,则需要先卸载再安装,步骤如下
3.1.1卸载vue-cli 2.0+
npm uninstall vue-cli -g
3.2.2安装vue-cli3
npm i -g @vue/cli
3.2.3创建项目
vue create vue-tinymce(项目名称)
3.2 tinymce的使用步骤
3.2.1.下载tinymce
npm i tinymce -S
3.2.2下载tinymce-vue
npm install @tinymce/tinymce-vue -S
3.2.3 package.json 图示
3.3tinymce汉化
3.3.1下载汉化包
下载地址:https://www.tiny.cloud/get-tiny/language-packages/
图示:
3.3.2设置TinyMCE的界面语言,tiny默认是英文的,要变中文需要下载汉化包放到指定目录内,然后使用该配置:
language:'zh_CN'
3.4使用以及配置tinymce
3.4.1在node-modules中tinymce的skins文件夹以及语言包langs复制到public的文件夹下面
3.4.2在vue中使用,封装成组件tinymce.vue
复制代码
<template>
<div class="tinymce-editor">
<editor v-model="editorContent"
:init="init">
</editor>
</div>
</template>
<script>
import tinymce from 'tinymce/tinymce'
import Editor from '@tinymce/tinymce-vue'
import 'tinymce/themes/silver/theme'
//插件plugins
import 'tinymce/plugins/image'// 插入上传图片插件
import 'tinymce/plugins/table'// 插入表格插件
import 'tinymce/plugins/lists'// 列表插件
import "tinymce/icons/default/icons.js";
export default {
components: {
Editor
},
props: {
value: {
type: String,
default: ''
},
plugins: {
type: [String, Array],
default: 'lists image table powerpaste',
},
toolbar: {
type: [String, Array],
default: 'undo redo | formatselect | fontsizeselect | fontselect | bold italic forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | lists image table | removeformat'
}
},
data () {
return {
init: {
language_url: `/tinymce/langs/zh_CN.js`,//引入语言包
language: 'zh_CN',
skin_url: `/tinymce/skins/ui/oxide`,
content_css: `/tinymce/skins/content/default/content.css`,
height: 500,
plugins: this.plugins,
toolbar: this.toolbar,
fontsize_formats: "8px 10px 12px 14px 16px 18px 20px 22px 24px 26px 28px 30px 32px 34px 36px",
branding: false,
menubar: false,
paste_data_images: false,
content_style: `
* { padding:0; margin:0; }
html, body { height:100%; }
img { max-width:100%; display:block;height:auto; }
a { text-decoration: none; }
iframe { width: 100%; }
p { line-height:1.6; margin: 0px; }
table { word-wrap:break-word; word-break:break-all; max-width:100%; border:none; border-color:#999; }
.mce-object-iframe { width:100%; box-sizing:border-box; margin:0; padding:0; }
ul,ol { list-style-position:inside; }
`,
// 图片上传配置
images_upload_handler: function (blobInfo, success, failure){
let formData = new FormData();
formData.append('file',blobInfo.blob());
//可自己写上传图片的方法
},
},
editorContent: this.value
}
},
mounted () {
},
methods: {
},
watch: {
value (newValue) {
this.editorContent= newValue;
},
editorContent (newValue) {
this.$emit('input', newValue);
}
}
}
</script>
<style>
</style>
复制代码
3.5 powerpaste的使用
3.5.1下载powerpaste
想要从word复制粘贴过来的文本基本保持原本格式,我下载了大佬提供的powerpaste插件。这个插件在官网上是需要月付费的,我太穷了QAQ花不起这钱,百度网盘分享给大家powerpaste的压缩包,因为在项目
中使用的tinymce的版本是5.0+,所以我使用的是4.0+版本的powerpaste,网盘链接以及提取码分享给大家:
链接:https://pan.baidu.com/s/1zzRGFVXNWiaMaNppIMFRtw 提取码:qsls
下载完之后将其解压方法public文件夹下面的tinymce文件中
3.5.2在tinymce的配置中添加
复制代码
//添加额外的插件
external_plugins: {
'powerpaste': `/tinymce/powerpaste/plugin.min.js`//${this.baseUrl}
},
powerpaste_word_import: 'merge',// 参数:propmt, merge, clear
powerpaste_html_import: 'merge',// propmt, merge, clear
powerpaste_allow_local_images: false,//粘贴图片
复制代码
3.6引入使用,新建另外的组件Home.vue
复制代码
<template>
<div class="home">
<tinymce-editor ref="editor"
v-model="content"
:language="language"
:skin="skin"
@input="getInput"
>
</tinymce-editor>
<div v-html="content"></div>
</div>
</template>
<script>
import TinymceEditor from '@/components/tinymce/tinymce';
export default {
name: 'Home',
data(){
return {
language: 'zh_CN',
skin: 'oxide',
content:''
}
},
components: {
TinymceEditor
},
methods:{
getInput(input){
this.content = input;
}
}
}
</script>
复制代码
3.7使用效果
3.7.1复制的word文本(部分图)
3.7.2复制到tinymce富文本编辑中的时候的样式(基本保持一致)
3.7.3获取到的富文本编辑器的内容显示的时候(样式也基本一致),只有个别有丢失的现象,稍微改动下就可以了
最后附上github地址
https://github.com/Eternal0101/vue-tinymce
就是一个单纯的小白,有很多不足的地方忘指正。第一次写博客QAQ
后续会补上使用tinymce的时候踩到的坑QAQ
奥利给!!
有话要说