| import os |
| import glob |
| import sys |
| import random |
| import re |
| import fnmatch |
|
|
| if __name__ == os.path.splitext(os.path.basename(__file__))[0] or __name__ =='__main__': |
| from ConsoleColor import print, console, ccolor |
| else: |
| from .ConsoleColor import print, console , ccolor |
| |
| |
| |
|
|
| import subprocess |
| import pkg_resources |
|
|
| required = {'chardet'} |
| installed = {pkg.key for pkg in pkg_resources.working_set} |
| missing = required - installed |
|
|
| if missing: |
| python = sys.executable |
| subprocess.check_call([python, '-m', 'pip', 'install', *missing], stdout=subprocess.DEVNULL) |
|
|
| import chardet |
|
|
|
|
| |
| class wildcards: |
|
|
| |
| card_path = os.path.join(os.path.dirname(__file__), "..", "..", "wildcards", "**", "*.txt") |
| |
| print(f"wildcards card_path : ", card_path , style="bold CYAN") |
|
|
| |
| |
| |
| resub = re.compile(r"(\{)(((\d+)|(\d+)?-(\d+)?)?\$\$(([^\{\}]*?)\$\$)?)?([^\{\}]*)(\})") |
| recard = re.compile(r"(__)(.*?)(__)") |
|
|
| |
| is_card_Load = False |
| cards = {} |
| seperator=", " |
| loop_max=50 |
|
|
| |
| def sub(match): |
| |
| try: |
| |
| seperator=wildcards.seperator |
| s=match.group(3) |
| m=match.group(9).split("|") |
| p=match.group(8) |
| if p: |
| seperator=p |
| |
| if s is None: |
| return random.choice(m) |
| c=len(m) |
| n=int(match.group(4)) if match.group(4) else None |
| if n: |
|
|
| r=seperator.join(random.sample(m,min(n,c))) |
| |
| return r |
|
|
| n1=match.group(5) |
| n2=match.group(6) |
| |
| if n1 or n2: |
| a=min(int(n1 if n1 else c), int(n2 if n2 else c),c) |
| b=min(max(int(n1 if n1 else 0), int(n2 if n2 else 0)),c) |
| |
| r=seperator.join( |
| random.sample( |
| m, |
| random.randint( |
| a,b |
| ) |
| ) |
| ) |
| |
| |
| else: |
| r=seperator.join( |
| random.sample( |
| m, |
| random.randint( |
| 0,c |
| ) |
| ) |
| ) |
| |
| return r |
|
|
|
|
| except Exception as e: |
| console.print_exception() |
| return "" |
| |
| |
|
|
| |
| def sub_loop(text): |
| bak=text |
| for i in range(1, wildcards.loop_max): |
| tmp=wildcards.resub.sub(wildcards.sub, bak) |
| |
| if bak==tmp : |
| return tmp |
| bak=tmp |
| return bak |
|
|
| |
| def card(match): |
| |
| lst=fnmatch.filter(wildcards.cards, match.group(2)) |
| if len(lst)>0: |
| |
| cd=random.choice(lst) |
| |
| r=random.choice(wildcards.cards[cd]) |
| else : |
| r= match.group(2) |
| |
| return r |
| |
|
|
| |
| def card_loop(text): |
| bak=text |
| for i in range(1, wildcards.loop_max): |
| tmp=wildcards.recard.sub(wildcards.card, bak) |
| |
| if bak==tmp : |
| tmp=wildcards.sub_loop(tmp) |
| |
| if bak==tmp : |
| |
| return tmp |
| bak=tmp |
| |
| return bak |
| |
| |
| def card_load(): |
| |
| card_path=wildcards.card_path |
| cards = {} |
| |
| files=glob.glob(card_path, recursive=True) |
| |
| |
| for file in files: |
| basenameAll = os.path.basename(file) |
| basename = os.path.relpath(file, os.path.dirname(__file__)).replace("\\", "/").replace("../../wildcards/", "") |
| |
| |
| file_nameAll = os.path.splitext(basenameAll)[0] |
| file_name = "/"+os.path.splitext(basename)[0] |
| |
| |
| if not file_nameAll in cards: |
| cards[file_nameAll]=[] |
| if not file_name in cards: |
| cards[file_name]=[] |
| |
| with open(file, "rb") as f: |
| raw_data = f.read() |
| encoding = chardet.detect(raw_data)["encoding"] |
| with open(file, "r", encoding=encoding) as f: |
| lines = f.readlines() |
| for line in lines: |
| line=line.strip() |
| |
| if line.startswith("#") or len(line)==0: |
| continue |
| cards[file_nameAll]+=[line] |
| cards[file_name]+=[line] |
| |
| wildcards.cards=cards |
| print(f"[cyan]cards file count : [/cyan]", len(wildcards.cards)) |
| |
| wildcards.is_card_Load=True |
|
|
| |
| def run(text,load=False): |
| if text is None or not isinstance(text, str): |
| print("[red]text is not str : [/red]",text) |
| return None |
| if not wildcards.is_card_Load or load: |
| wildcards.card_load() |
|
|
| |
| result=wildcards.card_loop(text) |
| |
| return result |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| print("wildcards test : "+wildcards.run("__aest__")) |
| print("wildcards test : "+wildcards.run("__*test__")) |
| print("wildcards test : "+wildcards.run("__?est__")) |
| print("wildcards test : "+wildcards.run("__test__")) |
| print("wildcards test : "+wildcards.run("__/test__")) |
| print("wildcards test : "+wildcards.run("__/0/test__")) |
|
|