Typecho 主题那点坑

Author Avatar
黎明余光 2017年10月21日
  • 在其它设备中阅读本文章

Material 3.1.1 的那点更新和更新中踩的坑

在文章中给图片加上 LazyLoad

效果可以去看 https://blog.lim-light.com/archives/icey.html

发现 themeInit

又一个 typecho 主题函数,文档只字未提什么都习惯了
最开始是在 Jrotty 那看到的 Typecho 不修改源码不关闭反垃圾保护兼容 pjax,当时觉得没啥用,也没仔细看对 $archive->content 的处理,今天找怎么读 $this 中数据而不直接输出的时候找到了替换超链接,加上 target="_blank" 的代码,于是机智地想到了

function themeInit($archive)
{
    if ($archive->is('post') || $archive->is('page')) {
        $archive->content = preg_replace('#<img(.*?) src="(.*?)" (.*?)>#',
        '<img$1 data-original="$2" class="lazy" $3>', $archive->content);
    }
}

解决使用 Pangu.PHP 导致代码块渲染问题

搞事情

今天把时间都用 浪费 在更新主题上了,换了 Pangu.PHP 来加空格,解决前端渲染导致令人不快的抖动问题,日常踩坑

最开始是偷 nfz 在 viosey/typecho-theme-material 的针对压缩 HTML 的解决方案的,原版是

<?php $html_source = ob_get_contents(); ob_clean(); print compressHtml($html_source); ob_end_flush(); ?>

直接改成

<?php $html_source = ob_get_contents(); ob_clean(); print pangu::do($html_source); ob_end_flush(); ?>

似乎一切都没什么问题

发现

启用后上一篇文章的代码块被压缩成了

function themeInit($archive)
{if ($archive->is('single'))
....

原本是

function themeInit($archive)
{
    if ($archive->is('single'))
....

不想去找 Pangu.PHP 的问题,那就跳过代码块好了
依然偷 nfz 的解决方案,魔改成了

/**
 * Pangu.PHP
 * @param string html_source
 * @return string 处理完的 html_source
 */
function pangu($html_source) {
    $chunks = preg_split('/(<!--<nopangu>-->.*?<!--<\/nopangu>-->|<nopangu>.*?<\/nopangu>|<pre.*?\/pre>|<textarea.*?\/textarea>)/msi', $html_source, -1, PREG_SPLIT_DELIM_CAPTURE);
    $result = '';
    foreach ($chunks as $c) {
        if (strtolower(substr($c, 0, 19)) == '<!--<nopangu>-->') {
            $c = substr($c, 19, strlen($c) - 19 - 20);
            $result .= $c;
            continue;
        } else if (strtolower(substr($c, 0, 12)) == '<nopangu>') {
            $c = substr($c, 12, strlen($c) - 12 - 13);
            $result .= $c;
            continue;
        } else if (strtolower(substr($c, 0, 4)) == '<pre' || strtolower(substr($c, 0, 9)) == '<textarea') {
            $result .= $c;
            continue;
        }
        $result .= pangu::do($c);
    }
    return $result;
}

然后改成

<?php $html_source = ob_get_contents(); ob_clean(); print pangu($html_source); ob_end_flush(); ?>

本文链接:https://blog.lim-light.com/archives/theme-update-311.html
本文采用 CC BY-NC-SA 3.0 CN 协议进行许可,阅读 相关说明

    Jrotty
    Jrotty  2017-12-16, 13:28

    盘古这个好评哈,我其实也想搞了,但是没整明白

    Heng
    Heng  2017-11-22, 09:58

    大神,非常感谢你修改维护这个主题。我自己不会写代码,所以就信口开河了:感觉图片占用空间有点多,尤其是首页顶部的,加上留白,在PC上第一屏看不到文章,感觉是不是可以优化呢。

      黎明余光
      黎明余光  2017-11-22, 22:56

      实际上原版的 demo 留白更多...再删感觉不好看,所以不会对这方面进行优化了

    ZimKim
    ZimKim  2017-11-02, 19:36

    原生搜索不可用吗?

      黎明余光
      黎明余光  2017-11-02, 23:52

      指的是?搜索在这里可以正常使用

    tengdw
    tengdw  2017-11-01, 16:13

    今天用的报错
    Parse error: syntax error, unexpected 'do' (T_DO), expecting identifier (T_STRING) or variable (T_VARIABLE) or '{' or '$' in /www/wwwroot/blog/usr/themes/material_bak/functions.php on line 417

    UFO404
    UFO404  2017-10-30, 10:12

    升级typecho1.1会对主题有影响嘛