Update app.py
Browse files
app.py
CHANGED
|
@@ -98,7 +98,7 @@ def apply_emoji_font(text, emoji_font):
|
|
| 98 |
segments = tag_pattern.split(text)
|
| 99 |
result = []
|
| 100 |
|
| 101 |
-
# Apply emoji font only to
|
| 102 |
emoji_pattern = re.compile(
|
| 103 |
r"([\U0001F300-\U0001F5FF"
|
| 104 |
r"\U0001F600-\U0001F64F"
|
|
@@ -124,17 +124,17 @@ def apply_emoji_font(text, emoji_font):
|
|
| 124 |
# Keep tags unchanged
|
| 125 |
result.append(segment)
|
| 126 |
else:
|
| 127 |
-
# Apply
|
| 128 |
parts = []
|
| 129 |
last_pos = 0
|
| 130 |
for match in emoji_pattern.finditer(segment):
|
| 131 |
start, end = match.span()
|
| 132 |
if last_pos < start:
|
| 133 |
-
parts.append(f'<font face="
|
| 134 |
parts.append(replace_emoji(match))
|
| 135 |
last_pos = end
|
| 136 |
if last_pos < len(segment):
|
| 137 |
-
parts.append(f'<font face="
|
| 138 |
result.append(''.join(parts))
|
| 139 |
|
| 140 |
return ''.join(result)
|
|
@@ -170,7 +170,7 @@ def markdown_to_pdf_content(markdown_text, render_with_bold, auto_bold_numbers,
|
|
| 170 |
|
| 171 |
line = detect_and_convert_links(line)
|
| 172 |
|
| 173 |
-
#
|
| 174 |
line = re.sub(r'\*\*(.+?)\*\*', r'<b>\1</b>', line)
|
| 175 |
line = re.sub(r'\*([^*]+?)\*', r'<b>\1</b>', line)
|
| 176 |
|
|
@@ -231,7 +231,7 @@ def create_pdf(markdown_text, base_font_size, render_with_bold, auto_bold_number
|
|
| 231 |
adjusted_font_size = int(col_width / (avg_line_chars / 10))
|
| 232 |
adjusted_font_size = max(min_font_size, adjusted_font_size)
|
| 233 |
item_style = ParagraphStyle(
|
| 234 |
-
'ItemStyle', parent=styles['Normal'], fontName="
|
| 235 |
fontSize=adjusted_font_size, leading=adjusted_font_size * 1.15, spaceAfter=1,
|
| 236 |
linkUnderline=True
|
| 237 |
)
|
|
@@ -242,7 +242,7 @@ def create_pdf(markdown_text, base_font_size, render_with_bold, auto_bold_number
|
|
| 242 |
linkUnderline=True
|
| 243 |
)
|
| 244 |
section_style = ParagraphStyle(
|
| 245 |
-
'SectionStyle', parent=styles['Heading2'], fontName="
|
| 246 |
textColor=colors.darkblue, fontSize=adjusted_font_size * 1.1, leading=adjusted_font_size * 1.32, spaceAfter=2,
|
| 247 |
linkUnderline=True
|
| 248 |
)
|
|
@@ -268,7 +268,7 @@ def create_pdf(markdown_text, base_font_size, render_with_bold, auto_bold_number
|
|
| 268 |
heading_style = ParagraphStyle(
|
| 269 |
f'Heading{level}Style',
|
| 270 |
parent=styles['Heading1'],
|
| 271 |
-
fontName="
|
| 272 |
textColor=colors.darkblue if level == 1 else (colors.black if level > 2 else colors.blue),
|
| 273 |
fontSize=adjusted_font_size * (1.6 - (level-1)*0.15),
|
| 274 |
leading=adjusted_font_size * (1.8 - (level-1)*0.15),
|
|
@@ -279,7 +279,10 @@ def create_pdf(markdown_text, base_font_size, render_with_bold, auto_bold_number
|
|
| 279 |
column_cells[col_idx].append(Paragraph(apply_emoji_font(heading_text, "NotoEmoji-Bold"), heading_style))
|
| 280 |
elif item.startswith("<b>") and item.endswith("</b>"):
|
| 281 |
content = item[3:-4].strip()
|
| 282 |
-
|
|
|
|
|
|
|
|
|
|
| 283 |
else:
|
| 284 |
column_cells[col_idx].append(Paragraph(apply_emoji_font(item, "NotoEmoji-Bold"), item_style))
|
| 285 |
else:
|
|
|
|
| 98 |
segments = tag_pattern.split(text)
|
| 99 |
result = []
|
| 100 |
|
| 101 |
+
# Apply emoji font only to emojis, use DejaVuSans for other text
|
| 102 |
emoji_pattern = re.compile(
|
| 103 |
r"([\U0001F300-\U0001F5FF"
|
| 104 |
r"\U0001F600-\U0001F64F"
|
|
|
|
| 124 |
# Keep tags unchanged
|
| 125 |
result.append(segment)
|
| 126 |
else:
|
| 127 |
+
# Apply DejaVuSans to non-emoji text, emoji_font to emojis
|
| 128 |
parts = []
|
| 129 |
last_pos = 0
|
| 130 |
for match in emoji_pattern.finditer(segment):
|
| 131 |
start, end = match.span()
|
| 132 |
if last_pos < start:
|
| 133 |
+
parts.append(f'<font face="DejaVuSans">{segment[last_pos:start]}</font>')
|
| 134 |
parts.append(replace_emoji(match))
|
| 135 |
last_pos = end
|
| 136 |
if last_pos < len(segment):
|
| 137 |
+
parts.append(f'<font face="DejaVuSans">{segment[last_pos:]}</font>')
|
| 138 |
result.append(''.join(parts))
|
| 139 |
|
| 140 |
return ''.join(result)
|
|
|
|
| 170 |
|
| 171 |
line = detect_and_convert_links(line)
|
| 172 |
|
| 173 |
+
# Preserve bold and emphasis formatting
|
| 174 |
line = re.sub(r'\*\*(.+?)\*\*', r'<b>\1</b>', line)
|
| 175 |
line = re.sub(r'\*([^*]+?)\*', r'<b>\1</b>', line)
|
| 176 |
|
|
|
|
| 231 |
adjusted_font_size = int(col_width / (avg_line_chars / 10))
|
| 232 |
adjusted_font_size = max(min_font_size, adjusted_font_size)
|
| 233 |
item_style = ParagraphStyle(
|
| 234 |
+
'ItemStyle', parent=styles['Normal'], fontName="DejaVuSans",
|
| 235 |
fontSize=adjusted_font_size, leading=adjusted_font_size * 1.15, spaceAfter=1,
|
| 236 |
linkUnderline=True
|
| 237 |
)
|
|
|
|
| 242 |
linkUnderline=True
|
| 243 |
)
|
| 244 |
section_style = ParagraphStyle(
|
| 245 |
+
'SectionStyle', parent=styles['Heading2'], fontName="DejaVuSans",
|
| 246 |
textColor=colors.darkblue, fontSize=adjusted_font_size * 1.1, leading=adjusted_font_size * 1.32, spaceAfter=2,
|
| 247 |
linkUnderline=True
|
| 248 |
)
|
|
|
|
| 268 |
heading_style = ParagraphStyle(
|
| 269 |
f'Heading{level}Style',
|
| 270 |
parent=styles['Heading1'],
|
| 271 |
+
fontName="DejaVuSans",
|
| 272 |
textColor=colors.darkblue if level == 1 else (colors.black if level > 2 else colors.blue),
|
| 273 |
fontSize=adjusted_font_size * (1.6 - (level-1)*0.15),
|
| 274 |
leading=adjusted_font_size * (1.8 - (level-1)*0.15),
|
|
|
|
| 279 |
column_cells[col_idx].append(Paragraph(apply_emoji_font(heading_text, "NotoEmoji-Bold"), heading_style))
|
| 280 |
elif item.startswith("<b>") and item.endswith("</b>"):
|
| 281 |
content = item[3:-4].strip()
|
| 282 |
+
if number_pattern.match(content):
|
| 283 |
+
column_cells[col_idx].append(Paragraph(apply_emoji_font(content, "NotoEmoji-Bold"), numbered_bold_style))
|
| 284 |
+
else:
|
| 285 |
+
column_cells[col_idx].append(Paragraph(apply_emoji_font(content, "NotoEmoji-Bold"), section_style))
|
| 286 |
else:
|
| 287 |
column_cells[col_idx].append(Paragraph(apply_emoji_font(item, "NotoEmoji-Bold"), item_style))
|
| 288 |
else:
|