Skip to content

Latest commit

 

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

✨ GlyphFx — 终端文字动画引擎

零依赖 · 跨平台 · CLI 与 Python 库双形态 · 12 种内置特效 · 一键导出动画 SVG / HTML / JSON

🌐 语言切换:简体中文English繁體中文

Python License: MIT Version Zero Dependencies Tests


🎉 项目介绍

GlyphFx 是一个纯 Python 标准库实现的终端文字时序动画引擎。一行命令,就能让普通文字在终端里打字、流光、故障、解码、燃起 ASCII 火焰;同时它也是一个可以直接 import 的动画库,每一帧都由整数随机种子确定性生成,可复现、可测试、可离线渲染成文件。

🎯 它解决什么痛点

  • 😮‍💨 终端动画只能在自己屏幕上看:录屏模糊、截图是死的,没法贴进 PR、博客、群聊。GlyphFx 可把同一份动画无头导出为自包含的动画 SVG(SMIL)、带播放器的独立 HTML 与结构化 JSON
  • 🧩 现有工具要么是静态二进制、要么依赖链沉重:GlyphFx 零三方运行时依赖,Python 3.8+ 即可运行,Windows / macOS / Linux 行为一致。
  • 🔗 特效之间无法编排:GlyphFx 原生支持特效管线串联--chain typewriter,rainbow)。
  • 🧪 动画难以自测:GlyphFx 的“特效 = 进度值 → 字符网格”的纯函数模型,让每一帧都能被断言,CI 里也能稳定跑。

💡 灵感来源与自研声明

项目灵感来自近期终端动效赛道的高热度探索(终端文字特效、ASCII 火焰清屏等方向)。GlyphFx 没有复制任何现有项目的一行代码,全部架构与 12 种特效均为从零独立实现,并在“可分享导出、确定性帧引擎、管线编排、跨平台降级、无障碍支持”五个方向做出了差异化设计。


✨ 核心特性

  • 🎬 12 种自研内置特效 typewriter(打字机)· fade(逐字淡入)· beam(扫描光束)· rainbow(流动彩虹)· wave(正弦波浪)· bounce(抛物线弹跳)· scroll(跑马灯)· scramble(密码解码)· sparkle(星点闪烁)· glitch(故障毛刺)· matrix(数字雨解码)· flame(ASCII 火焰)
  • 🧰 双形态交付:同一个引擎既是 glyphfx 命令行工具,也是 import glyphfx 的 Python 库
  • 📤 三种无头导出:动画 SVG(纯 SMIL,无 JS)、独立 HTML(内嵌播放器,可暂停/调速)、JSON 帧数据(便于二次开发与快照测试)
  • 🔗 特效管线串联:多个特效首尾相接,一条命令编排完整开场动画
  • 🎲 确定性渲染:所有随机效果由 --seed 控制,同一种子逐帧一致,天然适合 CI 与演示
  • 🖥️ 真正跨平台:自动启用 Windows 10+ 虚拟终端序列;真彩 → 16 色 → 无色三级降级;遵循 NO_COLOR;非 TTY 管道自动只输出静态终帧,绝不刷屏
  • 🪶 零运行时依赖:仅用 Python 标准库,安装无网络依赖陷阱
  • 28 个测试全程护航:覆盖缓动、颜色、画布、全部特效、三种导出器与子进程级 CLI

🖼️ 特效画廊(点击在浏览器中打开可看动画)

打字机 流动彩虹 数字雨 故障毛刺
typewriter rainbow matrix glitch
逐字淡入 正弦波浪 密码解码 ASCII 火焰
fade wave scramble flame

📁 全部 12 个特效的 SVG 见 docs/assets/effects/,连续播放版见 docs/assets/showcase.html(下载后用浏览器打开)。


🚀 快速开始

📋 环境要求

项目 要求
Python 3.8 / 3.9 / 3.10 / 3.11 / 3.12+
操作系统 Windows 10+、macOS、Linux(任意支持 ANSI 的终端)
第三方依赖

⬇️ 安装

# 推荐:pipx 全局隔离安装
pipx install glyphfx

# 或使用 pip
python3 -m pip install glyphfx

# 从源码安装(可编辑模式,便于二次开发)
git clone https://github.com/gitstq/glyphfx.git
cd glyphfx
python3 -m pip install -e .

⚡ 30 秒上手

# 1) 终端里直接播放彩虹流动
glyphfx "Hello, GlyphFx!" -e rainbow

# 2) 打字机 + 解码 + 彩虹 三段串联
glyphfx "Deploy Success" --chain typewriter,scramble,rainbow

# 3) 导出一份自包含动画 SVG(可直接嵌进 README / 博客)
glyphfx "Shipped!" -e matrix --frames 36 --export svg -o shipped.svg

# 4) 管道输入
echo "build passed" | glyphfx -e beam

# 5) 查看全部特效
glyphfx --list

作为 Python 库使用:

import glyphfx

# 在当前终端播放
glyphfx.animate("Hello", effect="typewriter", fps=24)

# 无头取帧(不触碰终端)
frames = glyphfx.frames("Hello", effect="glitch", frames=20, seed=3)
svg_text = glyphfx.to_svg("Hello", effect="glitch", frames=20, seed=3)
open("hello.svg", "w", encoding="utf-8").write(svg_text)

📖 详细使用指南

🧑‍💻 命令行参数全览

参数 说明 默认值
TEXT 要动画化的文本;省略时从标准输入读取
-e, --effect 特效名(glyphfx --list 查看全部) rainbow
--chain a,b,c 特效管线,按顺序串联播放 关闭
--fps N 每秒帧数 24
--frames N 覆盖特效默认总帧数 各特效内置
--seed N 随机种子,保证逐帧可复现 0
--width N 固定画布列宽(便于对齐) 自适应
--easing NAME 缓动曲线:linear/out-quad/in-out-cubic/out-back/elastic 等 10 种 linear
--loop 循环播放直到 Ctrl+C 关闭
--color auto / truecolor / ansi16 / none auto
--opt KEY=VALUE 特效专属参数,可重复,如 --opt amplitude=3
--export 无头导出:svg / html / json 关闭
-o, --output 导出文件路径(JSON 省略时输出到 stdout) 自动命名
--list 列出全部特效后退出
--preview 依次播放每一个特效
--version 输出版本号

🎚️ 特效专属参数(通过 --opt 传入)

特效 参数 含义
wave amplitude=2 波浪振幅(行数)
wave loops=1.5 文本宽度内的正弦周期数
bounce travel=10 水平弹跳移动距离(列)
rainbow saturation=0.75 / value=1.0 HSV 饱和度与明度
glyphfx "WAVE" -e wave --opt amplitude=3 --opt loops=2.0

📤 三种导出格式详解

# 动画 SVG:纯 SMIL 实现,无 JavaScript,可直接 <img> 引用或拖进浏览器
glyphfx "CI GREEN" -e beam --export svg -o ci.svg

# 独立 HTML:内嵌全部帧与迷你播放器(暂停 / 重播 / 0.25x–3x 调速),双击即开
glyphfx "CI GREEN" -e beam --export html -o ci.html

# JSON:结构化帧数据,stdout 输出便于 jq / 前端二次渲染
glyphfx "CI GREEN" -e beam --frames 8 --export json | python3 -m json.tool | head

JSON 结构示例:

{"glyphfx": 1, "width": 10, "height": 1, "fps": 24,
 "frames": [[[{"c": "C", "f": "#e2e8f0", "k": null, "b": true}]]]}

🧩 库 API 速查

import glyphfx
from glyphfx.effects import build_effect
from glyphfx.exporters import export_svg, export_html, export_json

# 1) 直接播放(自动检测终端能力,非 TTY 只打印终帧)
glyphfx.animate("OK", effect="sparkle", loop=False)

# 2) 串联管线
canvases = glyphfx.chain_frames(["typewriter", "rainbow"], "OK", frames=24)

# 3) 逐帧处理:Canvas 是 width×height 的字符网格
effect = build_effect("matrix", "WAKE UP", frames=48, seed=42)
for i, canvas in enumerate(effect):
    print(i, canvas.render("truecolor"))

# 4) 查看全部特效元信息
for info in glyphfx.effect_info():
    print(info["name"], "-", info["description"])

♿ 无障碍与退化行为

  • 设置环境变量 NO_COLOR=1 即输出纯文本;--color ansi16 可降级到经典 16 色。
  • 输出被重定向到管道/文件(非 TTY)时,实时模式只输出静态终帧,避免 ANSI 转义污染日志。
  • Ctrl+C 中断循环时会自动恢复光标与颜色,终端不会残留花屏状态。

🧪 测试

python3 -m unittest discover -s tests -v

💡 设计思路与迭代计划

🏗️ 架构一览

src/glyphfx/
├── easing.py      # 10 种纯函数缓动曲线
├── colors.py      # 真彩/16色/无色三级 SGR 抽象 + Windows VT 启用
├── canvas.py      # 字符网格 Cell/Canvas:特效绘制的唯一画布
├── effects/       # 12 个特效,每个都是 p∈[0,1] → Canvas 的确定性映射
│   ├── base.py    # Effect 基类:帧迭代、缓动、每帧独立 RNG
│   └── *.py
├── engine.py      # 实时播放器(清屏/光标/帧率/Ctrl+C 安全还原)
├── exporters.py   # SVG(SMIL) / HTML / JSON 三种无头导出
└── cli.py         # argparse 命令行入口

核心设计取舍

  1. 特效即纯函数。给定 (文本, 帧序号, 种子) 必然得到同一张画布,因此测试、导出、回放共用同一条代码路径,不存在“终端里好看、导出就翻车”的两套实现。
  2. 只依赖标准库。终端工具的最大失败模式是安装即报错;GlyphFx 在任何能跑 Python 3.8 的机器上开箱即用。
  3. 导出优先。动画的价值在于传播,SVG/HTML 导出与终端渲染同源,保证“所见即所导出”。

🗺️ 迭代路线图

  • v1.1:新增 neon(霓虹脉冲)、slide-up(逐行升起)、gradient-shift 三种特效
  • v1.1:支持从 .txt / stdin 批量生成每行动画
  • v1.2:导出 GIF(可选 Pillow 扩展,保持核心零依赖)
  • v1.2:自定义配色主题(--theme JSON / 内置主题)
  • v1.3:ANSI 录制回放(.cast 格式兼容 asciinema)
  • 🌟 欢迎在 Issues 提名新特效与导出格式

🤝 社区贡献方向

新特效、新缓动曲线、新导出器、终端兼容性报告、多语言文档校对都非常欢迎——请先阅读 CONTRIBUTING.md


📦 打包与部署指南

GlyphFx 属于工具库 / CLI 组件类项目,纯 Python 实现、无需编译任何二进制产物。

🏗️ 本地构建 wheel / sdist

python3 -m pip install build
python3 -m build          # 在 dist/ 下生成 .whl 与 .tar.gz

🚚 离线环境安装

把 wheel 拷贝到目标机器后:

python3 -m pip install glyphfx-1.0.0-py3-none-any.whl
glyphfx --version

🐍 作为依赖集成

# pyproject.toml
dependencies = ["glyphfx"]
from glyphfx.frames import frames  # 或:from glyphfx import frames

🐳 容器中使用

FROM python:3.12-slim
RUN pip install --no-cache-dir glyphfx
ENTRYPOINT ["glyphfx"]

💡 容器/CI 中通常没有 TTY,GlyphFx 会自动退化为静态终帧输出;需要产物时请使用 --export


🤝 贡献指南

  • 提交信息遵循 Conventional Commitsfeat: / fix: / docs: / refactor: / test: / chore:
  • 新特效请注册到 src/glyphfx/effects/__init__.py,通用测试会自动覆盖帧数、确定性与字形保留
  • 提交前请确保 python3 -m unittest discover -s tests 全绿
  • 完整流程(开发环境、PR 清单、发版步骤)见 CONTRIBUTING.md

📄 开源协议

本项目基于 MIT License 开源,允许自由使用、修改、分发与商用,保留版权声明即可。

如果你喜欢 GlyphFx,欢迎 ⭐ Star 支持,也欢迎把导出的动画分享给我们!

About

✨ Zero-dependency terminal text animation engine: 12 effects, CLI + Python library, animated SVG/HTML/JSON export.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages