Files
wehub-resource-sync 925e56bb5f
Test CLI scripts / build (push) Waiting to run
Unit tests / build (t4_gpu) (push) Waiting to run
Unit tests / build (ubuntu-latest) (push) Waiting to run
Unit tests / build (windows-latest) (push) Waiting to run
chore: import upstream snapshot with attribution
2026-07-13 13:24:56 +08:00

90 lines
2.6 KiB
Python

import html as htmllib
import os.path
import re
filepath = os.path.abspath(__file__)
def render_text_as_html(
bboxes: list[list[int]],
texts: list[str],
image_size: tuple[int, int],
base_font_size: int = 16,
scaler: int = 2
):
katex_path = os.path.join(os.path.dirname(filepath), "katex.js")
with open(katex_path, "r") as f:
katex_script = f.read()
html_content = []
image_size = tuple([int(s * scaler) for s in image_size])
width, height = image_size
html_content.append(f"""
<!DOCTYPE html>
<html>
<head>
<style>
body {{
margin: 0;
padding: 0;
width: {width}px;
height: {height}px;
position: relative;
overflow: hidden;
background: white;
color: black;
}}
.text-box {{
position: absolute;
overflow: hidden;
display: flex;
justify-content: left;
font-family: Arial, sans-serif;
white-space: pre-wrap;
}}
.vertical-text {{
writing-mode: vertical-rl; /* Top to bottom, right to left */
}}
</style>
{katex_script}
</head>
<body>
""")
for i, (bbox, text) in enumerate(zip(bboxes, texts)):
bbox = bbox.copy()
bbox = [int(bb * scaler) for bb in bbox]
x1, y1, x2, y2 = bbox
width = x2 - x1
height = y2 - y1
min_dim = min(width, height)
# Scale font size based on box height
font_size = min(int(min_dim * 0.75), base_font_size)
# Create div with absolute positioning
div_style = (
f"left: {x1}px; "
f"top: {y1}px; "
f"width: {width}px; "
f"height: {height}px; "
f"font-size: {font_size}px;"
)
class_ = "text-box"
if height > width * 2:
class_ += " vertical-text"
# Determine if content is HTML/MathML or plain text
if "<" in text and ">" in text and re.search(r"<(html|math|div|sub|sup|i|u|mark|small|del|b|br|code)\b", text.lower()):
# Content is already HTML/MathML, include as-is
html_content.append(f'<span class="{class_}" id="box-{i}" style="{div_style}">{text}</span>')
else:
# Plain text, escape it
escaped_text = htmllib.escape(text)
html_content.append(f'<span class="{class_}" id="box-{i}" style="{div_style}">{escaped_text}</span>')
html_content.append("</body></html>")
return "\n".join(html_content), image_size