thinkphp集成editormd一系列实战
介绍
最近php搞了个博客,需要集成markdown编辑器(富文本的太low了,效率也低),用的是时下比较火的editormd,除了基本的文档编辑我这里还实现了几个自己的需求:
- 使用ctrl-v实现将图片粘贴到markdown编辑器
- 实现前台复制代码(
有需要的找我要)
效果展示
- 编辑器

- 前台展示

后台集成
引入资源
<!-- editormd-->
<link href="__STATIC__/common/plugin/editormd/css/editormd.min.css" rel="stylesheet">
<script src="__STATIC__/common/plugin/editormd/editormd.min.js"></script>
<script src="__STATIC__/common/plugin/editormd/plugins/image-handle-paste/uploadPasteImg.js"></script>
<script src="__STATIC__/common/plugin/webuploader/webuploader.min.js"></script>
编写DOM
<div class="form-group">
<label for="" class="col-sm-2 control-label">文章内容</label>
<div class="col-sm-9">
<div id="editor1">
<textarea name="arc_content"></textarea>
</div>
</div>
</div>
初始化编辑器
// 初始化编辑器
$(function() {
var editor = editormd("editor1", {
width: "100%",
height: 740,
path: "__STATIC__/common/plugin/editormd/lib/",
//theme : "dark",
//previewTheme : "dark",
//editorTheme : "pastel-on-dark",
codeFold : true,
fullscreen: false,
//syncScrolling : false,
saveHTMLToTextarea : true, // 保存 HTML 到 Textarea
//searchReplace : true,
watch : false, // 关闭实时预览
//htmlDecode : "style,script,iframe|on*", // 开启 HTML 标签解析,为了安全性,默认不开启
//toolbar : false, //关闭工具栏
//previewCodeHighlight : false, // 关闭预览 HTML 的代码块高亮,默认开启
emoji : true,
taskList : true,
tocm : true, // Using [TOCM]
lineNumbers : false,
//tex : true, // 开启科学公式TeX语言支持,默认关闭
//flowChart : true, // 开启流程图支持,默认关闭
//sequenceDiagram : true, // 开启时序/序列图支持,默认关闭,
//dialogLockScreen : false, // 设置弹出层对话框不锁屏,全局通用,默认为true
//dialogShowMask : false, // 设置弹出层对话框显示透明遮罩层,全局通用,默认为true
//dialogDraggable : false, // 设置弹出层对话框不可拖动,全局通用,默认为true
//dialogMaskOpacity : 0.4, // 设置透明遮罩层的透明度,全局通用,默认值为0.1
//dialogMaskBgColor : "#000", // 设置透明遮罩层的背景颜色,全局通用,默认为#fff
imageUpload : true,
imageFormats : ["jpg","gif", "png"],
imageUploadURL : "/system/component/uploadMDImg",
onload : function() {
//console.log('onload', this);
//this.fullscreen();
//this.unwantch();
//this.watch().fullscreen();
//this.setMarkdown("#PHP");
//this.width("100%");
//this.height(480);
//this.resize("100%", 640);
//this.setMarkdow()
// 初始化粘贴图片插件
initPasteDragImg(this);
}
});
});
图片上传接口
//Markdown上传图片
public function uploadMDImg(){
if(request()->isPost()){
$file = request()->file('editormd-image-file');
$info = $file->move( ROOT_PATH . 'public' . DS . 'uploads' );
if($info){
$saved_name = '/uploads/' . str_replace("\\","/",$info->getSaveName());
//$value=config('uploadFiles').'/knowledge/'.$info->getSaveName();
return json(['url'=>$saved_name,'success'=>1,'message'=>'图片上传成功!']);
}
else{
echo $file->getError();
}
}else{
$this->error('非法请求');
}
}
前台展示
引入资源
<link rel="stylesheet" href="__STATIC__/common/plugin/editormd/css/editormd.min.css" />
<link rel="stylesheet" type="text/css" href="__STATIC__/common/plugin/editormd/css/editormd.preview.min.css"/>
<!--markdown-->
<script src="__STATIC__/common/plugin/editormd/editormd.min.js" type="text/javascript" charset="utf-8"></script>
<script src="__STATIC__/common/plugin/editormd/lib/marked.min.js" type="text/javascript" charset="utf-8"></script>
<script src="__STATIC__/common/plugin/editormd/lib/prettify.min.js" type="text/javascript" charset="utf-8"></script>
<script src="__STATIC__/common/js/clipboard.min.js" type="text/javascript" charset="utf-8"></script>
编写DOM
<div id="editmd" class="post-content" >
<!-- textarea 加载testEditor.getMarkdown()的内容 -->
<textarea id="content" style="display:none;" name="content">{$articleData['arc_content']}</textarea>
</div>
初始化文章内容
var Editor;
//markdownToHTML 将markdown文本转换为HTML
Editor = editormd.markdownToHTML("editmd", {
htmlDecode : "style,script,iframe", // you can filter tags decode
markdown : $("#content").text() ,//+ "\r\n" + $("#append-test").text(),
//htmlDecode : true, // 开启 HTML 标签解析,为了安全性,默认不开启
htmlDecode : "style,script,iframe", // you can filter tags decode
//toc : false,
tocm : true, // Using [TOCM]
//tocContainer : "#custom-toc-container", // 自定义 ToC 容器层
//gfm : false,
//tocDropdown : true,
// markdownSourceCode : true, // 是否保留 Markdown 源码,即是否删除保存源码的 Textarea 标签
path: "__STATIC__/common/plugin/editormd/lib/",
lineNumbers : false,
emoji : true,
taskList : true,
tocm : true //对目录解析
});
thinkphp集成editormd一系列实战的更多相关文章
- 【网站支付PHP篇】thinkPHP集成汇潮支付(ecpss)
系列目录 支付宝集成:http://www.cnblogs.com/nerve/p/3437879.html 系列说明 最近在帮朋友的系统安装支付模块(兑换网站积分),现在总结一些开发心得,希望对大家 ...
- 【网站支付PHP篇】thinkPHP集成支付宝支付(担保交易)
目录 系列说明 开发环境 部署支付宝 支付请求 支付宝返回处理 系列说明 最近在帮朋友的系统安装支付模块(兑换网站积分),现在总结一些开发心得,希望对大家有用.这个系列会讲以下第三方支付平台的集成: ...
- SpringBoot集成Kafka的实战用法大全
本文是SpringBoot+Kafka的实战讲解,如果对kafka的架构原理还不了解的读者,建议先看一下<大白话kafka架构原理>.<秒懂kafka HA(高可用)>两篇文章 ...
- springboot集成rabbitmq(实战)
RabbitMQ简介RabbitMQ使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现(AMQP的主要特征是面向消息.队列.路由.可靠性.安全).支持多种客户端,如:Python.Ru ...
- ThinkPHP集成万象优图
项目原因 不告诉你,反正需要把腾讯云的万象优图整合进来. 下载PHP版的万象优图的SDK 下载地址:https://github.com/tencentyun/image-php-sdk git cl ...
- thinkphp 集成 twig模版引擎
下载地址:https://github.com/fucongcong/ThinkPHPLevel/archive/master.zip 控制器格式为: <?php namespace Home\ ...
- Apache Hudi集成Apache Zeppelin实战
1. 简介 Apache Zeppelin 是一个提供交互数据分析且基于Web的笔记本.方便你做出可数据驱动的.可交互且可协作的精美文档,并且支持多种语言,包括 Scala(使用 Apache Spa ...
- MyBatis初级实战之一:Spring Boot集成
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Python接口测试实战5(上) - Git及Jenkins持续集成
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- Apworks框架实战
Apworks框架实战(一):Apworks到底是什么? Apworks框架实战(二):开始使用 Apworks框架实战(三):单元测试与持续集成 Apworks框架实战(四):使用Visual St ...
随机推荐
- Laravel - 解决 $.ajax success 返回的数据为空的问题 (后台为laravel)
原因之一 : 后台 dump()打印 , 去掉或者注释就好了
- Python学习之十四_Python连接各种数据库的方法(DM,oscar,Oracle,SQLSERVER,MYSQL,PG,Kingbase
Python学习之十四_Python连接各种数据库的方法(DM,oscar,Oracle,SQLSERVER,MYSQL,PG,Kingbase) 前言 想着能够使用多种数据库进行一些操作. 所以本文 ...
- [转帖]快速定位MySQL数据库当前消耗CPU最高的sql语句
概述 One of our customers recently asked whether it is possible to identify, from the MySQL side, the ...
- [转帖]CentOS 8已经停止维护,怎么检查CentOS的版本
https://rumenz.com/rumenbiji/centos-check-version.html CentOS 8 在2021年12月31日停止更新并停止维护(EOL). CentOS 7 ...
- [转帖]新一代垃圾回收器ZGC的探索与实践
1. 引入 1.1 GC之痛 很多低延迟高可用Java服务的系统可用性经常受GC停顿的困扰. GC停顿指垃圾回收期间STW(Stop The World),当STW时,所有应用线程停止活动,等待GC停 ...
- Opentelemetry Metrics API
Opentelemetry Metrics API 目录 Opentelemetry Metrics API 概览 在没有安装SDK情况下的API行为 Measurements Metric Inst ...
- 2022 倒带 - NutUI
作者:京东零售 于明明 前言 时光飞逝,流年似水,让我们倒带 2022,回首这跌宕起伏一年走过的 "升级之路". NutUI 表现如何? 成绩单等着您打分! 2022 是 NutU ...
- React中css的module
处理css全局作用 现在有这样一个场景: A页面和B页面都有一个相同的类名 我们在A页面中有引入css. B页面没有css 在我们切换A和B页面的时候. A页面的css也作用在了B页面. 我们只希望A ...
- 一个思路:实现 golang 中的 `__file__` `__line__` 宏
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 测试 zaplog 发现,开启 caller 的调用,会使 ...
- Spring源码——初识Spring容器
Spring源码之工厂(容器) 为什么把Spring的工厂又叫做容器呢? 工厂的责任是创建对象,但是创建完对象后还要进行存储(针对于单例的对象来讲),以供其他地方使用,这就是容器.为了能存多个对象,并 ...