awacke1 commited on
Commit
6eaa916
ยท
verified ยท
1 Parent(s): e546935

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +401 -0
app.py ADDED
@@ -0,0 +1,401 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import io
2
+ import re
3
+ import streamlit as st
4
+ import glob
5
+ import os
6
+ from PIL import Image
7
+ import fitz
8
+ from reportlab.lib.pagesizes import A4
9
+ from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle
10
+ from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
11
+ from reportlab.lib import colors
12
+ from reportlab.pdfbase import pdfmetrics
13
+ from reportlab.pdfbase.ttfonts import TTFont
14
+ import unicodedata
15
+
16
+ st.set_page_config(layout="wide", initial_sidebar_state="collapsed")
17
+
18
+ def create_pdf_tab(default_markdown):
19
+ font_files = glob.glob("*.ttf")
20
+ if not font_files:
21
+ st.error("No .ttf font files found in the current directory. Please add some, e.g., NotoColorEmoji-Regular.ttf and DejaVuSans.ttf.")
22
+ return
23
+ available_fonts = {os.path.splitext(os.path.basename(f))[0]: f for f in font_files}
24
+
25
+ md_files = [f for f in glob.glob("*.md") if os.path.basename(f) != "README.md"]
26
+ md_options = [os.path.splitext(os.path.basename(f))[0] for f in md_files]
27
+
28
+ with st.sidebar:
29
+ selected_md = st.selectbox("Select Markdown File", options=md_options, index=0 if md_options else -1)
30
+ selected_font_name = st.selectbox("Select Emoji Font", options=list(available_fonts.keys()), index=0 if "NotoColorEmoji-Regular" in available_fonts else 0)
31
+ selected_font_path = available_fonts[selected_font_name]
32
+ base_font_size = st.slider("Font Size (points)", min_value=6, max_value=16, value=9, step=1)
33
+ plain_text_mode = st.checkbox("Render as Plain Text (Preserve Bold Only)", value=False)
34
+ auto_bold_numbers = st.checkbox("Auto-Bold Numbered Lines", value=False)
35
+ num_columns = st.selectbox("Number of Columns", options=[1, 2, 3, 4, 5, 6], index=3)
36
+
37
+ if 'markdown_content' not in st.session_state or not md_options:
38
+ st.session_state.markdown_content = default_markdown
39
+
40
+ if md_options and selected_md:
41
+ with open(f"{selected_md}.md", "r", encoding="utf-8") as f:
42
+ st.session_state.markdown_content = f.read()
43
+
44
+ edited_markdown = st.text_area("Modify the markdown content below:", value=st.session_state.markdown_content, height=300, key=f"markdown_{selected_md}_{selected_font_name}_{num_columns}")
45
+ if st.button("Update PDF"):
46
+ st.session_state.markdown_content = edited_markdown
47
+ with open(f"{selected_md}.md", "w", encoding="utf-8") as f:
48
+ f.write(edited_markdown)
49
+ st.rerun()
50
+
51
+ st.download_button(label="Save Markdown", data=st.session_state.markdown_content, file_name=f"{selected_md}.md", mime="text/markdown")
52
+
53
+ if not md_options:
54
+ st.warning("No .md files found in the directory (excluding README.md). Using default content.")
55
+ return
56
+
57
+ try:
58
+ pdfmetrics.registerFont(TTFont(selected_font_name, selected_font_path))
59
+ pdfmetrics.registerFont(TTFont("DejaVuSans", "DejaVuSans.ttf"))
60
+ except Exception as e:
61
+ st.error(f"Failed to register fonts: {e}. Ensure both {selected_font_name}.ttf and DejaVuSans.ttf are in the directory.")
62
+ return
63
+
64
+ def apply_emoji_font(text, emoji_font):
65
+ emoji_pattern = re.compile(
66
+ r"([\U0001F300-\U0001F5FF"
67
+ r"\U0001F600-\U0001F64F"
68
+ r"\U0001F680-\U0001F6FF"
69
+ r"\U0001F700-\U0001F77F"
70
+ r"\U0001F780-\U0001F7FF"
71
+ r"\U0001F800-\U0001F8FF"
72
+ r"\U0001F900-\U0001F9FF"
73
+ r"\U0001FA00-\U0001FA6F"
74
+ r"\U0001FA70-\U0001FAFF"
75
+ r"\u2600-\u26FF"
76
+ r"\u2700-\u27BF]+)"
77
+ )
78
+
79
+ def replace_emoji(match):
80
+ emoji = match.group(1)
81
+ emoji = unicodedata.normalize('NFC', emoji)
82
+ return f'<font face="{emoji_font}">{emoji}</font>'
83
+
84
+ segments = []
85
+ last_pos = 0
86
+ for match in emoji_pattern.finditer(text):
87
+ start, end = match.span()
88
+ if last_pos < start:
89
+ segments.append(f'<font face="DejaVuSans">{text[last_pos:start]}</font>')
90
+ segments.append(replace_emoji(match))
91
+ last_pos = end
92
+ if last_pos < len(text):
93
+ segments.append(f'<font face="DejaVuSans">{text[last_pos:]}</font>')
94
+ return ''.join(segments)
95
+
96
+ def markdown_to_pdf_content(markdown_text, plain_text_mode, auto_bold_numbers):
97
+ lines = markdown_text.strip().split('\n')
98
+ pdf_content = []
99
+ number_pattern = re.compile(r'^\d+\.\s')
100
+
101
+ if plain_text_mode:
102
+ for line in lines:
103
+ line = line.strip()
104
+ if not line or line.startswith('# '):
105
+ continue
106
+ bold_pattern = re.compile(r'\*\*(.*?)\*\*')
107
+ line = bold_pattern.sub(r'<b>\1</b>', line)
108
+ pdf_content.append(line)
109
+ else:
110
+ for line in lines:
111
+ line = line.strip()
112
+ if not line or line.startswith('# '):
113
+ continue
114
+ if line.startswith('## ') or line.startswith('### '):
115
+ text = line.replace('## ', '').replace('### ', '').strip()
116
+ pdf_content.append(f"<b>{text}</b>")
117
+ elif auto_bold_numbers and number_pattern.match(line):
118
+ pdf_content.append(f"<b>{line}</b>")
119
+ else:
120
+ pdf_content.append(line.strip())
121
+
122
+ total_lines = len(pdf_content)
123
+ return pdf_content, total_lines
124
+
125
+ def create_pdf(markdown_text, base_font_size, plain_text_mode, num_columns, auto_bold_numbers):
126
+ buffer = io.BytesIO()
127
+ page_width = A4[0] * 2
128
+ page_height = A4[1]
129
+ doc = SimpleDocTemplate(buffer, pagesize=(page_width, page_height), leftMargin=36, rightMargin=36, topMargin=36, bottomMargin=36)
130
+ styles = getSampleStyleSheet()
131
+ story = []
132
+ spacer_height = 10
133
+ section_spacer_height = 15
134
+ pdf_content, total_lines = markdown_to_pdf_content(markdown_text, plain_text_mode, auto_bold_numbers)
135
+
136
+ item_font_size = base_font_size
137
+ section_font_size = base_font_size * 1.1
138
+
139
+ section_style = ParagraphStyle(
140
+ 'SectionStyle', parent=styles['Heading2'], fontName="DejaVuSans",
141
+ textColor=colors.darkblue, fontSize=section_font_size, leading=section_font_size * 1.2, spaceAfter=2
142
+ )
143
+ item_style = ParagraphStyle(
144
+ 'ItemStyle', parent=styles['Normal'], fontName="DejaVuSans",
145
+ fontSize=item_font_size, leading=item_font_size * 1.15, spaceAfter=1
146
+ )
147
+
148
+ story.append(Spacer(1, spacer_height))
149
+ columns = [[] for _ in range(num_columns)]
150
+ lines_per_column = total_lines / num_columns if num_columns > 0 else total_lines
151
+ current_line_count = 0
152
+ current_column = 0
153
+
154
+ number_pattern = re.compile(r'^\d+\.\s')
155
+ for i, item in enumerate(pdf_content):
156
+ if i > 0 and number_pattern.match(item.replace('<b>', '').replace('</b>', '')):
157
+ columns[current_column].append(Spacer(1, section_spacer_height))
158
+
159
+ if current_line_count >= lines_per_column and current_column < num_columns - 1:
160
+ current_column += 1
161
+ current_line_count = 0
162
+ columns[current_column].append(item)
163
+ current_line_count += 1
164
+
165
+ column_cells = [[] for _ in range(num_columns)]
166
+ for col_idx, column in enumerate(columns):
167
+ for item in column:
168
+ if isinstance(item, Spacer):
169
+ column_cells[col_idx].append(item)
170
+ elif isinstance(item, str) and item.startswith('<b>'):
171
+ text = item.replace('<b>', '').replace('</b>', '')
172
+ column_cells[col_idx].append(Paragraph(apply_emoji_font(text, selected_font_name), section_style))
173
+ else:
174
+ column_cells[col_idx].append(Paragraph(apply_emojiJsfont(item, selected_font_name), item_style))
175
+
176
+ max_cells = max(len(cells) for cells in column_cells) if column_cells else 0
177
+ for cells in column_cells:
178
+ cells.extend([Paragraph("", item_style)] * (max_cells - len(cells)))
179
+
180
+ col_width = (page_width - 72) / num_columns if num_columns > 0 else page_width - 72
181
+ table_data = list(zip(*column_cells)) if column_cells else [[]]
182
+ table = Table(table_data, colWidths=[col_width] * num_columns, hAlign='CENTER')
183
+ table.setStyle(TableStyle([
184
+ ('VALIGN', (0, 0), (-1, -1), 'TOP'), ('ALIGN', (0, 0), (-1, -1), 'LEFT'),
185
+ ('BACKGROUND', (0, 0), (-1, -1), colors.white), ('GRID', (0, 0), (-1, -1), 0, colors.white),
186
+ ('LINEAFTER', (0, 0), (num_columns-1, -1), 0.5, colors.grey),
187
+ ('LEFTPADDING', (0, 0), (-1, -1), 2), ('RIGHTPADDING', (0, 0), (-1, -1), 2),
188
+ ('TOPPADDING', (0, 0), (-1, -1), 1), ('BOTTOMPADDING', (0, 0), (-1, -1), 1),
189
+ ]))
190
+
191
+ story.append(table)
192
+ doc.build(story)
193
+ buffer.seek(0)
194
+ return buffer.getvalue()
195
+
196
+ def pdf_to_image(pdf_bytes):
197
+ try:
198
+ doc = fitz.open(stream=pdf_bytes, filetype="pdf")
199
+ images = []
200
+ for page in doc:
201
+ pix = page.get_pixmap(matrix=fitz.Matrix(2.0, 2.0))
202
+ img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
203
+ images.append(img)
204
+ doc.close()
205
+ return images
206
+ except Exception as e:
207
+ st.error(f"Failed to render PDF preview: {e}")
208
+ return None
209
+
210
+ with st.spinner("Generating PDF..."):
211
+ pdf_bytes = create_pdf(st.session_state.markdown_content, base_font_size, plain_text_mode, num_columns, auto_bold_numbers)
212
+
213
+ with st.container():
214
+ pdf_images = pdf_to_image(pdf_bytes)
215
+ if pdf_images:
216
+ for img in pdf_images:
217
+ st.image(img, use_container_width=True)
218
+ else:
219
+ st.info("Download the PDF to view it locally.")
220
+
221
+ with st.sidebar:
222
+ st.download_button(label="Download PDF", data=pdf_bytes, file_name="deities_guide.pdf", mime="application/pdf")
223
+
224
+ default_markdown = """# Deities Guide: Mythology and Moral Lessons ๐ŸŒŸโœจ
225
+
226
+ 1. ๐Ÿ“œ **Introduction**
227
+ - **Purpose**: Explore deities, spirits, saints, and beings with their epic stories and morals! ๐ŸŒ๐Ÿ“–
228
+ - **Usage**: A guide for learning and storytelling across traditions. ๐ŸŽญโœ๏ธ
229
+ - **Themes**: Justice โš–๏ธ, faith ๐Ÿ™, hubris ๐Ÿ˜ค, redemption ๐ŸŒˆ, cosmic order ๐ŸŒŒ.
230
+
231
+ 2. ๐Ÿ› ๏ธ **Core Concepts of Divinity**
232
+ - **Powers**: Creation ๐ŸŒ, omniscience ๐Ÿ‘๏ธโ€๐Ÿ—จ๏ธ, shapeshifting ๐Ÿฆ‹ across entities.
233
+ - **Life Cycle**: Mortality ๐Ÿ’€, immortality โœจ, transitions like saints and avatars ๐ŸŒŸ.
234
+ - **Communication**: Omens ๐ŸŒฉ๏ธ, visions ๐Ÿ‘๏ธ, miracles โœจ from gods and spirits.
235
+
236
+ 3. โšก **Standard Abilities**
237
+ - **Creation**: Gods and spirits shape worlds, e.g., Allah ๐ŸŒ and Vishnu ๐ŸŒ€.
238
+ - **Influence**: Saints and prophets intercede, like Muhammad ๐Ÿ•Œ and Paul โœ๏ธ.
239
+ - **Transformation**: Angels and avatars shift forms, e.g., Gabriel ๐Ÿ˜‡ and Krishna ๐Ÿฆš.
240
+ - **Knowledge**: Foresight ๐Ÿ”ฎ or revelation ๐Ÿ“œ, as with the Holy Spirit ๐Ÿ•Š๏ธ and Brahma ๐Ÿง .
241
+ - **Judgment**: Divine authority ๐Ÿ‘‘, e.g., Yahweh โš–๏ธ and Yama ๐Ÿ’€.
242
+
243
+ 4. โณ **Mortality and Immortality**
244
+ - **Gods**: Eternal โฐ, like Allah ๐ŸŒŸ and Shiva ๐Ÿ•‰๏ธ.
245
+ - **Spirits**: Realm-bound ๐ŸŒ , e.g., jinn ๐Ÿ”ฅ and devas โœจ.
246
+ - **Saints/Prophets**: Mortal to divine ๐ŸŒโžก๏ธ๐ŸŒŒ, e.g., Moses ๐Ÿ“œ and Rama ๐Ÿน.
247
+ - **Beings**: Limbo states โ“, like cherubim ๐Ÿ˜‡ and rakshasas ๐Ÿ‘น.
248
+ - **Lessons**: Faith ๐Ÿ™ and duty โš™๏ธ define transitions.
249
+
250
+ 5. ๐ŸŒ  **Ascension and Signs**
251
+ - **Paths**: Birth ๐Ÿ‘ถ, deeds ๐Ÿ›ก๏ธ, revelation ๐Ÿ“–, as with Jesus โœ๏ธ and Arjuna ๐Ÿน.
252
+ - **Signs**: Miracles โœจ and prophecies ๐Ÿ”ฎ, like those in the Quran ๐Ÿ“˜ and Gita ๐Ÿ“š.
253
+ - **Morals**: Obedience ๐ŸงŽ and devotion โค๏ธ shape destiny ๐ŸŒŸ.
254
+
255
+ 6. ๐ŸŽฒ **Storytelling and Games**
256
+ - **Portrayal**: Gods, spirits, and saints in narratives or RPGs ๐ŸŽฎ๐Ÿ“œ.
257
+ - **Dynamics**: Clerics โ›ช, imams ๐Ÿ•Œ, and sadhus ๐Ÿง˜ serve higher powers.
258
+ - **Balance**: Power ๐Ÿ’ช vs. personality ๐Ÿ˜Š for depth.
259
+
260
+ 7. ๐ŸŽฎ **Dungeon Mastering Beings**
261
+ - **Gods**: Epic scope ๐ŸŒŒ, e.g., Allah โœจ and Vishnu ๐ŸŒ€.
262
+ - **Spirits**: Local influence ๐Ÿž๏ธ, like jinn ๐Ÿ”ฅ and apsaras ๐Ÿ’ƒ.
263
+ - **Saints**: Moral anchors โš“, e.g., St. Francis ๐Ÿพ and Ali โš”๏ธ.
264
+
265
+ 8. ๐Ÿ™ **Devotee Relationships**
266
+ - **Clerics**: Serve gods, e.g., Krishnaโ€™s priests ๐Ÿฆš.
267
+ - **Mediums**: Channel spirits, like jinn whisperers ๐Ÿ”ฅ๐Ÿ‘๏ธ.
268
+ - **Faithful**: Venerate saints and prophets, e.g., Fatimaโ€™s followers ๐ŸŒน.
269
+
270
+ 9. ๐Ÿฆ… **American Indian Traditions**
271
+ - **Coyote, Raven, White Buffalo Woman**: Trickster kin ๐ŸฆŠ๐Ÿฆ and wise mother ๐Ÿƒ.
272
+ - **Relation**: Siblings and guide teach balance โš–๏ธ.
273
+ - **Lesson**: Chaos ๐ŸŒช๏ธ breeds wisdom ๐Ÿง .
274
+
275
+ 10. โš”๏ธ **Arthurian Legends**
276
+ - **Merlin, Morgan le Fay, Arthur**: Mentor ๐Ÿง™, rival ๐Ÿง™โ€โ™€๏ธ, son ๐Ÿ‘‘.
277
+ - **Relation**: Family tests loyalty ๐Ÿค.
278
+ - **Lesson**: Honor ๐Ÿ›ก๏ธ vs. betrayal ๐Ÿ—ก๏ธ.
279
+
280
+ 11. ๐Ÿ›๏ธ **Babylonian Mythology**
281
+ - **Marduk, Tiamat, Ishtar**: Son โš”๏ธ, mother ๐ŸŒŠ, lover โค๏ธ.
282
+ - **Relation**: Kinship drives order ๐Ÿฐ.
283
+ - **Lesson**: Power ๐Ÿ’ช reshapes chaos ๐ŸŒช๏ธ.
284
+
285
+ 12. โœ๏ธ **Christian Trinity**
286
+ - **God (Yahweh), Jesus, Holy Spirit**: Father ๐Ÿ‘‘, Son โœ๏ธ, Spirit ๐Ÿ•Š๏ธ.
287
+ - **Relation**: Divine family redeems ๐ŸŒˆ.
288
+ - **Lesson**: Faith ๐Ÿ™ restores grace โœจ.
289
+
290
+ 13. ๐Ÿ˜‡ **Christian Saints & Angels**
291
+ - **St. Michael, Gabriel, Mary**: Warrior โš”๏ธ, messenger ๐Ÿ“œ, mother ๐ŸŒน.
292
+ - **Relation**: Heavenly kin serve God ๐Ÿ‘‘.
293
+ - **Lesson**: Duty โš™๏ธ upholds divine will ๐ŸŒŸ.
294
+
295
+ 14. ๐Ÿ€ **Celtic Mythology**
296
+ - **Lugh, Morrigan, Cernunnos**: Son โ˜€๏ธ, mother ๐Ÿฆ‡, father ๐ŸฆŒ.
297
+ - **Relation**: Family governs cycles ๐ŸŒ.
298
+ - **Lesson**: Courage ๐Ÿ’ช in fate ๐ŸŽฒ.
299
+
300
+ 15. ๐ŸŒ„ **Central American Traditions**
301
+ - **Quetzalcoatl, Tezcatlipoca, Huitzilopochtli**: Brothers ๐Ÿ๐Ÿ† and war son โš”๏ธ.
302
+ - **Relation**: Sibling rivalry creates ๐ŸŒ.
303
+ - **Lesson**: Sacrifice ๐Ÿฉธ builds worlds ๐Ÿฐ.
304
+
305
+ 16. ๐Ÿ‰ **Chinese Mythology**
306
+ - **Jade Emperor, Nuwa, Sun Wukong**: Father ๐Ÿ‘‘, mother ๐Ÿ, rebel son ๐Ÿ’.
307
+ - **Relation**: Family enforces harmony ๐ŸŽถ.
308
+ - **Lesson**: Duty โš™๏ธ curbs chaos ๐ŸŒช๏ธ.
309
+
310
+ 17. ๐Ÿ™ **Cthulhu Mythos**
311
+ - **Cthulhu, Nyarlathotep, Yog-Sothoth**: Elder kin ๐Ÿ™๐Ÿ‘๏ธโ€๐Ÿ—จ๏ธ๐ŸŒŒ.
312
+ - **Relation**: Cosmic trio overwhelms ๐Ÿ˜ฑ.
313
+ - **Lesson**: Insignificance ๐ŸŒŒ humbles ๐Ÿ™‡.
314
+
315
+ 18. โ˜ฅ **Egyptian Mythology**
316
+ - **Ra, Osiris, Isis**: Father โ˜€๏ธ, son โšฐ๏ธ, mother ๐ŸŒŸ.
317
+ - **Relation**: Family ensures renewal ๐Ÿ”„.
318
+ - **Lesson**: Justice โš–๏ธ prevails.
319
+
320
+ 19. โ„๏ธ **Finnish Mythology**
321
+ - **Vรคinรคmรถinen, Louhi, Ukko**: Son ๐ŸŽถ, mother โ„๏ธ, father โšก.
322
+ - **Relation**: Kinship tests wisdom ๐Ÿง .
323
+ - **Lesson**: Perseverance ๐Ÿ‹๏ธ wins.
324
+
325
+ 20. ๐Ÿ›๏ธ **Greek Mythology**
326
+ - **Zeus, Hera, Athena**: Father โšก, mother ๐Ÿ‘‘, daughter ๐Ÿฆ‡.
327
+ - **Relation**: Family rules with tension โš”๏ธ.
328
+ - **Lesson**: Hubris ๐Ÿ˜ค meets wisdom ๐Ÿง .
329
+
330
+ 21. ๐Ÿ•‰๏ธ **Hindu Trimurti**
331
+ - **Brahma, Vishnu, Shiva**: Creator ๐ŸŒ€, preserver ๐Ÿ›ก๏ธ, destroyer ๐Ÿ”ฅ.
332
+ - **Relation**: Divine trio cycles existence ๐Ÿ”„.
333
+ - **Lesson**: Balance โš–๏ธ sustains life ๐ŸŒ.
334
+
335
+ 22. ๐ŸŒบ **Hindu Avatars & Devis**
336
+ - **Krishna, Rama, Durga**: Sons ๐Ÿฆš๐Ÿน and fierce mother ๐Ÿ—ก๏ธ.
337
+ - **Relation**: Avatars and goddess protect dharma โš–๏ธ.
338
+ - **Lesson**: Duty โš™๏ธ defeats evil ๐Ÿ‘น.
339
+
340
+ 23. ๐ŸŒธ **Japanese Mythology**
341
+ - **Amaterasu, Susanoo, Tsukuyomi**: Sister โ˜€๏ธ, brothers ๐ŸŒŠ๐ŸŒ™.
342
+ - **Relation**: Siblings balance cosmos ๐ŸŒŒ.
343
+ - **Lesson**: Harmony ๐ŸŽถ vs. chaos ๐ŸŒช๏ธ.
344
+
345
+ 24. ๐Ÿ—ก๏ธ **Melnibonean Legends**
346
+ - **Arioch, Xiombarg, Elric**: Lords ๐Ÿ‘‘ and mortal son โš”๏ธ.
347
+ - **Relation**: Pact binds chaos ๐ŸŒช๏ธ.
348
+ - **Lesson**: Power ๐Ÿ’ช corrupts ๐Ÿ˜ˆ.
349
+
350
+ 25. โ˜ช๏ธ **Muslim Divine & Messengers**
351
+ - **Allah, Muhammad, Gabriel**: God ๐ŸŒŸ, prophet ๐Ÿ•Œ, angel ๐Ÿ˜‡.
352
+ - **Relation**: Messenger reveals divine will ๐Ÿ“œ.
353
+ - **Lesson**: Submission ๐Ÿ™‡ brings peace โ˜ฎ๏ธ.
354
+
355
+ 26. ๐Ÿ‘ป **Muslim Spirits & Kin**
356
+ - **Jinn, Iblis, Khidr**: Spirits ๐Ÿ”ฅ๐Ÿ˜ˆ and guide ๐ŸŒฟ defy or aid.
357
+ - **Relation**: Supernatural kin test faith ๐Ÿ™.
358
+ - **Lesson**: Obedience ๐ŸงŽ vs. rebellion ๐Ÿ˜ก.
359
+
360
+ 27. ๐Ÿฐ **Nehwon Legends**
361
+ - **Death, Ningauble, Sheelba**: Fateful trio ๐Ÿ’€๐Ÿ‘๏ธโ€๐Ÿ—จ๏ธ๐ŸŒฟ.
362
+ - **Relation**: Guides shape destiny ๐ŸŽฒ.
363
+ - **Lesson**: Cunning ๐Ÿง  defies fate โšฐ๏ธ.
364
+
365
+ 28. ๐Ÿง **Nonhuman Traditions**
366
+ - **Corellon, Moradin, Gruumsh**: Elf ๐Ÿง, dwarf โ›๏ธ, orc ๐Ÿ—ก๏ธ fathers.
367
+ - **Relation**: Rivals define purpose โš”๏ธ.
368
+ - **Lesson**: Community ๐Ÿค endures.
369
+
370
+ 29. แšฑ **Norse Mythology**
371
+ - **Odin, Frigg, Loki**: Father ๐Ÿ‘๏ธ, mother ๐Ÿ‘‘, trickster son ๐ŸฆŠ.
372
+ - **Relation**: Family faces doom โšก.
373
+ - **Lesson**: Sacrifice ๐Ÿฉธ costs.
374
+
375
+ 30. ๐Ÿ—ฟ **Sumerian Mythology**
376
+ - **Enki, Inanna, Anu**: Son ๐ŸŒŠ, daughter โค๏ธ, father ๐ŸŒŒ.
377
+ - **Relation**: Kin wield knowledge ๐Ÿง .
378
+ - **Lesson**: Ambition ๐ŸŒŸ shapes.
379
+
380
+ 31. ๐Ÿ“š **Appendices**
381
+ - **Planes**: Realms of gods, spirits, saints, e.g., Paradise ๐ŸŒˆ and Svarga โœจ.
382
+ - **Symbols**: Rituals ๐Ÿ•‰๏ธ and artifacts ๐Ÿ—ฟ of faith.
383
+ - **Charts**: Domains and duties for devotees ๐Ÿ“Š.
384
+
385
+ 32. ๐ŸŒŒ **Planes of Existence**
386
+ - **Heaven/Paradise**: Christian/Muslim abode ๐ŸŒŸ.
387
+ - **Svarga**: Hindu divine realm โœจ.
388
+ - **Underworld**: Spirits linger, e.g., Sheol โšฐ๏ธ and Naraka ๐Ÿ”ฅ.
389
+
390
+ 33. ๐Ÿ• **Temple Trappings**
391
+ - **Cross/Crescent**: Christian/Muslim faith โœ๏ธโ˜ช๏ธ.
392
+ - **Mandalas**: Hindu devotion ๐ŸŒ€.
393
+ - **Relics**: Saintsโ€™ and prophetsโ€™ legacy ๐Ÿ—๏ธ.
394
+
395
+ 34. ๐Ÿ“Š **Clerical Chart**
396
+ - **Gods**: Domains, e.g., creation ๐ŸŒ and mercy โค๏ธ.
397
+ - **Spirits**: Influence, like guidance ๐ŸŒฟ and mischief ๐Ÿ˜ˆ.
398
+ - **Saints/Prophets**: Virtues, e.g., justice โš–๏ธ and prophecy ๐Ÿ”ฎ.
399
+ """
400
+
401
+ create_pdf_tab(default_markdown)