Spaces:
Build error
Build error
import os | |
import re | |
import json | |
import math | |
from modules.extra_utils import get_files_from_folder | |
from random import Random | |
# cannot use modules.config - validators causing circular imports | |
styles_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../sdxl_styles/')) | |
def normalize_key(k): | |
k = k.replace('-', ' ') | |
words = k.split(' ') | |
words = [w[:1].upper() + w[1:].lower() for w in words] | |
k = ' '.join(words) | |
k = k.replace('3d', '3D') | |
k = k.replace('Sai', 'SAI') | |
k = k.replace('Mre', 'MRE') | |
k = k.replace('(s', '(S') | |
return k | |
styles = {} | |
styles_files = get_files_from_folder(styles_path, ['.json']) | |
for x in ['sdxl_styles_fooocus.json', | |
'sdxl_styles_sai.json', | |
'sdxl_styles_mre.json', | |
'sdxl_styles_twri.json', | |
'sdxl_styles_diva.json', | |
'sdxl_styles_marc_k3nt3l.json']: | |
if x in styles_files: | |
styles_files.remove(x) | |
styles_files.append(x) | |
for styles_file in styles_files: | |
try: | |
with open(os.path.join(styles_path, styles_file), encoding='utf-8') as f: | |
for entry in json.load(f): | |
name = normalize_key(entry['name']) | |
prompt = entry['prompt'] if 'prompt' in entry else '' | |
negative_prompt = entry['negative_prompt'] if 'negative_prompt' in entry else '' | |
styles[name] = (prompt, negative_prompt) | |
except Exception as e: | |
print(str(e)) | |
print(f'Failed to load style file {styles_file}') | |
style_keys = list(styles.keys()) | |
fooocus_expansion = 'Fooocus V2' | |
random_style_name = 'Random Style' | |
legal_style_names = [fooocus_expansion, random_style_name] + style_keys | |
def get_random_style(rng: Random) -> str: | |
return rng.choice(list(styles.items()))[0] | |
def apply_style(style, positive): | |
p, n = styles[style] | |
return p.replace('{prompt}', positive).splitlines(), n.splitlines() | |
def get_words(arrays, total_mult, index): | |
if len(arrays) == 1: | |
return [arrays[0].split(',')[index]] | |
else: | |
words = arrays[0].split(',') | |
word = words[index % len(words)] | |
index -= index % len(words) | |
index /= len(words) | |
index = math.floor(index) | |
return [word] + get_words(arrays[1:], math.floor(total_mult / len(words)), index) | |
def apply_arrays(text, index): | |
arrays = re.findall(r'\[\[(.*?)\]\]', text) | |
if len(arrays) == 0: | |
return text | |
print(f'[Arrays] processing: {text}') | |
mult = 1 | |
for arr in arrays: | |
words = arr.split(',') | |
mult *= len(words) | |
index %= mult | |
chosen_words = get_words(arrays, mult, index) | |
i = 0 | |
for arr in arrays: | |
text = text.replace(f'[[{arr}]]', chosen_words[i], 1) | |
i = i+1 | |
return text | |