Scott brown garding of adenoids
adenoid grading classification nasopharynx
Scott Brown grading adenoids nasopharyngeal obstruction grades
https://neuron.mefst.hr/docs/katedre/orl/seminari_medicina/P…
| Grade | Description |
|---|---|
| Grade I | Adenoid tissue filling one-third of the vertical portion of the choanae |
| Grade II | Adenoid tissue filling from one-third to two-thirds of the choanae |
| Grade III | Adenoid tissue filling from two-thirds to nearly complete obstruction of the choanae |
| Grade IV | Complete choanal obstruction |

| Grade | Anatomic contact |
|---|---|
| 1 | No contact with adjacent structures |
| 2 | Contact with torus tubaris (Eustachian tube orifice) |
| 3 | Contact with torus tubaris + vomer |
| 4 | Contact with torus tubaris + vomer + soft palate (at rest) |
Guidelines Approach to Epistaxis Raisa Chowdhury 1 Mark Khoury 3 , Sena Turkdogan 2 and Lamiae Himdi 3,* , Jennifer A. Silver 3 , Jessica Hier 3 , Stuart Bursey 3, Danah Quttaineh 3 Prepare ppt for journal presentation for post graduate from the above journal
epistaxis guidelines management approach
epistaxis Chowdhury Khoury Himdi guidelines
Chowdhury Khoury Himdi Silver Hier Bursey epistaxis guidelines approach journal article
https://www.mdpi.com/2504-463X/5/2/21
site:mdpi.com "approach to epistaxis" 2024 Chowdhury full article anatomy etiology classification treatment
mkdir -p /tmp/workspace/epistaxis-ppt && ls /tmp/workspace/
~/epistaxis-ppt/build_ppt.py
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.util import Inches, Pt
import copy
from lxml import etree
# ── Palette ──────────────────────────────────────────────────────────────────
DARK_BLUE = RGBColor(0x0D, 0x2E, 0x5A) # header / title bg
MID_BLUE = RGBColor(0x1A, 0x5F, 0x9E) # accent bar
LIGHT_BLUE = RGBColor(0xD6, 0xE8, 0xF7) # light bg
RED_ACCENT = RGBColor(0xC0, 0x20, 0x2A) # emergency / highlight
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK_GREY = RGBColor(0x2B, 0x2B, 0x2B)
LIGHT_GREY = RGBColor(0xF2, 0xF4, 0xF7)
GOLD = RGBColor(0xE8, 0xA0, 0x1E)
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
blank = prs.slide_layouts[6]
# ── Helpers ───────────────────────────────────────────────────────────────────
def add_rect(slide, x, y, w, h, color, alpha=None):
shape = slide.shapes.add_shape(1, Inches(x), Inches(y), Inches(w), Inches(h))
shape.fill.solid()
shape.fill.fore_color.rgb = color
shape.line.fill.background()
return shape
def add_text(slide, text, x, y, w, h, size=18, bold=False, color=WHITE,
align=PP_ALIGN.LEFT, wrap=True, italic=False, anchor=MSO_ANCHOR.TOP):
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = wrap
tf.vertical_anchor = anchor
tf.margin_left = Inches(0.05)
tf.margin_right = Inches(0.05)
tf.margin_top = Inches(0.03)
tf.margin_bottom = Inches(0.03)
p = tf.paragraphs[0]
p.alignment = align
run = p.add_run()
run.text = text
run.font.size = Pt(size)
run.font.bold = bold
run.font.italic = italic
run.font.color.rgb = color
run.font.name = "Calibri"
return tb
def add_multiline(slide, lines, x, y, w, h, size=16, color=DARK_GREY,
bold_first=False, bullet=True, line_spacing=1.15):
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = Inches(0.1)
tf.margin_right = Inches(0.05)
tf.margin_top = Inches(0.05)
tf.margin_bottom = Inches(0.05)
for i, line in enumerate(lines):
if i == 0:
p = tf.paragraphs[0]
else:
p = tf.add_paragraph()
p.alignment = PP_ALIGN.LEFT
from pptx.util import Pt as Pt2
from pptx.oxml.ns import qn
pPr = p._pPr
if pPr is None:
pPr = p._p.get_or_add_pPr()
# line spacing
lnSpc = etree.SubElement(pPr, qn('a:lnSpc'))
spcPct = etree.SubElement(lnSpc, qn('a:spcPct'))
spcPct.set('val', str(int(line_spacing * 100000)))
run = p.add_run()
bullet_prefix = "• " if bullet else ""
run.text = bullet_prefix + line
run.font.size = Pt(size)
run.font.color.rgb = color
run.font.name = "Calibri"
if bold_first and i == 0:
run.font.bold = True
return tb
def header_bar(slide, title, subtitle=None):
"""Dark blue header bar at top"""
add_rect(slide, 0, 0, 13.333, 1.15, DARK_BLUE)
add_rect(slide, 0, 1.15, 13.333, 0.07, MID_BLUE)
add_text(slide, title, 0.3, 0.1, 12.5, 0.8,
size=28, bold=True, color=WHITE, align=PP_ALIGN.LEFT, anchor=MSO_ANCHOR.MIDDLE)
if subtitle:
add_text(slide, subtitle, 0.3, 0.82, 12.5, 0.35,
size=14, bold=False, color=LIGHT_BLUE, align=PP_ALIGN.LEFT)
def footer(slide, text="Chowdhury R et al. J Otorhinolaryngol Hear Balance Med 2024;5(2):21"):
add_rect(slide, 0, 7.2, 13.333, 0.3, DARK_BLUE)
add_text(slide, text, 0.2, 7.2, 13.0, 0.3,
size=9, bold=False, color=RGBColor(0xBB, 0xCC, 0xDD),
align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
def section_card(slide, title, items, x, y, w, h, header_color=MID_BLUE, text_size=15):
add_rect(slide, x, y, w, 0.4, header_color)
add_text(slide, title, x+0.08, y+0.02, w-0.15, 0.38,
size=14, bold=True, color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, x, y+0.4, w, h-0.4, LIGHT_GREY)
add_multiline(slide, items, x+0.1, y+0.42, w-0.2, h-0.5,
size=text_size, color=DARK_GREY)
# =============================================================================
# SLIDE 1 – TITLE
# =============================================================================
slide = prs.slides.add_slide(blank)
# Full dark bg
add_rect(slide, 0, 0, 13.333, 7.5, DARK_BLUE)
# Accent strip
add_rect(slide, 0, 3.5, 13.333, 0.08, RED_ACCENT)
add_rect(slide, 0, 5.7, 13.333, 0.08, GOLD)
# Title
add_text(slide, "APPROACH TO EPISTAXIS", 1.0, 1.2, 11.5, 1.5,
size=44, bold=True, color=WHITE, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
add_text(slide, "Guidelines | Journal of Otorhinolaryngology, Hearing and Balance Medicine",
1.0, 2.7, 11.5, 0.5, size=17, bold=False,
color=LIGHT_BLUE, align=PP_ALIGN.CENTER)
add_text(slide, "Chowdhury R, Turkdogan S, Silver JA, Hier J, Bursey S, Quttaineh D, Khoury M, Himdi L",
1.0, 3.7, 11.5, 0.5, size=14, bold=False,
color=RGBColor(0xDD, 0xEE, 0xFF), align=PP_ALIGN.CENTER)
add_text(slide, "Published: December 23, 2024 • DOI: 10.3390/ohbm5020021",
1.0, 4.25, 11.5, 0.4, size=13, bold=False,
color=GOLD, align=PP_ALIGN.CENTER)
add_text(slide, "Journal Club Presentation • Postgraduate ENT",
1.0, 5.9, 11.5, 0.5, size=15, bold=True,
color=WHITE, align=PP_ALIGN.CENTER)
# =============================================================================
# SLIDE 2 – OVERVIEW / OUTLINE
# =============================================================================
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GREY)
header_bar(slide, "Presentation Outline")
footer(slide)
outline = [
("1", "Introduction & Epidemiology"),
("2", "Anatomy of Nasal Vasculature"),
("3", "Etiology & Risk Factors"),
("4", "Classification of Epistaxis"),
("5", "Clinical Assessment & History"),
("6", "Initial Management"),
("7", "Stepwise Treatment Algorithm"),
("8", "Advanced Interventions"),
("9", "Special Populations & Recurrence"),
("10", "Patient Education & Prevention"),
("11", "Key Takeaways & Summary"),
]
for i, (num, title) in enumerate(outline):
col = i % 2
row = i // 2
x = 0.5 + col * 6.4
y = 1.4 + row * 1.0
add_rect(slide, x, y, 0.45, 0.62, MID_BLUE)
add_text(slide, num, x, y, 0.45, 0.62, size=20, bold=True,
color=WHITE, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, x+0.45, y, 5.7, 0.62, WHITE)
add_text(slide, title, x+0.55, y+0.06, 5.5, 0.5,
size=16, bold=False, color=DARK_GREY, anchor=MSO_ANCHOR.MIDDLE)
# =============================================================================
# SLIDE 3 – INTRODUCTION & EPIDEMIOLOGY
# =============================================================================
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GREY)
header_bar(slide, "Introduction & Epidemiology")
footer(slide)
# Left panel – definition
add_rect(slide, 0.3, 1.4, 6.0, 0.38, MID_BLUE)
add_text(slide, "What is Epistaxis?", 0.4, 1.4, 5.8, 0.38,
size=14, bold=True, color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, 0.3, 1.78, 6.0, 2.6, WHITE)
add_multiline(slide,
["Epistaxis (nosebleed) = bleeding from the nasal cavity or nasopharynx",
"One of the most common ENT emergencies worldwide",
"Bimodal age distribution: children (<16 yrs) and adults (>40 yrs, peaks in 6th decade)",
"60% of the general population experience at least one episode in their lifetime",
"Only ~6% require medical attention; <0.1% are life-threatening",
"Etiologies span local trauma, systemic disease, and medications"],
0.4, 1.82, 5.7, 2.5, size=14, color=DARK_GREY)
# Right panel – key stats
add_rect(slide, 6.8, 1.4, 6.2, 0.38, RED_ACCENT)
add_text(slide, "Key Epidemiological Facts", 6.9, 1.4, 6.0, 0.38,
size=14, bold=True, color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
stats = [
("~60%", "lifetime prevalence in general population"),
("2x peak", "children and 6th decade adults"),
("80%", "cases are anterior (Little's area / Kiesselbach's plexus)"),
("70–80%", "are idiopathic (primary epistaxis)"),
("20%", "are posterior – higher morbidity, hospitalization"),
]
for i, (val, desc) in enumerate(stats):
y_pos = 1.82 + i * 0.9
add_rect(slide, 6.8, y_pos, 1.3, 0.7, MID_BLUE)
add_text(slide, val, 6.8, y_pos, 1.3, 0.7, size=17, bold=True,
color=WHITE, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, 8.1, y_pos, 4.9, 0.7, WHITE)
add_text(slide, desc, 8.18, y_pos+0.06, 4.7, 0.58,
size=13, color=DARK_GREY, anchor=MSO_ANCHOR.MIDDLE)
# =============================================================================
# SLIDE 4 – ANATOMY OF NASAL VASCULATURE
# =============================================================================
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GREY)
header_bar(slide, "Anatomy of Nasal Vasculature", "Understanding the blood supply is key to localizing and managing epistaxis")
footer(slide)
add_rect(slide, 0.3, 1.38, 12.7, 0.38, MID_BLUE)
add_text(slide, "Dual Blood Supply to the Nasal Cavity", 0.45, 1.38, 12.5, 0.38,
size=15, bold=True, color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
# ECA column
section_card(slide, "External Carotid Artery (ECA)",
["Facial artery → Superior labial artery → septal branches",
"Internal maxillary artery → Sphenopalatine artery (SPA)",
"SPA = posterior septum & lateral wall (MOST COMMON source of posterior epistaxis)",
"Greater palatine artery → incisive foramen → anterior septum",
"SPA ligation / embolization = mainstay of surgical tx"],
0.3, 1.85, 6.1, 2.6, header_color=MID_BLUE, text_size=14)
# ICA column
section_card(slide, "Internal Carotid Artery (ICA)",
["Ophthalmic artery → Anterior ethmoidal artery",
"Anterior ethmoidal artery → anterior upper septum & roof",
"Posterior ethmoidal artery → posterior superior septum",
"Anterior ethmoidal ligation needed for refractory anterior-superior bleeds",
"ICA bleeds less common but more difficult to control"],
6.55, 1.85, 6.1, 2.6, header_color=DARK_BLUE, text_size=14)
# Kiesselbach / Little's area
add_rect(slide, 0.3, 4.6, 12.7, 0.38, GOLD)
add_text(slide, "Kiesselbach's Plexus (Little's Area) — Anterior Inferior Nasal Septum",
0.4, 4.6, 12.5, 0.38, size=14, bold=True, color=DARK_GREY, anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, 0.3, 4.98, 12.7, 1.2, WHITE)
add_multiline(slide,
["Anastomosis of: SPA + Greater palatine + Superior labial + Anterior ethmoidal arteries",
"Responsible for ~80% of all anterior epistaxis episodes — the most common bleeding site",
"Woodruff's plexus (posterior nasal floor / inferior meatus) = posterior counterpart"],
0.45, 5.0, 12.4, 1.1, size=14, color=DARK_GREY, bullet=True)
# =============================================================================
# SLIDE 5 – ETIOLOGY & RISK FACTORS
# =============================================================================
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GREY)
header_bar(slide, "Etiology & Risk Factors")
footer(slide)
local_causes = [
"Trauma (nose picking, facial fractures, foreign bodies)",
"Nasal surgery or procedures",
"Septal perforation / deviated septum",
"Rhinitis (allergic, infective, atrophic)",
"Nasal tumors (benign: juvenile angiofibroma; malignant)",
"Hereditary Hemorrhagic Telangiectasia (HHT / Osler-Weber-Rendu)",
"Topical medications (decongestants, steroids – chronic use)",
"Dry air / low humidity – mucosal desiccation",
"Intranasal illicit drugs (cocaine – septal damage)",
]
systemic_causes = [
"Hypertension (does not cause epistaxis but worsens severity/duration)",
"Anticoagulants: warfarin, heparin, DOACs",
"Antiplatelet agents: aspirin, clopidogrel, NSAIDs",
"Coagulopathies: von Willebrand disease, haemophilia, thrombocytopenia",
"Hepatic disease (coagulation factor deficiency)",
"Renal failure (uraemic platelet dysfunction)",
"Systemic infections (influenza, COVID-19 – mucosal inflammation)",
"Pregnancy (increased nasal vascularity + hormonal effects)",
]
section_card(slide, "LOCAL CAUSES", local_causes,
0.3, 1.38, 6.1, 5.5, header_color=MID_BLUE, text_size=13)
section_card(slide, "SYSTEMIC / DRUG-RELATED CAUSES", systemic_causes,
6.55, 1.38, 6.4, 5.5, header_color=RED_ACCENT, text_size=13)
# =============================================================================
# SLIDE 6 – CLASSIFICATION
# =============================================================================
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GREY)
header_bar(slide, "Classification of Epistaxis", "Scott-Brown / Clinical Classification")
footer(slide)
# Row 1: Primary vs Secondary
add_rect(slide, 0.3, 1.38, 6.0, 0.4, MID_BLUE)
add_text(slide, "Primary (Idiopathic)", 0.4, 1.38, 5.8, 0.4, size=14, bold=True,
color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, 0.3, 1.78, 6.0, 1.3, WHITE)
add_multiline(slide,
["70–80% of all cases — no proven precipitant",
"Spontaneous bleeds; most common in Little's area",
"Typically mild, recurrent, responds to first-line tx"],
0.4, 1.82, 5.7, 1.2, size=14, color=DARK_GREY, bullet=True)
add_rect(slide, 6.8, 1.38, 6.2, 0.4, RED_ACCENT)
add_text(slide, "Secondary (Identifiable Cause)", 6.9, 1.38, 6.0, 0.4, size=14, bold=True,
color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, 6.8, 1.78, 6.2, 1.3, WHITE)
add_multiline(slide,
["20–30%: clear cause (trauma, surgery, anticoagulation, tumor)",
"Requires specific management of underlying etiology",
"Standard hemostatic techniques may be insufficient"],
6.9, 1.82, 6.0, 1.2, size=14, color=DARK_GREY, bullet=True)
# Row 2: Anterior vs Posterior
add_rect(slide, 0.3, 3.25, 6.0, 0.4, DARK_BLUE)
add_text(slide, "Anterior Epistaxis (~80%)", 0.4, 3.25, 5.8, 0.4, size=14, bold=True,
color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, 0.3, 3.65, 6.0, 1.5, WHITE)
add_multiline(slide,
["Source: Kiesselbach's plexus (Little's area)",
"Visible on anterior rhinoscopy",
"Most self-limiting; managed with pressure ± cautery",
"Better prognosis; rarely life-threatening"],
0.4, 3.68, 5.7, 1.4, size=14, color=DARK_GREY, bullet=True)
add_rect(slide, 6.8, 3.25, 6.2, 0.4, DARK_BLUE)
add_text(slide, "Posterior Epistaxis (~20%)", 6.9, 3.25, 6.0, 0.4, size=14, bold=True,
color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, 6.8, 3.65, 6.2, 1.5, WHITE)
add_multiline(slide,
["Source: posterior to piriform aperture (SPA, Woodruff's plexus)",
"Often cannot be located on anterior examination",
"Requires nasal endoscopy for localization",
"Higher morbidity; may require packing, surgery, or embolization"],
6.9, 3.68, 6.0, 1.4, size=14, color=DARK_GREY, bullet=True)
# Row 3: Age / Severity
add_rect(slide, 0.3, 5.3, 6.0, 0.4, GOLD)
add_text(slide, "By Age", 0.4, 5.3, 5.8, 0.4, size=14, bold=True,
color=DARK_GREY, anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, 0.3, 5.7, 6.0, 1.0, WHITE)
add_multiline(slide,
["Childhood (<16 yrs): usually anterior, Kiesselbach's, responds to simple measures",
"Adult (>16 yrs): bimodal; older adults more likely posterior, systemic factors"],
0.4, 5.73, 5.7, 0.9, size=14, color=DARK_GREY, bullet=True)
add_rect(slide, 6.8, 5.3, 6.2, 0.4, GOLD)
add_text(slide, "By Severity / Frequency", 6.9, 5.3, 6.0, 0.4, size=14, bold=True,
color=DARK_GREY, anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, 6.8, 5.7, 6.2, 1.0, WHITE)
add_multiline(slide,
["Recurrent minor: inversely proportional to severity; easily managed",
"Acute severe: often single episode, hospitalization, high morbidity"],
6.9, 5.73, 6.0, 0.9, size=14, color=DARK_GREY, bullet=True)
# =============================================================================
# SLIDE 7 – CLINICAL ASSESSMENT
# =============================================================================
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GREY)
header_bar(slide, "Clinical Assessment", "History, Examination & Investigations")
footer(slide)
# History
section_card(slide, "HISTORY",
["Frequency, duration, severity, side, volume of blood",
"Precipitating factors: trauma, nose blowing, sneezing, surgery",
"Associated symptoms: nasal obstruction, facial pain, visual changes",
"Drug history: anticoagulants, antiplatelets, NSAIDs, nasal sprays, illicit drugs",
"PMH: hypertension, coagulopathy, liver/renal disease, HHT family history",
"Prior treatments: packing, cautery, surgical procedures"],
0.3, 1.38, 6.0, 3.0, header_color=MID_BLUE, text_size=13)
# Examination
section_card(slide, "EXAMINATION",
["Vital signs: BP, HR, SpO2 (assess hemodynamic stability)",
"Anterior rhinoscopy: Thudichum or otoscope; identify Kiesselbach's plexus bleeding",
"Flexible/rigid nasal endoscopy: gold standard for posterior localization",
"Oropharynx: check for blood trickling down posterior pharynx",
"Neck: lymphadenopathy (malignancy?); facial exam for trauma",
"Look for stigmata of HHT: telangiectasias on lips/tongue/fingers"],
6.55, 1.38, 6.4, 3.0, header_color=DARK_BLUE, text_size=13)
# Investigations
add_rect(slide, 0.3, 4.55, 12.7, 0.38, RED_ACCENT)
add_text(slide, "INVESTIGATIONS", 0.4, 4.55, 12.5, 0.38,
size=14, bold=True, color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, 0.3, 4.93, 12.7, 1.75, WHITE)
invest_left = [
"FBC: Hb (anemia), platelets (thrombocytopenia?)",
"Coagulation screen: PT/INR, aPTT (especially if on anticoagulants)",
"Group & Save / Crossmatch (if severe/life-threatening bleed)",
]
invest_right = [
"Renal/liver function: uremia, coagulopathy of liver disease",
"Imaging: CT angiography if tumor/vascular lesion suspected",
"DUCG (Dynamic Uncertain Causality Graph): emerging AI-aided diagnostic tool",
]
add_multiline(slide, invest_left, 0.5, 4.97, 6.1, 1.65, size=13, color=DARK_GREY, bullet=True)
add_multiline(slide, invest_right, 6.8, 4.97, 6.1, 1.65, size=13, color=DARK_GREY, bullet=True)
# =============================================================================
# SLIDE 8 – INITIAL MANAGEMENT
# =============================================================================
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GREY)
header_bar(slide, "Initial (First-Line) Management", "First-aid & Emergency Department Approach")
footer(slide)
steps = [
("STEP 1", "Resuscitation & Stabilization",
["Airway, Breathing, Circulation — large bore IV access if haemodynamically compromised",
"Position: sit upright, lean forward (prevents swallowing blood)",
"Supplemental oxygen if SpO2 <94% or ongoing blood loss"],
MID_BLUE),
("STEP 2", "Direct Pressure",
["Compress the soft cartilaginous (anterior) part of the nose",
"Sustained pressure for 10–20 minutes — the single most effective first-line measure",
"Pinch below the bony bridge; ice over nose/neck may reduce bleeding",
"Instruct patient NOT to blow nose or swallow blood"],
MID_BLUE),
("STEP 3", "Topical Vasoconstrictors / Anaesthesia",
["Oxymetazoline 0.05%, xylometazoline, or 1:1000 adrenaline-soaked pledgets",
"Reduces mucosal bleeding and improves visualization",
"Lignocaine (lidocaine) 4% or co-phenylcaine spray for anaesthesia prior to examination",
"Topical tranexamic acid (1g/5mL) – emerging evidence for efficacy"],
RED_ACCENT),
("STEP 4", "Chemical Cautery",
["Silver nitrate sticks – preferred method for visible anterior bleeds",
"Apply to BLEEDING point (not the whole septum)",
"Do NOT cauterize both sides of the septum simultaneously → perforation risk",
"Electrocautery (bipolar): reserved for larger/persistent vessels"],
RED_ACCENT),
]
for i, (step, title, items, color) in enumerate(steps):
col = i % 2
row = i // 2
x = 0.3 + col * 6.5
y = 1.4 + row * 2.6
add_rect(slide, x, y, 1.1, 0.5, color)
add_text(slide, step, x, y, 1.1, 0.5, size=13, bold=True,
color=WHITE, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, x+1.1, y, 5.0, 0.5, DARK_BLUE if color == MID_BLUE else RGBColor(0x8B, 0x10, 0x15))
add_text(slide, title, x+1.15, y, 4.9, 0.5, size=14, bold=True,
color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, x, y+0.5, 6.1, 2.0, WHITE)
add_multiline(slide, items, x+0.12, y+0.53, 5.85, 1.9, size=13, color=DARK_GREY, bullet=True)
# =============================================================================
# SLIDE 9 – TREATMENT ALGORITHM / STEPWISE APPROACH
# =============================================================================
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GREY)
header_bar(slide, "Stepwise Treatment Algorithm", "Escalating management based on response")
footer(slide)
# Draw algorithm boxes
def algo_box(slide, text, x, y, w=3.8, h=0.65, bg=MID_BLUE, fg=WHITE, size=13):
add_rect(slide, x, y, w, h, bg)
add_text(slide, text, x+0.05, y+0.05, w-0.1, h-0.1, size=size, bold=True,
color=fg, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
def arrow_down(slide, x, y):
"""Small downward arrow text"""
add_text(slide, "▼", x, y, 0.4, 0.3, size=14, color=DARK_GREY,
align=PP_ALIGN.CENTER)
algo_items = [
(0.5, 1.4, "1. Direct Pressure × 20 min + Vasoconstrictor", MID_BLUE, WHITE),
(0.5, 2.2, "2. Anterior Rhinoscopy / Nasendoscopy → Identify bleeding point", MID_BLUE, WHITE),
(0.5, 3.0, "3. Topical Tranexamic Acid / Silver Nitrate Cautery", RGBColor(0x14, 0x75, 0xBB), WHITE),
(0.5, 3.8, "4. Anterior Nasal Packing (Bismuth-iodoform or Rapid Rhino)", DARK_BLUE, WHITE),
(0.5, 4.6, "5. Posterior Packing / Foley Catheter Balloon (if posterior bleed)", RED_ACCENT, WHITE),
(0.5, 5.4, "6. Nasal Endoscopy + Electrocautery of SPA / Anterior Ethmoidal Artery", RED_ACCENT, WHITE),
(0.5, 6.2, "7. Surgical Ligation (SPA) or Interventional Radiology Embolization", RGBColor(0x80, 0x00, 0x00), WHITE),
]
for x, y, text, bg, fg in algo_items:
algo_box(slide, text, x, y, w=8.0, h=0.62, bg=bg, fg=fg, size=13)
if y < 6.2:
add_text(slide, "▼", 4.1, y+0.62, 0.5, 0.35, size=16, color=DARK_GREY, align=PP_ALIGN.CENTER)
# Side notes
add_rect(slide, 9.0, 1.38, 4.0, 5.5, WHITE)
add_rect(slide, 9.0, 1.38, 4.0, 0.4, GOLD)
add_text(slide, "Key Considerations", 9.05, 1.38, 3.9, 0.4, size=13, bold=True,
color=DARK_GREY, anchor=MSO_ANCHOR.MIDDLE)
notes = [
"Always reassess after each step",
"Haemodynamic instability → resuscitate first",
"Bilateral simultaneous cautery is CONTRAINDICATED",
"Packing → prophylactic antibiotics (staph coverage)",
"Anticoagulants: reverse if life-threatening; bridge therapy decisions are individualized",
"Coagulopathy: correct before invasive procedures",
"For HHT: laser, embolization, bevacizumab are options",
"Paediatric: avoid posterior packing; ENT + PICU involvement",
"Record all bleeding points and interventions meticulously",
]
add_multiline(slide, notes, 9.08, 1.82, 3.85, 5.0, size=12, color=DARK_GREY, bullet=True, line_spacing=1.2)
# =============================================================================
# SLIDE 10 – PACKING TECHNIQUES
# =============================================================================
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GREY)
header_bar(slide, "Nasal Packing Techniques", "Anterior & Posterior Packing — Indications and Methods")
footer(slide)
section_card(slide, "ANTERIOR NASAL PACKING",
["Indication: anterior bleed not controlled by cautery",
"BIPP (Bismuth Iodoform Paraffin Paste) ribbon gauze — traditional",
"Rapid Rhino / Merocel expandable sponge — easy insertion, less trauma",
"Inflatable balloon catheters (e.g. Epistat dual balloon)",
"Duration: typically 24–48 hours; remove in daylight",
"Complications: sinusitis, toxic shock syndrome (TSS), pressure necrosis",
"Antibiotics: not universally recommended; consider if prolonged packing"],
0.3, 1.38, 6.0, 5.5, header_color=MID_BLUE, text_size=13)
section_card(slide, "POSTERIOR NASAL PACKING",
["Indication: posterior bleed not amenable to cautery",
"Traditional: posterior gauze pack + anterior pack → hospital admission mandatory",
"Foley catheter balloon (14–16 Fr, 10–30 mL) — widely available, rapid",
"Brighton balloon / Epistat: dual balloon for simultaneous anterior + posterior tamponade",
"Requires admission, monitoring (hypoxia risk, vasovagal episodes)",
"Supplemental O2; pulse oximetry monitoring during packing",
"Consider antibiotics (TSS prophylaxis); remove within 48–72 hours",
"Failure → escalate to surgical/endovascular intervention"],
6.55, 1.38, 6.4, 5.5, header_color=DARK_BLUE, text_size=13)
# =============================================================================
# SLIDE 11 – SURGICAL & INTERVENTIONAL OPTIONS
# =============================================================================
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GREY)
header_bar(slide, "Advanced Interventions", "Surgical & Endovascular Options")
footer(slide)
section_card(slide, "ENDOSCOPIC CAUTERY / LIGATION",
["Endoscopic SPA ligation: gold standard surgical treatment for posterior epistaxis",
"Success rate: 87–100% for posterior refractory epistaxis",
"Performed under general or local anaesthesia",
"Anterior ethmoidal artery ligation: for refractory anterior-superior bleeds",
"External ethmoidectomy approach or endoscopic depending on anatomy"],
0.3, 1.38, 6.0, 2.7, header_color=MID_BLUE, text_size=13)
section_card(slide, "INTERVENTIONAL RADIOLOGY (IR) EMBOLIZATION",
["Embolization of SPA or internal maxillary artery branches",
"Indicated for: failed packing + failed/unsuitable surgery; life-threatening bleeds",
"Requires collaboration with IR team; performed under local anaesthesia",
"Success rate: ~80–90%; risk of facial/scalp necrosis, CVA (<1%)",
"Particularly useful in HHT and post-traumatic pseudoaneurysm"],
6.55, 1.38, 6.4, 2.7, header_color=RED_ACCENT, text_size=13)
section_card(slide, "HEMOSTATIC AGENTS & EMERGING THERAPIES",
["Fibrin glue / oxidized cellulose (Surgicel) — topical hemostasis",
"Tranexamic acid (topical & IV): effective in reducing rebleeding",
"Bevacizumab (anti-VEGF): for HHT-related recurrent epistaxis",
"Systemic antifibrinolytics: tranexamic acid PO — first-line for coagulopathic bleeds",
"Platelet transfusion / FFP: correct specific coagulopathy",
"Desmopressin (DDAVP): for von Willebrand disease or platelet dysfunction"],
0.3, 4.25, 6.0, 2.6, header_color=DARK_BLUE, text_size=13)
section_card(slide, "ANTICOAGULATION MANAGEMENT",
["Risk-benefit discussion: continuing vs. reversing anticoagulation",
"Warfarin: vitamin K ± PCC (Prothrombin Complex Concentrate) for major bleed",
"DOACs (rivaroxaban, apixaban, dabigatran): specific reversal agents available",
"Aspirin/clopidogrel: generally continue unless bleed is life-threatening",
"Always involve haematology / cardiology for complex cases",
"Restart anticoagulation within 7–14 days after control to prevent thromboembolism"],
6.55, 4.25, 6.4, 2.6, header_color=GOLD, text_size=13)
# =============================================================================
# SLIDE 12 – SPECIAL POPULATIONS
# =============================================================================
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GREY)
header_bar(slide, "Special Populations & Recurrence", "Pediatric, HHT, Hypertension, Recurrence Risk")
footer(slide)
section_card(slide, "PAEDIATRIC EPISTAXIS",
["Most are anterior / Kiesselbach's; usually idiopathic",
"First-line: saline irrigation, petroleum jelly moisturisation, avoid nose-picking",
"Silver nitrate cautery safe in children; unilateral only",
"Juvenile Nasopharyngeal Angiofibroma: vascular tumor in adolescent males — do NOT pack; refer",
"Avoid posterior packing in children where possible"],
0.3, 1.38, 6.0, 3.0, header_color=MID_BLUE, text_size=13)
section_card(slide, "HHT (Hereditary Haemorrhagic Telangiectasia)",
["Autosomal dominant; telangiectasias of mucosa, skin, viscera",
"Recurrent bilateral epistaxis — standard packing often ineffective",
"Options: laser photocoagulation (KTP, Nd:YAG), topical oestrogen, bevacizumab",
"Embolization may provide temporary relief",
"Refer to HHT specialist centre; genetic counselling recommended"],
6.55, 1.38, 6.4, 3.0, header_color=MID_BLUE, text_size=13)
section_card(slide, "HYPERTENSION & EPISTAXIS",
["HTN does NOT cause epistaxis directly but prolongs/worsens bleeding",
"Treat elevated BP during acute episode (IV labetalol if severely elevated)",
"Long-term BP control reduces recurrence",
"Epistaxis itself may temporarily elevate BP (pain, anxiety)"],
0.3, 4.55, 6.0, 2.3, header_color=RED_ACCENT, text_size=13)
section_card(slide, "RECURRENCE & RISK STRATIFICATION",
["Early recurrence (within 30 days) vs. late recurrence (31 days–3 years)",
"Risk factors for recurrence: anticoagulation, HHT, posterior source, uncontrolled HTN",
"Written discharge instructions reduce re-attendance rates significantly",
"Follow-up endoscopy if suspected underlying pathology",
"Screen for coagulopathy in recurrent childhood epistaxis"],
6.55, 4.55, 6.4, 2.3, header_color=RED_ACCENT, text_size=13)
# =============================================================================
# SLIDE 13 – PATIENT EDUCATION & PREVENTION
# =============================================================================
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GREY)
header_bar(slide, "Patient Education & Prevention", "Reducing Recurrence and Re-attendance")
footer(slide)
# First aid instructions
section_card(slide, "FIRST-AID INSTRUCTIONS (Give verbally AND in writing)",
["Sit upright and lean slightly forward",
"Pinch the soft part of the nose continuously for 10–20 minutes (use a timer)",
"Breathe through the mouth; spit out any blood",
"Apply ice pack to nose/back of neck",
"Do NOT tilt head back — blood may be swallowed or aspirated",
"Do NOT remove clots prematurely; avoid nose blowing for 24 hours",
"If bleeding persists after 20 minutes or recurs → attend emergency department"],
0.3, 1.38, 6.0, 4.0, header_color=RED_ACCENT, text_size=13)
# Prevention
section_card(slide, "PREVENTIVE MEASURES",
["Nasal moisturisation: saline sprays, nasal gel (petroleum jelly), humidifier",
"Avoid nose-picking and trauma; trim fingernails in children",
"Review all anticoagulant/antiplatelet medications with prescribing physician",
"Manage underlying conditions: HTN, allergic rhinitis, coagulopathies",
"Avoid dry environments; increase indoor humidity",
"Regular follow-up for recurrent epistaxis to identify treatable cause",
"In HHT: genetic counselling; screen family members",
"Reduce triggers: smoking cessation (impairs mucosal integrity)"],
6.55, 1.38, 6.4, 4.0, header_color=MID_BLUE, text_size=13)
# Discharge checklist
add_rect(slide, 0.3, 5.55, 12.7, 0.38, GOLD)
add_text(slide, "Discharge Checklist", 0.4, 5.55, 12.5, 0.38,
size=14, bold=True, color=DARK_GREY, anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, 0.3, 5.93, 12.7, 1.25, WHITE)
discharge = [
"Verbal + written instructions given",
"Underlying cause identified and addressed",
"Anticoagulation plan documented",
"ENT follow-up arranged if recurrent / posterior / unexplained bleed",
"Emergency re-attendance threshold clearly communicated to patient",
]
add_multiline(slide, discharge, 0.45, 5.96, 12.5, 1.15, size=13, color=DARK_GREY, bullet=True)
# =============================================================================
# SLIDE 14 – KEY TAKEAWAYS
# =============================================================================
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GREY)
header_bar(slide, "Key Takeaways & Clinical Pearls")
footer(slide)
takeaways = [
("1", "80% anterior (Kiesselbach's plexus); 20% posterior (SPA/Woodruff's) — localize first"),
("2", "Direct pressure for 20 minutes is the single most effective first-line intervention"),
("3", "70–80% are idiopathic (primary); always exclude secondary causes in recurrent/severe cases"),
("4", "Nasendoscopy is the gold standard to localize posterior bleeds — do not rely on palpation"),
("5", "Cauterize only the identified bleeding point; NEVER both sides of septum simultaneously"),
("6", "Posterior packing requires hospital admission with O2 monitoring — vasovagal/hypoxia risk"),
("7", "Endoscopic SPA ligation: gold standard surgical option — 87–100% success for posterior bleeds"),
("8", "Always individualize anticoagulation reversal: balance bleeding risk vs. thrombosis risk"),
("9", "HHT: standard packing often fails; bevacizumab and laser are evidence-based options"),
("10", "Written patient education at discharge significantly reduces re-attendance rates"),
]
for i, (num, text) in enumerate(takeaways):
y_pos = 1.42 + i * 0.57
add_rect(slide, 0.3, y_pos, 0.55, 0.48, MID_BLUE if i % 2 == 0 else DARK_BLUE)
add_text(slide, num, 0.3, y_pos, 0.55, 0.48, size=16, bold=True,
color=WHITE, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
bg_col = WHITE if i % 2 == 0 else LIGHT_GREY
add_rect(slide, 0.85, y_pos, 12.2, 0.48, bg_col)
add_text(slide, text, 0.95, y_pos+0.04, 12.0, 0.42,
size=14, color=DARK_GREY, anchor=MSO_ANCHOR.MIDDLE)
# =============================================================================
# SLIDE 15 – CONCLUSION & REFERENCES
# =============================================================================
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, DARK_BLUE)
add_rect(slide, 0, 1.3, 13.333, 0.07, RED_ACCENT)
add_rect(slide, 0, 6.2, 13.333, 0.07, GOLD)
add_text(slide, "Conclusion", 1.0, 0.2, 11.5, 0.9,
size=32, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
conclusions = [
"Epistaxis is common but management requires a systematic, stepwise approach",
"Accurate anatomical knowledge (ECA/ICA, Kiesselbach's, SPA) guides targeted intervention",
"Patient education with verbal AND written instructions is essential at every encounter",
"Most cases resolve with conservative measures; escalate judiciously",
"Interdisciplinary collaboration (ENT, IR, haematology) is key in complex cases",
]
add_multiline(slide, conclusions, 1.0, 1.5, 11.2, 3.5, size=16,
color=RGBColor(0xDD, 0xEE, 0xFF), bullet=True, line_spacing=1.3)
add_rect(slide, 0.5, 5.1, 12.5, 0.38, MID_BLUE)
add_text(slide, "Source Article", 0.6, 5.1, 12.3, 0.38, size=13, bold=True,
color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, 0.5, 5.48, 12.5, 1.5, RGBColor(0x0A, 0x1F, 0x40))
refs = [
"Chowdhury R, Turkdogan S, Silver JA, Hier J, Bursey S, Quttaineh D, Khoury M, Himdi L.",
"Approach to Epistaxis. J Otorhinolaryngol Hear Balance Med. 2024;5(2):21.",
"DOI: 10.3390/ohbm5020021 | Published: 23 December 2024",
"",
"Additional sources: Scott-Brown's Otorhinolaryngology HNS (8th ed.), Cummings Otolaryngology (7th ed.)",
]
add_multiline(slide, refs, 0.6, 5.5, 12.3, 1.4, size=12,
color=RGBColor(0xAA, 0xCC, 0xEE), bullet=False, line_spacing=1.15)
# =============================================================================
# SAVE
# =============================================================================
from io import BytesIO
buf = BytesIO()
prs.save(buf)
with open("/tmp/workspace/epistaxis-ppt/Approach_to_Epistaxis_Journal_PPT.pptx", "wb") as f:
f.write(buf.getvalue())
print("DONE — saved to /tmp/workspace/epistaxis-ppt/Approach_to_Epistaxis_Journal_PPT.pptx")
cd /tmp/workspace/epistaxis-ppt && python build_ppt.py 2>&1
python3 -c " from pptx import Presentation prs = Presentation('/tmp/workspace/epistaxis-ppt/Approach_to_Epistaxis_Journal_PPT.pptx') print(f'Slides: {len(prs.slides)}') for i, slide in enumerate(prs.slides, 1): texts = [s.text_frame.text[:60] for s in slide.shapes if s.has_text_frame and s.text_frame.text.strip()] print(f' Slide {i}: {texts[0] if texts else \"(empty)\"}') "
Approach to Epistaxis Journal PPT
Presentation · PPTX
| # | Slide | Content |
|---|---|---|
| 1 | Title Slide | Full citation — Chowdhury R et al., J Otorhinolaryngol Hear Balance Med 2024;5(2):21 |
| 2 | Outline | 11-point numbered overview |
| 3 | Introduction & Epidemiology | Definition, 60% lifetime prevalence, bimodal age distribution, key stats |
| 4 | Nasal Vasculature Anatomy | ECA (SPA, facial, maxillary), ICA (ethmoidal arteries), Kiesselbach's plexus |
| 5 | Etiology & Risk Factors | Local vs. systemic causes, drugs, HHT |
| 6 | Classification | Primary/secondary, anterior/posterior, by age/severity (Scott-Brown framework) |
| 7 | Clinical Assessment | History checklist, examination (rhinoscopy, endoscopy), investigations (FBC, coag, imaging) |
| 8 | Initial Management | 4-step first-aid: resuscitation → pressure → vasoconstrictors → cautery |
| 9 | Stepwise Treatment Algorithm | 7-level escalating flowchart with side-panel key considerations |
| 10 | Nasal Packing Techniques | Anterior (BIPP, Merocel, Rapid Rhino) vs. posterior (Foley, Brighton balloon) |
| 11 | Advanced Interventions | Endoscopic SPA ligation, IR embolization, hemostatic agents, anticoagulation reversal |
| 12 | Special Populations | Paediatric, HHT, hypertension, recurrence risk stratification |
| 13 | Patient Education & Prevention | First-aid steps, preventive measures, discharge checklist |
| 14 | Key Takeaways | 10 numbered clinical pearls |
| 15 | Conclusion & References | Summary + full article citation |