diff --git a/modules/extras.py b/modules/extras.py index 297487ba3..e2f9a2a0a 100644 --- a/modules/extras.py +++ b/modules/extras.py @@ -7,7 +7,7 @@ import html import torch import tqdm -from modules import shared, images, sd_models, sd_vae, sd_models_config, errors, png_parser +from modules import shared, images, sd_models, sd_vae, sd_models_config, errors, infotext_utils from modules.ui_common import plaintext_to_html import gradio as gr import safetensors.torch @@ -27,58 +27,79 @@ def pnginfo_format_quicklink(name): return f"[{html.escape(name)}]" -def run_pnginfo(image): - if image is None: - return '', '', '' +def pnginfo_html_v1(geninfo, items): + items = {**{'parameters': geninfo}, **items} + info_html = '' + for key, text in items.items(): + info_html += f"""
+

{plaintext_to_html(str(key))}

+

{plaintext_to_html(str(text))}

+
""".strip() + "\n" - geninfo, items = images.read_info_from_image(image) + if len(info_html) == 0: + message = "Nothing found in the image." + info_html = f"

{message}

" - info = '' - parser = png_parser.PngParser(geninfo) - if parser.valid: - info += f""" + return info_html + + +def pnginfo_html_v2(geninfo, items): + # raise ValueError + prompt, negative_prompt, last_line = infotext_utils.split_infotext(geninfo) + res = infotext_utils.parameters_to_dict(last_line) + if not any([prompt, res, items]): + raise ValueError + + info_html = '' + if prompt: + info_html += f"""

parameters
{pnginfo_format_quicklink("Copy")} {pnginfo_format_quicklink("Prompt")}""" - if parser.negative is not None: - info += f' {pnginfo_format_quicklink("Negative")}' - info += f""" {pnginfo_format_quicklink("Settings")} + if negative_prompt: + info_html += f' {pnginfo_format_quicklink("Negative")}' + info_html += f""" {pnginfo_format_quicklink("Settings")}

-

{pnginfo_format_string(parser.positive)}

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

{pnginfo_format_string(prompt)}

""" + if negative_prompt: + info_html += f"""

-Negative prompt:
{pnginfo_format_string(parser.negative)} +Negative prompt:
{pnginfo_format_string(negative_prompt)}

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

" + if res: + info_html += "

" first = True - for setting in parser.settings: + for key, value in res.items(): if first: first = False else: - info += ", " - info += pnginfo_format_setting(str(setting[0]), str(setting[1])+str(setting[2])) - info += "

" + info_html += ", " + info_html += pnginfo_format_setting(key, value) + info_html += "

" + info_html += "
\n" - if parser.extra is not None: - info += f"

{pnginfo_format_string(parser.extra)}

" - - info += "\n" - else: - items = {**{'parameters': geninfo}, **items} - - for key, text in items.items(): - info += f""" + for key, text in items.items(): + info_html += f"""

{plaintext_to_html(str(key))}

{plaintext_to_html(str(text))}

""".strip()+"\n" + return info_html + + +def run_pnginfo(image): + if image is None: + return '', '', '' + + geninfo, items = images.read_info_from_image(image) + try: + info = pnginfo_html_v2(geninfo, items) + except ValueError: + info = pnginfo_html_v1(geninfo, items) + if len(info) == 0: message = "Nothing found in the image." info = f"

{message}

" diff --git a/modules/png_parser.py b/modules/png_parser.py deleted file mode 100644 index e676f3da9..000000000 --- a/modules/png_parser.py +++ /dev/null @@ -1,57 +0,0 @@ -import re - -class PngParser: - re_top_level = None - re_top_level2 = None - re_extra_newline = None - re_parameters = None - - def __init__(self, pnginfo_string): - PngParser.init_re() - - self.valid = self.parse_pnginfo(pnginfo_string) - - def parse_pnginfo(self, pnginfo_string): - try: - # separate positive, negative, and parameters - m = PngParser.re_top_level.search(pnginfo_string) - if m is None: - 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.extra = None - self.settings = None - - # parse extra parameters (if they exist) by a newline outside of quotes - m = PngParser.re_extra_newline.search(self.parameters) - if m is not None: - s = m.span() - self.extra = self.parameters[s[1]:] - self.parameters = self.parameters[:s[0]] - - # parse standard parameters - self.settings = PngParser.re_parameters.findall(self.parameters) - if self.settings is None: - return False - except Exception: - return False - - return True - - @classmethod - 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)(?:.)*?(?:(?