热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

angular2+tinymce+prism富文本编辑器(多图上传,代码高亮)

文章目录背景参考地址版本使用安装步骤插件自定义上传文件(配置信息)汉化(配置信息)自动调整高度(配置信息)代码块配置信息问题:页面展示中没有代码高亮地址问题发现解决方案(使用pri

文章目录

  • 背景
  • 参考地址
  • 版本
  • 使用
    • 安装步骤
    • 插件
      • 自定义上传文件(配置信息)
      • 汉化(配置信息)
      • 自动调整高度(配置信息)
      • 代码块
        • 配置信息
        • 问题: 页面展示中没有代码高亮
          • 地址
          • 问题发现
        • 解决方案(使用prism)
          • 客官可以自行选择需要的主题
          • 选择需要的语言
          • index.html添加引用
          • 函数
      • 多图上传(第三方插件,非官方插件使用方案)
        • 配置信息
        • 问题: 怎么使用第三方插件
        • 解决方案
          • 下载tinymce到本地
          • 配置index.html
        • 问题: upfiles.html 出现iframe跨域
        • 解决方案
          • 修改axupimgs中的plugin.min.js文件
          • 将 axupimgs文件夹下的loading.gif和upfiles.html都放到项目中
        • 汉化(方案2: 使用自定义tinymce.js地址)
          • 配置信息
背景

笔者项目原先使用的是百度的ueditor编辑器,由于没有了维护,并且在原基础上改造的成本大,于是考虑更换新的编辑器
而对于新的编辑器选择,笔者考虑以下几点

  • 是否持续更新,在网上有很多开源项目,有些属于个人,有些属于组织,在选择时,笔者都会去看最近一次更新的时间,以及github上issue的数量,从而来判断是否还在更新中
  • 是否提供自定义图片上传功能,很多开源的富文本项目都不提供自定义的上传文件功能,当然,对于普通的上传,大部分项目都是支持的,只是笔者的文件都是放在了阿里云的oss中,在上传时并不想经过自己的服务器,再经由服务器上传到oss中(这不是浪费io嘛)
    最终我选择了tinymce,理由如下:
  • 配置简单
  • 支持框架(vue\angular\react)
  • 已商业化(也就是说会一直更新,并且他也有提供免费功能,已经足够笔者使用)
参考地址

致谢!!
官方文档,可自行翻译
第三方翻译的中文说明文档

版本
名称版本号
angular8+
tinymce5.1.5
使用

安装步骤

英文说明: https://www.tiny.cloud/docs/integrations/angular/

  • 安装tinymce-angular包,并保存到你package.json用–save

npm install --save @tinymce/tinymce-angular

  • 在app.module.ts加入EditorModule,以下为示例

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { EditorModule } from '@tinymce/tinymce-angular';
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
EditorModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }

  • 使用示例

<editor
id="oneweek-editor"
initialValue="

This is the initial content of the editor

"
[init]="{
height: 500,
menubar: false,
plugins: [
'advlist autolink lists link image charmap print preview anchor',
'searchreplace visualblocks code fullscreen',
'insertdatetime media table paste code help wordcount'
],
toolbar:
'undo redo | formatselect | bold italic backcolor | \ alignleft aligncenter alignright alignjustify | \ bullist numlist outdent indent | removeformat | help'
}"
>
</editor>

运行项目则可在对应路由看到编辑器

插件

自定义上传文件(配置信息)

{
// editor便签的id为oneweek-editor
selector: '#oneweek-editor',
// plugins是tinymce的各种插件
plugins: 'link lists image code table colorpicker textcolor wordcount contextmenu codesample',
// 自定义上传文件
images_upload_handler: (blobInfo, success, failure) => {
// blobInfo.blob()为file, blobInfo.blob().name为文件名称,调用成功后需要回调success(文件名称),向页面传递图片信息,如果失败了需要回调failure(失败信息)
console.log('上传图片啦');
},
// toolbar定义快捷栏的操作, | 用来分隔显示
toolbar: 'image | codesample | bullist numlist | bold italic underline strikethrough | alignleft'
+ ' aligncenter alignright alignjustify | undo redo',
// 这里是代码块的一些语言选择,好像暂时还没支持typescript
codesample_languages: [
{ text: 'Python', value: 'python'},
{ text: 'HTML/XML', value: 'markup'},
{ text: 'Javascript', value: 'Javascript'},
{ text: 'CSS', value: 'css'},
{ text: 'Java', value: 'java'}
],
// 高度
height: 600
}

汉化(配置信息)

{
selector: '#oneweek-editor',
// plugins是tinymce的各种插件
plugins: 'link lists image code table colorpicker textcolor wordcount contextmenu codesample',
// 语言包可以使用tinymce提供的网址,但是墙的原因,会连不上/网速慢,所以还是自行下载,下载地址:https://www.tiny.cloud/get-tiny/language-packages/
language_url: 'zh_CN.js的地址:如http://xxx/zh_CN.js',
language: 'zh_CN',
images_upload_handler: (blobInfo, success, failure) => {
// blobInfo.blob()为file, blobInfo.blob().name为文件名称,调用成功后需要回调success(文件名称),向页面传递图片信息,如果失败了需要回调failure(失败信息)
console.log('上传图片啦');
},
// toolbar定义快捷栏的操作, | 用来分隔显示
toolbar: 'image | codesample | bullist numlist | bold italic underline strikethrough | alignleft'
+ ' aligncenter alignright alignjustify | undo redo',
// 这里是代码块的一些语言选择,好像暂时还没支持typescript
codesample_languages: [
{ text: 'Python', value: 'python'},
{ text: 'HTML/XML', value: 'markup'},
{ text: 'Javascript', value: 'Javascript'},
{ text: 'CSS', value: 'css'},
{ text: 'Java', value: 'java'}
],
// 高度
height: 600,
}

自动调整高度(配置信息)

{
selector: '#oneweek-editor',
// plugins是tinymce的各种插件
plugins: 'link lists image code table colorpicker textcolor wordcount contextmenu codesample autosize',
// 语言包可以使用tinymce提供的网址,但是墙的原因,会连不上/网速慢,所以还是自行下载,下载地址:https://www.tiny.cloud/get-tiny/language-packages/
language_url: 'zh_CN.js的地址',
language: 'zh_CN',
images_upload_handler: (blobInfo, success, failure) => {
// blobInfo.blob()为file, blobInfo.blob().name为文件名称,调用成功后需要回调success(文件名称),向页面传递图片信息,如果失败了需要回调failure(失败信息)
console.log('上传图片啦');
},
// toolbar定义快捷栏的操作, | 用来分隔显示
toolbar: 'image | codesample | bullist numlist | bold italic underline strikethrough | alignleft'
+ ' aligncenter alignright alignjustify | undo redo',
// 这里是代码块的一些语言选择,好像暂时还没支持typescript
codesample_languages: [
{ text: 'Python', value: 'python'},
{ text: 'HTML/XML', value: 'markup'},
{ text: 'Javascript', value: 'Javascript'},
{ text: 'CSS', value: 'css'},
{ text: 'Java', value: 'java'}
],
autoresize_on_init: false,
// 最小高度
min_height: 350,
// 最大高度
max_height: 650
}

代码块

配置信息

{
selector: '#oneweek-editor',
// plugins是tinymce的各种插件
plugins: 'link lists image code table colorpicker textcolor wordcount contextmenu codesample autosize',
// 语言包可以使用tinymce提供的网址,但是墙的原因,会连不上/网速慢,所以还是自行下载,下载地址:https://www.tiny.cloud/get-tiny/language-packages/
language_url: 'zh_CN.js的地址',
language: 'zh_CN',
images_upload_handler: (blobInfo, success, failure) => {
// blobInfo.blob()为file, blobInfo.blob().name为文件名称,调用成功后需要回调success(文件名称),向页面传递图片信息,如果失败了需要回调failure(失败信息)
console.log('上传图片啦');
},
// toolbar定义快捷栏的操作, | 用来分隔显示
toolbar: 'image | codesample | bullist numlist | bold italic underline strikethrough | alignleft'
+ ' aligncenter alignright alignjustify | undo redo',
// 这里是代码块的一些语言选择,好像暂时还没支持typescript
codesample_languages: [
{ text: 'Python', value: 'python'},
{ text: 'HTML/XML', value: 'markup'},
{ text: 'Javascript', value: 'Javascript'},
{ text: 'CSS', value: 'css'},
{ text: 'Java', value: 'java'}
],
autoresize_on_init: false,
// 最小高度
min_height: 350,
// 最大高度
max_height: 650
}

问题: 页面展示中没有代码高亮

地址

官网-代码插件说明
prism官网地址

问题发现

在编辑器中编辑了代码后,可以看到代码是有高亮显示的,但是展示在页面(节点代码如下)是却没有高亮

<div class="text-content" [innerHTML]="content"></div>

查阅官网才知道,语法突出还需要使用prism,果然是个坑
《angular2+tinymce+prism 富文本编辑器(多图上传,代码高亮)》

解决方案(使用prism)

进入到prism官网

客官可以自行选择需要的主题

《angular2+tinymce+prism 富文本编辑器(多图上传,代码高亮)》
选中主题后可以如下看到对应的样式
《angular2+tinymce+prism 富文本编辑器(多图上传,代码高亮)》

选择需要的语言

笔者使用了python,java,相应的在页面勾选
《angular2+tinymce+prism 富文本编辑器(多图上传,代码高亮)》
勾选完成后,将页面拉到最下方,也就是查看主题预览的地方,将js和css都下载下来
《angular2+tinymce+prism 富文本编辑器(多图上传,代码高亮)》
下载完成后放到自己项目中,也可以放到第三方空间(如阿里云的oss,第三方文件托管平台,只要能在项目中访问到即可)

index.html添加引用

在index.html中加入对tinymce.min.js的引用

<link rel="stylesheet" type="text/css" href="prism.css地址">
<script type="text/Javascript" src="prism.js地址"></script>

若放在自己的项目中,还需要在angular.json中,加入对prism.css和prism.js的引入

"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/course",
"index": "src/index.html",
"main": "src/main.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "src/tsconfig.app.json",
"assets": [
"prism.css地址,如src/assets/prism/prism.css",
"prism.js地址,如src/assets/prism/prism.js"
// 所示prism.js和prism.css放在同一个文件夹,则可以直接引入文件夹
// "prism文件夹地址,如src/assets/prism"
],

函数

highlight() {
const elementList = document.getElementsByTagName('pre');
if (elementList && elementList.length > 0) {
for (let i = 0; i < elementList.length; i++) {
Prism.highlightElement(elementList[i]);
}
}
}

多图上传(第三方插件,非官方插件使用方案)

由于tinymce官方并没有提供多图上传的功能,所以只能自己开发或者依赖于第三方开发者
在上文提供的文档中的中文文档地址中,无私的贡献者,为我们提供了更多插件 -> 图片批量上传, 此为使用说明地址

配置信息

{
selector: '#oneweek-editor',
// plugins是tinymce的各种插件
plugins: 'link lists image code table colorpicker textcolor wordcount contextmenu codesample autosize axupimgs',
// 语言包可以使用tinymce提供的网址,但是墙的原因,会连不上/网速慢,所以还是自行下载,下载地址:https://www.tiny.cloud/get-tiny/language-packages/
language_url: 'zh_CN.js的地址',
language: 'zh_CN',
images_upload_handler: (blobInfo, success, failure) => {
// blobInfo.blob()为file, blobInfo.blob().name为文件名称,调用成功后需要回调success(文件名称),向页面传递图片信息,如果失败了需要回调failure(失败信息)
console.log('上传图片啦');
},
// toolbar定义快捷栏的操作, | 用来分隔显示
toolbar: 'image axupimgs | codesample | bullist numlist | bold italic underline strikethrough | alignleft'
+ ' aligncenter alignright alignjustify | undo redo',
// 这里是代码块的一些语言选择,好像暂时还没支持typescript
codesample_languages: [
{ text: 'Python', value: 'python'},
{ text: 'HTML/XML', value: 'markup'},
{ text: 'Javascript', value: 'Javascript'},
{ text: 'CSS', value: 'css'},
{ text: 'Java', value: 'java'}
],
autoresize_on_init: false,
// 最小高度
min_height: 350,
// 最大高度
max_height: 650
}

问题: 怎么使用第三方插件

使用说明截图如下:
《angular2+tinymce+prism 富文本编辑器(多图上传,代码高亮)》
说明中指明,要将zip下载后放置到tinymce主目录下的plugins文件夹内,此时就出现一个问题:angular安装的tinymce使用地址默认是官方地址,也没有在配置中提供使用自己的地址的参数,怎么放第三方插件

解决方案

下载tinymce到本地

下载地址
在官网上下载tinymce包,下载完成后解压到自己项目中,也可以放到第三方空间(如阿里云的oss,第三方文件托管平台,只要能在项目中访问到即可),再将下载到的axupimgs.zip解压,将解压得到的axupimgs整个文件夹都挪到tinymce文件夹下的plugins文件夹下即可

  • tinymce
    • plugins
      • axupimgs
配置index.html

在index.html中加入对tinymce.min.js的引用

<script type="text/Javascript" src="tinymce.min.js地址"></script>

若放在自己的项目中,还需要在angular.json中,加入对tinymce.min.js的引入

"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/course",
"index": "src/index.html",
"main": "src/main.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "src/tsconfig.app.json",
"assets": [
"tinymce.min.js的地址,如src/assets/tinymce.min.js"
],

启动项目,可以看到
《angular2+tinymce+prism 富文本编辑器(多图上传,代码高亮)》
点击多图上传,会出现如下窗口,并且在console控制台中不会报错,功能都能正常使用
《angular2+tinymce+prism 富文本编辑器(多图上传,代码高亮)》

问题: upfiles.html 出现iframe跨域

如果你的tinymce文件夹不是放在项目中,而是托管到第三方平台,如阿里云的oss,在点击多图上传时,在console中会打印跨域问题,并且你也无法在多图上传的窗口中进行操作
这是因为第三方开发者在编写程序时,使用的iframe嵌套,而此刻我们的项目和tinymce地址不同,出现了跨域

解决方案

修改axupimgs中的plugin.min.js文件

var baseURL=tinymce.baseURL;
var iframe1 = baseURL+'/plugins/axupimgs/upfiles.html';

改为

var baseURL = document.location.protocol + '//' + document.location.host;
var iframe1 = baseURL + '/assets/plugins/axupimgs/upfiles.html';

将 axupimgs文件夹下的loading.gif和upfiles.html都放到项目中

将axupimgs文件夹下的loading.gif和upfiles.html都放到项目的assets文件夹下,结构如下:
src

  • assets
    • plugins
    • axupimgs
      • upfiles.html
      • loading.gif
        在angular.json文件中加入axupimgs文件夹:

"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/course",
"index": "src/index.html",
"main": "src/main.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "src/tsconfig.app.json",
"assets": [
"src/assets/plugins/axupimgs"
],

重新启动项目,即可正常使用多图上传

汉化(方案2: 使用自定义tinymce.js地址)

在index.html中加入了tinymce.js地址后,汉化就可以不使用language_url参数,而是将语言文件zh_CN.js放到tinymce文件夹下的langs下,结构如下所示
tinymce

  • langs
    • zh_CN.js
配置信息

{
selector: '#oneweek-editor',
// plugins是tinymce的各种插件
plugins: 'link lists image code table colorpicker textcolor wordcount contextmenu codesample autosize axupimgs',
language: 'zh_CN',
images_upload_handler: (blobInfo, success, failure) => {
// blobInfo.blob()为file, blobInfo.blob().name为文件名称,调用成功后需要回调success(文件名称),向页面传递图片信息,如果失败了需要回调failure(失败信息)
console.log('上传图片啦');
},
// toolbar定义快捷栏的操作, | 用来分隔显示
toolbar: 'image axupimgs | codesample | bullist numlist | bold italic underline strikethrough | alignleft'
+ ' aligncenter alignright alignjustify | undo redo',
// 这里是代码块的一些语言选择,好像暂时还没支持typescript
codesample_languages: [
{ text: 'Python', value: 'python'},
{ text: 'HTML/XML', value: 'markup'},
{ text: 'Javascript', value: 'Javascript'},
{ text: 'CSS', value: 'css'},
{ text: 'Java', value: 'java'}
],
autoresize_on_init: false,
// 最小高度
min_height: 350,
// 最大高度
max_height: 650
}

推荐阅读
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
author-avatar
蚊子爱的
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有