Spaces:
Sleeping
Sleeping
from pandas import DataFrame | |
from src.application.config import WORD_BREAK | |
from src.application.image.helper import encode_image | |
from src.application.image.image import ImageDetector | |
from src.application.text.helper import replace_leading_spaces | |
from src.application.text.text import TextDetector | |
def create_ordinary_user_table( | |
aligned_sentences_df: DataFrame, | |
text: TextDetector, | |
image: ImageDetector, | |
) -> str: | |
""" | |
Creates an HTML table comparing input news with source news | |
for ordinary users. | |
Args: | |
aligned_sentences_df (DataFrame): Aligned sentence data. | |
text (TextDetector): Text comparison data. | |
image (ImageDetector): Image comparison data. | |
Returns: | |
A string representing the HTML table. | |
""" | |
rows = [] | |
if image.input is not None: | |
rows.append(format_image_ordinary_user_row(image)) | |
if text.input is not None: | |
rows.append(format_text_ordinary_user_row(aligned_sentences_df, text)) | |
table = "\n".join(rows) | |
return f""" | |
<h5>Comparison between input news and source news:</h5> | |
<table border="1" style="width:100%; text-align:left;"> | |
<col style="width: 340px;"> | |
<col style="width: 30px;"> | |
<col style="width: 75px;"> | |
<thead> | |
<tr> | |
<th>Input news</th> | |
<th>Forensic</th> | |
<th>Originality</th> | |
</tr> | |
</thead> | |
<tbody> | |
{table} | |
</tbody> | |
</table> | |
""" | |
def format_text_ordinary_user_row( | |
aligned_sentences_df, | |
text, | |
) -> str: | |
""" | |
Formats a row for the text in the ordinary user table. | |
Args: | |
aligned_sentences_df (DataFrame): Aligned sentence data. | |
text (TextDetector): Text comparison data. | |
Returns: | |
A string representing the HTML table row for the text. | |
""" | |
input_sentences = "" | |
source_text_html = "" | |
urls = [] | |
for _, row in aligned_sentences_df.iterrows(): | |
if row["input"] is None: | |
continue | |
input_sentences += replace_leading_spaces(row["input"]) + "<br>" | |
url = row["url"] | |
if url not in urls: | |
urls.append(url) | |
source_text_html += f"""<a href="{url}">{url}</a><br>""" | |
return f""" | |
<tr> | |
<td>{input_sentences}</td> | |
<td>{text.prediction_label[0]}<br> | |
({text.prediction_score[0] * 100:.2f}%)</td> | |
<td style="{WORD_BREAK}";>{source_text_html}</td> | |
</tr> | |
""" | |
def format_image_ordinary_user_row(image: ImageDetector) -> str: | |
""" | |
Formats a row for the image in the ordinary user table. | |
Args: | |
image: Image comparison data. | |
Returns: | |
A string representing the HTML table row for the image. | |
""" | |
if image.input is None: | |
return "" | |
# Put image, label, and score into html tag | |
if image.referent_url is not None or image.referent_url != "": | |
if "http" in image.input: | |
input_image = ( | |
f"""<a href="{image.input}">{image.input}</a>""" # noqa: E501 | |
) | |
else: | |
base64_image = encode_image(image.input) | |
input_image = f"""<img src="data:image/jpeg;base64,{base64_image}" width="100" height="150">""" # noqa: E501 | |
source_image_html = f"""<a href="{image.referent_url}">{image.referent_url}</a>""" # noqa: E501 | |
else: | |
source_image_html = "" | |
return f""" | |
<tr> | |
<td>{input_image}</td> | |
<td>{image.prediction_label}<br>({image.prediction_score:.2f}%)</td> | |
<td style="{WORD_BREAK}";>{source_image_html}</td> | |
</tr> | |
""" | |