Skip to content

Instantly share code, notes, and snippets.

@DmytroLisitsyn
Last active February 13, 2024 11:57
Show Gist options
  • Save DmytroLisitsyn/81ce342a116779e34a59aa1762fda119 to your computer and use it in GitHub Desktop.
Save DmytroLisitsyn/81ce342a116779e34a59aa1762fda119 to your computer and use it in GitHub Desktop.
Gwyneira - asset constants generator
#!/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