143 lines
5.4 KiB
Bash
Executable File
143 lines
5.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# 字体下载脚本:思源宋体 + 思源黑体 + 霞鹜文楷
|
||
# 用法:bash .opencode/templates/fonts/download-fonts.sh
|
||
# 许可:全部 SIL OFL,可自由商用、嵌入 PDF 分发
|
||
|
||
set -euo pipefail
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
FONTS_DIR="$SCRIPT_DIR"
|
||
|
||
echo "====================================="
|
||
echo "Deep Research 字体下载"
|
||
echo "目标目录:$FONTS_DIR"
|
||
echo "====================================="
|
||
|
||
# 检测下载工具
|
||
if command -v curl >/dev/null 2>&1; then
|
||
DOWNLOADER="curl -fL --retry 3 --retry-delay 5 -o"
|
||
elif command -v wget >/dev/null 2>&1; then
|
||
DOWNLOADER="wget -O"
|
||
else
|
||
echo "❌ 需要 curl 或 wget,请先安装"
|
||
exit 1
|
||
fi
|
||
|
||
# 字体清单:文件名 | 下载 URL
|
||
# 思源字体走 adobe-fonts GitHub Release 的 "Language Specific OTFs Simplified Chinese" 包
|
||
# 霞鹜文楷走 lxgw/LxgwWenKai Release
|
||
declare -a FONTS=(
|
||
"SourceHanSerifSC-Regular.otf|https://github.com/adobe-fonts/source-han-serif/raw/release/SubsetOTF/CN/SourceHanSerifCN-Regular.otf"
|
||
"SourceHanSerifSC-Bold.otf|https://github.com/adobe-fonts/source-han-serif/raw/release/SubsetOTF/CN/SourceHanSerifCN-Bold.otf"
|
||
"SourceHanSansSC-Light.otf|https://github.com/adobe-fonts/source-han-sans/raw/release/SubsetOTF/CN/SourceHanSansCN-Light.otf"
|
||
"SourceHanSansSC-Medium.otf|https://github.com/adobe-fonts/source-han-sans/raw/release/SubsetOTF/CN/SourceHanSansCN-Medium.otf"
|
||
"SourceHanSansSC-Bold.otf|https://github.com/adobe-fonts/source-han-sans/raw/release/SubsetOTF/CN/SourceHanSansCN-Bold.otf"
|
||
"SourceHanSansSC-Heavy.otf|https://github.com/adobe-fonts/source-han-sans/raw/release/SubsetOTF/CN/SourceHanSansCN-Heavy.otf"
|
||
"LXGWWenKai-Regular.ttf|https://github.com/lxgw/LxgwWenKai/releases/download/v1.330/LXGWWenKai-Regular.ttf"
|
||
)
|
||
|
||
# 备用镜像(主源失败时用)
|
||
declare -a MIRRORS=(
|
||
"SourceHanSerifSC-Regular.otf|https://raw.githubusercontent.com/adobe-fonts/source-han-serif/release/SubsetOTF/CN/SourceHanSerifCN-Regular.otf"
|
||
"SourceHanSerifSC-Bold.otf|https://raw.githubusercontent.com/adobe-fonts/source-han-serif/release/SubsetOTF/CN/SourceHanSerifCN-Bold.otf"
|
||
"SourceHanSansSC-Light.otf|https://raw.githubusercontent.com/adobe-fonts/source-han-sans/release/SubsetOTF/CN/SourceHanSansCN-Light.otf"
|
||
"SourceHanSansSC-Medium.otf|https://raw.githubusercontent.com/adobe-fonts/source-han-sans/release/SubsetOTF/CN/SourceHanSansCN-Medium.otf"
|
||
"SourceHanSansSC-Bold.otf|https://raw.githubusercontent.com/adobe-fonts/source-han-sans/release/SubsetOTF/CN/SourceHanSansCN-Bold.otf"
|
||
"SourceHanSansSC-Heavy.otf|https://raw.githubusercontent.com/adobe-fonts/source-han-sans/release/SubsetOTF/CN/SourceHanSansCN-Heavy.otf"
|
||
"LXGWWenKai-Regular.ttf|https://ghproxy.com/https://github.com/lxgw/LxgwWenKai/releases/download/v1.330/LXGWWenKai-Regular.ttf"
|
||
)
|
||
|
||
download_font() {
|
||
local filename="$1"
|
||
local url="$2"
|
||
local target="$FONTS_DIR/$filename"
|
||
|
||
if [[ -f "$target" ]]; then
|
||
local size
|
||
size=$(stat -f%z "$target" 2>/dev/null || stat -c%s "$target" 2>/dev/null || echo 0)
|
||
if [[ $size -gt 100000 ]]; then
|
||
echo " ✓ 已存在($size bytes),跳过:$filename"
|
||
return 0
|
||
else
|
||
echo " ⚠ 文件过小($size bytes),重新下载:$filename"
|
||
rm -f "$target"
|
||
fi
|
||
fi
|
||
|
||
echo " ↓ 下载 $filename ..."
|
||
if $DOWNLOADER "$target" "$url" 2>/dev/null; then
|
||
local size
|
||
size=$(stat -f%z "$target" 2>/dev/null || stat -c%s "$target" 2>/dev/null || echo 0)
|
||
if [[ $size -gt 100000 ]]; then
|
||
echo " ✓ 完成($size bytes)"
|
||
return 0
|
||
else
|
||
echo " ⚠ 下载的文件过小,可能失败"
|
||
rm -f "$target"
|
||
return 1
|
||
fi
|
||
else
|
||
echo " ✗ 下载失败"
|
||
rm -f "$target"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
get_mirror_url() {
|
||
local filename="$1"
|
||
for entry in "${MIRRORS[@]}"; do
|
||
IFS='|' read -r fn url <<< "$entry"
|
||
if [[ "$fn" == "$filename" ]]; then
|
||
echo "$url"
|
||
return 0
|
||
fi
|
||
done
|
||
return 1
|
||
}
|
||
|
||
echo ""
|
||
echo "开始下载..."
|
||
echo ""
|
||
|
||
FAILED=()
|
||
for entry in "${FONTS[@]}"; do
|
||
IFS='|' read -r filename url <<< "$entry"
|
||
if ! download_font "$filename" "$url"; then
|
||
# 主源失败,试镜像
|
||
mirror_url=$(get_mirror_url "$filename" || true)
|
||
if [[ -n "$mirror_url" ]]; then
|
||
echo " ↻ 尝试镜像..."
|
||
if download_font "$filename" "$mirror_url"; then
|
||
continue
|
||
fi
|
||
fi
|
||
FAILED+=("$filename")
|
||
fi
|
||
done
|
||
|
||
echo ""
|
||
echo "====================================="
|
||
|
||
if [[ ${#FAILED[@]} -eq 0 ]]; then
|
||
echo "✅ 全部字体下载成功!"
|
||
echo ""
|
||
echo "字体文件清单:"
|
||
ls -lh "$FONTS_DIR" | grep -E '\.(otf|ttf)$' || true
|
||
echo ""
|
||
echo "许可证:全部 SIL OFL,可自由商用、嵌入 PDF 分发。"
|
||
exit 0
|
||
else
|
||
echo "❌ 以下字体下载失败:"
|
||
for f in "${FAILED[@]}"; do
|
||
echo " - $f"
|
||
done
|
||
echo ""
|
||
echo "请手动下载,并放入 $FONTS_DIR/"
|
||
echo ""
|
||
echo "手动下载链接:"
|
||
echo " 思源宋体:https://github.com/adobe-fonts/source-han-serif/releases"
|
||
echo " 思源黑体:https://github.com/adobe-fonts/source-han-sans/releases"
|
||
echo " 霞鹜文楷:https://github.com/lxgw/LxgwWenKai/releases"
|
||
exit 1
|
||
fi
|