原文链接 http://ymblog.net/2016/07/24/wordpress-prism/

继昨天花了一天一夜的时间匆匆写了主题Jiameil3.0之后,心中一直在想着优化加速,体验更好,插件更少,到目前为止,博客插件有多说,Crayon Syntax Highlighter代码高亮插件,super cache缓存插件,百度sitemap。在没有缓存的情况下,首页dom初识加载完成(不是document加载完成)的时间为5-6s左右,有缓存的情况下大概为2s左右,觉得慢了,查看源码,发现在首页代码高亮插件的代码也会加载,还有jquery的引入,因为自己已经额外引用了百度jquery的CDN,所以觉得完全没必要,想着怎么换掉。

查了下资料,牛逼的人们总是啥都会整出来,看到Prism.js,处理一下只需要引用50KB不到的js,而且不依赖jquery,非常nice,使用prism.js的具体过程请看这篇文章:wordpress无插件实现sublime代码高亮显示

用过的同学就会发现,尼玛即使那样做了,在后台编辑文章时的体验特差啊啊啊,心灰意冷!因为要在文本模式下插入指定的代码,再切换回可视化,而这样切换,光标及可编辑的位置就变得模糊而不可调整,简直了,而且添加的代码还要将标签转义才能够正常显示。巨坑!

后来动动脑子想到,自己手动写个转化工具网页不也是可以?于是就开始着手了。

实现的目的只想把代码拷进去,点一下按钮,再点一下复制就可以去粘贴代码到编辑器 了

于是结构看起来是这样的:

<div class="box">
<div class="h">
选择语言:<select id="lang"></select>
<a href="javascript:;" id="copy">复制代码</a>
<a href="javascript:;" id="render">转化</a>
</div> <textarea id="code" placeholder="粘贴源代码"></textarea>
<textarea id="box" placeholder="复制生成后的代码"></textarea>
</div>

  

关于语言选择当然不能写死,万一以后要增加呢,所以我们定义数组动态添加:

var la = ["html", "js", "css", "php", "java", "jsx", "git", "nginx", "yaml", "scss", "sass", "c", "c++", "CoffeeScript", "go", "jade", "sql", "json", "less", "python"];

for (var i =0; i < la.length; i++) {
str = document.createElement("option");
str.value = la[i]
str.innerHTML = la[i];
lang.appendChild(str);
}

  

当点击转化时,转义html标签为实体后,首位添加上prism插件必须的pre标签和行号:

render.addEventListener("click", function () {
var content = code.value;
content = content.replace(/</g, "<").replace(/>/g, ">"); str = '<pre class="line-numbers"><code class="language-'+ lang.value +'">\n';
str += content;
str += "\n</code></pre>"; box.value = str;
}, false);

  

然后是点击复制就将目标代码复制到剪切板:

copy.addEventListener("click", function () {
box.select();
document.execCommand("Copy");
});;

  

就这样完成,但是还是有个小坑,我在写的时候发现了,要粘贴代码的时候需要手动切换到文本模式,粘贴完代码后还得切换到可视化,就这个巨坑,而且代码样式不能预览,不过比之前好多了,为了不用那么冗余的插件,为此也算是值了。完工后的界面是这样子的。请戳链接:demo,转载请注明连接。

那么问题又来了,我不可能每次手动输入这个地址吧,多麻烦?我想要在后台写文章的时候添加一个按钮跳转到我自定义的这个页面,万能的网友总是一如既往的牛逼,有2中解决办法:

  1. 在后台左侧界面添加自定义菜单
  2. 在编辑器界面添加按钮跳转

很显然,我会先择后者 ,它们看起来分别是这样的:

两者的实现方式分别为:

// my_add_pages() 为 'admin_menu' 钩子的回调函数
function my_add_pages() {
// 第一个参数'Help page'为菜单名称,第二个参数'使用帮助'为菜单标题
// 'manage_options' 参数为用户权限
// 'my_toplevel_page' 参数用于调用my_toplevel_page()函数,来显示菜单内容
add_menu_page('Help page', '使用帮助', 'manage_options', __FILE__, 'my_toplevel_page');
} // my_toplevel_page() 用于显示菜单的内容,填写菜单页面的HTML代码即可
function my_toplevel_page() {
echo '
这里填菜单页面的HTML代码
'; // 如以下示例代码。 wrap 类是WordPress构建好的css类,可以在你的HTML代码中使用
/*
echo '
<div class="wrap">
<h2>使用帮助</h2>
<p>这里是使用帮助,通过阅读本文你将了解本程序的使用!有事请<a href="#">与我联系</a></p>
</div>
';
*/
} // 通过add_action来自动调用my_add_pages函数
add_action('admin_menu', 'my_add_pages');

  

这段代码的参考文章是:WordPress后台添加侧边栏菜单。后者的实现方式是:

add_action('media_buttons', 'add_my_media_button');

function add_my_media_button() {
echo '<a href="#" id="insert-my-media" class="button">Add my media</a>';
}

这段代码参考的是:如何给wordpress的编辑器添加一个自定义按钮,并且实现插入功能

这样点击添加代码块,就会跳转到自定义的转化代码的html页面。

原文链接 http://ymblog.net/2016/07/24/wordpress-prism/

wordpress优化之结合prism.js为编辑器自定义按钮转化代码的更多相关文章

  1. 【翻译】如何在AJAX生成的内容中再次运行Prism.js

    一.前言 最近用一个十分轻量级的网页代码高亮Js库,应用到项目中发现了一个问题,对于静态的已经写好的代码,Prism的高亮插件是没有问题的,但是通过Ajax异步获取数据并修改DOM时发现,Prism高 ...

  2. 基于 Angularjs&Node.js 云编辑器架构设计及开发实践

    基于 Angularjs&Node.js 云编辑器架构设计及开发实践 一.产品背景 二.总体架构 1. 前端架构 a.前端层次 b.核心基础模块设计 c.业务模块设计 2. Node.js端设 ...

  3. js 语法高亮插件之 Prism.js

    之前也介绍过几款语法高亮插件<为博客园选择一个小巧霸气的语法高亮插件>以及关于他们的综合性能<再议 语法高亮插件的选择>.今天在小影志博客看到<使用 Prism.js 实 ...

  4. prism.js使页面代码变得漂亮

    第一次接触prism.js,并把它用到了园子里. 装逼如风,常伴吾身.有了如此利器,从此院子里我的代码是"最"漂亮的! 身为程序员深刻体会代码高亮在生产过程中是多么的重要.以下便是 ...

  5. wordpress优化:Gravatar头像被墙及解决方案

    网站缓存现象: 打开网站是左下角出现0.gravatar.com.1.gravatar.com或2.gravatar.com字样,网站一直处于缓存状态,迟迟未能打开.很多人都会缺乏耐心地等待一个网页的 ...

  6. prism.js——让网页中的代码更好看

    粗放的代码展示 有时候,网页中会插入代码.直接把代码放入<pre></pre>标签和<code></code>标签里,也算是可以在页面中显示出来. 比如 ...

  7. 富文本编辑器嵌入指定html代码

    先把内容放入一个input中 <input id="detail" type="hidden" value="${sysCarousel.det ...

  8. UEditor富文本WEB编辑器自定义默认值设置方法

    1.在使用UEditor编辑器编写内容时你会发现,当输入的内容较多时,编辑框的边框高度也会自动增加,若希望输入内容较多时以拉框滚动的效果. 方法:找到Ueditor文件根目录下的ueditor.con ...

  9. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 代码分层

    视频地址:https://www.cctalk.com/v/15114923889408 文章 在前面几节中,我们已经实现了项目中的几个常见操作:启动服务器.路由中间件.Get 和 Post 形式的请 ...

随机推荐

  1. Npm包的开发

    个人开发包的目录结构 ├── coverage //istanbul测试覆盖率生成的文件 ├── index.js //入口文件 ├── introduce.md //说明文件 ├── lib │   ...

  2. 【流量劫持】躲避 HSTS 的 HTTPS 劫持

    前言 HSTS 的出现,对 HTTPS 劫持带来莫大的挑战. 不过,HSTS 也不是万能的,它只能解决 SSLStrip 这类劫持方式.但仔细想想,SSLStrip 这种算劫持吗? 劫持 vs 钓鱼 ...

  3. hash表长度优化证明

    hash表冲突的解决方法一般有两个方向: 一个是倾向于空间换时间,使用向量加链表可以最大程度的在节省空间的前提下解决冲突. 另外一个倾向于时间换空间,下面是关于这种思路的一种合适表长度的证明过程: 这 ...

  4. [.NET] 利用 async & await 的异步编程

    利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html  目录 异步编程的简介 异 ...

  5. RabbitMq应用一

    RabbitMq应用一 RabbitMQ的具体概念,百度百科一下,我这里说一下我的理解,如果有少或者不对的地方,欢迎纠正和补充. 一个项目架构,小的时候,一般都是传统的单一网站系统,或者项目,三层架构 ...

  6. C#制作简易屏保

    前言:前段时间,有个网友问我C#制作屏保的问题,我瞬间懵逼了(C#还可以制作屏保!).于是我去查阅相关资料,下面把C#如何制作屏保的过程及我学习过程的心得也记录下来,希望对需要的人能有帮助. 基本思路 ...

  7. springmvc+bootstrap+jquerymobile完整搭建案例(提供下载地址)

    用一张简单的截图说明下,然后提供一个下载地址. bootstrap的大部分样式官方都是写好的,所以只需要class="官方样式即可",具体可以看官方的案例,下面来个地址 http: ...

  8. isEmpty和isNull()区别

     isEmpty和isNull()区别一个NULL字符串一定是一个空串,一个空串未必是一个NULL字符串例如:QString().isNull():   //结果为trueQString().isEm ...

  9. Maven搭建SpringMVC+Hibernate项目详解 【转】

    前言 今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这 ...

  10. Android 解析XML文件和生成XML文件

    解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...