diff --git a/modules/extras.py b/modules/extras.py index b4434bea3..bf9bbb957 100644 --- a/modules/extras.py +++ b/modules/extras.py @@ -12,11 +12,17 @@ from modules.ui_common import plaintext_to_html import gradio as gr import safetensors.torch +def pnginfo_format_string(plain_text): + content = "
\n".join(html.escape(x) for x in str(plain_text).split('\n')) + return content def pnginfo_format_setting(name, value): cls_name = 'geninfo-setting-string' if value.startswith('"') else 'geninfo-setting-value' return f"{html.escape(name)}: {html.escape(value)}" +def pnginfo_format_quicklink(name): + return f"[{html.escape(name)}]" + def run_pnginfo(image): if image is None: return '', '', '' @@ -28,16 +34,23 @@ def run_pnginfo(image): if parser.valid: info += f"""
-

parameters

-{plaintext_to_html(str(parser.positive))} +

parameters
+{pnginfo_format_quicklink("All")} {pnginfo_format_quicklink("Positive")}""" + if parser.negative is not None: + info += f' {pnginfo_format_quicklink("Negative")}' + info += f""" {pnginfo_format_quicklink("Settings")} +

+

{pnginfo_format_string(parser.positive)}

""" + if parser.negative is not None: + info += f"""

-Negative prompt:
{html.escape(str(parser.negative))} +Negative prompt:
{pnginfo_format_string(parser.negative)}

""" if parser.settings is None: info += f"{plaintext_to_html(str(parser.parameters))}" else: - info += "

" + info += "

" first = True for setting in parser.settings: if first: @@ -48,7 +61,7 @@ def run_pnginfo(image): info += "

" if parser.extra is not None: - info += f"{plaintext_to_html(str(parser.extra))}" + info += f"

{pnginfo_format_string(parser.extra)}

" info += "
\n" else: diff --git a/modules/png_parser.py b/modules/png_parser.py index f6066fc43..e676f3da9 100644 --- a/modules/png_parser.py +++ b/modules/png_parser.py @@ -2,6 +2,7 @@ import re class PngParser: re_top_level = None + re_top_level2 = None re_extra_newline = None re_parameters = None @@ -15,11 +16,18 @@ class PngParser: # separate positive, negative, and parameters m = PngParser.re_top_level.search(pnginfo_string) if m is None: - return False + m = PngParser.re_top_level2.search(pnginfo_string) + if m is None: + return False + else: + self.positive = m.group(1) + self.negative = None + self.parameters = m.group(2) + else: + self.positive = m.group(1) + self.negative = m.group(2) + self.parameters = m.group(3) - self.positive = m.group(1) - self.negative = m.group(2) - self.parameters = m.group(3) self.extra = None self.settings = None @@ -43,5 +51,7 @@ class PngParser: def init_re(cls): if cls.re_top_level is None: cls.re_top_level = re.compile(r'^(?P(?:.|\n)*)\nNegative prompt: (?P(?:.|\n)*)\n(?=Steps: )(?P(?:.|\n)*)$') + cls.re_top_level2 = re.compile(r'^(?P(?:.|\n)*)\nSteps: (?P(?:.|\n)*)$') +# cls.re_top_level2 = re.compile(r'^(?P(?:.|\n)*)\n(?=Steps: )(?P(?:.|\n)*)$') cls.re_extra_newline = re.compile(r'\n(?=(?:[^"]*"[^"]*")*[^"]*$)') cls.re_parameters = re.compile(r'\s*(?P[^:,]+):\s*(?P")?(?P(?(2)(?:.)*?(?:(? { + el.classList.add('animate'); + }, 0); + } +} diff --git a/style.css b/style.css index 2e054614e..f1bf9b2f8 100644 --- a/style.css +++ b/style.css @@ -1709,6 +1709,15 @@ body.resizing .resize-handle { background-color: var(--pnginfo-string-hover); } +.pnginfo-page p span.geninfo-quick-link { + color: var(--pnginfo-string-color); + cursor: pointer; +} + +.pnginfo-page p span.geninfo-quick-link:hover { + background-color: var(--pnginfo-string-hover); +} + /* PngInfo animations */ @keyframes copyAnimationSettingValue { 0% { @@ -1740,4 +1749,9 @@ span.geninfo-setting-value.animate { span.geninfo-setting-string.animate { -webkit-animation: copyAnimationSettingString 1s 1; animation: copyAnimationSettingString 1s 1; +} + +span.geninfo-quick-link.animate { + -webkit-animation: copyAnimationSettingString 1s 1; + animation: copyAnimationSettingString 1s 1; } \ No newline at end of file