AI 摘要

Typecho default-ultra 主题的安装,下载后放 /usr/themes/ 并命名为 default-ultra,后台启用并务必完成外观参数配置。主题支持 PJAX、亮/暗/系统色/阅读色切换、侧边栏、图片懒加载与灯箱、字数/阅读时长/阅读数统计、TOC、返回顶部等开关,按需开启即可。

主题安装说明

1.环境说明

温馨提示:default-ultra 主题目前仅在 Typecho 1.2.1、PHP 56 ~ PHP84、MySQL 56 ~ MySQL 84/PostgreSQL 17.6/SQLLite 环境下测试通过,其他情况未作太多测试,如有问题可与我反馈。

推荐环境:Typecho 1.2.1、OpenResty/Nginx、PHP 8.4、MySQL 8。

2.首次安装

主题安装步骤:

1、在 Github 上下载最新的主题文件压缩包。

2、将主题文件压缩包上传至 Typecho 程序/usr/themes/ 目录下。

3、解压主题文件压缩包,并将解压后的文件夹命名为 default-ultra。

4、进入 Typecho 后台 - 控制台 - 外观 - 可以使用的外观,启用 default-ultra 主题。

5、进入 Typecho 后台 - 控制台 - 外观 - 设置外观,配置主题参数。注意:主题启用后,一定要根据自己的实际需求设置主题参数,否则大部分功能可能无法生效。

3.后续更新

主题更新注意事项:

1、主题更新步骤与首次安装步骤基本一致,在 Github 上下载最新的主题文件压缩包,上传覆盖即可。

2、如果对主题文件进行二次修改,请谨慎覆盖更新。

3、主题更新后,一定要根据自己的实际需求设置主题参数。

配套插件说明

1.ip2region

Typecho 主题配套的客户端 IP 地址归属地信息查询插件,开源于 visduo/typecho-ip2region-plugin

注意:在 default-ultra 主题中,显示评论者 IP 地址归属地信息功能需要配合该插件使用。

插件安装步骤:

1、在 Github 上下载最新的插件文件压缩包。

2、将插件文件压缩包上传至 Typecho 程序/usr/themes/plugins 目录下。

3、解压插件文件压缩包,并将解压后的文件夹命名为 ip2region。

4、该插件即插即用,无需手动启用。

2.playback

Typecho 主题配套的文章放映插件,开源于 visduo/typecho-playback-plugin

注意:在 default-ultra 主题中,文章放映功能需要配合该插件使用。

插件安装步骤:

1、在 Github 上下载最新的插件文件压缩包。

2、将插件文件压缩包上传至 Typecho 程序/usr/themes/plugins 目录下。

3、解压插件文件压缩包,并将解压后的文件夹命名为 playback。

4、进入 Typecho 后台 - 控制台 - 插件,启用 playback 插件。

3.AISummary

Typecho 主题配套的智能提取文章摘要插件,开源于 idealclover/AISummary-Typecho

注意:在 default-ultra 主题中,AI 文章摘要需要配合该插件使用。

插件安装与使用参考:https://github.com/idealclover/AISummary-Typecho

插件设置 - 自定义样式:

<style>
    .aisummary {
        background-color: var(--muted-color);
        border-radius: 12px;
        padding: 12px;
        border: 1px solid var(--border-color);
        margin-bottom: 0!important;
        color: var(--text-color)
    }

    .aisummary + :not(h1) {
        padding-top: 2em!important
    }

    .ai-text-container {
        background-color: var(--bg-color);
        border-radius: 8px;
        padding: 12px 15px;
        border: 1px solid var(--border-color);
        margin-bottom: 8px
    }

    .ai-header {
        margin-bottom: 8px;
        padding-bottom: 0!important;
        text-align: left;
        display: flex;
        align-items: center;
        text-indent: 0
    }

    .ai-footer {
        font-size: .92857em;
        color: var(--secondary-color);
        margin-bottom: 0;
        padding-bottom: 0!important;
        text-align: left;
        text-indent: 0
    }

    .ai-hidden-text {
        display: none
    }

    .ai-typewriter-text {
        display: inline;
        text-indent: 2em
    }

    .ai-cursor {
        display: inline-block;
        width: 2px;
        height: 1em;
        background-color: var(--link-color);
        margin-left: 2px;
        animation: ai-blink 0.7s infinite;
        vertical-align: middle
    }

    @keyframes ai-blink {
        0% { opacity: 1; }
        50% { opacity: 0; }
        100% { opacity: 1; }
    }
</style>

<script>
    let aiSummaryTypingTimeoutId = null;

    function initAISummary() {
        const typewriterElement = document.querySelector('.ai-typewriter-text');
        const sourceTextElement = document.querySelector('.ai-hidden-text');
        const typingSpeed = 50;

        if (!typewriterElement || !sourceTextElement) return;

        if (aiSummaryTypingTimeoutId) {
            clearTimeout(aiSummaryTypingTimeoutId);
        }

        let textToType = sourceTextElement.textContent.trim();

        if (textToType.length > 0) {
            textToType = '  ' + textToType;
        }

        typewriterElement.textContent = '';
        let charIndex = 0;

        function typeNextCharacter() {
            if (charIndex < textToType.length) {
                typewriterElement.textContent += textToType.charAt(charIndex);
                charIndex++;
                aiSummaryTypingTimeoutId = setTimeout(typeNextCharacter, typingSpeed);
            } else {
                aiSummaryTypingTimeoutId = null;
            }
        }
        typeNextCharacter();
    }
</script>

插件设置 - 正文摘要前后固定文字:

<p class="ai-header">
    <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">
        <path stroke="none" d="M0 0h24v24H0z" fill="none"/>
        <path d="M3 10a4 4 0 0 1 4 -4h10a4 4 0 0 1 4 4v6a4 4 0 0 1 -4 4h-10a4 4 0 0 1 -4 -4v-6z" />
        <path d="M8 3l2 3" />
        <path d="M16 3l-2 3" />
        <path d="M9 13v-2" />
        <path d="M15 11v2" />
    </svg>
    AI 摘要
</p>
<div class="ai-text-container">
    <div class="ai-hidden-text">{{text}}</div>
    <div class="ai-typewriter-text"></div>
    <span class="ai-cursor"></span>
</div>
<p class="ai-footer">此摘要根据文章内容自动生成,仅用于文章内容的解释与总结</p>

主题设置说明

1.基础设置

名称描述
是否启用全站 PJAX开启后,全站页面实现 PJAX 无刷新跳转
favicon.ico 图标路径用于指定网页 favicon 图标,即浏览器标签页上显示的小图标
版权信息用于指定网页底部版权区域显示的内容
网站统计代码用于指定网站统计工具(如百度统计、Google Analytics 等)的嵌入代码

2.主题模式设置

名称描述
是否启用主题模式切换开启后,全站支持切换亮色/深色/跟随系统模式
默认外观用于指定未手动切换主题模式时全站的默认主题模式
可选:跟随系统/亮色模式/深色模式/护眼模式

3.顶部菜单设置

名称描述
顶部菜单显示内容用于指定网页顶部菜单显示的菜单项来源
可选:分类/独立页面

4.侧边栏设置

名称描述
是否启用侧边栏开启后,将显示网页侧边栏
推荐启用侧边栏
侧边栏显示内容用于指定网页侧边栏显示的内容
可选:文章分类/最新合集/随机推荐/近期文章/近期评论/文章归档/数据统计
是否启用侧边栏粘性布局开启后,侧边栏会在页面滚动过程中始终保持在可视区域内

5.文章设置

名称描述
是否启用绕过图片防盗链服务开启后,文章内的图片将自动调用绕过图片防盗链接口服务
处理外链图片(如微信公众号图片等)防盗链问题
是否启用图片懒加载开启后,文章内的图片仅在用户即将浏览到时才加载,非一次性全部加载
是否启用图片灯箱开启后,点击文章内的图片,即可让图片展开放大
是否显示文章字数开启后,将在首页、文章列表页、文章页自动统计并显示文章字数
是否显示文章预计阅读时长开启后,将在首页、文章列表页、文章页自动计算并显示文章预计阅读时长
默认阅读速度用于计算文章预计阅读时长时,会根据文章字数和默认阅读速度进行估算
其单位为字/分钟
是否显示文章阅读数开启后,将在首页、文章列表页、文章页自动计算并显示文章阅读数
随机生成文章阅读数最小值用于文章发布后,会在设定的最小与最大值之间,为文章随机分配一个阅读数
随机生成文章阅读数最大值用于文章发布后,会在设定的最小与最大值之间,为文章随机分配一个阅读数
文章外链新窗口打开开启后,文章中的所有外链将自动在新窗口打开
是否显示文章声明开启后,文章底部将显示文章声明内容
文章声明内容指定文章底部显示的文章声明内容

6.评论设置

名称描述
是否显示评论者 IP 地址归属地信息开启后,将显示评论者 IP 地址归属地信息
该功能需要配合 ip2region 插件使用,请确保已安装 ip2region 插件

7.悬浮工具设置

名称描述
是否启用 TOC开启后,将启用 TOC 并在网页右下角显示 TOC 按钮
是否自动打开 TOC 列表开启后,将默认打开 TOC 面板
是否自动展开 TOC 列表项开启后,将默认展开全部 TOC 列表项
是否启用主题模式切换按钮开启后,将在网页右下角显示主题模式切换按钮
需同时开启主题模式切换
是否启用返回顶部按钮开启后,将在网页右下角显示返回顶部按钮
是否启用文章放映模式按钮开启后,将在网页右下角显示文章放映模式按钮
该功能需要配合 playback 插件使用,请确保已安装 playback 插件

其他问题帮助

1.后台外观设置时复选框无法保存

该问题是 Typecho 1.2.1 的 Bug,解决方法参考:https://www.duox.dev/post/40.html

2.ShortLinks 插件与 AISummary 插件冲突失效

该问题是插件钩子冲突的问题,解决方法参考:https://www.duox.dev/post/89.html

3.自定义 CSS 样式

进入 Typecho 后台 - 控制台 - 外观 - 编辑当前外观,打开模板文件 header.php,在 head 标签中添加 style 标签并自定义 CSS 代码,修改后保存文件即可。

注意:如果自定义了 CSS 样式,后续更新主题时,请谨慎覆盖模板文件 header.php。

4.修改全局字体

参考自定义 CSS 样式的方法,通过自定义主题字体变量即可修改全局字体。

:root {
    --body-font-famliy: "内容字体"!important;
    --code-font-famliy: "代码块字体"!important
}

比如要将全局内容字体修改为霞鹜文楷,样式代码可以这样写:

/** 从字图CDN引入霞鹜文楷字体 **/
@import url("https://chinese-fonts-cdn.deno.dev/packages/lxgwwenkaibright/dist/LXGWBright-Regular/result.css");

/** 修改主题字体变量 **/
:root {
    --body-font-famliy: "LXGW Bright"!important
}

注意:如果修改了全局字体,后续更新主题时,请谨慎覆盖模板文件 header.php。

5.移除网页底部“Theme by duozai”信息

default-ultra 主题基于 MIT 开源协议,根据 MIT 协议的条款,不可以随意移除或修改原作品中包含的版权声明和许可信息。

当然如果真的想要移除,也是可以的 :)

进入 Typecho 后台 - 控制台 - 外观 - 编辑当前外观,打开模板文件 footer.php,找到对应的代码并将其删除,修改后保存文件即可。

6.添加“友情链接/邻居”页面

default-ultra 主题目前没有额外适配友情链接插件,也没有提供友情链接页面的独立页面模板,请直接添加独立页面不选择自定义模板,并通过 Markdown 相关语法添加友情链接列表。

- [标题](链接地址) 描述文本

7.添加“归档”页面

default-ultra 主题目前没有提供归档页面的独立页面模板,请直接添加独立页面不选择自定义模板,并自行编写页面内容。

8.添加“时间轴”页面

default-ultra 主题目前已经提供时间轴页面的独立页面模板,请直接添加独立页面,自定义模板选择时间轴即可。