系统环境:centos 6.5

因为服务器上都是红帽,所以本机就选择了centos。红帽系列的linux确实够保守,需要什么软件都要自己动手。

习惯了用客户端写博客,在linux下如果回到网页的方式已经不能忍受,这几天博客没有更新跟折腾这个客户端有很大的关系。

下面详细说说我现在正在使用的wordpress客户端ScribeFire,它的安装配置以及如何修改它添加我们程序猿必须的代码高亮功能。

为什么选择ScribeFire,请看这里 Linux下选择及安装wordpress客户端

ScribeFire严格来说或许并算不上是一个客户端,因为它只是chrome的一个插件,在chrome的应用商店搜索一下就能找到并安装,非常简单,下面说说安装完后的配置。

在安装完打开后,点击Add a New Blog添加博客(目前只有英文),因为ScribeFire并不能像live writer那样自动识别完成配置,所以必须手动指定wordpress的rpc地址,以本博客为例,应该如下图:

点击Finish即可完成配置。ScribeFIre默认会在内容中添加P标签,不需要的可以在插件选项中去掉。

到这里,一般用户就大功告成,可以使用了。但是对于我们程序猿来说,怎么可以没有代码高亮功能呢,必须添加一个。

前面已经说过,博客的代码高亮插件一般都是把我们的代码用<pre>或者<code>标签包围而已,前台在展示时再进行加工,这个各类代码高亮插件都是大同小异的。也就是说我们在写博客时只要切换到HTML代码模式,手动加上效果也是一样的,只不过这样就显得比较麻烦,而且有些样式经过这样切换以后会受到影响而显示不正常,目前我的博客很多文章如果不用客户端直接在wordpress后台打开编辑一下,不用改任何内容保存样式和版面就错乱了。

既然ScribeFIre本身没有提供这个功能,势必要修改源代码了,还好chrome的插件都是一些html、js和css文件,我们完全可以自行修改。

在linux下,chrome的扩展安装目录在用户的.config目录下,以我的用户名liyd为例,我的chrome扩展安装目录为:

/home/liyd/.config/google-chrome/Default/Extensions/

切换到该目录下,用ll命令列出文件列表:

初步一看,傻眼了,chrome是以生成随机目录名称的方式来保存插件的,每个插件都是一个文件夹,我根本不知道我要找的ScribeFire是哪个目录,总不能一个个看过去吧,这也太费力了。当然可以用linux的文件查找命令,但这不并是最好的,因为具体的文件名我们并不清楚,方法终归是有的,请看下图:

我们打开chrome的开发者工具,监控一下ScribeFire的事件,就成功的找到了扩展插件的具体目录。从这里,我们也看到了ScribeFire的富文本框用的是tinymce这个组件。我们接下来添加代码高亮的功能就跟这个有关。

google了一下tinymce,发现这是一款相当强大的富文本框组件,以前怎么就没听说过呢,呵呵。

去它的官网:http://www.tinymce.com 看了一下,API相当的全,但是没有我们本次所需要的功能,一开始看到有个code插件,以为就是添加源代码功能呢,结果一加上,是对整个富文本框显示html源码的,显然不是我们所需,看来是逃不出自己动手了。

大致浏览了一下tinymce的文档,对实现代码高亮功能心中也有个底了,下面来说说这其中的过程。

首先我从API中找到了以下两个方法:

tinyMCE.activeEditor.selection.getContent({format:"text/html"})
tinyMCE.activeEditor.selection.setContent("");

这正是我所需要的,一个获取选中的内容,一个设置选中的内容,

其中 getContent 的format参数指定选中的内容以text方式或者html方式返回。

text方式只获取内容,不包含html标签

html方式获取html内容,包括html标签

我们打开ScribeFire扩展目录下的events.js文件,在它的init方法中添加一个code按钮(具体添加方式请查看tinymce的API),并设置它的点击事件:

editor.addButton('_code', {
    text: 'code',
    icon: false,
    onclick: function() {
    // Alerts the currently selected contents
    }
});

一开始我在点击事件的函数中写入了如下代码,想象中是选中代码内容后,点击按钮用<pre>标签包围:

var _code = tinyMCE.activeEditor.selection.getContent();
tinyMCE.activeEditor.selection.setContent("<pre>"+_code+"</pre>");

但是实际测试中,在可视化状态下添加代码富文本框也会给内容添加一堆div等的标签,所以无法使用。

后来想到getContent方法可以去掉html标签返回text内容(默认是html),因此把代码改成如下:

var _code = tinyMCE.activeEditor.selection.getContent({format:"text"});
tinyMCE.activeEditor.selection.setContent("<pre>"+_code+"</pre>");

这种方式一般的代码是解决问题了,但是当你添加的是xml的代码是,就会导致杯具,因为它会把所有的标签都去掉,连转码后的也不放过,所以该方法也不完美。

这里我还尝试了用正则表达式的方式来移除自动添加的html标签,当一切都搞定之后杯具的发现用getContent方法获取过内容再设置后,代码缩进的格式会丢失,也就是每一行都会变成顶格对齐了,但是如果直接把代码粘贴到<pre>标签里面则不会有这问题。

因为上面的问题,不能以选中的方式解决,我想到了弹出一个层,类似于iteye的方式,但是遍寻tinymce所有api也没发现有这弹出层的功能,要自己加上也不难,但是这势必会修改较多的代码,导致复杂度增加,最后也放弃了。

在苦苦思索后,终于想到了一种以前似乎在哪里用到过的方式,就是先添加一个<pre>标签,再往里面粘贴内容,测试后证明行的通,最终代码如下,反而更简单了:

editor.addButton('_code', {
    text: 'code',
    icon: false,
    onclick: function() {
    // Alerts the currently selected contents
    tinyMCE.activeEditor.selection.setContent("<pre>codeHere</pre>");
    }
});

但是添加<pre>标签后,在可视化状态下又怎么把代码写入或粘贴到这里面呢?如果切换到html模式这功能又白搞了,再看它的init方法,发现有这一行:

content_css: 'skin/editor_content.css',

这个是设置富文本框里面内容的样式文件,找到该css文件,在里面加入:

pre{
    border: 1px dashed #C1CDC1;
}

给<pre>标签添加一个虚线的边框,大功告成。另外因为博客样式经常用到h1、h2系列标题标签,对scribeFire提供的字体大小设置反而基本不用,因此另外又添加了个设置header的按钮,和h系列标签对应,最终效果如下:

你可能感兴趣的内容
0条评论

selfly

交流QQ群:32261424
Owner