Last active
February 13, 2024 11:57
-
-
Save DmytroLisitsyn/81ce342a116779e34a59aa1762fda119 to your computer and use it in GitHub Desktop.
Gwyneira - asset constants generator
This file contains hidden or 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
#!/bin/bash | |
set -e | |
CATALOGS=$@ | |
ASSETS=() | |
MAKE_SPACING() { | |
local DEPTH=$1 | |
local STEP=" " | |
local SPACING="" | |
for (( I=0; I<$DEPTH; I++ )); do | |
SPACING="$STEP$SPACING" | |
done | |
echo "$SPACING" | |
} | |
HANDLE_KEYWORD() { | |
case $1 in | |
"continue"|"switch"|"default"|"static"|"final"|"class"|"struct"|"import"|"extension"|"return"|"try"|"break"|"case"|"super"|"private"|"public"|"internal"|"guard"|"self | |
"|"while"|"catch"|"true"|"false"|"override"|"lazy") | |
echo "\`$1\`";; | |
*) | |
echo $1;; | |
esac | |
} | |
LOWERCASE_FIRST_LETTER() { | |
echo "$(tr '[:upper:]' '[:lower:]' <<< ${1:0:1})${1:1}" | |
} | |
MAKE_ENTRY() { | |
local KEY="$1" | |
local ENTRY="$2" | |
local DEPTH="$3" | |
local SPACING=$(MAKE_SPACING $DEPTH) | |
local NAME="${ENTRY//[[:blank:]]/}" | |
NAME=$(LOWERCASE_FIRST_LETTER $NAME) | |
NAME=${NAME//%[@d]/} | |
NAME=$(HANDLE_KEYWORD $NAME) | |
echo "${SPACING}static var $NAME: UIImage { return $ENTITY_TITLE.image(\"$KEY\") }" | |
} | |
MAKE_ENTRIES() { | |
local DEPTH=$1 | |
local HIERARCHY=() | |
local HIERARCHY_DEPTH=0 | |
for ASSET in "${ASSETS[@]}"; do | |
local PATH_COMPONENTS=() | |
IFS='/' | |
read -ra PATH_COMPONENTS <<< "$ASSET" | |
unset IFS | |
local KEY=${PATH_COMPONENTS[${#PATH_COMPONENTS[@]}-1]} | |
local COMPONENTS=() | |
IFS='.' | |
read -ra COMPONENTS <<< "$KEY" | |
unset IFS | |
local LENGTH=${#COMPONENTS[@]} | |
local NEW_HIERARCHY_DEPTH=$(expr $LENGTH - 1) | |
local NEW_HIERARCHY=(${COMPONENTS[@]:0:$NEW_HIERARCHY_DEPTH}) | |
local ENTRY=${COMPONENTS[$NEW_HIERARCHY_DEPTH]} | |
local MAX_COMMON_HIERARCHY_DEPTH=$(( $NEW_HIERARCHY_DEPTH<$HIERARCHY_DEPTH ? $NEW_HIERARCHY_DEPTH : $HIERARCHY_DEPTH )) | |
local COMMON_HIERARCHY_DEPTH=0 | |
for (( I=0; I<$MAX_COMMON_HIERARCHY_DEPTH; I++ )); do | |
if [[ "${HIERARCHY[$I]}" == "${NEW_HIERARCHY[$I]}" ]]; then | |
COMMON_HIERARCHY_DEPTH=$(expr $COMMON_HIERARCHY_DEPTH + 1) | |
else | |
break | |
fi | |
done | |
local BRACKETS_TO_CLOSE=$(expr $HIERARCHY_DEPTH - $COMMON_HIERARCHY_DEPTH) | |
for (( I=$HIERARCHY_DEPTH-1; I>=$COMMON_HIERARCHY_DEPTH; I-- )); do | |
local SPACING=$(MAKE_SPACING $(expr $I + $DEPTH)) | |
echo "${SPACING}}" | |
done | |
for (( I=$COMMON_HIERARCHY_DEPTH; I<$NEW_HIERARCHY_DEPTH; ++I )); do | |
local SPACING=$(MAKE_SPACING $(expr $I + $DEPTH)) | |
echo "${SPACING}enum ${COMPONENTS[$I]} {" | |
done | |
local ENTRY_DEPTH=$(expr $NEW_HIERARCHY_DEPTH + $DEPTH) | |
echo "$(MAKE_ENTRY "$KEY" "$ENTRY" $ENTRY_DEPTH)" | |
HIERARCHY=("${NEW_HIERARCHY[@]}") | |
HIERARCHY_DEPTH=$NEW_HIERARCHY_DEPTH | |
done | |
for (( I=$HIERARCHY_DEPTH-1; I>=0; I-- )); do | |
local SPACING=$(MAKE_SPACING $(expr $I + $DEPTH)) | |
echo "${SPACING}}" | |
done | |
} | |
MAKE_CONSTANTS_FILE_FOR_CATALOG() { | |
local CATALOG="$1" | |
if [ ! -e "$CATALOG" ]; then | |
return 0 | |
fi | |
local OUTPUT_FOLDER="$(dirname "$CATALOG")" | |
local OUTPUT_FILE_NAME="$(basename -- "$CATALOG")" | |
local ENTITY_TITLE="${OUTPUT_FILE_NAME%.*}" | |
local OUTPUT_FILE="$OUTPUT_FOLDER/$ENTITY_TITLE.swift" | |
ASSETS=$(find -E "$CATALOG" -regex '^.*\.imageset') | |
ASSETS=${ASSETS//"$CATALOG"\//} | |
ASSETS=${ASSETS//\.imageset/} | |
IFS=$'\n' | |
ASSETS=($(sort <<< "${ASSETS[*]}")) | |
unset IFS | |
echo "// | |
// This file is generated by Gwyneira - asset constants generator. | |
// | |
import UIKit | |
enum $ENTITY_TITLE { | |
$(MAKE_ENTRIES 1) | |
} | |
extension $ENTITY_TITLE { | |
static func image(_ name: String) -> UIImage { | |
return UIImage(named: name, in: Bundle(for: ${ENTITY_TITLE}_BundleRef.self), with: nil)! | |
} | |
} | |
private final class ${ENTITY_TITLE}_BundleRef { | |
}" > $OUTPUT_FILE | |
return 0 | |
} | |
for CATALOG in "$@"; do | |
MAKE_CONSTANTS_FILE_FOR_CATALOG "$CATALOG" | |
done |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment