如何为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

移动端可扫我直达哦~

推荐阅读

thumbnail 2025-06-08

typecho前台ajax登录与错误处理

尝试了在主题前台做一个登录框,登陆的功能是实现了,有一个小小的不便,就是如果输错了密码,因为页面又跳回了首页,所以弹出式登录框又被隐藏了,登录成功与否不够明显,二次登录的场合操作也较繁琐,所以想实现前台以ajax的方式登录。实现aja...

建站相关 typecho

thumbnail 2025-06-08

聊聊html里的head部分

HTML文档的<head>部分是一个容器,用于包含文档的元数据(metadata)和链接到外部资源的信息,这些内容不会直接显示在网页上,但对网页的功能和表现至关重要。主要元素和功能1. 基础元素<title>:...

建站相关 typecho

thumbnail 2025-06-04

typecho前端实现站点语言的切换

前端修改的数据能及时反馈到后端,那当然需要一个前后端都可以无障碍读取的东西,所以最初是想要用localstorage,但发现php无法直接读取其值,所以就换成了cookie。前端通过js来设置参数值:document.cookie='...

建站相关 typecho

thumbnail 2025-06-02

typecho 主题中的模板与模块的概念

模板是 typecho 主题中一个重要的概念,我们说过typecho的极简主题可以只存在 index.php 这一个文件,但需要展现分类页的时候,typecho事实上会先去寻找名为 category.php 的分类页模板,文章页当然也...

建站相关 typecho

thumbnail 2025-06-02

typecho的几种常见的文章列表调用

处理好了header与面包屑,接下来就按照自己的需求自由发挥了,先放一个分类列表,再挑出一个喜欢的标签,自定义一个该标签下内容展示模块。Typecho 提供了多种文章循环方式,以下是常用的几种方法:标准文章循环<?php whi...

建站相关 typecho

thumbnail 2025-06-02

在typecho里实现面包屑导航

什么是面包屑导航面包屑导航是一种网站导航方式,通常在网站顶部显示,大多会放在站点header的下方,用于显示用户当前位置。 面包屑导航由导航元素构成,每个元素代表一个网站导航项,各个元素通常包含对应链接,供用户跳转。面包屑导航示例首页...

建站相关 typecho

thumbnail 2025-05-29

关于typecho中的路由知识

路由(Routing)是博客系统中将URL地址映射到具体处理逻辑的机制,它决定了当用户访问某个网址时,系统应该执行什么操作、显示什么内容。typecho站点一般都会开启伪静态,伪静态通过URL重写将"漂亮"的URL映射到实际的文件路径...

建站相关 typecho

thumbnail 2025-05-29

Typecho 模板中的翻译函数 _t 与 _e

在 Typecho 模板开发中,_t 和 _e 是用于国际化处理的函数,核心区别在于输出方式:"_t" 函数‌‌功能‌:获取翻译后的字符串但不直接输出,需结合 echo 使用。‌示例‌:<?php echo _t('欢迎语');...

建站相关 typecho

thumbnail 2025-05-26

typecho文章自定义字段的删除与修改

涉及数据库的操作,务必请提前做好备份!提前做好备份!!做好备份!!!小鸟数据的当前主题的缩略图字段命名为augPostThumb,这几天在尝试完善一下原有主题,下载了原站的数据库导入了测试站用于测试页面效果,测试主题的缩略图相关字段拟...

建站相关 typecho

thumbnail 2025-05-26

typecho的文章自定义字段的知识笔记

在typecho中,除了可以自定义设置项之外,我们也可以给文章自定义一些额外的字段,比如给文章编辑界面添加一个缩略图选项,或者增加一个keywords输入框,用来修改编辑当前内容页的关键词信息。// 主题设置 function th...

建站相关 typecho