首页>建站相关>如何为Typecho后台编辑器添加一个自定义按钮

如何为Typecho后台编辑器添加一个自定义按钮

写了一个自用的小鸟主题,主页与分类页基本都定稿了,但是single页面的内容部分感觉过于单一,就想着是不是可以利用markdown加入类名。但尝试了很多网上的方案,hyperdown(typecho的markdown解析器)都无法正常解析。

于是转而考虑直接写入html语句的方式,为编辑器添加几个按钮,以含类名的html方式一些不同的类名,根据类名实现不同的视觉效果。比如利用"single-jplink"类名实现了下面这样一个按钮效果,链接指向joe主题的《自定义后台编辑器功能》,这也是本文的参考。

Typecho自定义后台编辑器功能

修改编辑的大致原理是通过插件语法在文章或页面的编辑页插入一段js,利用js添加按钮并绑定动作,首先在function.php里加入如下代码,这段代码会在页面编辑以及文章编辑页时在末尾插入一段js代码,代码的路径可以自行定义,博主把它暂时放在了主题的js文件夹里,就是代码中的“/js/editor.js”:

/*========
后台编辑器
========*/
Typecho_Plugin::factory('admin/write-post.php')->bottom = array('Editor', 'edit');
Typecho_Plugin::factory('admin/write-page.php')->bottom = array('Editor', 'edit');

class Editor{
  public static function edit(){
    echo "<script src='" . Helper::options()->themeUrl . '/js/editor.js' . "'></script>";
  }
}

然后将命名为editor.js代码放入主题的js文件夹,js全文如下:

(function ($) {
  $(document).on('DOMContentLoaded', function(){
    const items=[
      {
        title:'下载',
        id:'wmd-dllink-button',
        class:'single-dllink'
      },
      {
        title:'跳转',
        id:'wmd-jplink-button',
        class:'single-jplink'
      },
    ];
    items.forEach(function(item){
      let element= $(`<li class="wmd-button" id="${item.id}" title="${item.title}">${item.title}</li>`); 
      element.on('click',function(){
        $('#text').toggleSelection(item.class);        
      });
      $('#wmd-button-row').append(element);
    });  
  });

  $.fn.extend({
    toggleSelection: function (a) {
      this.focus();
      let selected=document.getSelection();
      let result=selected.toString();
      if(result.length==0)return;
      let pattern=/<a class="(.*?)" href="(.*?)" rel="nofollow" target="_blank">(.*?)<\/a>/;
      let before=`<a class="${a}" href="(.*?)" rel="nofollow" target="_blank">`;
      let after='</a>'
      if(pattern.exec(result)){
        if(pattern.exec(result)[1]==a){
          selected.focusNode.children[1].setRangeText(pattern.exec(result)[3]+"||"+pattern.exec(result)[2]);
        }else{
          selected.focusNode.children[1].setRangeText(result.replace(pattern.exec(result)[1],a));
        } 
      }else{
        selected.focusNode.children[1].setRangeText(before.replace('(.*?)',result.split('||')[1])+result.split('||')[0]+after);
      }
    }
  });
})(jQuery);

程序实现了这样一个功能,将“aa||bb”格式的数据通过正则匹配,分别将aa作为a标签的内容,将bb填入元素的href。成功生成后,在选区未被变更的情况下,如果再次点击按钮,则让选区恢复为原值,如果想要更换为另一个类,则直接点击一下另一个按钮即可。

为了这个小功能看了整整两天的代码,但最后发现理想丰满但现实过于骨感,默认的编辑器不处理(即直接输出html)的标签极为有限,印象中仅有“ul|table|pre|a”等标签以及一些格式控制标签(比如加粗斜体等)会被正确处理为html元素,其他的大多会被一对双引号打回原形,成了单纯的字符。所以最终只实现了对于链接的类区分,利用不同的类对a标签实现了不同的样式。

一点补充

学习过程中发现,对于其他元素的支持,可以通过修改HyperDown.php文件的方式来扩展,但是,这种方式可能在升级程序后失效,感觉缺乏一些兼容性,而且更换其他主题后,很可能导致页面上出现多余的html标签,修改方法请点击上方链接查看。

增加HTML标签支持

标签: typecho

移动端可扫我直达哦~

推荐阅读

typecho 2024-04-20

typecho根据标签的slug name信息判断是否输出免责声明

博主是从事机械行业的,工作过程中接触了很多二手老旧的设备,因为是二手设备,不缺胳膊少腿能正常运行已是难得,完善的说明书与售后服务想都不要想了。所以找设备的说明书成了一项附加的工作,总得让设备正常运行起来,偶尔设备有个小病小痛的,也不能...

建站相关 typecho

typecho 2023-11-02

Typecho开发文档-Widget设计文档

什么是WidgetWidget是组成Typecho的最基本元素,除了已经抽象出来的类库外,其它几乎所有的功能都会通过Widget来完成.在实践中我们发现,在博客这种小型但很灵活的系统中实施一些大型框架的思想是不合适的,它会使系统灵活性...

建站相关 typecho

typecho 2023-10-25

Typecho默认路由表一览

路由器(Route)路由器(Route)是Typecho系统中的一个重要组件,类似mod_rewrite的机制,来实现独立的URL和指定的controller/action/params的映射规则.它通过识别诸如http://loca...

建站相关 typecho

typecho 2023-10-21

Typecho自动更新指定文章内容的尝试

曾经在老的博客(wordpress)里尝试并且成功运行过的一个方案,定时去请求某个比如“每天60秒读懂世界”这样的api,获取到数据,然后根据数据更新某一篇博文的内容。因为有“轻微”的强迫症,所以习惯把不用的东西直接“rm -rf”删...

建站相关 typecho

typecho 2023-10-21

Typecho数据库常用API

表的创建和删除在Typecho插件开发过程中,往往需要创建自己的表。上文提到Typecho_Db类中的query函数,可用于执行所有sql语句,因此我们使用query()来进行表的创建、修改或者删除。$db= Typecho_Db::...

建站相关 typecho

typecho 2023-10-18

让typecho博客支持显示数学公式

MathJax是一个开源的基于Ajax的数学公式显示的解决方案,结合多种先进的Web技术,支持主流的浏览器。MathJax根据页面中定义的LaTex数据,生成对应的数学公式。具体可见:mathjax项目代码(GitHub)因为是利用j...

建站相关 typecho

typecho 2023-10-15

为Typecho编辑器增加HTML标签支持

这几天为Typecho编辑器基本不支持块级元素而困扰,在github上翻编辑器插件的时候意外看到有位望友说可以去修改Hyperdown.php文件以增加对HTML标签的支持。该文件位于:build/var/HyperDown.php需...

建站相关 typecho

typecho 2023-10-12

typecho为什么更换主题后部分图片无法正确显示

其实严格的说,这可能是博主自己主题的问题,但人类的悲欢偶尔相通么,没准也可能在其他的主题中遇到类似的。博主之前边写博客边修改拼凑了一个比较简陋的主题,使用一段时间后,觉得主页过于单调了,于是在23年的国庆前后对主题整体做了一个比较大的...

建站相关 typecho

typecho 2023-10-05

typecho输出标签云或生成热门标签

小鸟数据生成标签云的代码应该是仿自默认的纯白主题,为了显示彩色标签,所以为tags增加了几个随机的类,事实上这几个类完全可以利用jquery在前端添加,毕竟现在用户的电脑性能远远超过了自己小水管服务器的性能,php添加随机类的写法:&...

建站相关 typecho