Typecho 文档:如何在文章中显示图片描述?

02月24日

适用程序:Typecho
程序版本:1.2.1
文档作者:Lopwon
作者博客:Lopwon.com
发布页面:Lopwon.com/attachment/3943/
许可方式:CC BY-NC-SA

注意:此文档源于作者在博客改造中的一些经验总结,转载还请署名。

敬告:此文档操作涉及程序核心文件的修改,作者不对你在使用中产生的任何问题造成的不良后果,承担责任。

文档说明

Typecho 支持以下两种格式显示文章中的图片,每种格式都可以自定义图片的描述,但是,似乎没有内置方法获取和输出这些描述,本文档通过几种方式实现这一需求。

1. Markdown 语法插入图片

    ![图片描述](图片链接)

2. 编辑器功能按键插入图片

    ![图片描述][3]

      [3]: 图片链接

文件 var\Utils\HyperDown.php 会对以上两种格式做解析转换为 HTML 输出,由 post.phppage.php 文件中的 $this->content() 渲染出图片 <img src="图片链接" alt="图片描述" title="图片描述">

那么,知晓解析机制后,思路会清晰,操作也顺畅多了。


使用方法

方法一:修改程序源文件。

缺点,不利于后期博客升级;也会让之前未完善的图片描述(如 IMG_888.jpg)一并输出。

1. 打开 var\Utils\HyperDown.php 文件,找到第496行和第508行,在其内 <img> 结构之后添加图片描述容器:

    // 第496行替换为
    "<img src=\"{$url}\" alt=\"{$title}\" title=\"{$title}\"><span class=\"escaped\">{$title}</span>"

    // 第508行替换为
    "<img src=\"{$this->_definitions[$matches[2]]}\" alt=\"{$escaped}\" title=\"{$escaped}\"><span class=\"escaped\">{$escaped}</span>"

2. 通过定义 .escaped 适配样式。

方法二:在前端使用 JavaScript 脚本。

缺点,对于使用异步加载的文章内容,可能不太友好;对于网络不顺畅、图片较多等情况下,显示方面有明显延迟;对于使用 <img> 方式插入的表情包,也会受影响。

优点,可以通过字符 ·(中文输入状态下的 ~ 键)决定哪些图片需要输出图片描述,即图片描述以字符 · 起头的(如 · 图片描述)才会输出,避免之前未完善的图片描述(如 IMG_888.jpg)一并输出。

1. 查找文章内容区的所有 <img> 图片,提取 title 属性值,并添加至对应图片后方:

    document.addEventListener("DOMContentLoaded", () => {
        const post = document.querySelector(".lopwon-content"); // 替换为文章内容区的类名
        if (!post) return;
        const images = post.querySelectorAll("img");

        for (let img of images) {
            const titleText = img.getAttribute("title");

            if (titleText && titleText.startsWith("·")) { // 检查 title 是否存在且以字符 · 起头的
                const span = document.createElement("span");
                span.textContent = titleText;
                span.className = "escaped";
                img.insertAdjacentElement("afterend", span);
            }
        }
    });

2. 通过定义 .escaped 适配样式。

方法三:在后端使用 PHP 替换。

缺点,对于使用 <img> 方式插入的表情包,会受影响。

优点,可以通过字符 ·(中文输入状态下的 ~ 键)决定哪些图片需要输出图片描述,即图片描述包含字符 · (如 · 图片描述)的才会输出,避免之前未完善的图片描述(如 IMG_888.jpg)一并输出。

1. 在主题 functions.php 新增文章内容替换函数:

    function lopwonContent($content) {

        // 在 $this->content 中匹配图片 <img src="" alt="" title=""> 并重新构建 <img> 结构,此方法也可以用于对 <img> 构建为符合灯箱系统或延迟加载的结构
        $content = preg_replace_callback('/<img[^>]+src=["\']([^"\']+)["\'][^>]*>/i', function ($matches) {
            $imgTag = $matches[0];
            $imgSrc = $matches[1]; // 图片 src 属性值,即图片链接

            preg_match('/alt=["\']([^"\']*)["\']/', $imgTag, $altMatches); // 提取 img 标签中的 alt 属性
            preg_match('/title=["\']([^"\']*)["\']/', $imgTag, $titleMatches); // 提取 img 标签中的 title 属性

            // 两个值是一样的,详见文件 var\Utils\HyperDown.php 第487行和第502行,图片描述同时添加到 alt 和 title
            $altText = isset($altMatches[1]) ? $altMatches[1] : ''; // 图片 alt 属性值,即图片描述
            $titleText = isset($titleMatches[1]) ? $titleMatches[1] : ''; // 图片 title 属性值,即图片描述

            $escaped = (stripos($altText, '·') !== false) ? '<span class="escaped">' . $altText . '</span>' : ''; // 如果图片描述包含 · 字符,才需要构建图片描述容器            
            $newImgTag = '<img src="' . $imgSrc . '" alt="' . $altText . '" title="' . $titleText . '" />' . $escaped; // 构建包含图片描述的新 <img> 标签结构

            return $newImgTag;
        }, $content);

        return $content; // 返回经过处理的文章内容

    }

2. 通过定义 .escaped 适配样式。

3. 在 post.php 和 page.php 调用 lopwonContent($content)

    $content = $this->content; // 如果找不到 $this->content 说明在用主题已经对文章内容作了自定义,找到输出文章内容的变量进行赋值
    echo lopwonContent($content); // 输出经过函数 lopwonContent 处理的文章内容

至此,在文章中的图片也能显示自定义的图片描述了。

Snapic Plus v5 Lopwon Hub