Add files via upload

This commit is contained in:
Legende
2025-04-13 08:39:40 +02:00
committed by GitHub
parent 1bae5e2eb4
commit 82427418a0
+53 -22
View File
@@ -281,45 +281,76 @@ class CategorizedPromptFormatter:
matched_original_tags.add(original_tag) # Mark the ORIGINAL tag as matched
# --- 3. Process Template ---
placeholder_regex = r"<\|([^:]+?)(?::(-?\d+))?\|>"
formatted_output_string = ""
already_added_tags = set()
used_in_template_tags = set() # Tracks tags referenced by template (before dedup)
result_parts = []
last_end = 0
for match in re.finditer(r"<\|(.*?)\|>|", output_template):
placeholder_content = match.group(1)
# Use the updated regex with finditer
for match in re.finditer(placeholder_regex, output_template):
category_name = match.group(1).strip()
limit_str = match.group(2) # Captures signed number string (e.g., "5", "-3") or None
start, end = match.span()
# Append the literal text segment before the placeholder
result_parts.append(output_template[last_end:start])
if placeholder_content:
category_name = placeholder_content.strip()
# Use the categorized_tags dict built earlier
tags_for_category = categorized_tags.get(category_name, [])
limit = None
if limit_str:
try:
limit = int(limit_str)
except ValueError:
print(f"Warning: Invalid limit format '{limit_str}' for category '{category_name}'. Ignoring limit.")
limit = None # Revert to no limit on error
if tags_for_category:
# Mark all tags associated with this placeholder as 'used' by the template
used_in_template_tags.update(tags_for_category)
# Get the list of tags associated with this category name from the input prompt
tags_for_category = categorized_tags.get(category_name, [])
tags_to_process = [] # Initialize empty
tags_to_join = []
if disable_duplicates:
for tag in tags_for_category:
if tag not in already_added_tags:
tags_to_join.append(tag)
already_added_tags.add(tag) # Mark as added
else:
tags_to_join = tags_for_category
# already_added_tags.update(tags_to_join) # Optional
# --- Apply Slicing Logic Based on Limit Sign ---
if limit is None:
# No limit specified, take all
tags_to_process = tags_for_category
elif limit == 0:
# Limit is zero, take none
tags_to_process = []
elif limit > 0:
# Positive limit: take the first N tags
tags_to_process = tags_for_category[:limit]
else: # limit < 0
# Negative limit: take the last N (abs(limit)) tags
tags_to_process = tags_for_category[limit:]
if tags_to_join:
joined_tags = output_delimiter.join(tags_to_join)
result_parts.append(joined_tags)
# --- Process the selected tags ---
if tags_to_process:
# Mark only the tags we are potentially using (after limit/slicing) as 'used'
used_in_template_tags.update(tags_to_process)
tags_to_join = []
if disable_duplicates:
# Filter the selected list against already added tags
for tag in tags_to_process:
if tag not in already_added_tags:
tags_to_join.append(tag)
already_added_tags.add(tag) # Mark as added
else:
# Use all tags from the (potentially sliced) list
tags_to_join = tags_to_process
# already_added_tags.update(tags_to_join) # Optional if disable_duplicates is False
if tags_to_join:
joined_tags = output_delimiter.join(tags_to_join)
result_parts.append(joined_tags)
last_end = end
# Append any remaining literal text after the last placeholder
result_parts.append(output_template[last_end:])
formatted_output_string = "".join(result_parts)
# --- 4. Handle Unmatched Tags ---
# This section remains the same
rejected_tags_list = []