mirror of
https://github.com/felixfoertsch/EurKEY-macOS.git
synced 2026-04-16 14:38:28 +02:00
- rename v2.0 → EurKEY Next across all files, scripts, workflows, website - rename bundle EurKey-macOS → EurKEY-macOS - add §/± to ¬ dead key (¬+s → §, ¬+S → ±) for ANSI keyboard compatibility - normalize Caps Lock = Shift across all four layouts, remove custom Caps bindings - fix v1.4: revert accidental Caps/ẞ changes, correct changelog to super/subscript swap - update README: remove duplicate v1.2–v1.4 changelog, reorder versions (Next first) - update website: ISO+ANSI feature card, EurKEY Next branding, consistent version order Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
139 lines
3.9 KiB
Bash
Executable File
139 lines
3.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Build and validate the EurKEY-macOS keyboard layout bundle.
|
|
#
|
|
# Regenerates Info.plist with correct KLInfo entries for all layout versions,
|
|
# sets the bundle version, and validates the bundle structure.
|
|
#
|
|
# Usage: bash scripts/build-bundle.sh [--version YYYY.MM.DD]
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
BUILD_DIR="${PROJECT_DIR}/build"
|
|
BUNDLE_DIR="${BUILD_DIR}/EurKEY-Next.bundle"
|
|
CONTENTS_DIR="${BUNDLE_DIR}/Contents"
|
|
RESOURCES_DIR="${CONTENTS_DIR}/Resources"
|
|
|
|
# parse arguments
|
|
VERSION="${1:-$(date +%Y.%m.%d)}"
|
|
if [[ "${1:-}" == "--version" ]]; then
|
|
VERSION="${2:?missing version argument}"
|
|
fi
|
|
|
|
BUNDLE_ID="de.felixfoertsch.keyboardlayout.EurKEY-Next"
|
|
BUNDLE_NAME="EurKEY-Next"
|
|
|
|
# layout names to include (EurKEY Next is the main layout, others are legacy versions)
|
|
LAYOUTS=("EurKEY Next" "EurKEY v1.4" "EurKEY v1.3" "EurKEY v1.2")
|
|
|
|
SRC_DIR="${PROJECT_DIR}/src"
|
|
|
|
echo "Building ${BUNDLE_NAME} ${VERSION}"
|
|
echo "Bundle: ${BUNDLE_DIR}"
|
|
echo
|
|
|
|
# --- generate icons from SVG sources ---
|
|
bash "${SCRIPT_DIR}/build-icons.sh"
|
|
|
|
# --- assemble bundle from src/ ---
|
|
rm -rf "${BUNDLE_DIR}"
|
|
mkdir -p "${RESOURCES_DIR}"
|
|
|
|
for layout in "${LAYOUTS[@]}"; do
|
|
cp "${SRC_DIR}/keylayouts/${layout}.keylayout" "${RESOURCES_DIR}/"
|
|
cp "${SRC_DIR}/icons/${layout}.icns" "${RESOURCES_DIR}/"
|
|
done
|
|
|
|
for lang in en de es; do
|
|
mkdir -p "${RESOURCES_DIR}/${lang}.lproj"
|
|
cp "${SRC_DIR}/lproj/${lang}.lproj/InfoPlist.strings" "${RESOURCES_DIR}/${lang}.lproj/"
|
|
done
|
|
|
|
echo "Assembled bundle from src/"
|
|
|
|
# --- generate Info.plist ---
|
|
cat > "${CONTENTS_DIR}/Info.plist" << 'PLIST_HEADER'
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>CFBundleIdentifier</key>
|
|
PLIST_HEADER
|
|
|
|
echo " <string>${BUNDLE_ID}</string>" >> "${CONTENTS_DIR}/Info.plist"
|
|
|
|
cat >> "${CONTENTS_DIR}/Info.plist" << 'PLIST_NAME'
|
|
<key>CFBundleName</key>
|
|
PLIST_NAME
|
|
|
|
echo " <string>${BUNDLE_NAME}</string>" >> "${CONTENTS_DIR}/Info.plist"
|
|
|
|
cat >> "${CONTENTS_DIR}/Info.plist" << 'PLIST_VERSION'
|
|
<key>CFBundleVersion</key>
|
|
PLIST_VERSION
|
|
|
|
echo " <string>${VERSION}</string>" >> "${CONTENTS_DIR}/Info.plist"
|
|
|
|
# add KLInfo for each layout
|
|
for layout in "${LAYOUTS[@]}"; do
|
|
# generate input source ID: bundle id + layout name lowercased, spaces removed
|
|
source_id_suffix=$(echo "${layout}" | tr '[:upper:]' '[:lower:]' | tr -d ' ')
|
|
source_id="${BUNDLE_ID}.${source_id_suffix}"
|
|
|
|
cat >> "${CONTENTS_DIR}/Info.plist" << KLINFO_ENTRY
|
|
<key>KLInfo_${layout}</key>
|
|
<dict>
|
|
<key>TICapsLockLanguageSwitchCapable</key>
|
|
<true/>
|
|
<key>TISIconIsTemplate</key>
|
|
<true/>
|
|
<key>TISInputSourceID</key>
|
|
<string>${source_id}</string>
|
|
<key>TISIntendedLanguage</key>
|
|
<string>en</string>
|
|
</dict>
|
|
KLINFO_ENTRY
|
|
done
|
|
|
|
cat >> "${CONTENTS_DIR}/Info.plist" << 'PLIST_FOOTER'
|
|
</dict>
|
|
</plist>
|
|
PLIST_FOOTER
|
|
|
|
echo "Generated Info.plist with ${#LAYOUTS[@]} layout entries"
|
|
|
|
# --- generate version.plist ---
|
|
cat > "${CONTENTS_DIR}/version.plist" << VPLIST
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>BuildVersion</key>
|
|
<string>${VERSION}</string>
|
|
<key>ProjectName</key>
|
|
<string>${BUNDLE_NAME}</string>
|
|
<key>SourceVersion</key>
|
|
<string>${VERSION}</string>
|
|
</dict>
|
|
</plist>
|
|
VPLIST
|
|
|
|
echo "Generated version.plist (${VERSION})"
|
|
|
|
# --- validate with plutil ---
|
|
if command -v plutil &> /dev/null; then
|
|
plutil -lint "${CONTENTS_DIR}/Info.plist" || exit 1
|
|
plutil -lint "${CONTENTS_DIR}/version.plist" || exit 1
|
|
echo "plist validation passed"
|
|
fi
|
|
|
|
# --- run layout validation ---
|
|
if [[ -f "${SCRIPT_DIR}/validate_layouts.py" ]]; then
|
|
echo
|
|
python3 "${SCRIPT_DIR}/validate_layouts.py" || exit 1
|
|
fi
|
|
|
|
echo
|
|
echo "Bundle build complete: ${BUNDLE_DIR}"
|
|
echo "Version: ${VERSION}"
|