AppFlowy/frontend/scripts/white_label/font_white_label.sh
Lucas a5eb2cdd9a
feat: improve white label scripts on Windows (#7755)
* feat: improve white label scripts on Windows

* feat: add font white label script

* chore: integrate font white label script
2025-04-16 10:15:40 +08:00

198 lines
6 KiB
Bash

#!/bin/bash
show_usage() {
echo "Usage: $0 [options]"
echo "Options:"
echo " --font-path Set the path to the folder containing font files (.ttf or .otf files)"
echo " --font-family Set the name of the font family"
echo " --help Show this help message"
echo ""
echo "Example:"
echo " $0 --font-path \"/path/to/fonts\" --font-family \"CustomFont\""
}
FONT_PATH=""
FONT_FAMILY=""
TARGET_FONT_DIR="appflowy_flutter/assets/fonts/"
PUBSPEC_FILE="appflowy_flutter/pubspec.yaml"
BASE_APPEARANCE_FILE="appflowy_flutter/lib/workspace/application/settings/appearance/base_appearance.dart"
while [[ $# -gt 0 ]]; do
case $1 in
--font-path)
FONT_PATH="$2"
shift 2
;;
--font-family)
FONT_FAMILY="$2"
shift 2
;;
--help)
show_usage
exit 0
;;
*)
echo "Unknown option: $1"
show_usage
exit 1
;;
esac
done
# Validate required arguments
if [ -z "$FONT_PATH" ]; then
echo "Error: Font path is required"
show_usage
exit 1
fi
if [ -z "$FONT_FAMILY" ]; then
echo "Error: Font family name is required"
show_usage
exit 1
fi
# Check if source directory exists
if [ ! -d "$FONT_PATH" ]; then
echo "Error: Font directory not found at $FONT_PATH"
exit 1
fi
# Create target directory if it doesn't exist
mkdir -p "$TARGET_FONT_DIR"
# Clean existing fonts in target directory
echo "Cleaning existing fonts in $TARGET_FONT_DIR..."
rm -rf "$TARGET_FONT_DIR"/*
# Copy font files to target directory
echo "Copying font files from $FONT_PATH to $TARGET_FONT_DIR..."
found_fonts=false
for ext in ttf otf; do
if ls "$FONT_PATH"/*."$ext" >/dev/null 2>&1; then
cp "$FONT_PATH"/*."$ext" "$TARGET_FONT_DIR"/ 2>/dev/null && found_fonts=true
fi
done
if [ "$found_fonts" = false ]; then
echo "Error: No font files (.ttf or .otf) found in source directory"
exit 1
fi
# Generate font configuration for pubspec.yaml
echo "Generating font configuration..."
# Create temporary file for font configuration
TEMP_FILE=$(mktemp)
{
echo " # BEGIN: WHITE_LABEL_FONT"
echo " - family: $FONT_FAMILY"
echo " fonts:"
# Generate entries for each font file
for font_file in "$TARGET_FONT_DIR"/*; do
filename=$(basename "$font_file")
echo " - asset: assets/fonts/$filename"
# Try to detect font weight from filename
if [[ $filename =~ (Thin|ExtraLight|Light|Regular|Medium|SemiBold|Bold|ExtraBold|Black) ]]; then
case ${BASH_REMATCH[1]} in
"Thin") echo " weight: 100";;
"ExtraLight") echo " weight: 200";;
"Light") echo " weight: 300";;
"Regular") echo " weight: 400";;
"Medium") echo " weight: 500";;
"SemiBold") echo " weight: 600";;
"Bold") echo " weight: 700";;
"ExtraBold") echo " weight: 800";;
"Black") echo " weight: 900";;
esac
fi
# Try to detect italic style from filename
if [[ $filename =~ Italic ]]; then
echo " style: italic"
fi
done
echo " # END: WHITE_LABEL_FONT"
} > "$TEMP_FILE"
# Update pubspec.yaml
echo "Updating pubspec.yaml..."
if [ -f "$PUBSPEC_FILE" ]; then
# Create a backup of the original file
cp "$PUBSPEC_FILE" "${PUBSPEC_FILE}.bak"
if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then
# Windows-specific handling
# First, remove existing white label font configuration
awk '/# BEGIN: WHITE_LABEL_FONT/,/# END: WHITE_LABEL_FONT/{ next } /# White-label font configuration will be added here/{ print; system("cat '"$TEMP_FILE"'"); next } 1' "$PUBSPEC_FILE" > "${PUBSPEC_FILE}.tmp"
if [ $? -eq 0 ]; then
mv "${PUBSPEC_FILE}.tmp" "$PUBSPEC_FILE"
rm -f "${PUBSPEC_FILE}.bak"
else
echo "Error: Failed to update pubspec.yaml"
mv "${PUBSPEC_FILE}.bak" "$PUBSPEC_FILE"
rm -f "${PUBSPEC_FILE}.tmp"
rm -f "$TEMP_FILE"
exit 1
fi
else
# Unix-like systems handling
if sed --version >/dev/null 2>&1; then
SED_INPLACE="-i"
else
SED_INPLACE="-i ''"
fi
# Remove existing white label font configuration
sed $SED_INPLACE '/# BEGIN: WHITE_LABEL_FONT/,/# END: WHITE_LABEL_FONT/d' "$PUBSPEC_FILE"
# Add new font configuration
sed $SED_INPLACE "/# White-label font configuration will be added here/r $TEMP_FILE" "$PUBSPEC_FILE"
if [ $? -ne 0 ]; then
echo "Error: Failed to update pubspec.yaml"
mv "${PUBSPEC_FILE}.bak" "$PUBSPEC_FILE"
rm -f "$TEMP_FILE"
exit 1
fi
rm -f "${PUBSPEC_FILE}.bak"
fi
else
echo "Error: pubspec.yaml not found at $PUBSPEC_FILE"
rm -f "$TEMP_FILE"
exit 1
fi
# Update base_appearance.dart
echo "Updating base_appearance.dart..."
if [ -f "$BASE_APPEARANCE_FILE" ]; then
# Create a backup of the original file
cp "$BASE_APPEARANCE_FILE" "${BASE_APPEARANCE_FILE}.bak"
if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then
# Windows-specific handling
sed -i "s/const defaultFontFamily = '.*'/const defaultFontFamily = '$FONT_FAMILY'/" "$BASE_APPEARANCE_FILE"
else
# Unix-like systems handling
sed -i '' "s/const defaultFontFamily = '.*'/const defaultFontFamily = '$FONT_FAMILY'/" "$BASE_APPEARANCE_FILE"
fi
if [ $? -ne 0 ]; then
echo "Error: Failed to update base_appearance.dart"
mv "${BASE_APPEARANCE_FILE}.bak" "$BASE_APPEARANCE_FILE"
exit 1
fi
rm -f "${BASE_APPEARANCE_FILE}.bak"
else
echo "Error: base_appearance.dart not found at $BASE_APPEARANCE_FILE"
exit 1
fi
# Cleanup
rm -f "$TEMP_FILE"
echo "Font white labeling completed successfully!"