Skip to content

Fuse Fonts

Fuse Fonts #695

Workflow file for this run

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 }}