#!/usr/bin/env python3
"""
Copia un Doodle Icon al tema, listo para ga_icon().
python3 design/doodle-icons/to-theme.py interface/heart → assets/icons/heart.svg
python3 design/doodle-icons/to-theme.py interface/heart corazon → assets/icons/corazon.svg (ga_icon( 'corazon' ))
python3 design/doodle-icons/to-theme.py arrows/arrow-right arrow --size 18
Quita la máscara de recorte (cortaba los bordes de algunos iconos), pasa el color a currentColor
(el icono toma el color del texto) y redondea las coordenadas a un decimal (≈ la mitad de peso).
"""
import argparse
import pathlib
import re
import sys
HERE = pathlib.Path(__file__).resolve().parent
THEME_ICONS = HERE.parent.parent / 'wp-content/themes/gure-ametsa/assets/icons'
def round_number(match):
return ('%.1f' % float(match.group(0))).rstrip('0').rstrip('.') or '0'
def to_theme_svg(source, size):
view_box = re.search(r'viewBox="([^"]+)"', source).group(1)
body = re.sub(r'.*?', '', source, flags=re.S)
paths = []
for tag in re.findall(r']*>', body):
d = re.search(r'\bd="([^"]+)"', tag).group(1)
d = re.sub(r'-?\d*\.\d+|-?\d+', round_number, d)
d = re.sub(r'\s+', ' ', d).replace(' -', '-')
rule = ' fill-rule="evenodd"' if 'fill-rule="evenodd"' in tag else ''
paths.append(f'')
return (f'\n')
def main():
parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('icon', help='categoría/nombre, p. ej. interface/heart (ver catalogo.html)')
parser.add_argument('name', nargs='?', help='nombre en el tema (por defecto, el del icono)')
parser.add_argument('--size', type=int, default=20, help='ancho y alto en px (por defecto 20)')
args = parser.parse_args()
source = HERE / 'svg' / f'{args.icon.removesuffix(".svg")}.svg'
if not source.is_file():
sys.exit(f'No existe {source.relative_to(HERE)}. Mira los nombres en catalogo.html.')
name = args.name or source.stem
if not re.fullmatch(r'[a-z0-9-]+', name):
sys.exit('El nombre en el tema solo puede llevar minúsculas, números y guiones (p. ej. tik-tok).')
target = THEME_ICONS / f'{name}.svg'
target.write_text(to_theme_svg(source.read_text(encoding='utf-8'), args.size), encoding='utf-8')
print(f'{target.relative_to(HERE.parent.parent)} → ga_icon( \'{name}\' )')
if __name__ == '__main__':
main()