分类 PHP 下的文章

  TOC的生成

  TOC是何种

  TOC 即 Table of Content,就是将文档中的 h1-h6 抽取下来,并结构化的展示;可以通过链接直接跳转至相应的内容 (这里我使用视口)

  这个本来是没哪些好写的,但是牵涉至树状的结构化处理,要考虑到奇特的层级问题。

  方案

  由于原始文档的格式(markdown,html,asciidoc)比较多,但是适于最后展示的还是 html,所以为了便于统一的处理,先将文档都选染成html

  使用 ParseDown 渲染markdown使用 Crawler 解析html提取 h{n},结构化 h{n},并设置html中的 id 属性展示树状 TOC预览

  实现

  安装依赖包

   composer require erusev/parsedown-extra

    composer require symfony/dom-crawler

  代码实现

   public function getTocAttribute() {

        if ($this->headerNodes) {
            return $this->headerNodes;
        }
        $crawler = new Crawler();
        $crawler->addHtmlContent($this->html, 'utf-8');
        $this->headerNodes = $crawler->filter('h1,h2,h3,h4,h5,h6')->each(function (Crawler $node, $i) {
            $attrId = 'header_' . $i;
            $node->getNode(0)->setAttribute('id', $attrId);
            return [
                'target' => '#' . $attrId,
                'level' => intval(substr($node->nodeName(), 1)),
                'text' => $node->text(),
            ];
        });
        $this->tocedHtml = $crawler->html();
        return $this->headerNodes;

  树形结构化

   class MenuItem {

        public $level;
        public $text;
        public $target;
        public $children = [];
        public function __construct($target, $level, $text) {
            $this->target = $target;
            $this->level = $level;
            $this->text = $text;
        }
    }
    $rootMenu = new MenuItem(-1, 0, '__root__');
    foreach ($wiki->toc as $hn) {
        $menuItem = new MenuItem($hn['target'], $hn['level'], $hn['text']);
        // 每个菜单都从根目录开始寻找
        $lastMenu = $rootMenu;
        while (true) {
            $nestMenu = end($lastMenu->children);
            // 如果比上个层级还大,就挂载到他后面
            if (!$nestMenu && $hn['level'] > $lastMenu->level) {
                $lastMenu->children[] = $menuItem;
                break;
            }
            // 如果循环下来发现没有匹配的层级,则放进根目录
            if ($hn['level'] < $nestMenu->level) {
                $rootMenu->children[] = $menuItem;
                break;
            }
            // 如果和上个层级一样,就赛到上层的children
            if ($nestMenu->level >= $hn['level']) {
                $lastMenu->children[] = $menuItem;
                break;
            }
            $lastMenu = $nestMenu;
        }

  渲染输出

   function tree($menu) {

        $html = '';
        $html .= '[' . $menu->text . '][1]';
        if ($menu->children) {
            foreach ($menu->children as $subMenu) {
                $html .= tree($subMenu);
            }
        }
        $html .= '';
        return $html;
    }
    echo '文章目录';
    foreach ($rootMenu->children as $menu) {
        echo tree($menu);
    }

  typecho代码高亮插件

  这是许久之前写的一个typecho代码高亮插件了,由于是自己用的,所以高亮theme之类的都没有变成可配置的;

  自定义更改

  需要修改theme的话,可以直接更改 HighLight/Plugin.php 文件上面引用css的代码行

  echo '' . "n";

  @疯狂的巨作 同学提出是否要分享一下,所以就拿出来了。

  安装方式

  下载 HighLight.zip,解压

  上传至 /path/to/your/typecho/usr/plugins/ 目录下,使用 admin 帐号登入你的 typecho 后台,在插件管理上面启用他就可以啦。

  HighLight.zip

  正则-编程语言读取代码的生成

  演示: 正则表达式测试工具

  功能介绍

  给定一个正则,生成php的正则读取代码。

  一般正则中还会或多或少的包含详细编程语言中的特殊字符,还须要考虑到详细语言中字符串的通配符;

  下面列举了一些常见的要考虑的状况:

   1. 语言是否支持多行字符串?

    2. 是否有定界符?
    3. 语言的正则引擎是否支持逆序环视?

  具体场景

  我们拿PHP做个反例:

  写一个特殊字符覆盖比较全的正则,并写出他的PHP匹配代码:

  要匹配的内容

  

    
      '引用\/'

  正则

  '(.+?\/)'

  PHP匹配代码

   $contents = 'image/png', 'Cache-Control' => 'public, max-age=31536000', 'ETag' => $md5]);

        }

  YUV 图片文字色调的获取 (颜色明亮度)

  更多的使用的时侯,往往我们只须要指定背景色,不关心文字的色调(能认清就行);于是在不同的背景色下边typecho 代码高亮,我们都须要使文字色调跟背景色保持一定的对比度,好了直接看代码吧

   $greyLevel = $r .229 + $g * .587 + $b .114;

    if ($greyLevel >= 189) { // 192
        $fg = '#666666';
    } else {
        $fg = '#ECF0F1';

  字体选择的优化

  全英语的状况下 Georgia 的诠释疗效比较不错,但是包含英文后来疗效就大打折扣,所以这儿有个小兼容

   $fontFamily = 'Georgia.ttf';

    // 如果包含中文

  安全控制

  由于图片的生成会消耗一定的显存,而且图片规格越大,耗的显存越多typecho 代码高亮,所以这儿对生成图片的规格做了1个限制,就是高宽都应当大于等于 2048,否则返回 404

  使用phpexcel解读Excel

  使用composer管理

  composer require phpoffice/phpexcel

<p><pre>

最后修改:2020 年 12 月 22 日 06 : 30 AM
如果觉得我的文章对你有用,请随意赞赏