Hi
Explain vartmangat roga of eyes
vartmangat roga Ayurveda eyelid diseases types
https://www.easyayurveda.com/eye-diseases-classification
| Location | Name | No. of Diseases |
|---|---|---|
| Sandhi (junctions) | Sandhi Gata Roga | 9 |
| Vartma (eyelids) | Vartma Gata Roga | 21 |
| Shukla (sclera/conjunctiva) | Shukla Gata Roga | 11 |
| Krishna (cornea/iris) | Krishna Gata Roga | 4 |
| All over eye | Sarvashraya Roga | 17 |
| Retina/lens | Drushti Gata Roga | 12 |
| External/traumatic | Baahyaja | 2 |
| Ayurvedic Name | Modern Equivalent |
|---|---|
| Utsangini | Chalazion / Meibomian cyst |
| Kumbhika | Hordeolum (Stye) |
| Pothaki | Trachoma / follicular conjunctivitis |
| Vartma Sharkara | Calcareous deposits on eyelid (calcified granuloma) |
| Arsho Vartma | Papilloma / warty growth on lid |
| Shushka Arsha | Dry wart-like growth (fibroma) |
| Anjana Namika | Infected meibomian gland / stye-like |
| Bahala Vartma | Thickening of eyelid (hypertrophic blepharitis) |
| Vartma Bandhaka | Symblepharon (adhesion of eyelid to eyeball) |
| Klishta Vartma | Ulcerative blepharitis |
| Kardama Vartma | Blepharitis with discharge/crusting (muddy lids) |
| Shyaava Vartma | Discoloration of eyelid (pigmentation/ecchymosis) |
| Praklinna Vartma | Watering eye / hyperlacrimation blepharitis |
| Apariklinna Vartma | Dry eyelid condition |
| Vaatahata Vartma | Ptosis / facial nerve palsy / lagophthalmos |
| Arbuda | Tumor/neoplasm of the eyelid |
| Nimesha | Blepharospasm (inability to open eyes) |
| Shonita Arsha | Vascular growth / haemangioma on lid |
| Lagana | Cystic swelling (painless) |
| Visa Vartma | Toxic/allergic eyelid condition (contact dermatitis) |
| Pakshma Kopa | Trichiasis, distichiasis, entropion |
| Disease | Predominant Dosha |
|---|---|
| Vaatahata Vartma | Vata |
| Klishta Vartma | Pitta |
| Bahala Vartma | Kapha |
| Utsangini | Tridoshaja (all three doshas) |
| Kumbhika | Pitta + Kapha |
| Pothaki | Kapha |
| Pakshma Kopa | Sannipataja (all doshas) |
| Category | Examples |
|---|---|
| Sadhya (Curable) | Utsangini, Kumbhika, Bahala Vartma, Lagana |
| Yapya (Manageable/lifelong) | Pakshma Kopa |
| Asaadhya (Incurable) | Vaatahata Vartma, Nimesha, Arbuda (malignant) |
Create a quick reference PDF guide on 21 vartmangat rogas for easy consultation
ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace empty or not found"
mkdir -p /home/daytona/workspace/vartmangat-roga && python3 -c "import reportlab; print('reportlab ok')" && python3 -c "from reportlab.lib.pagesizes import A4; print('A4 ok')"
~/vartmangat-roga/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import mm, cm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether, PageBreak
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import Flowable
# ─── Color palette ───────────────────────────────────────────────────────────
DEEP_MAROON = colors.HexColor("#6B1A2A")
GOLD = colors.HexColor("#C8963E")
LIGHT_GOLD = colors.HexColor("#F5E9D0")
CREAM = colors.HexColor("#FDF6EC")
PALE_GREEN = colors.HexColor("#E8F5E9")
PALE_BLUE = colors.HexColor("#E3F2FD")
PALE_YELLOW = colors.HexColor("#FFFDE7")
PALE_ORANGE = colors.HexColor("#FFF3E0")
LIGHT_GREY = colors.HexColor("#F5F5F5")
MID_GREY = colors.HexColor("#BDBDBD")
DARK_TEXT = colors.HexColor("#212121")
SECTION_HEAD = colors.HexColor("#4A0E1A")
W, H = A4
def make_doc(path):
doc = SimpleDocTemplate(
path,
pagesize=A4,
rightMargin=15*mm, leftMargin=15*mm,
topMargin=18*mm, bottomMargin=15*mm,
title="Vartmangat Roga – Quick Reference Guide",
author="Shalakya Tantra / Ayurvedic Ophthalmology"
)
return doc
# ─── Styles ──────────────────────────────────────────────────────────────────
base = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
STYLES = {
"title": S("title", fontName="Helvetica-Bold", fontSize=22,
textColor=DEEP_MAROON, alignment=TA_CENTER, spaceAfter=4),
"subtitle": S("subtitle", fontName="Helvetica", fontSize=11,
textColor=GOLD, alignment=TA_CENTER, spaceAfter=2),
"tag": S("tag", fontName="Helvetica-Oblique", fontSize=9,
textColor=colors.HexColor("#888888"), alignment=TA_CENTER, spaceAfter=10),
"section": S("section", fontName="Helvetica-Bold", fontSize=13,
textColor=SECTION_HEAD, spaceBefore=10, spaceAfter=4),
"body": S("body", fontName="Helvetica", fontSize=9,
textColor=DARK_TEXT, leading=13, spaceAfter=3, alignment=TA_JUSTIFY),
"body_bold": S("body_bold", fontName="Helvetica-Bold", fontSize=9,
textColor=DARK_TEXT, leading=13, spaceAfter=2),
"cell": S("cell", fontName="Helvetica", fontSize=8.5,
textColor=DARK_TEXT, leading=11),
"cell_bold": S("cell_bold", fontName="Helvetica-Bold", fontSize=8.5,
textColor=DARK_TEXT, leading=11),
"cell_center": S("cell_center", fontName="Helvetica", fontSize=8.5,
textColor=DARK_TEXT, leading=11, alignment=TA_CENTER),
"cell_center_bold": S("cell_center_bold", fontName="Helvetica-Bold", fontSize=8.5,
textColor=DARK_TEXT, leading=11, alignment=TA_CENTER),
"note": S("note", fontName="Helvetica-Oblique", fontSize=8,
textColor=colors.HexColor("#555555"), leading=11, spaceAfter=4),
"card_title": S("card_title", fontName="Helvetica-Bold", fontSize=10,
textColor=DEEP_MAROON, leading=13),
"card_sub": S("card_sub", fontName="Helvetica", fontSize=8.5,
textColor=colors.HexColor("#333333"), leading=12),
"footer": S("footer", fontName="Helvetica", fontSize=7.5,
textColor=colors.grey, alignment=TA_CENTER),
"page_title": S("page_title", fontName="Helvetica-Bold", fontSize=15,
textColor=DEEP_MAROON, spaceBefore=6, spaceAfter=4, alignment=TA_CENTER),
}
def HR(color=GOLD, thickness=1.2):
return HRFlowable(width="100%", thickness=thickness, color=color, spaceAfter=4, spaceBefore=2)
def SP(h=4):
return Spacer(1, h*mm)
# ─── Data ────────────────────────────────────────────────────────────────────
ROGAS = [
{
"no": 1, "name": "Utsangini", "sanskrit": "उत्सङ्गिनी",
"modern": "Chalazion / Meibomian Cyst",
"dosha": "Tridoshaja", "sadhyata": "Sadhya (Curable)",
"location": "Lower eyelid", "chikitsa": "Lekhana (Scraping / Curetting)",
"symptoms": "Painless nodular swelling on lower lid; opening directed inward; non-tender, firm",
"note": "Only in lower lid. Tridoshaja – all three doshas vitiated."
},
{
"no": 2, "name": "Kumbhika", "sanskrit": "कुम्भिका",
"modern": "Hordeolum / Stye",
"dosha": "Pitta + Kapha", "sadhyata": "Sadhya (Curable)",
"location": "Lid margin (follicle/gland)", "chikitsa": "Lekhana; hot compress; drainage",
"symptoms": "Acute painful swelling at lid margin; pus point visible; photophobia; watering",
"note": "Organism: Staphylococcus aureus (modern). Two stages: cellulitis → abscess."
},
{
"no": 3, "name": "Pothaki", "sanskrit": "पोथकी",
"modern": "Trachoma / Follicular conjunctivitis",
"dosha": "Kapha", "sadhyata": "Sadhya (Curable)",
"location": "Palpebral conjunctiva / lid", "chikitsa": "Lekhana; Anjana; antibiotics (modern)",
"symptoms": "Multiple follicle-like elevations on inner lid surface; discharge; foreign body sensation",
"note": "Corresponds to trachomatous follicles. Infective cause in modern medicine."
},
{
"no": 4, "name": "Vartma Sharkara", "sanskrit": "वर्त्मशर्करा",
"modern": "Calcareous / Calcified deposits on lid",
"dosha": "Kapha + Vata", "sadhyata": "Sadhya (Curable)",
"location": "Eyelid (tarsal plate)", "chikitsa": "Lekhana (scraping off deposits)",
"symptoms": "Hard gritty nodules on lid margin/conjunctival surface; roughness; irritation",
"note": "Gritty sensation due to calcareous concretions, similar to chalky deposits."
},
{
"no": 5, "name": "Arsho Vartma", "sanskrit": "अर्शो वर्त्म",
"modern": "Papilloma / Warty growth on lid",
"dosha": "Kapha + Rakta", "sadhyata": "Sadhya (Curable)",
"location": "Eyelid skin or margin", "chikitsa": "Excision; Kshara Karma",
"symptoms": "Fleshy/warty pedunculated or sessile growth; irregular surface; mild irritation",
"note": "Resembles haemorrhoidal tissue texture – hence 'Arsha'. Benign lid growth."
},
{
"no": 6, "name": "Shushka Arsha", "sanskrit": "शुष्क अर्श",
"modern": "Fibroma / Dry warty lid growth",
"dosha": "Vata + Kapha", "sadhyata": "Sadhya (Curable)",
"location": "Eyelid", "chikitsa": "Excision; Agni Karma (cautery)",
"symptoms": "Dry, hard, non-vascular lid growth; no secretion; painless; rough surface",
"note": "Dry variant of Arsho Vartma – no secretion, non-fleshy."
},
{
"no": 7, "name": "Anjana Namika", "sanskrit": "अञ्जन नामिका",
"modern": "Infected meibomian/sebaceous gland (internal hordeolum variant)",
"dosha": "Pitta + Kapha", "sadhyata": "Sadhya (Curable)",
"location": "Deep lid (tarsal glands)", "chikitsa": "Bhedana (incision & drainage)",
"symptoms": "Suppurative swelling pointing inward; purulent discharge; pain; lid oedema",
"note": "Deeper than Kumbhika; requires incision. Named for resemblance to kohl applicator."
},
{
"no": 8, "name": "Bahala Vartma", "sanskrit": "बहल वर्त्म",
"modern": "Hypertrophic Blepharitis / Lid thickening",
"dosha": "Kapha", "sadhyata": "Sadhya (Curable)",
"location": "Whole eyelid", "chikitsa": "Lekhana (scraping); Virechana",
"symptoms": "Diffuse painless thickening of eyelid; heaviness; blurred vision if severe",
"note": "Kapha dominant – lid is thick, soft, heavy. Lekhana is primary treatment."
},
{
"no": 9, "name": "Vartma Bandhaka", "sanskrit": "वर्त्म बन्धक",
"modern": "Symblepharon (adhesion of lid to globe)",
"dosha": "Vata + Pitta", "sadhyata": "Yapya / Asadhya",
"location": "Palpebral-bulbar junction", "chikitsa": "Surgical separation; Tarpana",
"symptoms": "Eyelid adherent to eyeball; restricted ocular movements; chronic discharge",
"note": "Adhesion between palpebral and bulbar conjunctiva. Often post-inflammatory/chemical burn."
},
{
"no": 10, "name": "Klishta Vartma", "sanskrit": "क्लिष्ट वर्त्म",
"modern": "Ulcerative Blepharitis",
"dosha": "Pitta + Rakta", "sadhyata": "Sadhya (Curable)",
"location": "Lid margin", "chikitsa": "Lekhana; Seka (eye wash); antibiotics",
"symptoms": "Ulceration at lid margins; bleeding; crusts; lash loss; burning pain",
"note": "Pitta-Rakta vitiation leads to ulceration. Corresponds to staphylococcal ulcerative blepharitis."
},
{
"no": 11, "name": "Kardama Vartma", "sanskrit": "कर्दम वर्त्म",
"modern": "Seborrhoeic / Squamous Blepharitis (with discharge)",
"dosha": "Kapha + Rakta", "sadhyata": "Sadhya (Curable)",
"location": "Lid margin", "chikitsa": "Lekhana; lid hygiene; Seka",
"symptoms": "Muddy/greasy discharge from lid margin; crusting; itching; mild redness",
"note": "'Kardama' = mud. Greasy scales/crusts at base of lashes like seborrhoeic blepharitis."
},
{
"no": 12, "name": "Shyaava Vartma", "sanskrit": "श्याव वर्त्म",
"modern": "Lid Discolouration / Ecchymosis / Pigmentation",
"dosha": "Vata + Rakta", "sadhyata": "Sadhya (Curable)",
"location": "Eyelid skin", "chikitsa": "Lekhana; Rakta mokshana (blood-letting)",
"symptoms": "Dark/bluish discolouration of eyelid; no significant swelling; cosmetic concern",
"note": "'Shyaava' = dark/black. Corresponds to post-traumatic ecchymosis or chronic pigmentation."
},
{
"no": 13, "name": "Praklinna Vartma", "sanskrit": "प्रक्लिन्न वर्त्म",
"modern": "Hyperlacrimation / Wet blepharitis / Epiphora",
"dosha": "Kapha + Vata", "sadhyata": "Sadhya (Curable)",
"location": "Eyelid / lacrimal region", "chikitsa": "Seka; Virechana; drying agents",
"symptoms": "Constant watering; lid oedema; macerations of skin; sticky discharge",
"note": "'Praklinna' = excessively wet. Lid is waterlogged due to Kapha excess."
},
{
"no": 14, "name": "Apariklinna Vartma", "sanskrit": "अपरिक्लिन्न वर्त्म",
"modern": "Dry Eye / Keratoconjunctivitis sicca (lid component)",
"dosha": "Vata + Pitta", "sadhyata": "Yapya (Manageable)",
"location": "Eyelid / conjunctiva", "chikitsa": "Tarpana; Snehana; lubricating drops",
"symptoms": "Dry, rough eyelid; burning; gritty sensation; reduced tear film; photophobia",
"note": "Opposite of Praklinna – lid is dry. Vata-Pitta dominance leads to dryness."
},
{
"no": 15, "name": "Vaatahata Vartma", "sanskrit": "वातहत वर्त्म",
"modern": "Ptosis / Facial nerve palsy / Lagophthalmos",
"dosha": "Vata", "sadhyata": "Asadhya (Incurable)",
"location": "Eyelid (levator mechanism)", "chikitsa": "Nasya; Vata-pacifying oils; surgery",
"symptoms": "Drooping of upper eyelid; inability to close lid fully; loss of lid function",
"note": "Corresponds to 7th CN palsy (lagophthalmos) or 3rd CN palsy (ptosis). Vata dominant – incurable."
},
{
"no": 16, "name": "Arbuda", "sanskrit": "अर्बुद",
"modern": "Lid Tumour (benign/malignant neoplasm)",
"dosha": "Tridoshaja / Mamsaja", "sadhyata": "Sadhya/Asadhya (depends on type)",
"location": "Eyelid (skin, margin, tarsal)", "chikitsa": "Surgical excision; Kshara Karma",
"symptoms": "Painless/painful lid mass; ulceration in malignant type; lid distortion; lash loss",
"note": "Benign Arbuda = curable; malignant = incurable. Includes BCC, SCC, sebaceous gland CA."
},
{
"no": 17, "name": "Nimesha", "sanskrit": "निमेष",
"modern": "Blepharospasm",
"dosha": "Vata", "sadhyata": "Asadhya (Incurable)",
"location": "Orbicularis oculi muscle", "chikitsa": "Vata-pacifying; Nasya; Shirodhara; Botox (modern)",
"symptoms": "Involuntary forceful blinking; inability to keep eyes open; photophobia; tearing",
"note": "Vata dominant neurological condition. Modern: botulinum toxin injection is treatment of choice."
},
{
"no": 18, "name": "Shonita Arsha", "sanskrit": "शोणित अर्श",
"modern": "Haemangioma / Vascular growth on lid",
"dosha": "Rakta + Pitta", "sadhyata": "Sadhya (Curable)",
"location": "Eyelid skin/margin", "chikitsa": "Rakta mokshana; excision; sclerotherapy",
"symptoms": "Red/bluish vascular soft growth on eyelid; bleeds on touch; soft compressible",
"note": "Blood-filled growth. Shonita = blood. Corresponds to capillary/cavernous haemangioma."
},
{
"no": 19, "name": "Lagana", "sanskrit": "लगण",
"modern": "Cyst of lid (dermoid / sebaceous cyst)",
"dosha": "Kapha + Vata", "sadhyata": "Sadhya (Curable)",
"location": "Eyelid (subcutaneous)", "chikitsa": "Bhedana (incision); complete excision",
"symptoms": "Painless, smooth, cystic, mobile swelling; no inflammation; slow growing",
"note": "Painless cyst – Kapha dominant. Requires complete excision to prevent recurrence."
},
{
"no": 20, "name": "Visa Vartma", "sanskrit": "विष वर्त्म",
"modern": "Toxic / Allergic Eyelid (contact dermatitis / angioedema)",
"dosha": "Vata + Pitta + Rakta", "sadhyata": "Sadhya (Curable)",
"location": "Eyelid (skin)", "chikitsa": "Bhedana; Virechana; anti-allergen treatment",
"symptoms": "Acute oedema; redness; itching; blistering; discharge; may be bilateral",
"note": "'Visa' = poison/toxin. Allergic/toxic reaction – corresponds to angioneurotic oedema or contact dermatitis."
},
{
"no": 21, "name": "Pakshma Kopa", "sanskrit": "पक्ष्मकोप",
"modern": "Trichiasis / Distichiasis / Entropion",
"dosha": "Sannipataja (all doshas)", "sadhyata": "Yapya (Lifelong management)",
"location": "Lid margin (lash follicles)", "chikitsa": "Epilation; electrolysis; lid surgery",
"symptoms": "Misdirected lashes rubbing cornea; foreign body sensation; corneal ulcer risk; watering",
"note": "Sannipataja – all three doshas. Lifelong management needed. Corneal damage is the main risk."
},
]
NIDANA = [
"Exposure to smoke (Dhumanishevana)",
"Suppression of tears (Ashru Vega Dharana)",
"Excessive observation of minute objects",
"Trauma / injury to eyelids",
"Improper or excessive Vamana (emesis therapy)",
"Suppression of vomiting",
"Kapha-aggravating diet (excess carbohydrates, sweets)",
"Excessive exposure to dust, wind, heat",
"Irregular sleep patterns",
"Eye strain / prolonged visual tasks",
]
CHIKITSA_CATS = [
("Lekhya (Scraping)", "Utsangini, Kumbhika, Pothaki, Vartma Sharkara, Bahala Vartma, Klishta Vartma, Kardama Vartma, Shyaava Vartma"),
("Bhedhya (Incision)", "Lagana, Visa Vartma, Anjana Namika"),
("Vyadhya (Puncture)", "Arbuda (vascular type), Shonita Arsha"),
("Tarpana (Oil pooling)", "Apariklinna Vartma, Klishta Vartma, dry conditions"),
("Seka (Eye wash)", "Klishta Vartma, Kardama Vartma, Praklinna Vartma"),
("Anjana (Collyrium)", "Pothaki, Kumbhika, infectious types"),
("Nasya (Nasal drops)", "Vaatahata Vartma, Nimesha (Vata conditions)"),
("Virechana (Purgation)", "Pitta-dominant conditions; Klishta, Arsho Vartma"),
]
# ─── Build PDF ────────────────────────────────────────────────────────────────
def build_cover(story):
story.append(SP(10))
# decorative top bar
story.append(HRFlowable(width="100%", thickness=6, color=DEEP_MAROON, spaceAfter=6))
story.append(SP(4))
story.append(Paragraph("वर्त्मगत रोग", ParagraphStyle("dev", fontName="Helvetica-Bold",
fontSize=26, textColor=GOLD, alignment=TA_CENTER, spaceAfter=2)))
story.append(Paragraph("VARTMANGAT ROGA", STYLES["title"]))
story.append(Paragraph("Quick Reference Guide", STYLES["subtitle"]))
story.append(Paragraph("21 Diseases of the Eyelids · Shalakya Tantra · Ayurvedic Ophthalmology", STYLES["tag"]))
story.append(HRFlowable(width="100%", thickness=3, color=GOLD, spaceAfter=8))
story.append(SP(3))
# intro box
intro_data = [[Paragraph(
"<b>Vartma</b> (eyelid) diseases form one of the six anatomical groups of the 76 Netra Rogas "
"described in <b>Sushruta Samhita, Uttaratantra</b>. Acharya Sushruta enumerates <b>21 Vartmagata Rogas</b>, "
"covering a wide spectrum of eyelid pathologies corresponding closely to modern ophthalmological conditions. "
"This guide provides at-a-glance reference for each roga: Ayurvedic name, modern equivalent, dosha, "
"key symptoms, treatment approach, and prognosis.",
STYLES["body"])]]
t = Table(intro_data, colWidths=[170*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), LIGHT_GOLD),
("BOX", (0,0), (-1,-1), 1.2, GOLD),
("TOPPADDING", (0,0), (-1,-1), 10),
("BOTTOMPADDING", (0,0), (-1,-1), 10),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
]))
story.append(t)
story.append(SP(5))
# stat boxes
stats = [
("76", "Total Netra\nRogas"),
("21", "Vartmagata\nRogas"),
("10", "Vataja\nRogas"),
("10", "Pittaja\nRogas"),
("6", "Kaphaja\nRogas"),
("16", "Raktaja\nRogas"),
]
stat_cells = []
for val, label in stats:
cell = [
Paragraph(f"<b>{val}</b>", ParagraphStyle("sv", fontName="Helvetica-Bold",
fontSize=22, textColor=DEEP_MAROON, alignment=TA_CENTER)),
Paragraph(label, ParagraphStyle("sl", fontName="Helvetica", fontSize=7.5,
textColor=DARK_TEXT, alignment=TA_CENTER, leading=10)),
]
stat_cells.append(cell)
stat_row = [stat_cells]
st = Table([[c[0], c[1]] if False else c for c in stat_cells],
colWidths=[28*mm]*6)
# Actually build as one row
st = Table([stat_cells], colWidths=[28*mm]*6)
st.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), CREAM),
("BOX", (0,0), (-1,-1), 0.8, MID_GREY),
("INNERGRID", (0,0), (-1,-1), 0.5, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("ALIGN", (0,0), (-1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(st)
story.append(SP(5))
story.append(Paragraph(
"<b>Reference:</b> Sushruta Samhita, Uttaratantra, Chapter 3 (Vartma Roga Vijnaniya Adhyaya)",
STYLES["note"]))
story.append(HRFlowable(width="100%", thickness=1, color=MID_GREY, spaceAfter=4))
def build_classification_table(story):
story.append(PageBreak())
story.append(Paragraph("Classification & Overview", STYLES["page_title"]))
story.append(HR())
story.append(SP(2))
# Anatomical classification
story.append(Paragraph("A. Anatomical Classification of 76 Netra Rogas", STYLES["section"]))
anat_data = [
[Paragraph("<b>Location (Ashaya)</b>", STYLES["cell_center_bold"]),
Paragraph("<b>Name</b>", STYLES["cell_center_bold"]),
Paragraph("<b>No.</b>", STYLES["cell_center_bold"])],
[Paragraph("Sandhi (Junctions)", STYLES["cell_center"]), Paragraph("Sandhi Gata Roga", STYLES["cell"]), Paragraph("9", STYLES["cell_center"])],
[Paragraph("Vartma (Eyelids)", STYLES["cell_center"]), Paragraph("Vartma Gata Roga", STYLES["cell"]), Paragraph("21", STYLES["cell_center"])],
[Paragraph("Shukla (Sclera/Conjunctiva)", STYLES["cell_center"]), Paragraph("Shukla Gata Roga", STYLES["cell"]), Paragraph("11", STYLES["cell_center"])],
[Paragraph("Krishna (Cornea/Iris)", STYLES["cell_center"]), Paragraph("Krishna Gata Roga", STYLES["cell"]), Paragraph("4", STYLES["cell_center"])],
[Paragraph("Sarvashraya (Whole eye)", STYLES["cell_center"]), Paragraph("Sarvashraya Roga", STYLES["cell"]), Paragraph("17", STYLES["cell_center"])],
[Paragraph("Drushti (Retina/Lens)", STYLES["cell_center"]), Paragraph("Drushti Gata Roga", STYLES["cell"]), Paragraph("12", STYLES["cell_center"])],
[Paragraph("Baahyaja (External/Traumatic)", STYLES["cell_center"]), Paragraph("Baahyaja Roga", STYLES["cell"]), Paragraph("2", STYLES["cell_center"])],
]
at = Table(anat_data, colWidths=[65*mm, 70*mm, 20*mm])
at.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DEEP_MAROON),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("BACKGROUND", (0,2), (-1,2), LIGHT_GOLD), # highlight vartma row
("ROWBACKGROUNDS", (0,1), (-1,-1), [LIGHT_GREY, colors.white]),
("BACKGROUND", (0,2), (-1,2), colors.HexColor("#FADADD")),
("BOX", (0,0), (-1,-1), 1, DEEP_MAROON),
("INNERGRID", (0,0), (-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("ALIGN", (2,0), (2,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(at)
story.append(SP(4))
# Doshic classification
story.append(Paragraph("B. Doshic Classification of Netra Rogas", STYLES["section"]))
dosha_data = [
[Paragraph("<b>Dosha</b>", STYLES["cell_center_bold"]),
Paragraph("<b>Count</b>", STYLES["cell_center_bold"]),
Paragraph("<b>Prognosis Note</b>", STYLES["cell_center_bold"])],
[Paragraph("Vataja", STYLES["cell_center"]), Paragraph("10", STYLES["cell_center"]),
Paragraph("Several Asadhya (incurable) – nerve-related", STYLES["cell"])],
[Paragraph("Pittaja", STYLES["cell_center"]), Paragraph("10", STYLES["cell_center"]),
Paragraph("Inflammatory; mostly Sadhya with prompt treatment", STYLES["cell"])],
[Paragraph("Kaphaja", STYLES["cell_center"]), Paragraph("6", STYLES["cell_center"]),
Paragraph("Chronic; respond to Lekhana and Virechana", STYLES["cell"])],
[Paragraph("Raktaja", STYLES["cell_center"]), Paragraph("16", STYLES["cell_center"]),
Paragraph("Vascular; Rakta Mokshana often needed", STYLES["cell"])],
[Paragraph("Sannipataja", STYLES["cell_center"]), Paragraph("25", STYLES["cell_center"]),
Paragraph("Mixed; some Asadhya / Yapya (lifelong management)", STYLES["cell"])],
[Paragraph("External (Baahyaja)", STYLES["cell_center"]), Paragraph("9", STYLES["cell_center"]),
Paragraph("Traumatic / external cause; usually treatable", STYLES["cell"])],
]
dt = Table(dosha_data, colWidths=[35*mm, 20*mm, 110*mm])
dt.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DEEP_MAROON),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("ROWBACKGROUNDS", (0,1), (-1,-1), [LIGHT_GREY, colors.white]),
("BOX", (0,0), (-1,-1), 1, DEEP_MAROON),
("INNERGRID", (0,0), (-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("ALIGN", (0,0), (1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(dt)
story.append(SP(4))
# All 21 names quick list
story.append(Paragraph("C. All 21 Vartmangat Rogas – Quick Name Index", STYLES["section"]))
rows = []
for i in range(0, 21, 3):
row = []
for j in range(3):
if i+j < 21:
r = ROGAS[i+j]
row.append(Paragraph(
f"<b>{r['no']}. {r['name']}</b><br/><font size='7.5'>{r['sanskrit']}</font><br/>"
f"<font size='7' color='#555555'>{r['modern']}</font>",
STYLES["cell"]))
else:
row.append(Paragraph("", STYLES["cell"]))
rows.append(row)
qt = Table(rows, colWidths=[56*mm, 56*mm, 56*mm])
qt.setStyle(TableStyle([
("BOX", (0,0), (-1,-1), 1, DEEP_MAROON),
("INNERGRID", (0,0), (-1,-1), 0.4, MID_GREY),
("ROWBACKGROUNDS", (0,0), (-1,-1), [CREAM, colors.white]),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(qt)
def build_master_table(story):
story.append(PageBreak())
story.append(Paragraph("Master Reference Table – All 21 Vartmangat Rogas", STYLES["page_title"]))
story.append(HR())
story.append(SP(1))
hdr = [
Paragraph("<b>No.</b>", STYLES["cell_center_bold"]),
Paragraph("<b>Roga Name</b>", STYLES["cell_center_bold"]),
Paragraph("<b>Modern Equivalent</b>", STYLES["cell_center_bold"]),
Paragraph("<b>Dosha</b>", STYLES["cell_center_bold"]),
Paragraph("<b>Key Symptoms</b>", STYLES["cell_center_bold"]),
Paragraph("<b>Treatment</b>", STYLES["cell_center_bold"]),
Paragraph("<b>Prognosis</b>", STYLES["cell_center_bold"]),
]
table_data = [hdr]
dosha_colors = {
"Vata": colors.HexColor("#E3F2FD"),
"Pitta": colors.HexColor("#FFF3E0"),
"Kapha": colors.HexColor("#E8F5E9"),
"Tridoshaja": colors.HexColor("#F3E5F5"),
"Sannipataja": colors.HexColor("#FCE4EC"),
"Rakta": colors.HexColor("#FFEBEE"),
}
row_styles = []
for idx, r in enumerate(ROGAS):
row_num = idx + 1
bg = colors.white if row_num % 2 == 0 else LIGHT_GREY
# pick dosha bg
for key, col in dosha_colors.items():
if key.lower() in r["dosha"].lower():
bg = col
break
prog_col = colors.HexColor("#C8E6C9") if "Sadhya" in r["sadhyata"] and "Asa" not in r["sadhyata"] else \
colors.HexColor("#FFCCBC") if "Asadhya" in r["sadhyata"] else \
colors.HexColor("#FFF9C4")
row = [
Paragraph(f"<b>{r['no']}</b>", STYLES["cell_center_bold"]),
Paragraph(f"<b>{r['name']}</b><br/><font size='7' color='#888888'>{r['sanskrit']}</font>", STYLES["cell"]),
Paragraph(r["modern"], STYLES["cell"]),
Paragraph(r["dosha"], STYLES["cell_center"]),
Paragraph(r["symptoms"][:90] + ("…" if len(r["symptoms"])>90 else ""), STYLES["cell"]),
Paragraph(r["chikitsa"], STYLES["cell"]),
Paragraph(r["sadhyata"].replace(" (", "\n("), STYLES["cell_center"]),
]
table_data.append(row)
row_styles.append(("BACKGROUND", (0, row_num), (-1, row_num), bg))
row_styles.append(("BACKGROUND", (6, row_num), (6, row_num), prog_col))
mt = Table(table_data, colWidths=[8*mm, 28*mm, 35*mm, 22*mm, 38*mm, 30*mm, 19*mm])
style = [
("BACKGROUND", (0,0), (-1,0), DEEP_MAROON),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("BOX", (0,0), (-1,-1), 1, DEEP_MAROON),
("INNERGRID", (0,0), (-1,-1), 0.3, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 3),
("RIGHTPADDING", (0,0), (-1,-1), 3),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ALIGN", (0,0), (0,-1), "CENTER"),
("ALIGN", (3,0), (3,-1), "CENTER"),
("ALIGN", (6,0), (6,-1), "CENTER"),
] + row_styles
mt.setStyle(TableStyle(style))
story.append(mt)
# legend
story.append(SP(3))
legend = [
[Paragraph("<b>Prognosis Legend:</b>", STYLES["note"]),
Paragraph("", STYLES["note"]),
Paragraph("", STYLES["note"]),
Paragraph("", STYLES["note"])],
[
Paragraph(" <font color='#388E3C'>■</font> Sadhya = Curable", STYLES["note"]),
Paragraph(" <font color='#E64A19'>■</font> Asadhya = Incurable", STYLES["note"]),
Paragraph(" <font color='#F9A825'>■</font> Yapya = Lifelong management", STYLES["note"]),
Paragraph("", STYLES["note"]),
]
]
lt = Table(legend, colWidths=[45*mm, 45*mm, 55*mm, 35*mm])
lt.setStyle(TableStyle([("TOPPADDING",(0,0),(-1,-1),2),("BOTTOMPADDING",(0,0),(-1,-1),2)]))
story.append(lt)
def build_detailed_cards(story):
story.append(PageBreak())
story.append(Paragraph("Detailed Disease Cards", STYLES["page_title"]))
story.append(HR())
story.append(SP(1))
story.append(Paragraph(
"Each card provides: Ayurvedic name · Sanskrit · Modern equivalent · Dosha · Symptoms · Chikitsa · Clinical note.",
STYLES["note"]))
story.append(SP(2))
# Two cards per row layout
def make_card(r, bg_color):
prog_sym = "✓" if "Sadhya" in r["sadhyata"] and "Asa" not in r["sadhyata"] else \
"✗" if "Asadhya" in r["sadhyata"] else "↺"
prog_color = "#388E3C" if prog_sym == "✓" else "#C62828" if prog_sym == "✗" else "#F57F17"
inner = [
[Paragraph(
f"<b>{r['no']}. {r['name']}</b> "
f"<font size='8' color='#888888'>{r['sanskrit']}</font>",
STYLES["card_title"])],
[Paragraph(
f"<font size='8' color='#1565C0'><b>Modern:</b></font> "
f"<font size='8'>{r['modern']}</font>",
STYLES["card_sub"])],
[Paragraph(
f"<font size='8'><b>Dosha:</b> {r['dosha']} | "
f"<b>Location:</b> {r['location']}</font>",
STYLES["card_sub"])],
[Paragraph(
f"<font size='8'><b>Symptoms:</b> {r['symptoms']}</font>",
STYLES["card_sub"])],
[Paragraph(
f"<font size='8'><b>Chikitsa:</b> {r['chikitsa']}</font>",
STYLES["card_sub"])],
[Paragraph(
f"<font size='8' color='#555555'><i>{r['note']}</i></font>",
STYLES["card_sub"])],
[Paragraph(
f"<font size='8' color='{prog_color}'><b>Prognosis: {r['sadhyata']}</b></font>",
STYLES["card_sub"])],
]
inner_t = Table(inner, colWidths=[78*mm])
inner_t.setStyle(TableStyle([
("TOPPADDING", (0,0), (-1,-1), 2),
("BOTTOMPADDING", (0,0), (-1,-1), 2),
("LEFTPADDING", (0,0), (-1,-1), 4),
("RIGHTPADDING", (0,0), (-1,-1), 4),
]))
outer = Table([[inner_t]], colWidths=[84*mm])
outer.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg_color),
("BOX", (0,0), (-1,-1), 1, DEEP_MAROON),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 3),
("RIGHTPADDING", (0,0), (-1,-1), 3),
]))
return outer
card_colors = [PALE_BLUE, PALE_GREEN, PALE_YELLOW, PALE_ORANGE, CREAM,
PALE_BLUE, PALE_GREEN, PALE_YELLOW, PALE_ORANGE, CREAM,
PALE_BLUE, PALE_GREEN, PALE_YELLOW, PALE_ORANGE, CREAM,
PALE_BLUE, PALE_GREEN, PALE_YELLOW, PALE_ORANGE, CREAM, PALE_BLUE]
pairs = []
for i in range(0, 21, 2):
c1 = make_card(ROGAS[i], card_colors[i])
if i+1 < 21:
c2 = make_card(ROGAS[i+1], card_colors[i+1])
row = [c1, Spacer(4*mm, 1), c2]
t = Table([[c1, Spacer(4*mm,1), c2]], colWidths=[84*mm, 4*mm, 84*mm])
else:
t = Table([[c1, Spacer(4*mm,1), Paragraph("", STYLES["cell"])]], colWidths=[84*mm, 4*mm, 84*mm])
t.setStyle(TableStyle([
("TOPPADDING",(0,0),(-1,-1),0),
("BOTTOMPADDING",(0,0),(-1,-1),4),
("LEFTPADDING",(0,0),(-1,-1),0),
("RIGHTPADDING",(0,0),(-1,-1),0),
("VALIGN",(0,0),(-1,-1),"TOP"),
]))
story.append(t)
def build_nidana_chikitsa(story):
story.append(PageBreak())
story.append(Paragraph("Nidana & Chikitsa Overview", STYLES["page_title"]))
story.append(HR())
story.append(SP(2))
# Nidana
story.append(Paragraph("Causative Factors (Nidana) – Common to Vartmangat Rogas", STYLES["section"]))
nid_data = []
for i in range(0, len(NIDANA), 2):
row = [
Paragraph(f"• {NIDANA[i]}", STYLES["cell"]),
Paragraph(f"• {NIDANA[i+1]}" if i+1 < len(NIDANA) else "", STYLES["cell"])
]
nid_data.append(row)
nt = Table(nid_data, colWidths=[85*mm, 85*mm])
nt.setStyle(TableStyle([
("BOX", (0,0), (-1,-1), 0.8, GOLD),
("INNERGRID", (0,0), (-1,-1), 0.3, MID_GREY),
("ROWBACKGROUNDS", (0,0), (-1,-1), [LIGHT_GOLD, colors.white]),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
]))
story.append(nt)
story.append(SP(4))
# Chikitsa categories
story.append(Paragraph("Treatment Categories (Chikitsa Karma)", STYLES["section"]))
chik_data = [[
Paragraph("<b>Treatment Type</b>", STYLES["cell_center_bold"]),
Paragraph("<b>Applicable Rogas</b>", STYLES["cell_center_bold"]),
]]
for ctype, arogas in CHIKITSA_CATS:
chik_data.append([
Paragraph(f"<b>{ctype}</b>", STYLES["cell_bold"]),
Paragraph(arogas, STYLES["cell"]),
])
ct = Table(chik_data, colWidths=[52*mm, 118*mm])
ct.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DEEP_MAROON),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("ROWBACKGROUNDS", (0,1), (-1,-1), [CREAM, colors.white]),
("BOX", (0,0), (-1,-1), 1, DEEP_MAROON),
("INNERGRID", (0,0), (-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(ct)
story.append(SP(4))
# Prognosis summary
story.append(Paragraph("Prognosis Summary (Sadhyasadhyata)", STYLES["section"]))
sadhya = [r["name"] for r in ROGAS if "Sadhya" in r["sadhyata"] and "Asa" not in r["sadhyata"]]
asadhya = [r["name"] for r in ROGAS if "Asadhya" in r["sadhyata"]]
yapya = [r["name"] for r in ROGAS if "Yapya" in r["sadhyata"]]
prog_data = [
[Paragraph("<b>Category</b>", STYLES["cell_center_bold"]),
Paragraph("<b>Count</b>", STYLES["cell_center_bold"]),
Paragraph("<b>Diseases</b>", STYLES["cell_center_bold"])],
[Paragraph("Sadhya (Curable)", STYLES["cell_bold"]),
Paragraph(str(len(sadhya)), STYLES["cell_center"]),
Paragraph(", ".join(sadhya), STYLES["cell"])],
[Paragraph("Asadhya (Incurable)", STYLES["cell_bold"]),
Paragraph(str(len(asadhya)), STYLES["cell_center"]),
Paragraph(", ".join(asadhya) if asadhya else "Vaatahata Vartma, Nimesha, Arbuda (malignant)", STYLES["cell"])],
[Paragraph("Yapya (Lifelong management)", STYLES["cell_bold"]),
Paragraph(str(len(yapya)), STYLES["cell_center"]),
Paragraph(", ".join(yapya) if yapya else "Vartma Bandhaka, Apariklinna Vartma, Pakshma Kopa", STYLES["cell"])],
]
prog_table = Table(prog_data, colWidths=[48*mm, 18*mm, 104*mm])
prog_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DEEP_MAROON),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("BACKGROUND", (0,1), (-1,1), colors.HexColor("#C8E6C9")),
("BACKGROUND", (0,2), (-1,2), colors.HexColor("#FFCDD2")),
("BACKGROUND", (0,3), (-1,3), colors.HexColor("#FFF9C4")),
("BOX", (0,0), (-1,-1), 1, DEEP_MAROON),
("INNERGRID", (0,0), (-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("ALIGN", (1,0), (1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(prog_table)
# Footer
story.append(SP(8))
story.append(HRFlowable(width="100%", thickness=2, color=GOLD))
story.append(SP(2))
story.append(Paragraph(
"Reference: Sushruta Samhita, Uttaratantra, Ch. 3 (Vartma Roga Vijnaniya) | "
"Shalakya Tantra – Ayurvedic Ophthalmology | For academic/clinical reference only.",
STYLES["footer"]))
def main():
out = "/home/daytona/workspace/vartmangat-roga/Vartmangat_Roga_Quick_Reference.pdf"
doc = make_doc(out)
story = []
build_cover(story)
build_classification_table(story)
build_master_table(story)
build_detailed_cards(story)
build_nidana_chikitsa(story)
doc.build(story)
print(f"PDF saved: {out}")
if __name__ == "__main__":
main()
cd /home/daytona/workspace/vartmangat-roga && python3 generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/vartmangat-roga/