Prompt- Create a super aesthetic, handwritten-style revision note page for the topic: Benign lesions of the oral cavity according to shafers β’ Make it look like neat exam notes written on a page (top view, clean layout, colorful headings, underlines, boxes). β’ Keep it crisp, high-yield, and exam-oriented. β’ Use clear headings and organize content like this (modify if needed for topic): β Definition β Etiology β Pathogenesis (flow/arrow style) β Clinical features β Radiographic features (if applicable) β Histopathology (if applicable) β Key features β Differential diagnosis β Management β Complications β Key points / last-minute revision box β’ Add simple diagrams or labeled sketches wherever helpful. β’ Highlight important keywords. β’ Include one memory trick / one-line summary β’
mkdir -p /home/daytona/workspace/oral-revision && echo "Directory ready"
~/oral-revision/benign_oral_lesions.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Benign Lesions of the Oral Cavity β Shafer's</title>
<link href="https://fonts.googleapis.com/css2?family=Caveat:wght@400;500;600;700&family=Patrick+Hand&family=Kalam:wght@300;400;700&display=swap" rel="stylesheet">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
background: #f5f0e8;
font-family: 'Kalam', cursive;
padding: 0;
}
.page {
width: 1400px;
min-height: 100%;
background: #fffef5;
background-image:
repeating-linear-gradient(
transparent,
transparent 39px,
#b8d4f0 39px,
#b8d4f0 40px
);
padding: 60px 70px 80px 110px;
position: relative;
box-shadow: 0 4px 30px rgba(0,0,0,0.15);
}
/* Red margin line */
.page::before {
content: '';
position: absolute;
left: 90px;
top: 0;
bottom: 0;
width: 2px;
background: #e85d5d;
opacity: 0.7;
}
/* Spiral holes */
.holes {
position: absolute;
left: 18px;
top: 0;
bottom: 0;
width: 40px;
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
padding: 30px 0;
}
.hole {
width: 22px;
height: 22px;
border-radius: 50%;
background: #f5f0e8;
border: 2px solid #ccc;
box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);
}
/* ===== MAIN TITLE ===== */
.main-title {
text-align: center;
margin-bottom: 8px;
position: relative;
}
.main-title h1 {
font-family: 'Caveat', cursive;
font-size: 42px;
font-weight: 700;
color: #1a237e;
text-decoration: underline;
text-decoration-color: #e91e63;
text-underline-offset: 6px;
letter-spacing: 1px;
}
.subtitle {
font-family: 'Patrick Hand', cursive;
font-size: 17px;
color: #555;
text-align: center;
margin-bottom: 6px;
}
.source-badge {
display: inline-block;
background: #fff9c4;
border: 2px dashed #f9a825;
border-radius: 8px;
padding: 3px 14px;
font-size: 14px;
color: #6d4c41;
font-family: 'Kalam', cursive;
margin-bottom: 18px;
}
/* ===== MEMORY TRICK BOX ===== */
.memory-box {
background: linear-gradient(135deg, #fff9c4, #fffde7);
border: 3px solid #f9a825;
border-radius: 14px;
padding: 12px 20px;
margin-bottom: 22px;
position: relative;
}
.memory-box::before {
content: 'π§ MEMORY TRICK';
position: absolute;
top: -13px;
left: 16px;
background: #f9a825;
color: white;
font-size: 12px;
font-weight: 700;
padding: 2px 10px;
border-radius: 6px;
font-family: 'Kalam', cursive;
letter-spacing: 0.5px;
}
.memory-box p {
font-size: 17px;
color: #4a148c;
font-weight: 600;
font-family: 'Caveat', cursive;
font-size: 20px;
}
/* ===== GRID LAYOUT ===== */
.grid-2 {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 18px;
margin-bottom: 18px;
}
.grid-3 {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 16px;
margin-bottom: 18px;
}
.full-width {
margin-bottom: 18px;
}
/* ===== SECTION CARDS ===== */
.card {
border-radius: 12px;
padding: 14px 18px;
position: relative;
border-left: 5px solid;
}
.card-blue { background: #e3f2fd; border-color: #1565c0; }
.card-green { background: #e8f5e9; border-color: #2e7d32; }
.card-purple { background: #f3e5f5; border-color: #6a1b9a; }
.card-red { background: #fce4ec; border-color: #c62828; }
.card-orange { background: #fff3e0; border-color: #e65100; }
.card-teal { background: #e0f2f1; border-color: #00695c; }
.card-pink { background: #fce4ec; border-color: #ad1457; }
.card-indigo { background: #e8eaf6; border-color: #283593; }
.card-yellow { background: #fffde7; border-color: #f57f17; }
.card-brown { background: #efebe9; border-color: #4e342e; }
.card-cyan { background: #e0f7fa; border-color: #00838f; }
.card-title {
font-family: 'Caveat', cursive;
font-size: 22px;
font-weight: 700;
margin-bottom: 8px;
display: flex;
align-items: center;
gap: 6px;
}
.card-blue .card-title { color: #0d47a1; }
.card-green .card-title { color: #1b5e20; }
.card-purple .card-title { color: #4a148c; }
.card-red .card-title { color: #b71c1c; }
.card-orange .card-title { color: #bf360c; }
.card-teal .card-title { color: #004d40; }
.card-pink .card-title { color: #880e4f; }
.card-indigo .card-title { color: #1a237e; }
.card-yellow .card-title { color: #e65100; }
.card-brown .card-title { color: #3e2723; }
.card-cyan .card-title { color: #006064; }
.card ul {
list-style: none;
padding: 0;
}
.card ul li {
font-size: 15px;
color: #333;
padding: 2px 0 2px 18px;
position: relative;
line-height: 1.55;
font-family: 'Kalam', cursive;
}
.card ul li::before {
content: 'β';
position: absolute;
left: 0;
color: #888;
font-size: 13px;
}
.card p {
font-size: 15px;
color: #333;
line-height: 1.6;
font-family: 'Kalam', cursive;
}
/* highlights */
.hl-red { color: #c62828; font-weight: 700; }
.hl-blue { color: #1565c0; font-weight: 700; }
.hl-green { color: #2e7d32; font-weight: 700; }
.hl-purple { color: #6a1b9a; font-weight: 700; }
.hl-orange { color: #e65100; font-weight: 700; }
.hl-teal { color: #00695c; font-weight: 700; }
/* underline emphasis */
.ul-red { text-decoration: underline; text-decoration-color: #e53935; text-underline-offset: 3px; }
.ul-blue { text-decoration: underline; text-decoration-color: #1e88e5; text-underline-offset: 3px; }
/* ===== FLOWCHART (pathogenesis) ===== */
.flow {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 4px;
font-family: 'Kalam', cursive;
font-size: 14px;
margin: 6px 0;
}
.flow-step {
background: white;
border: 2px solid #9575cd;
border-radius: 8px;
padding: 5px 10px;
color: #4527a0;
font-weight: 600;
text-align: center;
min-width: 80px;
}
.flow-arrow {
font-size: 20px;
color: #e91e63;
font-weight: 700;
}
/* ===== LESION CARDS (individual lesions) ===== */
.lesion-section {
margin-bottom: 22px;
}
.lesion-header {
font-family: 'Caveat', cursive;
font-size: 28px;
font-weight: 700;
color: white;
padding: 8px 20px;
border-radius: 10px 10px 0 0;
display: flex;
align-items: center;
gap: 8px;
letter-spacing: 0.5px;
}
.lh-blue { background: linear-gradient(90deg, #1565c0, #42a5f5); }
.lh-green { background: linear-gradient(90deg, #2e7d32, #66bb6a); }
.lh-purple { background: linear-gradient(90deg, #6a1b9a, #ab47bc); }
.lh-red { background: linear-gradient(90deg, #b71c1c, #ef5350); }
.lh-orange { background: linear-gradient(90deg, #bf360c, #ff7043); }
.lh-teal { background: linear-gradient(90deg, #00695c, #26a69a); }
.lh-indigo { background: linear-gradient(90deg, #283593, #5c6bc0); }
.lh-pink { background: linear-gradient(90deg, #880e4f, #e91e63); }
.lesion-body {
background: white;
border: 2px solid #ddd;
border-top: none;
border-radius: 0 0 10px 10px;
padding: 16px 20px;
}
.lesion-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
}
.lesion-mini-card {
background: #f9f9f9;
border-radius: 8px;
border: 1.5px solid #e0e0e0;
padding: 10px 12px;
}
.lmc-title {
font-family: 'Caveat', cursive;
font-size: 16px;
font-weight: 700;
margin-bottom: 5px;
border-bottom: 2px dashed;
padding-bottom: 3px;
}
.lmc-blue { color: #1565c0; border-color: #90caf9; }
.lmc-green { color: #2e7d32; border-color: #a5d6a7; }
.lmc-purple { color: #6a1b9a; border-color: #ce93d8; }
.lmc-red { color: #b71c1c; border-color: #ef9a9a; }
.lmc-orange { color: #e65100; border-color: #ffcc80; }
.lmc-teal { color: #00695c; border-color: #80cbc4; }
.lesion-mini-card p, .lesion-mini-card ul li {
font-size: 13.5px;
color: #333;
line-height: 1.5;
font-family: 'Kalam', cursive;
}
.lesion-mini-card ul { list-style: none; padding: 0; }
.lesion-mini-card ul li::before { content: 'β’ '; color: #999; }
.lesion-mini-card ul li { padding-left: 12px; position: relative; }
/* ===== TABLE ===== */
table {
width: 100%;
border-collapse: collapse;
font-family: 'Kalam', cursive;
font-size: 14px;
margin-top: 8px;
}
th {
background: #e8eaf6;
color: #283593;
font-family: 'Caveat', cursive;
font-size: 16px;
padding: 8px 12px;
border: 1.5px solid #c5cae9;
text-align: left;
}
td {
padding: 7px 12px;
border: 1.5px solid #e0e0e0;
vertical-align: top;
color: #333;
}
tr:nth-child(even) td { background: #f5f5f5; }
tr:nth-child(odd) td { background: white; }
/* ===== SKETCH / DIAGRAM ===== */
.sketch-box {
border: 2.5px dashed #90a4ae;
border-radius: 10px;
padding: 12px;
background: #fafafa;
text-align: center;
position: relative;
}
.sketch-label {
font-family: 'Caveat', cursive;
font-size: 14px;
color: #546e7a;
margin-top: 6px;
}
svg text { font-family: 'Kalam', cursive; }
/* ===== LAST MINUTE BOX ===== */
.last-minute {
background: linear-gradient(135deg, #fce4ec, #f8bbd0);
border: 3px solid #e91e63;
border-radius: 14px;
padding: 16px 22px;
margin-top: 20px;
position: relative;
}
.last-minute::before {
content: 'β‘ LAST-MINUTE REVISION';
position: absolute;
top: -14px;
left: 16px;
background: #e91e63;
color: white;
font-size: 13px;
font-weight: 700;
padding: 3px 12px;
border-radius: 6px;
font-family: 'Kalam', cursive;
}
.lm-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
margin-top: 6px;
}
.lm-item {
font-size: 14.5px;
color: #333;
font-family: 'Kalam', cursive;
padding-left: 18px;
position: relative;
line-height: 1.5;
}
.lm-item::before {
content: 'β
';
position: absolute;
left: 0;
color: #e91e63;
font-size: 13px;
}
/* ===== SEPARATOR ===== */
.sep {
border: none;
border-top: 2.5px dashed #bdbdbd;
margin: 20px 0;
}
/* ===== CORNER NOTE ===== */
.corner-note {
position: absolute;
top: 20px;
right: 30px;
font-family: 'Caveat', cursive;
font-size: 16px;
color: #888;
transform: rotate(5deg);
}
/* ===== NUMBER BADGE ===== */
.badge {
display: inline-block;
background: #e91e63;
color: white;
border-radius: 50%;
width: 22px;
height: 22px;
font-size: 13px;
font-family: 'Kalam', cursive;
font-weight: 700;
line-height: 22px;
text-align: center;
margin-right: 4px;
flex-shrink: 0;
}
/* ===== INLINE TAG ===== */
.tag {
display: inline-block;
border-radius: 4px;
padding: 0px 6px;
font-size: 12.5px;
font-family: 'Kalam', cursive;
font-weight: 700;
margin-left: 4px;
}
.tag-imp { background: #ff8f00; color: white; }
.tag-histo{ background: #7b1fa2; color: white; }
.tag-mc { background: #1565c0; color: white; }
.tag-key { background: #c62828; color: white; }
.section-divider-title {
font-family: 'Caveat', cursive;
font-size: 32px;
font-weight: 700;
color: #fff;
background: linear-gradient(90deg, #1a237e, #283593, #3949ab);
padding: 8px 24px;
border-radius: 10px;
margin: 24px 0 16px 0;
letter-spacing: 1px;
box-shadow: 2px 3px 8px rgba(0,0,0,0.2);
}
</style>
</head>
<body>
<div class="page">
<!-- Spiral Holes -->
<div class="holes">
<div class="hole"></div><div class="hole"></div><div class="hole"></div>
<div class="hole"></div><div class="hole"></div><div class="hole"></div>
<div class="hole"></div><div class="hole"></div><div class="hole"></div>
<div class="hole"></div><div class="hole"></div><div class="hole"></div>
<div class="hole"></div><div class="hole"></div><div class="hole"></div>
<div class="hole"></div><div class="hole"></div><div class="hole"></div>
</div>
<!-- Corner date -->
<div class="corner-note">Shafer's Ch. 9 & 10</div>
<!-- Main Title -->
<div class="main-title">
<h1>π¦· Benign Lesions of the Oral Cavity</h1>
</div>
<p class="subtitle">Reactive / Developmental / Inflammatory Non-Neoplastic Lesions</p>
<div style="text-align:center; margin-bottom:18px;">
<span class="source-badge">π Shafer's Textbook of Oral Pathology</span>
</div>
<!-- Memory Trick -->
<div class="memory-box">
<p>
<span class="hl-purple">"Fibrous Friends Give Pyogenic Papillomas Often, Lipomas Provide Giant Hemangiomas Nearby"</span><br>
<span style="font-size:16px; color:#555; font-family:'Kalam',cursive;">
β <b>F</b>ibroma, <b>F</b>ib epulis, <b>G</b>ingival hyperplasia, <b>P</b>yogenic granuloma, <b>Pa</b>pilloma, <b>O</b>steoma/Osteochondroma, <b>L</b>ipoma, <b>P</b>G-PGC, <b>G</b>iant cell epulis, <b>H</b>emangioma, <b>N</b>eurofibroma
</span>
</p>
</div>
<!-- ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
SECTION DIVIDER: CLASSIFICATION
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ -->
<div class="section-divider-title">π CLASSIFICATION (Shafer's)</div>
<div class="grid-2">
<div class="card card-blue">
<div class="card-title">π· Reactive / Inflammatory</div>
<ul>
<li><span class="hl-blue">Fibrous Epulis</span> (most common gingival lesion)</li>
<li><span class="hl-red">Pyogenic Granuloma</span></li>
<li><span class="hl-purple">Peripheral Giant Cell Granuloma</span> (PGCG)</li>
<li>Peripheral Ossifying Fibroma (POF)</li>
<li>Inflammatory Fibrous Hyperplasia (epulis fissuratum)</li>
<li>Drug-induced gingival hyperplasia</li>
<li>Denture-induced hyperplasia</li>
</ul>
</div>
<div class="card card-green">
<div class="card-title">π’ Developmental / Hamartomas</div>
<ul>
<li><span class="hl-green">Hemangioma</span> (vascular hamartoma)</li>
<li><span class="hl-teal">Lymphangioma</span></li>
<li>Congenital Epulis (Congenital granular cell tumor)</li>
<li>Melanotic Neuroectodermal Tumor (MNTI)</li>
<li>Fibrous Dysplasia</li>
<li>Torus palatinus / Torus mandibularis</li>
</ul>
</div>
</div>
<div class="grid-3">
<div class="card card-purple">
<div class="card-title">π£ Benign Neoplasms</div>
<ul>
<li><span class="hl-purple">Papilloma</span> (HPV-induced)</li>
<li>Fibroma</li>
<li>Lipoma</li>
<li>Neurofibroma</li>
<li>Neurilemmoma (Schwannoma)</li>
<li>Granular Cell Tumor</li>
</ul>
</div>
<div class="card card-orange">
<div class="card-title">π Bone / CT Origin</div>
<ul>
<li>Peripheral Cemento-ossifying Fibroma</li>
<li>Osteoma</li>
<li>Chondroma</li>
<li>Central Giant Cell Granuloma</li>
<li>Myxoma</li>
</ul>
</div>
<div class="card card-teal">
<div class="card-title">π©΅ Cyst-like / Others</div>
<ul>
<li>Mucocele (mucous retention / extravasation)</li>
<li>Ranula (floor of mouth)</li>
<li>Dermoid cyst</li>
<li>Lymphoepithelial cyst</li>
<li>Gingival cyst of adult</li>
</ul>
</div>
</div>
<hr class="sep">
<!-- ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
INDIVIDUAL LESIONS
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ -->
<div class="section-divider-title">π HIGH-YIELD INDIVIDUAL LESIONS</div>
<!-- ===== 1. PYOGENIC GRANULOMA ===== -->
<div class="lesion-section">
<div class="lesion-header lh-red">
<span class="badge">1</span> PYOGENIC GRANULOMA
<span class="tag tag-imp">IMP β
β
β
</span>
<span class="tag tag-mc">MC</span>
</div>
<div class="lesion-body">
<div class="lesion-grid">
<div class="lesion-mini-card">
<div class="lmc-title lmc-blue">π Definition & Key Facts</div>
<ul>
<li>Misnomer β <b>NOT pyogenic</b>, NOT a true granuloma</li>
<li>= Exuberant granulation tissue response to <b>local irritation</b></li>
<li>Synonyms: <b>Pregnancy tumor, Epulis gravidarum</b></li>
<li>Also called <span class="hl-red">Lobular Capillary Hemangioma</span></li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-orange">β οΈ Etiology</div>
<ul>
<li><b>Local irritants</b>: calculus, plaque, trauma</li>
<li><b>Hormonal</b>: pregnancy (estrogen β), puberty</li>
<li><b>Nutritional deficiency</b>: Vit C deficiency</li>
<li><b>Poor oral hygiene</b></li>
<li>Trauma / lip biting</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-green">π¬ Histopathology</div>
<ul>
<li><b>Mass of granulation tissue</b></li>
<li>Numerous <span class="hl-purple">thin-walled blood vessels</span> (lobular pattern)</li>
<li>Edematous stroma</li>
<li>Mixed <b>inflammatory infiltrate</b> (PMNs, lymphocytes)</li>
<li>Ulcerated surface covered by <b>fibrinous membrane</b></li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-red">π©Ί Clinical Features</div>
<ul>
<li>Site: <span class="hl-blue">Gingiva (most common)</span>, lips, tongue</li>
<li>Gender: <span class="hl-red">F > M</span> (esp. during pregnancy)</li>
<li>Age: <b>2ndβ3rd decade</b> (pregnancy); young adults</li>
<li>Appearance: <b>Pedunculated / sessile</b>, redβpink, bleeds easily</li>
<li>Size: few mm β 2 cm; soft, compressible</li>
<li>Surface: smooth / lobulated, often <b>ulcerated</b></li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-purple">π Key Points</div>
<ul>
<li>During pregnancy β <b>Epulis gravidarum</b></li>
<li>Regresses post-partum but surgical excision needed if persists</li>
<li>Recurrence if local irritants not removed</li>
<li><span class="hl-orange">Blanches on pressure</span> (vascular)</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-teal">π Management</div>
<ul>
<li>Eliminate <b>local irritants</b> (scaling)</li>
<li><b>Surgical excision</b> with periosteum</li>
<li>Address etiological factors (hormonal, nutritional)</li>
<li>During pregnancy: defer if possible; excise if β bleeding</li>
</ul>
</div>
</div>
<!-- Pathogenesis flow -->
<div style="margin-top: 10px;">
<span style="font-family:'Caveat',cursive; font-size:17px; color:#b71c1c; font-weight:700;">Pathogenesis β</span>
<div class="flow">
<div class="flow-step">Local Irritant / Trauma</div>
<div class="flow-arrow">β</div>
<div class="flow-step">Tissue Injury</div>
<div class="flow-arrow">β</div>
<div class="flow-step">Inflammatory Response + β Estrogen</div>
<div class="flow-arrow">β</div>
<div class="flow-step">Angiogenesis β</div>
<div class="flow-arrow">β</div>
<div class="flow-step">Exuberant Granulation Tissue</div>
<div class="flow-arrow">β</div>
<div class="flow-step">Pyogenic Granuloma</div>
</div>
</div>
</div>
</div>
<!-- ===== 2. PERIPHERAL GIANT CELL GRANULOMA ===== -->
<div class="lesion-section">
<div class="lesion-header lh-purple">
<span class="badge">2</span> PERIPHERAL GIANT CELL GRANULOMA (PGCG)
<span class="tag tag-imp">IMP β
β
β
</span>
</div>
<div class="lesion-body">
<div class="lesion-grid">
<div class="lesion-mini-card">
<div class="lmc-title lmc-blue">π Basics</div>
<ul>
<li>AKA: <span class="hl-purple">Giant cell epulis / Osteoclastoma of soft tissue</span></li>
<li>Purely <b>SOFT TISSUE</b> lesion (peripheral)</li>
<li>Arises from <b>periosteum / periodontal ligament</b></li>
<li>Anterior to molars most common</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-red">π©Ί Clinical Features</div>
<ul>
<li>Site: <span class="hl-blue">Interdental gingiva</span>, edentulous ridge</li>
<li>Color: <span class="hl-red">Bluish-purple / dark red</span> (hallmark!)</li>
<li>Pedunculated or sessile; bleeds on touch</li>
<li>May show "cupping resorption" on X-ray</li>
<li>F > M, any age (peak: 5thβ6th decade)</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-green">π¬ Histopathology</div>
<ul>
<li><span class="hl-purple">Multinucleated giant cells</span> in vascular stroma</li>
<li>Mononuclear stromal cells (spindle shaped)</li>
<li>Areas of <b>hemorrhage, hemosiderin</b> deposits β bluish color</li>
<li>Fibrous stroma; bone spicules occasionally</li>
<li>Overlying epithelium often <b>ulcerated</b></li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-purple">DDx</div>
<ul>
<li>Pyogenic granuloma (red, not bluish)</li>
<li>Central GCG (involves bone)</li>
<li>Brown tumor of hyperparathyroidism</li>
<li>Peripheral ossifying fibroma</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-teal">π Management</div>
<ul>
<li>Surgical excision <b>down to bone</b></li>
<li>Remove irritants; scale & root plane</li>
<li>Recurrence rate: <b>~10%</b></li>
<li>Rule out <b>hyperparathyroidism</b> (serum Ca, PTH)</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-orange">β‘ Key Distinguishing</div>
<ul>
<li><span class="hl-purple">BLUISH-PURPLE color = PGCG hallmark</span></li>
<li>Only lesion anterior to molar with that color</li>
<li>"Cupping resorption" of alveolar bone on X-ray</li>
<li>Check serum Ca & PTH to rule out brown tumor</li>
</ul>
</div>
</div>
</div>
</div>
<!-- ===== 3. FIBROUS EPULIS ===== -->
<div class="lesion-section">
<div class="lesion-header lh-blue">
<span class="badge">3</span> FIBROUS EPULIS (Irritation Fibroma / Fibroma)
<span class="tag tag-mc">Most Common Oral Tumor</span>
</div>
<div class="lesion-body">
<div class="lesion-grid">
<div class="lesion-mini-card">
<div class="lmc-title lmc-blue">π Definition</div>
<ul>
<li>Reactive <b>fibrous hyperplasia</b> to chronic irritation</li>
<li>Most common benign tumor of oral cavity</li>
<li>TRUE FIBROMA is rare; most are <b>fibrous hyperplasias</b></li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-red">π©Ί Clinical Features</div>
<ul>
<li>Site: <span class="hl-blue">Buccal mucosa (along occlusal plane)</span></li>
<li>Color: <b>Normal pink / pale</b></li>
<li>Firm, sessile, smooth surface</li>
<li>Asymptomatic; does NOT bleed</li>
<li>Slow growing; F slightly > M</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-green">π¬ Histopathology</div>
<ul>
<li>Dense <b>fibrous CT</b> with few fibroblasts</li>
<li>Covered by stratified squamous epithelium</li>
<li>Minimal inflammatory cells</li>
<li>May show <b>ossification / calcification</b> (ossifying fibroma)</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-purple">DDx</div>
<ul>
<li>Neurofibroma (softer)</li>
<li>Lipoma (yellowish)</li>
<li>Mucocele (fluctuant)</li>
<li>Peripheral ossifying fibroma</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-orange">β‘ POF vs Fibroma</div>
<table>
<tr><th>Feature</th><th>Fibroma</th><th>POF</th></tr>
<tr><td>Site</td><td>Buccal mucosa</td><td>Gingiva only</td></tr>
<tr><td>Calcification</td><td>Rare</td><td>Yes (dystrophic)</td></tr>
<tr><td>Recurrence</td><td>Low</td><td>~16%</td></tr>
</table>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-teal">π Management</div>
<ul>
<li><b>Conservative surgical excision</b></li>
<li>Remove causative irritant</li>
<li>Low recurrence if excision is complete</li>
</ul>
</div>
</div>
</div>
</div>
<!-- ===== 4. PAPILLOMA ===== -->
<div class="lesion-section">
<div class="lesion-header lh-green">
<span class="badge">4</span> SQUAMOUS CELL PAPILLOMA
<span class="tag tag-imp">IMP β
β
</span>
</div>
<div class="lesion-body">
<div class="lesion-grid">
<div class="lesion-mini-card">
<div class="lmc-title lmc-blue">π Basics</div>
<ul>
<li>Benign epithelial neoplasm caused by <span class="hl-red">HPV (types 6 & 11)</span></li>
<li>Most common benign epithelial neoplasm of oral cavity</li>
<li>Most common site: <b>soft palate, uvula, tongue</b></li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-red">π©Ί Clinical Features</div>
<ul>
<li>Exophytic, <b>cauliflower / wart-like</b> appearance</li>
<li>White (hyperkeratotic) or normal color</li>
<li>Pedunculated with narrow stalk</li>
<li>Soft, painless; size: 0.5β1 cm</li>
<li>Solitary (usually); multiple in immunocompromised</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-green">π¬ Histopathology</div>
<ul>
<li>Finger-like papillary projections of <b>stratified squamous epithelium</b></li>
<li>Fibrovascular core in each papilla</li>
<li><span class="hl-purple">Koilocytes</span> (HPV-infected cells): perinuclear halos, hyperchromatic nuclei</li>
<li>Surface: hyperkeratosis or parakeratosis</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-purple">Key: Koilocyte!</div>
<!-- SVG sketch of koilocyte -->
<svg width="130" height="70" viewBox="0 0 130 70">
<ellipse cx="65" cy="35" rx="55" ry="25" fill="#fce4ec" stroke="#e91e63" stroke-width="2"/>
<ellipse cx="65" cy="35" rx="15" ry="10" fill="#f48fb1" stroke="#c62828" stroke-width="1.5"/>
<ellipse cx="65" cy="35" rx="5" ry="5" fill="#c62828"/>
<text x="65" y="68" text-anchor="middle" font-size="10" fill="#880e4f">Koilocyte = perinuclear halo</text>
</svg>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-orange">DDx</div>
<ul>
<li>Verruca vulgaris (HPV 2,4 - skin type)</li>
<li>Condyloma acuminatum (HPV 6,11 - broader base)</li>
<li>Verrucous carcinoma</li>
<li>Focal epithelial hyperplasia (Heck's disease)</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-teal">π Management</div>
<ul>
<li>Surgical excision with base</li>
<li>Laser ablation (COβ laser)</li>
<li>Recurrence uncommon</li>
<li>No malignant potential with HPV 6 & 11</li>
</ul>
</div>
</div>
</div>
</div>
<!-- ===== 5. MUCOCELE ===== -->
<div class="lesion-section">
<div class="lesion-header lh-teal">
<span class="badge">5</span> MUCOCELE (Mucous Extravasation / Retention Cyst)
<span class="tag tag-imp">IMP β
β
β
</span>
</div>
<div class="lesion-body">
<div class="lesion-grid">
<div class="lesion-mini-card">
<div class="lmc-title lmc-blue">π Types</div>
<ul>
<li><span class="hl-red">Extravasation type</span> (common): trauma β rupture of duct β mucin pools in CT β no epithelial lining</li>
<li><span class="hl-blue">Retention type</span> (rare): obstruction of duct β cystic dilatation β <b>lined by epithelium</b></li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-red">π©Ί Clinical Features</div>
<ul>
<li>Site: <span class="hl-blue">Lower lip</span> (most common!), floor of mouth, buccal mucosa</li>
<li>Bluish, translucent, fluctuant swelling</li>
<li>Size: few mm β 1 cm</li>
<li>History of <b>recurrent swelling & rupture</b></li>
<li>Ranula = mucocele of <b>floor of mouth</b> (from sublingual gland)</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-green">π¬ Histopathology</div>
<ul>
<li><b>Extravasation</b>: Pool of mucin in CT, surrounded by <span class="hl-purple">granulation tissue</span>, macrophages (muciphages), NO epithelial lining</li>
<li><b>Retention</b>: Cyst lined by <b>ductal epithelium</b>, lumen filled with mucin</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-purple">Sketch</div>
<svg width="140" height="80" viewBox="0 0 140 80">
<rect x="5" y="5" width="130" height="70" rx="8" fill="#e0f7fa" stroke="#00838f" stroke-width="1.5"/>
<ellipse cx="70" cy="35" rx="40" ry="22" fill="#b2ebf2" stroke="#00838f" stroke-width="2"/>
<text x="70" y="38" text-anchor="middle" font-size="11" fill="#006064" font-weight="bold">Mucin pool</text>
<text x="70" y="65" text-anchor="middle" font-size="10" fill="#004d40">(No epithelial lining)</text>
<text x="70" y="75" text-anchor="middle" font-size="9" fill="#555">Extravasation type</text>
</svg>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-orange">DDx</div>
<ul>
<li>Fibroma (firm, no bluish tint)</li>
<li>Lymphangioma</li>
<li>Hemangioma (blanches on pressure)</li>
<li>Cystic hygroma (neck)</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-teal">π Management</div>
<ul>
<li><b>Surgical excision</b> with minor salivary gland</li>
<li>Marsupialization for ranula</li>
<li>Avoid simple enucleation (high recurrence)</li>
<li>Recurrence common if gland not removed</li>
</ul>
</div>
</div>
</div>
</div>
<!-- ===== 6. HEMANGIOMA ===== -->
<div class="lesion-section">
<div class="lesion-header lh-orange">
<span class="badge">6</span> HEMANGIOMA
<span class="tag tag-imp">IMP β
β
</span>
</div>
<div class="lesion-body">
<div class="lesion-grid">
<div class="lesion-mini-card">
<div class="lmc-title lmc-blue">π Basics</div>
<ul>
<li>Benign vascular lesion; may be <b>true neoplasm or hamartoma</b></li>
<li>Most common vascular tumor of oral cavity</li>
<li>Congenital or appears in early childhood</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-red">π©Ί Clinical</div>
<ul>
<li>Site: <span class="hl-blue">Tongue, lips, buccal mucosa</span></li>
<li>Redβblue, soft, compressible</li>
<li><span class="hl-red">Blanches on pressure</span> (diascopy +ve)</li>
<li>Strawberry hemangioma β involutes with age</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-green">π¬ Histopathology</div>
<ul>
<li><b>Capillary type</b>: lobules of capillaries, endothelium-lined</li>
<li><b>Cavernous type</b>: large dilated blood-filled sinusoids</li>
<li>Phleboliths (calcified thrombi) in cavernous type</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-purple">π Key</div>
<ul>
<li><b>Diascopy</b>: blanches β hemangioma</li>
<li><b>Does NOT blanche</b> β PGCG, other lesions</li>
<li>Phleboliths on X-ray β cavernous hemangioma</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-orange">π§© Syndromes</div>
<ul>
<li><b>Sturge-Weber</b>: port-wine stain + oral hemangioma</li>
<li><b>Rendu-Osler-Weber</b>: hereditary hemorrhagic telangiectasia</li>
<li><b>Maffucci syndrome</b>: hemangioma + enchondroma</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-teal">π Management</div>
<ul>
<li>Small: observation (many involute)</li>
<li>Sclerotherapy, laser therapy</li>
<li>Surgical excision for large lesions</li>
<li>Propranolol for infantile hemangioma</li>
</ul>
</div>
</div>
</div>
</div>
<!-- ===== 7. PERIPHERAL OSSIFYING FIBROMA ===== -->
<div class="lesion-section">
<div class="lesion-header lh-indigo">
<span class="badge">7</span> PERIPHERAL OSSIFYING FIBROMA (POF)
<span class="tag tag-imp">IMP β
β
</span>
</div>
<div class="lesion-body">
<div class="lesion-grid">
<div class="lesion-mini-card">
<div class="lmc-title lmc-blue">π Basics</div>
<ul>
<li>Reactive <b>gingival overgrowth</b> with dystrophic calcification</li>
<li>Arises from <b>periodontal ligament cells</b></li>
<li>Contains: fibrous tissue + calcification (bone/cementum)</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-red">π©Ί Clinical</div>
<ul>
<li>Site: <span class="hl-blue">Interdental papilla, anterior maxilla</span></li>
<li>Pink-red, sessile; may be ulcerated</li>
<li>Hard on palpation (calcifications)</li>
<li>F > M, age: 2ndβ3rd decade</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-green">π¬ Histopathology</div>
<ul>
<li><b>Cellular fibrous stroma</b></li>
<li>Foci of <span class="hl-purple">mineralization</span>: bone trabeculae, cementum-like material, dystrophic calcification</li>
<li>Ulcerated surface with inflammatory infiltrate</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-orange">Radiograph</div>
<ul>
<li>Radiopaque foci within soft tissue mass</li>
<li>"Scattered calcifications"</li>
<li>Superficial bone erosion possible</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-purple">DDx</div>
<ul>
<li>Pyogenic granuloma (softer, redder)</li>
<li>PGCG (bluish-purple)</li>
<li>Fibroma (no calcification)</li>
<li>Gingival fibrous hyperplasia</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-teal">π Management</div>
<ul>
<li>Thorough <b>excision down to bone + periosteum</b></li>
<li>Curettage of underlying bone</li>
<li>Recurrence: <span class="hl-red">~16%</span> (highest of epulides)</li>
</ul>
</div>
</div>
</div>
</div>
<!-- ===== 8. DRUG-INDUCED GINGIVAL HYPERPLASIA ===== -->
<div class="lesion-section">
<div class="lesion-header lh-pink">
<span class="badge">8</span> DRUG-INDUCED GINGIVAL HYPERPLASIA (DIGH)
<span class="tag tag-imp">IMP β
β
β
</span>
</div>
<div class="lesion-body">
<div class="lesion-grid">
<div class="lesion-mini-card">
<div class="lmc-title lmc-blue">π Key Drugs (Mnemonic: PCN)</div>
<ul>
<li><span class="hl-red">P</span>henytoin (Dilantin) β <b>most common / classic</b></li>
<li><span class="hl-blue">C</span>yclosporin (immunosuppressant)</li>
<li><span class="hl-green">N</span>ifedipine (Ca-channel blocker)</li>
<li>Also: verapamil, diltiazem, valproate</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-orange">Pathogenesis Flow</div>
<div class="flow" style="flex-direction:column; gap:3px;">
<div class="flow-step" style="background:#fce4ec;">Drug β β Folic Acid uptake</div>
<div class="flow-arrow">β</div>
<div class="flow-step" style="background:#fce4ec;">β Collagenase activity</div>
<div class="flow-arrow">β</div>
<div class="flow-step" style="background:#fce4ec;">Collagen accumulation</div>
<div class="flow-arrow">β</div>
<div class="flow-step" style="background:#fce4ec;">Gingival overgrowth</div>
</div>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-red">π©Ί Clinical</div>
<ul>
<li>Begins in <b>interdental papilla</b></li>
<li>Firm, <b>non-tender</b>, stippled</li>
<li>Does NOT bleed (unlike PG)</li>
<li>Worse with <b>poor oral hygiene</b></li>
<li>Phenytoin: affects anterior > posterior</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-green">π¬ Histopathology</div>
<ul>
<li>Hyperplastic stratified squamous epithelium</li>
<li><b>Acanthosis, elongated rete ridges</b></li>
<li>Dense fibrous CT with <span class="hl-purple">collagen bundles</span></li>
<li>Minimal inflammation (unless 2Β° to poor hygiene)</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-purple">π Phenytoin DIGH</div>
<ul>
<li>Incidence: <b>50% of patients</b> on phenytoin</li>
<li>Children more affected than adults</li>
<li>Folic acid supplementation may help</li>
<li>Not seen in edentulous areas</li>
</ul>
</div>
<div class="lesion-mini-card">
<div class="lmc-title lmc-teal">π Management</div>
<ul>
<li>Improve <b>oral hygiene</b></li>
<li>Drug substitution (with physician)</li>
<li><b>Gingivectomy / periodontal surgery</b></li>
<li>Folic acid for phenytoin cases</li>
<li>Recurrence if drug continued</li>
</ul>
</div>
</div>
</div>
</div>
<hr class="sep">
<!-- ===== COMPARISON TABLE ===== -->
<div class="section-divider-title">π COMPARISON TABLE β Epulides</div>
<div class="full-width">
<div style="overflow-x:auto; border-radius:12px; border: 2px solid #c5cae9;">
<table>
<thead>
<tr>
<th>Feature</th>
<th>Pyogenic Granuloma</th>
<th>PGCG</th>
<th>POF</th>
<th>Fibrous Epulis</th>
</tr>
</thead>
<tbody>
<tr>
<td><b>Color</b></td>
<td>Bright Red/Pink</td>
<td><span class="hl-purple">Bluish-purple</span></td>
<td>Pink-Red</td>
<td>Normal Pink</td>
</tr>
<tr>
<td><b>Bleeds easily</b></td>
<td>Yes β
</td>
<td>Yes</td>
<td>Sometimes</td>
<td>No</td>
</tr>
<tr>
<td><b>Calcification</b></td>
<td>No</td>
<td>No</td>
<td><span class="hl-green">Yes</span></td>
<td>Rare</td>
</tr>
<tr>
<td><b>Origin</b></td>
<td>Granulation tissue</td>
<td>Periosteum/PDL</td>
<td>PDL</td>
<td>Fibrous CT</td>
</tr>
<tr>
<td><b>Histo hallmark</b></td>
<td>Lobular capillaries</td>
<td><span class="hl-purple">Multi-nucleated GC</span></td>
<td>Fibrous + calcif.</td>
<td>Dense collagen</td>
</tr>
<tr>
<td><b>Recurrence</b></td>
<td>If irritant remains</td>
<td>~10%</td>
<td><span class="hl-red">~16%</span> (highest)</td>
<td>Low</td>
</tr>
<tr>
<td><b>X-ray changes</b></td>
<td>None</td>
<td>Cupping resorption</td>
<td>Radiopaque foci</td>
<td>None</td>
</tr>
<tr>
<td><b>Special concern</b></td>
<td>Rule out pregnancy</td>
<td>Rule out hyperparathyroidism</td>
<td>High recurrence</td>
<td>None</td>
</tr>
</tbody>
</table>
</div>
</div>
<hr class="sep">
<!-- ===== DIFFERENTIAL DIAGNOSIS FLOWCHART ===== -->
<div class="section-divider-title">π DIFFERENTIAL DIAGNOSIS APPROACH</div>
<div class="grid-2">
<div class="card card-indigo">
<div class="card-title">π΅ By Color</div>
<ul>
<li><span class="hl-red">Red + bleeds = Pyogenic Granuloma</span></li>
<li><span class="hl-purple">Bluish-purple = PGCG</span></li>
<li><span class="hl-blue">Bluish + translucent = Mucocele / Hemangioma</span></li>
<li>Normal pink, firm = Fibroma</li>
<li>White, wart-like = Papilloma</li>
<li>Yellow, soft = Lipoma</li>
</ul>
</div>
<div class="card card-cyan">
<div class="card-title">π©΅ By Blanching</div>
<ul>
<li><span class="hl-green">Blanches β Vascular (Hemangioma)</span></li>
<li>Does NOT blanch β PGCG, Mucocele</li>
<li><b>Diascopy test</b>: press glass on lesion</li>
<li>+ diascopy = blood in vessels β hemangioma</li>
<li>β diascopy = blood outside vessels β PGCG</li>
</ul>
</div>
</div>
<hr class="sep">
<!-- ===== LAST MINUTE BOX ===== -->
<div class="last-minute">
<div class="lm-grid">
<div class="lm-item">Most common benign tumor of oral cavity = <span class="hl-blue">FIBROMA</span></div>
<div class="lm-item">Most common gingival lesion = <span class="hl-blue">Fibrous Epulis</span></div>
<div class="lm-item">Pyogenic granuloma of pregnancy = <span class="hl-red">Epulis Gravidarum</span></div>
<div class="lm-item">PGCG hallmark color = <span class="hl-purple">Bluish-Purple</span> (hemosiderin)</div>
<div class="lm-item">HPV 6 & 11 β <span class="hl-green">Oral Papilloma</span> (no malignant potential)</div>
<div class="lm-item">Koilocytes (perinuclear halos) β <span class="hl-green">Papilloma histology</span></div>
<div class="lm-item">Mucocele β lower lip, extravasation type, NO epithelial lining</div>
<div class="lm-item">POF has highest recurrence among epulides = <span class="hl-red">~16%</span></div>
<div class="lm-item">Drug-induced gingival hyperplasia: <span class="hl-purple">PCN mnemonic</span> (Phenytoin, Cyclosporin, Nifedipine)</div>
<div class="lm-item">Diascopy positive = <span class="hl-green">Hemangioma</span> (blanches)</div>
<div class="lm-item">Brown tumor of hyperparathyroidism = histologically like <span class="hl-purple">PGCG</span> β always check Ca & PTH</div>
<div class="lm-item">Ranula = mucocele of floor of mouth (from sublingual gland)</div>
</div>
</div>
<!-- One-line summary -->
<div style="margin-top:20px; text-align:center;">
<div style="display:inline-block; background:#e8eaf6; border:3px double #3949ab; border-radius:12px; padding:10px 30px;">
<span style="font-family:'Caveat',cursive; font-size:22px; color:#1a237e; font-weight:700;">
π‘ One-line Summary: "Benign oral lesions = REACTIVE (irritation/hormonal) > DEVELOPMENTAL > TRUE NEOPLASMS β treat by excision + remove cause!"
</span>
</div>
</div>
<div style="margin-top:16px; text-align:right; font-family:'Caveat',cursive; font-size:16px; color:#bbb;">
Orris AI Notes β’ Shafer's Oral Pathology
</div>
</div>
</body>
</html>
which chromium-browser || which chromium || which google-chrome || which google-chrome-stable 2>/dev/null; node --version; npm list -g puppeteer 2>/dev/null | head -5
cd /home/daytona/workspace/oral-revision && npm install puppeteer 2>&1 | tail -5
python3 -c "import playwright; print('playwright ok')" 2>/dev/null || python3 -c "from selenium import webdriver; print('selenium ok')" 2>/dev/null || echo "neither available"; python3 -c "import subprocess; r=subprocess.run(['/usr/bin/chromium','--version'],capture_output=True,text=True); print(r.stdout)" 2>/dev/null
/usr/bin/chromium --headless=new --no-sandbox --disable-gpu --screenshot=/home/daytona/workspace/oral-revision/benign_oral_lesions.png --window-size=1400,5000 "file:///home/daytona/workspace/oral-revision/benign_oral_lesions.html" 2>&1 | head -20; ls -lh /home/daytona/workspace/oral-revision/
python3 -c " from PIL import Image img = Image.open('/home/daytona/workspace/oral-revision/benign_oral_lesions.png') print('Size:', img.size) print('Mode:', img.mode) "
/usr/bin/chromium --headless=new --no-sandbox --disable-gpu --print-to-pdf=/home/daytona/workspace/oral-revision/benign_oral_lesions.pdf --print-to-pdf-no-header --no-pdf-header-footer --window-size=1600,10000 "file:///home/daytona/workspace/oral-revision/benign_oral_lesions.html" 2>&1 | grep -v dbus | grep -v "Failed\|ERROR\|object_proxy\|NameHasOwner\|GetAll" | head -10; ls -lh /home/daytona/workspace/oral-revision/
# Get actual page height via chromium JS /usr/bin/chromium --headless=new --no-sandbox --disable-gpu \ --run-all-compositor-stages-before-draw \ --virtual-time-budget=5000 \ --screenshot=/home/daytona/workspace/oral-revision/benign_oral_lesions_full.png \ --window-size=1400,9000 \ "file:///home/daytona/workspace/oral-revision/benign_oral_lesions.html" 2>/dev/null python3 -c " from PIL import Image img = Image.open('/home/daytona/workspace/oral-revision/benign_oral_lesions_full.png') print('Full size:', img.size) " ls -lh /home/daytona/workspace/oral-revision/
python3 -c " from PIL import Image, ImageChops import numpy as np img = Image.open('/home/daytona/workspace/oral-revision/benign_oral_lesions_full.png') arr = np.array(img) # Find last row that is not near-white (background is #fffef5 ~ 255,254,245) non_white_rows = np.where(arr.min(axis=(1,2)) < 240)[0] if len(non_white_rows) > 0: last_row = non_white_rows[-1] + 80 # add padding last_row = min(last_row, img.height) cropped = img.crop((0, 0, img.width, last_row)) cropped.save('/home/daytona/workspace/oral-revision/benign_oral_lesions_final.png', quality=95, optimize=True) print(f'Cropped to: {cropped.size}') else: print('Could not find content end; saving as-is') img.save('/home/daytona/workspace/oral-revision/benign_oral_lesions_final.png') print(img.size) " ls -lh /home/daytona/workspace/oral-revision/benign_oral_lesions_final.png
python3 -c " from PIL import Image import numpy as np img = Image.open('/home/daytona/workspace/oral-revision/benign_oral_lesions_full.png') arr = np.array(img) # Sample last 200 rows bottom = arr[-200:,:,:] print('Bottom region min pixel:', bottom.min(), 'max pixel:', bottom.max()) print('Bottom avg color:', bottom.mean(axis=(0,1))) # Is it whitespace? white_mask = (bottom > 245).all(axis=2) pct_white = white_mask.sum() / white_mask.size * 100 print(f'Bottom 200px: {pct_white:.1f}% white pixels') "
/usr/bin/chromium --headless=new --no-sandbox --disable-gpu \ --run-all-compositor-stages-before-draw \ --virtual-time-budget=5000 \ --screenshot=/home/daytona/workspace/oral-revision/benign_oral_lesions_final.png \ --window-size=1400,11000 \ "file:///home/daytona/workspace/oral-revision/benign_oral_lesions.html" 2>/dev/null python3 -c " from PIL import Image import numpy as np img = Image.open('/home/daytona/workspace/oral-revision/benign_oral_lesions_final.png') arr = np.array(img) non_bg = np.where(~((arr[:,:,0]>240) & (arr[:,:,1]>235) & (arr[:,:,2]>225)))[0] if len(non_bg): print('Last content row:', non_bg[-1], '/', img.height) else: print('All bg?') print('Image size:', img.size) " ls -lh /home/daytona/workspace/oral-revision/benign_oral_lesions_final.png
python3 -c " from PIL import Image import numpy as np img = Image.open('/home/daytona/workspace/oral-revision/benign_oral_lesions_final.png') # Crop to content + 80px padding cropped = img.crop((0, 0, 1400, 6052 + 80)) cropped.save('/home/daytona/workspace/oral-revision/benign_oral_lesions_final.png', optimize=True) print('Final image size:', cropped.size) " ls -lh /home/daytona/workspace/oral-revision/benign_oral_lesions_final.png
benign oral lesions final
Image Β· PNG
benign oral lesions
PDF Document Β· PDF
benign oral lesions
HTML File Β· HTML