mirror of
https://github.com/material-components/material-components-ios.git
synced 2026-02-20 08:27:32 +08:00
* [Icons] Add icon method for use with imageNamed Icon images are currently loaded manually from a path in a bundle and therefore bypass the internal UIImage caching mechanism. This change will add new methods that provide the icon images via the -imageNamed family of methods. Closes #1637, #1606
261 lines
7.4 KiB
Bash
Executable File
261 lines
7.4 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Copyright 2016-present the Material Components for iOS authors. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
# Sync icons from the https://github.com/google/material-design-icons.git GitHub repository to the
|
|
# components/private/Icons directory.
|
|
#
|
|
# Expectations:
|
|
#
|
|
# components/private/Icons/icons/ contains one folder for each icon that is intended to be copied
|
|
# from the material-design-icons repository.
|
|
#
|
|
# Example:
|
|
#
|
|
# components/private/Icons/icons/
|
|
# ic_arrow_back/
|
|
# ic_menu/
|
|
#
|
|
# This script will generate the scaffolding required to add these icons to an app.
|
|
#
|
|
# components/private/Icons/icons/ic_arrow_back/
|
|
# src/
|
|
# MaterialIcons_ic_arrow_back.bundle/
|
|
# ic_arrow_back.png
|
|
# ic_arrow_back@2x.png
|
|
# ic_arrow_back@3x.png
|
|
# MaterialIcons+ic_arrow_back.h
|
|
# MaterialIcons+ic_arrow_back.m
|
|
# components/private/Icons/icons/ic_menu/
|
|
# src/
|
|
# MaterialIcons_ic_menu.bundle/
|
|
# ic_menu.png
|
|
# ic_menu@2x.png
|
|
# ic_menu@3x.png
|
|
# MaterialIcons+ic_menu.h
|
|
# MaterialIcons+ic_menu.m
|
|
#
|
|
|
|
# Compute directories relative to the script's known location in scripts/
|
|
SCRIPTS_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
REPO_ROOT_PATH="$( cd "$( dirname $SCRIPTS_PATH )" && pwd )"
|
|
|
|
# Where to install the material-design-icons repo
|
|
ICONS_REPO_PATH="$SCRIPTS_PATH/external/material-design-icons"
|
|
|
|
ICONS_COMPONENT_RELATIVE_PATH="components/private/Icons"
|
|
ICONS_COMPONENT_PATH="$REPO_ROOT_PATH/$ICONS_COMPONENT_RELATIVE_PATH"
|
|
|
|
# Where the generated CocoaPods script lives
|
|
GENERATED_SCRIPTS_PATH="$REPO_ROOT_PATH/scripts/generated"
|
|
GENERATED_ICONS_SCRIPT_PATH="$GENERATED_SCRIPTS_PATH/icons.rb"
|
|
|
|
# Runs git commands in the material-design-icons repository directory.
|
|
git_icons() {
|
|
pushd $ICONS_REPO_PATH >> /dev/null
|
|
git "$@"
|
|
popd >> /dev/null
|
|
}
|
|
|
|
echo "Fetching material-design-icons..."
|
|
|
|
if [ ! -d "$ICONS_REPO_PATH" ]; then
|
|
git clone https://github.com/google/material-design-icons.git "$ICONS_REPO_PATH"
|
|
else
|
|
git_icons fetch
|
|
fi
|
|
|
|
echo "Checking out origin/master..."
|
|
echo
|
|
|
|
git_icons checkout origin/master || { echo "Failed to update material-design-icons repo."; exit 1; }
|
|
|
|
mkdir -p "$GENERATED_SCRIPTS_PATH"
|
|
|
|
echo
|
|
echo "Enumerating icons..."
|
|
|
|
cat > "$GENERATED_ICONS_SCRIPT_PATH" <<EOL
|
|
# This file was automatically generated by running $0
|
|
# Do not modify directly.
|
|
def registerIcons(s)
|
|
|
|
s.subspec "Icons" do |iss|
|
|
iss.subspec "Base" do |ss|
|
|
ss.public_header_files = "$ICONS_COMPONENT_RELATIVE_PATH/src/*.h"
|
|
ss.source_files = "$ICONS_COMPONENT_RELATIVE_PATH/src/*.{h,m}"
|
|
end
|
|
EOL
|
|
|
|
# Enumerate all desired icons...
|
|
for directory in $ICONS_COMPONENT_PATH/icons/*/; do
|
|
icon_name=$(basename $directory)
|
|
|
|
echo
|
|
echo -n "$icon_name..."
|
|
|
|
location=$(find "$ICONS_REPO_PATH" -name "$icon_name.imageset")
|
|
|
|
if [ ! -d "$location" ]; then
|
|
echo -n "Skipping due to missing $icon_name."
|
|
continue
|
|
fi
|
|
|
|
assets_path="$directory/src/MaterialIcons_$icon_name.bundle"
|
|
|
|
echo -n "copying..."
|
|
|
|
mkdir -p "$assets_path"
|
|
|
|
cp "$location"/*.png "$assets_path"
|
|
|
|
# TODO(featherless): Simplify this _nx -> @nx remapping.
|
|
for old in $assets_path/*_2x.png; do
|
|
new=$(echo $old | sed -e 's/_2x\.png/@2x.png/')
|
|
mv -v "$old" "$new" >> /dev/null
|
|
done
|
|
|
|
for old in $assets_path/*_3x.png; do
|
|
new=$(echo $old | sed -e 's/_3x\.png/@3x.png/')
|
|
mv -v "$old" "$new" >> /dev/null
|
|
done
|
|
|
|
echo -n "writing pod entry..."
|
|
cat >> "$GENERATED_ICONS_SCRIPT_PATH" <<EOL
|
|
|
|
iss.subspec "$icon_name" do |ss|
|
|
ss.public_header_files = "$ICONS_COMPONENT_RELATIVE_PATH/icons/$icon_name/src/*.h"
|
|
ss.source_files = "$ICONS_COMPONENT_RELATIVE_PATH/icons/$icon_name/src/*.{h,m}"
|
|
ss.resource_bundles = {
|
|
"MaterialIcons_$icon_name" => [
|
|
"$ICONS_COMPONENT_RELATIVE_PATH/icons/$icon_name/src/MaterialIcons_$icon_name.bundle/*.png",
|
|
]
|
|
}
|
|
ss.dependency "#{Pathname.new(ss.name).dirname}/Base"
|
|
end
|
|
EOL
|
|
|
|
echo -n "creating source..."
|
|
|
|
file="MaterialIcons+$icon_name"
|
|
src_path="$ICONS_COMPONENT_RELATIVE_PATH/icons/$icon_name/src"
|
|
|
|
mkdir -p "$src_path"
|
|
|
|
header_file="$src_path/$file.h"
|
|
|
|
# TODO(featherless): Find a more scalable way to inject these license headers. Possibly store the
|
|
# license in a separate file and inject it here.
|
|
cat > "$header_file" <<EOL
|
|
/*
|
|
Copyright 2016-present the Material Components for iOS authors. All Rights Reserved.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
#import <UIKit/UIKit.h>
|
|
|
|
#import "MaterialIcons.h"
|
|
|
|
// This file was automatically generated by running $0
|
|
// Do not modify directly.
|
|
|
|
@interface MDCIcons ($icon_name)
|
|
|
|
/*
|
|
Returns the path for the $icon_name image contained in
|
|
MaterialIcons_$icon_name.bundle.
|
|
*/
|
|
+ (nonnull NSString *)pathFor_$icon_name;
|
|
|
|
/*
|
|
Returns the image for the $icon_name image contained in
|
|
MaterialIcons_$icon_name.bundle.
|
|
*/
|
|
+ (nullable UIImage *)imageFor_$icon_name;
|
|
|
|
@end
|
|
EOL
|
|
|
|
cat > "$src_path/$file.m" <<EOL
|
|
/*
|
|
Copyright 2016-present the Material Components for iOS authors. All Rights Reserved.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
// This file was automatically generated by running $0
|
|
// Do not modify directly.
|
|
|
|
#import "$file.h"
|
|
|
|
#import "MaterialIcons.h"
|
|
|
|
static NSString *const kBundleName = @"MaterialIcons_$icon_name";
|
|
static NSString *const kIconName = @"$icon_name";
|
|
|
|
// Export a nonsense symbol to suppress a libtool warning when this is linked alone in a static lib.
|
|
__attribute__((visibility("default")))
|
|
char MDCIconsExportToSuppressLibToolWarning_$icon_name = 0;
|
|
|
|
@implementation MDCIcons ($icon_name)
|
|
|
|
+ (nonnull NSString *)pathFor_$icon_name {
|
|
return [self pathForIconName:kIconName withBundleName:kBundleName];
|
|
}
|
|
|
|
+ (nullable UIImage *)imageFor_$icon_name {
|
|
NSBundle *bundle = [self bundleNamed:kBundleName];
|
|
return [UIImage imageNamed:kIconName
|
|
inBundle:bundle
|
|
compatibleWithTraitCollection:nil];
|
|
}
|
|
|
|
@end
|
|
EOL
|
|
|
|
echo -n "done!"
|
|
done
|
|
|
|
cat >> "$GENERATED_ICONS_SCRIPT_PATH" <<EOL
|
|
end
|
|
end
|
|
EOL
|
|
|
|
echo
|
|
echo
|
|
echo "Done!"
|
|
|