Last active
April 21, 2022 14:17
-
-
Save iliyaZelenko/a8efbce5dbf05207212ab0e506c7a46f to your computer and use it in GitHub Desktop.
Flutter svg icons generator to dart files with docs
This file contains 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
import os | |
import re | |
# Relatively to "lib" | |
dartIconsPath = 'resources/icons/' | |
iconsDirectory = 'assets/icons/' | |
# Change string to lowerCamelCase | |
def to_camel(word): | |
x = re.split(r'[-_\s]', word) | |
result = '' | |
for i in range(len(x)): | |
if i == 0: | |
result += x[i] | |
continue | |
else: | |
result += x[i].title() | |
continue | |
return result | |
# Change string to to_snake_case | |
def to_snake_case(name): | |
name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) | |
name = re.sub('__([A-Z])', r'_\1', name) | |
name = re.sub('([a-z0-9])([A-Z])', r'\1_\2', name) | |
return name.lower() | |
# Rename assets and check special characters | |
def rename_files(): | |
for filename in os.listdir("../" + iconsDirectory): | |
regex = r'[^A-Za-z0-9_-]+' | |
matches = re.finditer(regex, filename.replace('.', '')) | |
for matchNum, match in enumerate(matches, start=1): | |
print('Error!', filename, | |
'contains special characters! please rename this file.') | |
exit() | |
src = "../" + iconsDirectory + filename | |
des = "../" + iconsDirectory + to_snake_case(filename.replace(".svg", "")) | |
os.rename(src, des + ".svg") | |
continue | |
# Return string from SVG icon | |
def svg_string(src): | |
with open(src, 'r') as file: | |
data = file.read().replace('\n', '') | |
return data | |
# Return dart code as string | |
def dart_code(class_name, svg_string): | |
code = """import 'package:flutter/widgets.dart'; | |
import 'package:flutter_svg/flutter_svg.dart'; | |
// THIS FILE IS AUTO-GENERATED by rate_club/scripts/icons_generator.py | |
class Icon%s extends StatelessWidget { | |
final double? height; | |
final double? width; | |
final Color? color; | |
static const _svgString = ''' | |
%s | |
'''; | |
const Icon%s({Key? key, this.height, this.width, this.color}) : super(key: key); | |
@override | |
Widget build(BuildContext context) { | |
return SvgPicture.string( | |
_svgString, | |
color: this.color, | |
height: this.height, | |
width: this.width, | |
); | |
} | |
} | |
""" % (class_name, svg_string, class_name) | |
return code | |
# Generate dart files | |
def gen_files(): | |
directory = '../' + iconsDirectory | |
for filename in os.listdir(directory): | |
var_name = filename.replace('.svg', '') | |
svg_code = svg_string(directory + '/' + str(filename)) | |
dart_str = dart_code(var_name.title().replace('_', ''), svg_code) | |
gen_single_file(var_name, dart_str) | |
continue | |
# Create a single dart file | |
def gen_single_file(filename, code): | |
libDirectory = '../lib/' + dartIconsPath | |
f = open(libDirectory + '/icon_' + filename + '.dart', "w") | |
f.write(code) | |
f.close() | |
# Uppercase first char in string | |
def uppercase_first_char(str): | |
return str[0].upper() + str[1:] | |
# Generate Markdown (list of icons) | |
def gen_markdown(): | |
assetDirectory = "../" + iconsDirectory | |
f1 = open("../list_icons.md", "w") | |
f1.write("".join("# List of Icons") + "\n\n") | |
f1.write("".join("| Icon name | Preview | Code |") + "\n") | |
f1.write("".join("|---|---|---|") + "\n") | |
for filename in os.listdir(assetDirectory): | |
var_name = filename.replace('.svg', '') | |
line = "| " + 'icon_' + var_name + " | " | |
line += '<p align="center"><img width="50" loading="lazy" src="icons/' + str(filename) + '"></p> | ' | |
line += "`import 'package:rate_club/" + dartIconsPath + 'icon_' + var_name + ".dart';`<br>" | |
line += '`AppIcon' + var_name.title().replace('_', '') + "(), `|" + "\n" | |
f1.write("".join(line)) | |
continue | |
f1.close() | |
rename_files() | |
print('Rename SVG Icons to lowerCamelCase - Done!') | |
print('Generating Dart files - Please wait...') | |
gen_files() | |
print('Generating Dart files - Done!') | |
gen_markdown() | |
print('Generating list_icons.md - Done!') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment