Fuse Fonts #696
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Fuse Fonts | |
on: | |
schedule: | |
- cron: "*/5 * * * *" | |
push: | |
branches: | |
- "**" | |
workflow_dispatch: | |
inputs: | |
FORCE: | |
description: Skip checking updates & Force to fuse | |
type: boolean | |
default: false | |
required: false | |
env: | |
FORCE: ${{ github.event.inputs.FORCE }} | |
JETBRAINS_GIT_URL: ${{ github.server_url }}/JetBrains/JetBrainsMono.git | |
JETBRAINS_LATEST_Release_API_URL: ${{ github.api_url }}/repos/JetBrains/JetBrainsMono/releases/latest | |
JETBRAINS_COPYRIGHT: Copyright 2020 The JetBrains Mono Project Authors (${{ github.server_url }}/JetBrains/JetBrainsMono) | |
MAPLE_GIT_URL: ${{ github.server_url }}/subframe7536/maple-font.git | |
MAPLE_LATEST_Release_API_URL: ${{ github.api_url }}/repos/subframe7536/maple-font/releases/latest | |
MAPLE_COPYRIGHT: Copyright 2022 The Maple Mono Project Authors (${{ github.server_url }}/subframe7536/maple-font) | |
FUSION_NAME: JetBrains Maple Mono | |
FUSION_ID: JetBrainsMapleMono | |
FUSION_DESCRIPTION: The free and open-source font fused with JetBrains Mono & Maple Mono | |
FUSION_DEVELOPER: Space Time | |
FUSION_URL: ${{ github.server_url }}/${{ github.repository }} | |
FUSION_COPYRIGHT: Copyright 2025 Space Time (${{ github.server_url }}/${{ github.repository }}) | |
FUSION_LICENSE: "This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: https://openfontlicense.org" | |
jobs: | |
update-run-time: | |
name: Update Run Time | |
runs-on: ubuntu-latest | |
continue-on-error: true | |
steps: | |
- name: Fetch Git Folder & Readme | |
uses: actions/checkout@v4 | |
with: | |
sparse-checkout: | | |
.git | |
README.md | |
- name: Get Current Time | |
run: | | |
UTC_TIME="$(date -u "+%Y-%m-%d %H:%M:%S")" | |
BJT_TIME="$(TZ="Asia/Shanghai" date "+%Y-%m-%d %H:%M:%S")" | |
echo "UTC_TIME="$UTC_TIME"" >> "$GITHUB_ENV" | |
echo "BJT_TIME="$BJT_TIME"" >> "$GITHUB_ENV" | |
echo "UTC Time: $UTC_TIME" | |
echo "BJT Time: $BJT_TIME" | |
- name: Update Readme | |
run: | | |
sed -i "s|\(<!--UTC_TIME-->\).*\(<!--UTC_TIME-->\)|\1$UTC_TIME\2|g" "README.md" | |
sed -i "s|\(<!--BJT_TIME-->\).*\(<!--BJT_TIME-->\)|\1$BJT_TIME\2|g" "README.md" | |
- name: Commit Changes | |
run: | | |
git config user.name "github-actions[bot]" | |
git config user.email "github-actions[bot]@users.noreply.github.com" | |
git add "README.md" | |
git commit -m "Update Run Time: $BJT_TIME" | |
git pull --rebase "origin" "main" | |
git push | |
check-release-updates: | |
name: Check Release Updates | |
runs-on: ubuntu-latest | |
outputs: | |
IS_RELEASE_UPDATED: ${{ steps.check-release-updates.outputs.IS_RELEASE_UPDATED }} | |
JETBRAINS_LATEST_VERSION: ${{ steps.check-release-updates.outputs.JETBRAINS_LATEST_VERSION }} | |
MAPLE_LATEST_VERSION: ${{ steps.check-release-updates.outputs.MAPLE_LATEST_VERSION }} | |
steps: | |
- name: Fetch Git Folder | |
uses: actions/checkout@v4 | |
with: | |
sparse-checkout: .git | |
- name: Get Previous Run Id | |
run: | | |
PREV_RUN_ID="$(gh run list --workflow "$GITHUB_WORKFLOW" --limit 2 --json "databaseId" --jq ".[1].databaseId")" | |
echo "PREV_RUN_ID="$PREV_RUN_ID"" >> "$GITHUB_ENV" | |
echo "Previous Run Id: $PREV_RUN_ID" | |
env: | |
GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} | |
- name: Download Previous Versions | |
continue-on-error: true | |
uses: actions/download-artifact@v4 | |
with: | |
name: Versions | |
run-id: ${{ env.PREV_RUN_ID }} | |
github-token: ${{ secrets.GH_TOKEN }} | |
- name: Check Release Updates | |
id: check-release-updates | |
run: | | |
JETBRAINS_PREV_VERSION="$(cat "jetbrains_version.txt" 2> "/dev/null" || echo "")" | |
MAPLE_PREV_VERSION="$(cat "maple_version.txt" 2> "/dev/null" || echo "")" | |
JETBRAINS_LATEST_VERSION="$(curl -s "$JETBRAINS_LATEST_Release_API_URL" | jq -r ".tag_name")" | |
MAPLE_LATEST_VERSION="$(curl -s "$MAPLE_LATEST_Release_API_URL" | jq -r ".tag_name")" | |
if [[ "$FORCE" == "true" || "$JETBRAINS_PREV_VERSION" != "$JETBRAINS_LATEST_VERSION" || "$MAPLE_PREV_VERSION" != "$MAPLE_LATEST_VERSION" ]]; then | |
echo "IS_RELEASE_UPDATED=true" >> "$GITHUB_OUTPUT" | |
echo "JETBRAINS_LATEST_VERSION="$JETBRAINS_LATEST_VERSION"" >> "$GITHUB_OUTPUT" | |
echo "MAPLE_LATEST_VERSION="$MAPLE_LATEST_VERSION"" >> "$GITHUB_OUTPUT" | |
echo "$JETBRAINS_LATEST_VERSION" > "jetbrains_version.txt" | |
echo "$MAPLE_LATEST_VERSION" > "maple_version.txt" | |
else | |
echo "IS_RELEASE_UPDATED=false" >> "$GITHUB_OUTPUT" | |
fi | |
echo "Previous JetBrains Version: $JETBRAINS_PREV_VERSION" | |
echo "Previous Maple Version: $MAPLE_PREV_VERSION" | |
echo "Latest JetBrains Version: $JETBRAINS_LATEST_VERSION" | |
echo "Latest Maple Version: $MAPLE_LATEST_VERSION" | |
- name: Upload Latest Versions | |
uses: actions/upload-artifact@v4 | |
with: | |
name: Versions | |
path: "*_version.txt" | |
check-commit-updates: | |
name: Check Commit Updates | |
runs-on: ubuntu-latest | |
outputs: | |
IS_COMMIT_UPDATED: ${{ steps.check-commit-updates.outputs.IS_COMMIT_UPDATED }} | |
JETBRAINS_LATEST_HASH: ${{ steps.check-commit-updates.outputs.JETBRAINS_LATEST_HASH }} | |
MAPLE_LATEST_HASH: ${{ steps.check-commit-updates.outputs.MAPLE_LATEST_HASH }} | |
steps: | |
- name: Fetch Git Folder | |
uses: actions/checkout@v4 | |
with: | |
sparse-checkout: .git | |
- name: Get Previous Run Id | |
run: | | |
PREV_RUN_ID="$(gh run list --workflow "$GITHUB_WORKFLOW" --limit 2 --json "databaseId" --jq ".[1].databaseId")" | |
echo "PREV_RUN_ID="$PREV_RUN_ID"" >> "$GITHUB_ENV" | |
echo "Previous Run Id: $PREV_RUN_ID" | |
env: | |
GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} | |
- name: Download Previous Hashes | |
continue-on-error: true | |
uses: actions/download-artifact@v4 | |
with: | |
name: Hashes | |
run-id: ${{ env.PREV_RUN_ID }} | |
github-token: ${{ secrets.GH_TOKEN }} | |
- name: Check Commit Updates | |
id: check-commit-updates | |
run: | | |
JETBRAINS_PREV_HASH="$(cat "jetbrains_hash.txt" 2> "/dev/null" || echo "")" | |
MAPLE_PREV_HASH="$(cat "maple_hash.txt" 2> "/dev/null" || echo "")" | |
JETBRAINS_LATEST_HASH="$(git ls-remote --heads "$JETBRAINS_GIT_URL" "master" | cut "-c1-7")" | |
MAPLE_LATEST_HASH="$(git ls-remote --heads "$MAPLE_GIT_URL" "variable" | cut "-c1-7")" | |
if [[ "$FORCE" == "true" || "$JETBRAINS_PREV_HASH" != "$JETBRAINS_LATEST_HASH" || "$MAPLE_PREV_HASH" != "$MAPLE_LATEST_HASH" ]]; then | |
echo "IS_COMMIT_UPDATED=true" >> "$GITHUB_OUTPUT" | |
echo "JETBRAINS_LATEST_HASH="$JETBRAINS_LATEST_HASH"" >> "$GITHUB_OUTPUT" | |
echo "MAPLE_LATEST_HASH="$MAPLE_LATEST_HASH"" >> "$GITHUB_OUTPUT" | |
echo "$JETBRAINS_LATEST_HASH" > "jetbrains_hash.txt" | |
echo "$MAPLE_LATEST_HASH" > "maple_hash.txt" | |
else | |
echo "IS_COMMIT_UPDATED=false" >> "$GITHUB_OUTPUT" | |
fi | |
echo "Previous JetBrains Hash: $JETBRAINS_PREV_HASH" | |
echo "Previous Maple Hash: $MAPLE_PREV_HASH" | |
echo "Latest JetBrains Hash: $JETBRAINS_LATEST_HASH" | |
echo "Latest Maple Hash: $MAPLE_LATEST_HASH" | |
- name: Upload Latest Hashes | |
uses: actions/upload-artifact@v4 | |
with: | |
name: Hashes | |
path: "*_hash.txt" | |
fuse-fonts: | |
name: Fuse Fonts | |
runs-on: ubuntu-latest | |
needs: | |
- check-release-updates | |
- check-commit-updates | |
if: ${{ needs.check-release-updates.outputs.IS_RELEASE_UPDATED == 'true' || needs.check-commit-updates.outputs.IS_COMMIT_UPDATED == 'true' }} | |
strategy: | |
fail-fast: false | |
matrix: | |
MODE: | |
- Release | |
- Commit | |
NERD: | |
- SUFFIX: NF | |
ARGS: --nerd-font | |
- SUFFIX: XX | |
ARGS: --no-nerd-font | |
NARROW: | |
- SUFFIX: NR | |
ARGS: --cn-narrow | |
- SUFFIX: XX | |
ARGS: "" | |
env: | |
JETBRAINS_LATEST_VERSION: ${{ needs.check-release-updates.outputs.JETBRAINS_LATEST_VERSION }} | |
JETBRAINS_LATEST_HASH: ${{ needs.check-commit-updates.outputs.JETBRAINS_LATEST_HASH }} | |
MAPLE_LATEST_VERSION: ${{ needs.check-release-updates.outputs.MAPLE_LATEST_VERSION }} | |
MAPLE_LATEST_HASH: ${{ needs.check-commit-updates.outputs.MAPLE_LATEST_HASH }} | |
MODE: ${{ matrix.MODE }} | |
NERD_SUFFIX: ${{ matrix.NERD.SUFFIX }} | |
NERD_ARGS: ${{ matrix.NERD.ARGS }} | |
NARROW_SUFFIX: ${{ matrix.NARROW.SUFFIX }} | |
NARROW_ARGS: ${{ matrix.NARROW.ARGS }} | |
steps: | |
- name: Fetch Python Script & OFL License | |
uses: actions/checkout@v4 | |
with: | |
sparse-checkout: | | |
fuse_fonts.ff | |
OFL.txt | |
- name: Generate Version | |
run: | | |
if [[ "$MODE" == "Release" ]]; then | |
FUSION_VERSION="1.$(tr -d "." <<< "${JETBRAINS_LATEST_VERSION//v/}").$(tr -d "." <<< "${MAPLE_LATEST_VERSION//v/}")" | |
else | |
FUSION_VERSION="pre" | |
fi | |
echo "FUSION_VERSION="$FUSION_VERSION"" >> $GITHUB_ENV | |
echo "Version: $FUSION_VERSION" | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: 3.x | |
check-latest: true | |
- name: Build JetBrains | |
run: | | |
if [[ "$MODE" == "Release" ]]; then | |
git clone --branch "$JETBRAINS_LATEST_VERSION" --single-branch "$JETBRAINS_GIT_URL" | |
else | |
git clone --depth 1 "$JETBRAINS_GIT_URL" | |
fi | |
cd "JetBrainsMono" | |
pip install -r "requirements.txt" | |
gftools builder "sources/config.yaml" | |
cd ".." | |
mkdir -p "source-fonts/jetbrains" | |
cp -r "JetBrainsMono/fonts/ttf/"* "source-fonts/jetbrains/" | |
- name: Build Maple | |
run: | | |
if [[ "$MODE" == "Release" ]]; then | |
git clone --branch "$MAPLE_LATEST_VERSION" --single-branch "$MAPLE_GIT_URL" | |
else | |
git clone --depth 1 "$MAPLE_GIT_URL" | |
fi | |
cd "maple-font" | |
pip install -r "requirements.txt" | |
python "build.py" --normal --liga --cn --hinted --ttf-only "$NERD_ARGS" $NARROW_ARGS | |
cd ".." | |
mkdir -p "source-fonts/maple" | |
if [[ "$NERD_SUFFIX" == "NF" ]]; then | |
cp -r "maple-font/fonts/NF-CN/"* "source-fonts/maple/" | |
else | |
cp -r "maple-font/fonts/CN/"* "source-fonts/maple/" | |
fi | |
- name: Install FontForge | |
run: sudo apt-get -y install "fontforge" | |
- name: Fuse Fonts | |
run: | | |
mkdir -p "fused-fonts-HT" | |
mkdir -p "fused-fonts-XX" | |
for STYLE in "Thin" "ThinItalic" "ExtraLight" "ExtraLightItalic" "Light" "LightItalic" "Regular" "Italic" "Medium" "MediumItalic" "SemiBold" "SemiBoldItalic" "Bold" "BoldItalic" "ExtraBold" "ExtraBoldItalic"; do | |
if [[ "$NERD_SUFFIX" == "NF" ]]; then | |
fontforge "fuse_fonts.ff" \ | |
"source-fonts/maple/MapleMonoNormal-NF-CN-$STYLE.ttf" \ | |
"source-fonts/jetbrains/JetBrainsMono-$STYLE.ttf" \ | |
"$FUSION_ID-$STYLE" \ | |
"$FUSION_NAME" \ | |
"$FUSION_NAME $STYLE" \ | |
"$STYLE" \ | |
"fused-font-HT.ttf" | |
else | |
fontforge "fuse_fonts.ff" \ | |
"source-fonts/maple/MapleMonoNormal-CN-$STYLE.ttf" \ | |
"source-fonts/jetbrains/JetBrainsMono-$STYLE.ttf" \ | |
"$FUSION_ID-$STYLE" \ | |
"$FUSION_NAME" \ | |
"$FUSION_NAME $STYLE" \ | |
"$STYLE" \ | |
"fused-font-HT.ttf" | |
fi | |
gftools rename-font "fused-font-HT.ttf" "$FUSION_NAME" | |
gftools update-nameids "fused-font-HT.ttf" \ | |
--uniqueid "$FUSION_ID-$STYLE-$FUSION_VERSION" \ | |
--description "$FUSION_DESCRIPTION" \ | |
--designer "$FUSION_DEVELOPER" \ | |
--manufacturer "$FUSION_DEVELOPER" \ | |
--trademark "$FUSION_NAME" \ | |
--version "$FUSION_VERSION" \ | |
--copyright "$(echo -e "$JETBRAINS_COPYRIGHT\n$MAPLE_COPYRIGHT\n$FUSION_COPYRIGHT")" \ | |
--license "$FUSION_LICENSE" \ | |
--urlvendor "https://github.com/SpaceTimee/Fusion-JetBrainsMapleMono" \ | |
--urldesigner "https://www.spacetimee.xyz" \ | |
--urllicense "https://openfontlicense.org" | |
gftools drop-hints "fused-font-HT.ttf.fix" "fused-font-XX.ttf.fix" | |
mv "fused-font-HT.ttf.fix" "fused-fonts-HT/$FUSION_ID-$STYLE.ttf" | |
mv "fused-font-XX.ttf.fix" "fused-fonts-XX/$FUSION_ID-$STYLE.ttf" | |
cp "OFL.txt" "fused-fonts-HT/LICENSE.txt" | |
cp "OFL.txt" "fused-fonts-XX/LICENSE.txt" | |
done | |
- name: Zip Fonts | |
run: | | |
zip -r -j "$FUSION_ID-$NERD_SUFFIX-$NARROW_SUFFIX-HT.zip" "fused-fonts-HT/" | |
zip -r -j "$FUSION_ID-$NERD_SUFFIX-$NARROW_SUFFIX-XX.zip" "fused-fonts-XX/" | |
- name: Release Release Fonts | |
if: ${{ env.MODE == 'Release' }} | |
uses: softprops/action-gh-release@v2 | |
with: | |
files: | | |
${{ env.FUSION_ID }}-${{ env.NERD_SUFFIX }}-${{ env.NARROW_SUFFIX }}-HT.zip | |
${{ env.FUSION_ID }}-${{ env.NERD_SUFFIX }}-${{ env.NARROW_SUFFIX }}-XX.zip | |
tag_name: ${{ env.FUSION_VERSION }} | |
name: ${{ env.FUSION_VERSION }} | |
body: > | |
Fused with | |
[JetBrains Mono ${{ env.JETBRAINS_LATEST_VERSION }}](${{ github.server_url }}/JetBrains/JetBrainsMono/releases/tag/${{ env.JETBRAINS_LATEST_VERSION }}) & | |
[Maple Mono ${{ env.MAPLE_LATEST_VERSION }}](${{ github.server_url }}/subframe7536/maple-font/releases/tag/${{ env.MAPLE_LATEST_VERSION }}) | |
Built with | |
[Github Workflow #${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) | |
[不知道下载哪个?](${{ env.FUSION_URL }}?tab=readme-ov-file#下载哪个) | |
draft: false | |
prerelease: false | |
make_latest: true | |
token: ${{ secrets.GH_TOKEN }} | |
- name: Release Commit Fonts | |
if: ${{ env.MODE == 'Commit' }} | |
uses: softprops/action-gh-release@v2 | |
with: | |
files: | | |
${{ env.FUSION_ID }}-${{ env.NERD_SUFFIX }}-${{ env.NARROW_SUFFIX }}-HT.zip | |
${{ env.FUSION_ID }}-${{ env.NERD_SUFFIX }}-${{ env.NARROW_SUFFIX }}-XX.zip | |
tag_name: ${{ env.FUSION_VERSION }} | |
name: ${{ env.FUSION_VERSION }} | |
body: > | |
Fused with | |
[JetBrains Mono ${{ env.JETBRAINS_LATEST_HASH }}](${{ github.server_url }}/JetBrains/JetBrainsMono/commit/${{ env.JETBRAINS_LATEST_HASH }}) & | |
[Maple Mono ${{ env.MAPLE_LATEST_HASH }}](${{ github.server_url }}/subframe7536/maple-font/commit/${{ env.MAPLE_LATEST_HASH }}) | |
Built with | |
[Github Workflow #${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) | |
[不知道下载哪个?](${{ env.FUSION_URL }}?tab=readme-ov-file#下载哪个) | |
draft: false | |
prerelease: true | |
make_latest: false | |
token: ${{ secrets.GH_TOKEN }} |