import pandas as pd import numpy as np import re def parse_and_execute_commands(processed, user_input, fix, after, popped_row): commands = [cmd.strip() for cmd in user_input.split(',')] for command in commands: condition, cmd = parse_conditional_command(command) if check_condition(processed, condition, popped_row): processed = execute_command(processed, cmd, fix, after) return processed def parse_conditional_command(command): match = re.match(r"\((.*?)\)\:(.*)", command) if match: return match.groups() return '', command def check_condition(processed, condition, popped_row): if not condition: return True sub_conditions = re.split(r'\)\s*&\s*\(', condition) sub_conditions = [re.sub(r'^\(|\)$', '', cond) for cond in sub_conditions] results = [] for sub_cond in sub_conditions: if '&' in sub_cond: results.append(all(check_condition(processed, cond, popped_row) for cond in sub_cond.split('&'))) elif '|' in sub_cond: results.append(any(check_condition(processed, cond, popped_row) for cond in sub_cond.split('|'))) else: if sub_cond in ['e', 'q', 's', 'g']: results.append(sub_cond == popped_row['rating']) elif sub_cond in ['~e', '~q', '~s', '~g']: results.append(sub_cond != popped_row['rating']) # PM elif sub_cond.startswith('*'): results.append(sub_cond[1:] in processed) # NOT IN elif sub_cond.startswith('~!'): results.append(sub_cond[2:] not in processed) elif sub_cond.startswith('~'): results.append(any(sub_cond[1:] not in element for element in processed)) # CONTAIN else: results.append(any(sub_cond in element for element in processed)) return all(results) def execute_command(processed, command, fix, after): if '+=' in command: keyword, addition = command.split('+=', 1) addition = addition.replace('^', ', ') #addiction split 해서 프롬프트 존재하는지 체크 필요 return insert_text_after_keyword(processed, keyword, addition, fix, after) elif '=' in command: keyword, replacement = command.split('=', 1) if keyword in processed: replacement = replacement.replace('^', ', ') #replacement split 해서 프롬프트 존재하는지 체크 필요 index = processed.index(keyword) processed[index] = replacement return processed def insert_text_after_keyword(processed, user_keyword, user_additional_keyword, fix, after): if user_keyword == "prompt": processed.append(user_additional_keyword) elif user_keyword == "prefix": fix.append(user_additional_keyword) elif user_keyword == "postfix": after.append(user_additional_keyword) elif user_keyword in processed: index = processed.index(user_keyword) + 1 processed.insert(index, user_additional_keyword) return processed def find_keyword_index(general): # boys와 girls 리스트의 원소가 있는지 확인 및 인덱스 저장 boys = ["1boy", "2boys", "3boys", "4boys", "5boys", "6+boys"] girls = ["1girl", "2girls", "3girls", "4girls", "5girls", "6+girls"] #others = ["1other", "2others", "3others", "4others", "5others", "6+others"] boys_indices = [i for i, item in enumerate(general[:6]) if item in boys] girls_indices = [i for i, item in enumerate(general[:6]) if item in girls] # case 1과 case 2: girls 리스트의 원소 찾기 if girls_indices: return girls_indices[0]+1 # case 3: boys 리스트의 원소 찾기 if boys_indices: return boys_indices[0]+1 # case 4: 해당 사항 없음 # 2월 12일에 해당 부분 return 2 -> return 0 으로 수정하였으며 이 부분 트래킹 필요 return 0 def RFP(popped_row, fix_prompt, after_prompt, auto_hide_prompt, rm_a, rm_s, rm_c, nsfw, data, magic_word): boys = ["1boy", "2boys", "3boys", "4boys", "5boys", "6+boys"] girls = ["1girl", "2girls", "3girls", "4girls", "5girls", "6+girls"] general = [item.strip() for item in popped_row['general'].split(',')] special_word_check = fix_prompt+', '+after_prompt special_word_check = [item.strip() for item in special_word_check.split(',')] special_word_check = [item for item in special_word_check if item.startswith('*')] exc = [] for keyword in general: if keyword == '!' or keyword == '!?' or keyword == '!!': exc.append(keyword) if exc: for keyword in exc: general.remove(keyword) general[3:3] = exc if nsfw == 1: nsfw_word = [] for keyword in general: if keyword in data.qe_word or keyword in data.bag_of_tags or "horns" in keyword or "(" in keyword or keyword in boys or keyword in girls: nsfw_word.append(keyword) general = nsfw_word if rm_c == 1: temp_general = [] for keyword in general: if keyword in data.bag_of_tags: temp_general.append(keyword) for keyword in temp_general: general.remove(keyword) fix = [item.strip() for item in fix_prompt.split(',')] at_first = [] for fp in fix: if fp.startswith('*'): at_first.append(fp[1:]) if at_first: for af in at_first: if '*'+af in fix: fix.remove('*'+af) if rm_a == 0: if popped_row['artist']: artists = [item.strip() for item in popped_row['artist'].split(',')] artist = ["artist:" + _artist for _artist in artists] fix = fix + artist if rm_s == 0: if popped_row['copyright']: series = [item.strip() for item in popped_row['copyright'].split(',')] else: series = [] fix = fix + series after = [item.strip() for item in after_prompt[:-1].split(',')] auto_hide = [item.strip() for item in auto_hide_prompt[:-1].split(',')] + ["| |", ":|", "\||/", "<|> <|>", "|| ||", ";|"] fix_index = find_keyword_index(general) processed = general.copy() temp_hide_prompt = [] for keyword in processed: if keyword in auto_hide: temp_hide_prompt.append(keyword) for keyword in temp_hide_prompt: processed.remove(keyword) #여기에서 문제의 magic word 처리 if "cond" in magic_word and magic_word["cond"]: user_input = magic_word["cond"] processed = parse_and_execute_commands(processed, user_input, fix, after, popped_row) processed[fix_index:fix_index] = fix processed += after if rm_c == 0 and '*(remove character name)' not in special_word_check and '*(set character name after prefix)' not in special_word_check and '*(set character name before prefix)' not in special_word_check: if popped_row['character']: character = [item.strip() for item in popped_row['character'].split(',')] processed[fix_index:fix_index] = character fix_index+=len(character) elif rm_c == 0 and '*(set character name after prefix)' in special_word_check: if popped_row['character']: character = [item.strip() for item in popped_row['character'].split(',')] processed[fix_index+len(fix):fix_index+len(fix)] = character #fix_index+=len(character) elif rm_c == 0 and '*(set character name before prefix)' in special_word_check: if popped_row['character']: character = [item.strip() for item in popped_row['character'].split(',')] processed[fix_index+1:fix_index+1] = character fix_index+=len(character) if magic_word["random_artist"] == True: processed.insert(fix_index, magic_word["random_artist_name"]) boy_in_processed = girl_in_processed = None for boy in boys: if boy in processed: boy_in_processed = boy break for girl in girls: if girl in processed: girl_in_processed = girl break if boy_in_processed and girl_in_processed: boy_index = processed.index(boy_in_processed) girl_index = processed.index(girl_in_processed) if boy_index > girl_index: processed.pop(boy_index) processed.insert(girl_index, boy_in_processed) s_word = ['*(remove character name)', '*(set character name after prefix)', '*(set character name before prefix)'] for keyword in s_word: if keyword in processed: processed.remove(keyword) if at_first: processed = at_first + processed return ', '.join(processed), popped_row['rating']