From the above image make a slide wise for presentation of cellulitis Contents are Introduction Definition Causes Types and classification Pathophysiology Symptoms, Clinical feature Diagnosis Differential diagnosis give any 4 make a table in realtion with cellulitis Complications 
ls -la /home/daytona/workspace/ 2>/dev/null || mkdir -p /home/daytona/workspace/
mkdir -p /home/daytona/workspace/cellulitis-ppt
~/cellulitis-ppt/cellulitis.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Cellulitis";
// ── Color palette ──────────────────────────────────────────────
const DARK_BG = "0D2B3E"; // deep navy (title / section slides)
const MID_BG = "12404F"; // teal-dark
const LIGHT_BG = "EAF4F4"; // near-white teal tint (content slides)
const ACCENT = "1FA688"; // teal green
const ACCENT2 = "F4A261"; // warm amber
const WHITE = "FFFFFF";
const DARK_TXT = "0D2B3E";
const LIGHT_TXT = "EAF4F4";
const GREY = "4A6274";
// ── Helper: add a section divider slide ────────────────────────
function sectionSlide(title, subtitle) {
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: "100%", h: "100%", fill: { color: DARK_BG } });
s.addShape(pres.ShapeType.rect, { x: 0, y: 2.4, w: "100%", h: 0.06, fill: { color: ACCENT } });
s.addText(title, {
x: 0.7, y: 1.6, w: 8.6, h: 1.0,
fontSize: 38, bold: true, color: WHITE, fontFace: "Calibri", align: "center"
});
if (subtitle) {
s.addText(subtitle, {
x: 1, y: 2.7, w: 8, h: 0.7,
fontSize: 18, color: ACCENT, fontFace: "Calibri", align: "center", italic: true
});
}
return s;
}
// ── Helper: content slide with title bar ───────────────────────
function contentSlide(title) {
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: "100%", h: "100%", fill: { color: LIGHT_BG } });
// title bar
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: "100%", h: 0.85, fill: { color: DARK_BG } });
// accent line
s.addShape(pres.ShapeType.rect, { x: 0, y: 0.85, w: "100%", h: 0.06, fill: { color: ACCENT } });
s.addText(title, {
x: 0.3, y: 0.06, w: 9.4, h: 0.73,
fontSize: 24, bold: true, color: WHITE, fontFace: "Calibri", valign: "middle", margin: 0
});
return s;
}
// ══════════════════════════════════════════════════════════════
// SLIDE 1 – TITLE
// ══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: "100%", h: "100%", fill: { color: DARK_BG } });
// decorative left stripe
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.18, h: "100%", fill: { color: ACCENT } });
// decorative bottom stripe
s.addShape(pres.ShapeType.rect, { x: 0, y: 5.1, w: "100%", h: 0.525, fill: { color: MID_BG } });
s.addText("CELLULITIS", {
x: 0.5, y: 0.9, w: 9, h: 1.4,
fontSize: 58, bold: true, color: WHITE, fontFace: "Calibri",
align: "center", charSpacing: 8
});
s.addShape(pres.ShapeType.rect, { x: 2.5, y: 2.45, w: 5, h: 0.07, fill: { color: ACCENT } });
s.addText("A Comprehensive Clinical Overview", {
x: 0.5, y: 2.65, w: 9, h: 0.6,
fontSize: 20, color: ACCENT, fontFace: "Calibri", align: "center", italic: true
});
s.addText("Bacterial Skin & Soft Tissue Infection", {
x: 0.5, y: 3.3, w: 9, h: 0.5,
fontSize: 15, color: LIGHT_TXT, fontFace: "Calibri", align: "center"
});
s.addText("Dermatology | Infectious Disease | Clinical Medicine", {
x: 0.3, y: 5.15, w: 9.4, h: 0.45,
fontSize: 12, color: ACCENT, fontFace: "Calibri", align: "center"
});
}
// ══════════════════════════════════════════════════════════════
// SLIDE 2 – TABLE OF CONTENTS
// ══════════════════════════════════════════════════════════════
{
const s = contentSlide("Table of Contents");
const items = [
"01 Introduction",
"02 Definition",
"03 Causes & Risk Factors",
"04 Types & Classification",
"05 Pathophysiology",
"06 Symptoms",
"07 Clinical Features",
"08 Diagnosis",
"09 Differential Diagnosis",
"10 Complications",
];
const col1 = items.slice(0, 5);
const col2 = items.slice(5);
const bulletOpts = { bullet: { code: "25B8" }, fontSize: 16, color: DARK_TXT, fontFace: "Calibri", breakLine: true };
s.addText(col1.map((t, i) => ({ text: t, options: { ...bulletOpts, breakLine: i < col1.length - 1 } })),
{ x: 0.6, y: 1.05, w: 4.1, h: 4.0, valign: "top", lineSpacingMultiple: 1.5 });
s.addText(col2.map((t, i) => ({ text: t, options: { ...bulletOpts, breakLine: i < col2.length - 1 } })),
{ x: 5.0, y: 1.05, w: 4.7, h: 4.0, valign: "top", lineSpacingMultiple: 1.5 });
// divider
s.addShape(pres.ShapeType.rect, { x: 4.85, y: 1.0, w: 0.04, h: 4.1, fill: { color: ACCENT } });
}
// ══════════════════════════════════════════════════════════════
// SLIDE 3 – INTRODUCTION
// ══════════════════════════════════════════════════════════════
{
const s = contentSlide("Introduction");
// top stat boxes
const stats = [
{ val: "1.5–3%", lbl: "Global prevalence\n(annually)" },
{ val: "199–455", lbl: "Cases per 100,000\npersons/year" },
{ val: "2.5–5%", lbl: "Indian population\naffected annually" },
];
stats.forEach((st, i) => {
const bx = 0.5 + i * 3.17;
s.addShape(pres.ShapeType.roundRect, { x: bx, y: 1.0, w: 2.85, h: 1.1, fill: { color: DARK_BG }, rectRadius: 0.1 });
s.addText(st.val, { x: bx, y: 1.05, w: 2.85, h: 0.52, fontSize: 22, bold: true, color: ACCENT, align: "center", fontFace: "Calibri", margin: 0 });
s.addText(st.lbl, { x: bx, y: 1.55, w: 2.85, h: 0.5, fontSize: 11, color: WHITE, align: "center", fontFace: "Calibri", margin: 0 });
});
// body text
s.addText("Cellulitis is an acute bacterial infection affecting the deeper layers of the skin and subcutaneous tissue, typically caused by Streptococci or Staphylococci.", {
x: 0.5, y: 2.3, w: 9, h: 0.85, fontSize: 15, color: DARK_TXT, fontFace: "Calibri", wrap: true
});
// risk factor boxes
s.addShape(pres.ShapeType.roundRect, { x: 0.5, y: 3.2, w: 4.2, h: 1.6, fill: { color: DARK_BG }, rectRadius: 0.1 });
s.addText("Group 1 – Skin Barrier Breakdown", { x: 0.55, y: 3.22, w: 4.1, h: 0.4, fontSize: 13, bold: true, color: ACCENT, fontFace: "Calibri", margin: 0 });
s.addText([
{ text: "• Skin injuries, surgical incisions", options: { breakLine: true } },
{ text: "• IV punctures, toe fissures", options: { breakLine: true } },
{ text: "• Insect/animal bites, skin infections", options: {} }
], { x: 0.6, y: 3.62, w: 4.0, h: 1.1, fontSize: 12, color: WHITE, fontFace: "Calibri" });
s.addShape(pres.ShapeType.roundRect, { x: 5.2, y: 3.2, w: 4.3, h: 1.6, fill: { color: MID_BG }, rectRadius: 0.1 });
s.addText("Group 2 – Co-morbidities", { x: 5.25, y: 3.22, w: 4.2, h: 0.4, fontSize: 13, bold: true, color: ACCENT2, fontFace: "Calibri", margin: 0 });
s.addText([
{ text: "• Diabetes mellitus", options: { breakLine: true } },
{ text: "• Venous insufficiency", options: { breakLine: true } },
{ text: "• Peripheral arterial disease", options: { breakLine: true } },
{ text: "• Lymphoedema", options: {} }
], { x: 5.3, y: 3.62, w: 4.1, h: 1.1, fontSize: 12, color: WHITE, fontFace: "Calibri" });
}
// ══════════════════════════════════════════════════════════════
// SLIDE 4 – DEFINITION
// ══════════════════════════════════════════════════════════════
{
const s = contentSlide("Definition");
// large quote block
s.addShape(pres.ShapeType.roundRect, { x: 0.5, y: 1.1, w: 9, h: 2.1, fill: { color: DARK_BG }, rectRadius: 0.15 });
s.addText('"Cellulitis is an acute, non-necrotising bacterial infection of the dermis and subcutaneous tissue characterised by localised redness, swelling, warmth, and tenderness — most commonly caused by beta-haemolytic Streptococci and Staphylococcus aureus."', {
x: 0.7, y: 1.2, w: 8.6, h: 1.9,
fontSize: 17, color: WHITE, fontFace: "Calibri", italic: true, align: "center", valign: "middle", wrap: true
});
// key points
const kp = [
{ icon: "🦠", txt: "Caused by: Streptococci / Staphylococci" },
{ icon: "🔬", txt: "Layers involved: Dermis & subcutaneous tissue" },
{ icon: "📍", txt: "Commonly affects: Lower limbs (70% of cases)" },
{ icon: "⚠️", txt: "Requires prompt antibiotic treatment" },
];
kp.forEach((k, i) => {
const bx = i < 2 ? 0.5 : 5.2;
const by = 3.4 + (i % 2) * 0.75;
s.addShape(pres.ShapeType.roundRect, { x: bx, y: by, w: 4.4, h: 0.65, fill: { color: i % 2 === 0 ? ACCENT : MID_BG }, rectRadius: 0.08 });
s.addText(`${k.icon} ${k.txt}`, { x: bx + 0.1, y: by + 0.05, w: 4.2, h: 0.55, fontSize: 13, color: WHITE, fontFace: "Calibri", valign: "middle", margin: 0 });
});
}
// ══════════════════════════════════════════════════════════════
// SLIDE 5 – CAUSES
// ══════════════════════════════════════════════════════════════
{
const s = contentSlide("Causes");
// Primary pathogens
s.addText("Primary Pathogens", { x: 0.5, y: 1.0, w: 9, h: 0.4, fontSize: 16, bold: true, color: DARK_TXT, fontFace: "Calibri" });
const pathogens = [
{ name: "Group A Streptococcus\n(S. pyogenes)", note: "Most common cause\nof non-purulent cellulitis", color: DARK_BG },
{ name: "Staphylococcus\naureus (incl. MRSA)", note: "Common in purulent\ncellulitis / abscesses", color: MID_BG },
{ name: "H. influenzae\n(children)", note: "Facial cellulitis\nin unvaccinated children", color: "1a5276" },
{ name: "Aeromonas /\nPseudomonas", note: "Water exposure,\nimmunocompromised", color: "145a32" },
];
pathogens.forEach((p, i) => {
const bx = 0.3 + i * 2.4;
s.addShape(pres.ShapeType.roundRect, { x: bx, y: 1.5, w: 2.2, h: 1.6, fill: { color: p.color }, rectRadius: 0.12 });
s.addText(p.name, { x: bx + 0.05, y: 1.55, w: 2.1, h: 0.75, fontSize: 13, bold: true, color: ACCENT, fontFace: "Calibri", align: "center", wrap: true });
s.addText(p.note, { x: bx + 0.05, y: 2.3, w: 2.1, h: 0.75, fontSize: 11, color: WHITE, fontFace: "Calibri", align: "center", wrap: true });
});
// Entry points
s.addShape(pres.ShapeType.rect, { x: 0, y: 3.25, w: "100%", h: 0.04, fill: { color: ACCENT } });
s.addText("Routes of Entry", { x: 0.5, y: 3.35, w: 9, h: 0.38, fontSize: 16, bold: true, color: DARK_TXT, fontFace: "Calibri" });
const routes = ["Skin injuries & lacerations", "Surgical incisions", "IV puncture sites", "Insect / animal bites", "Toe web fissures", "Ulcers & wounds"];
s.addText(routes.map((r, i) => ({ text: `◆ ${r}`, options: { breakLine: i < routes.length - 1, fontSize: 13, color: DARK_TXT } })),
{ x: 0.5, y: 3.78, w: 9.0, h: 1.5, fontFace: "Calibri", lineSpacingMultiple: 1.5 });
}
// ══════════════════════════════════════════════════════════════
// SLIDE 6 – TYPES & CLASSIFICATION
// ══════════════════════════════════════════════════════════════
{
const s = contentSlide("Types & Classification");
const types = [
{ name: "Non-purulent\nCellulitis", desc: "No pus or abscess; most\ncommon type; typically\ncaused by Streptococci.", color: DARK_BG },
{ name: "Purulent\nCellulitis", desc: "Associated with pus,\nabscess or furuncle;\noften MRSA-related.", color: MID_BG },
{ name: "Periorbital\nCellulitis", desc: "Infection anterior to\norbital septum; can\naffect vision if severe.", color: "1a5276" },
{ name: "Orbital\nCellulitis", desc: "Behind orbital septum;\nserious: proptosis,\nophthalmoplegia.", color: "6e2f0a" },
{ name: "Facial /\nBuccal", desc: "Involves cheek; may\nextend to cavernous\nsinus (dangerous).", color: "145a32" },
];
types.forEach((t, i) => {
const row = Math.floor(i / 3);
const col = i % 3;
const bx = 0.35 + col * 3.12;
const by = 1.05 + row * 2.1;
const bw = 2.8;
const bh = 1.9;
s.addShape(pres.ShapeType.roundRect, { x: bx, y: by, w: bw, h: bh, fill: { color: t.color }, rectRadius: 0.12 });
s.addShape(pres.ShapeType.rect, { x: bx, y: by, w: bw, h: 0.06, fill: { color: ACCENT } });
s.addText(t.name, { x: bx + 0.05, y: by + 0.12, w: bw - 0.1, h: 0.65, fontSize: 14, bold: true, color: WHITE, fontFace: "Calibri", align: "center", wrap: true });
s.addText(t.desc, { x: bx + 0.1, y: by + 0.85, w: bw - 0.2, h: 0.95, fontSize: 12, color: LIGHT_TXT, fontFace: "Calibri", align: "center", wrap: true });
});
// 4th and 5th cards – row 2
}
// ══════════════════════════════════════════════════════════════
// SLIDE 7 – PATHOPHYSIOLOGY
// ══════════════════════════════════════════════════════════════
{
const s = contentSlide("Pathophysiology");
const steps = [
{ n: "1", title: "Bacterial Entry", body: "Bacteria (Streptococci / Staphylococci) infiltrate through breaks in skin: injuries, bites, surgical sites." },
{ n: "2", title: "Invasion & Colonisation", body: "Pathogens penetrate deeper layers of dermis and subcutaneous tissue, evading initial defences." },
{ n: "3", title: "Immune Response", body: "WBCs recruited to site; inflammation marked by redness, warmth, and swelling." },
{ n: "4", title: "Toxin & Enzyme Release", body: "Bacteria release enzymes and toxins; immune mediators cause tissue damage and potential pus / abscess formation." },
{ n: "5", title: "Systemic Spread", body: "In severe cases, bacteria disseminate via bloodstream → fever, chills, malaise, septicemia." },
];
steps.forEach((st, i) => {
const by = 1.0 + i * 0.88;
// circle
s.addShape(pres.ShapeType.ellipse, { x: 0.3, y: by + 0.05, w: 0.55, h: 0.55, fill: { color: ACCENT } });
s.addText(st.n, { x: 0.3, y: by + 0.05, w: 0.55, h: 0.55, fontSize: 16, bold: true, color: WHITE, align: "center", valign: "middle", fontFace: "Calibri", margin: 0 });
// connector line (except last)
if (i < steps.length - 1) {
s.addShape(pres.ShapeType.rect, { x: 0.545, y: by + 0.6, w: 0.04, h: 0.28, fill: { color: GREY } });
}
// text
s.addText(st.title, { x: 1.05, y: by + 0.04, w: 2.2, h: 0.35, fontSize: 14, bold: true, color: DARK_TXT, fontFace: "Calibri", margin: 0 });
s.addText(st.body, { x: 3.4, y: by, w: 6.2, h: 0.8, fontSize: 12, color: GREY, fontFace: "Calibri", wrap: true });
s.addShape(pres.ShapeType.rect, { x: 3.3, y: by + 0.1, w: 0.04, h: 0.6, fill: { color: ACCENT } });
});
}
// ══════════════════════════════════════════════════════════════
// SLIDE 8 – SYMPTOMS
// ══════════════════════════════════════════════════════════════
{
const s = contentSlide("Symptoms");
// two columns: local vs systemic
s.addShape(pres.ShapeType.roundRect, { x: 0.4, y: 0.95, w: 4.3, h: 4.4, fill: { color: DARK_BG }, rectRadius: 0.12 });
s.addShape(pres.ShapeType.roundRect, { x: 5.1, y: 0.95, w: 4.4, h: 4.4, fill: { color: MID_BG }, rectRadius: 0.12 });
s.addText("🔴 Local Symptoms", { x: 0.5, y: 0.98, w: 4.1, h: 0.5, fontSize: 15, bold: true, color: ACCENT, fontFace: "Calibri" });
const local = ["Erythema (redness)", "Oedema (swelling)", "Warmth / heat", "Tenderness & pain", "Induration (hardening)", "Skin lesions / wounds", "Ulcerations / abscesses", "Vesicles or bullae (blisters)"];
s.addText(local.map((t, i) => ({ text: `• ${t}`, options: { breakLine: i < local.length - 1 } })),
{ x: 0.6, y: 1.5, w: 4.0, h: 3.7, fontSize: 13, color: WHITE, fontFace: "Calibri", lineSpacingMultiple: 1.4, valign: "top" });
s.addText("🌡️ Systemic Symptoms\n(Severe Cases)", { x: 5.2, y: 0.98, w: 4.1, h: 0.6, fontSize: 15, bold: true, color: ACCENT2, fontFace: "Calibri", wrap: true });
const systemic = ["Fever & chills", "Malaise & fatigue", "Headache", "Nausea & vomiting", "Lymphadenopathy", "Leukocytosis (↑ WBC)", "Bacteremia (blood spread)"];
s.addText(systemic.map((t, i) => ({ text: `• ${t}`, options: { breakLine: i < systemic.length - 1 } })),
{ x: 5.25, y: 1.65, w: 4.1, h: 3.55, fontSize: 13, color: WHITE, fontFace: "Calibri", lineSpacingMultiple: 1.4, valign: "top" });
}
// ══════════════════════════════════════════════════════════════
// SLIDE 9 – CLINICAL FEATURES
// ══════════════════════════════════════════════════════════════
{
const s = contentSlide("Clinical Features");
// severity bands
const bands = [
{ label: "MILD", sub: "Localised with minimal systemic symptoms", color: "1a7a4a", w: 2.8 },
{ label: "MODERATE", sub: "Widespread with moderate systemic involvement", color: "d4870a", w: 3.4 },
{ label: "SEVERE", sub: "Extensive, life-threatening systemic complications", color: "922b21", w: 3.5 },
];
let bx = 0.3;
bands.forEach(b => {
s.addShape(pres.ShapeType.roundRect, { x: bx, y: 1.0, w: b.w, h: 0.9, fill: { color: b.color }, rectRadius: 0.1 });
s.addText(b.label, { x: bx + 0.05, y: 1.02, w: b.w - 0.1, h: 0.4, fontSize: 15, bold: true, color: WHITE, fontFace: "Calibri", align: "center" });
s.addText(b.sub, { x: bx + 0.05, y: 1.42, w: b.w - 0.1, h: 0.44, fontSize: 10, color: WHITE, fontFace: "Calibri", align: "center", wrap: true });
bx += b.w + 0.15;
});
// feature detail
s.addText("Cardinal Local Signs", { x: 0.4, y: 2.1, w: 5.0, h: 0.38, fontSize: 15, bold: true, color: DARK_TXT, fontFace: "Calibri" });
const signs = ["Erythema – spreading redness", "Oedema – pitting swelling", "Warmth – localised heat", "Tenderness – painful to palpation", "Induration – skin hardening", "Fistulas / ulcerations in advanced cases"];
s.addText(signs.map((t, i) => ({ text: `◆ ${t}`, options: { breakLine: i < signs.length - 1, fontSize: 13, color: DARK_TXT } })),
{ x: 0.4, y: 2.55, w: 4.7, h: 2.7, fontFace: "Calibri", lineSpacingMultiple: 1.45, valign: "top" });
// additional
s.addShape(pres.ShapeType.roundRect, { x: 5.4, y: 2.1, w: 4.1, h: 3.1, fill: { color: DARK_BG }, rectRadius: 0.12 });
s.addText("Additional Features", { x: 5.5, y: 2.15, w: 3.9, h: 0.4, fontSize: 14, bold: true, color: ACCENT, fontFace: "Calibri" });
const add = ["Vesicles / bullae (blister-like)", "Lymphangitis (streaking)", "Lymphadenopathy (enlarged nodes)", "Facial: risk of orbital cellulitis", "Periorbital: potential vision loss"];
s.addText(add.map((t, i) => ({ text: `• ${t}`, options: { breakLine: i < add.length - 1, fontSize: 12, color: WHITE } })),
{ x: 5.55, y: 2.6, w: 3.85, h: 2.5, fontFace: "Calibri", lineSpacingMultiple: 1.5, valign: "top" });
}
// ══════════════════════════════════════════════════════════════
// SLIDE 10 – DIAGNOSIS
// ══════════════════════════════════════════════════════════════
{
const s = contentSlide("Diagnosis");
// diagnostic criterion box
s.addShape(pres.ShapeType.roundRect, { x: 0.4, y: 1.0, w: 9.2, h: 0.9, fill: { color: ACCENT }, rectRadius: 0.1 });
s.addText("Diagnostic Criterion: Fulfillment of ≥ 2 of the following four criteria:", {
x: 0.5, y: 1.02, w: 9.0, h: 0.35, fontSize: 15, bold: true, color: WHITE, fontFace: "Calibri", align: "center"
});
const crit = ["Warmth", "Erythema", "Oedema", "Tenderness"];
s.addText(crit.map((c, i) => ({ text: `✔ ${c} `, options: { bold: true, fontSize: 15, color: WHITE } })),
{ x: 1.5, y: 1.38, w: 7.5, h: 0.45, fontFace: "Calibri", align: "center" });
// three method boxes
const methods = [
{ title: "Clinical Evaluation", body: "Spreading erythematous inflammation in deep dermis & subcutaneous tissue. Primary diagnostic method.", color: DARK_BG },
{ title: "Blood Cultures", body: "Rule out bacteremia in immunocompromised patients; indicated when fever + leukocytosis present.", color: MID_BG },
{ title: "Tissue Cultures", body: "For immunocompromised patients not responding to empirical treatment; animal bites & penetrating wounds.", color: "1a5276" },
];
methods.forEach((m, i) => {
const bx = 0.3 + i * 3.22;
s.addShape(pres.ShapeType.roundRect, { x: bx, y: 2.1, w: 3.0, h: 2.9, fill: { color: m.color }, rectRadius: 0.12 });
s.addShape(pres.ShapeType.rect, { x: bx, y: 2.1, w: 3.0, h: 0.06, fill: { color: ACCENT } });
s.addText(m.title, { x: bx + 0.1, y: 2.18, w: 2.8, h: 0.5, fontSize: 14, bold: true, color: WHITE, fontFace: "Calibri", align: "center" });
s.addText(m.body, { x: bx + 0.12, y: 2.75, w: 2.76, h: 2.15, fontSize: 12, color: LIGHT_TXT, fontFace: "Calibri", wrap: true, valign: "top" });
});
}
// ══════════════════════════════════════════════════════════════
// SLIDE 11 – DIFFERENTIAL DIAGNOSIS (TABLE)
// ══════════════════════════════════════════════════════════════
{
const s = contentSlide("Differential Diagnosis");
s.addText("Comparison of Cellulitis with 4 Key Differentials", {
x: 0.4, y: 0.9, w: 9.2, h: 0.38, fontSize: 14, bold: true, color: GREY, fontFace: "Calibri"
});
const headers = ["Condition", "Similarities to Cellulitis", "Distinguishing Features", "Key Differentiator"];
const rows = [
["Erysipelas", "Erythema, warmth, oedema, fever", "Well-demarcated raised border; superficial (dermis only); shiny surface; more rapid spread", "Sharply demarcated, raised edge"],
["Necrotising Fasciitis", "Red, swollen, painful skin; systemic toxicity", "Severe pain disproportionate to appearance; skin necrosis; crepitus; haemorrhagic bullae; rapid progression", "Pain out of proportion + crepitus"],
["Deep Vein Thrombosis (DVT)", "Unilateral leg swelling, redness, warmth", "No fever; no spreading erythema; positive Homan's sign; confirmed by Doppler ultrasound", "Doppler USS confirms clot, no infection"],
["Contact Dermatitis", "Erythema, oedema, skin inflammation", "No systemic symptoms; intense pruritus; vesicular rash; history of allergen exposure", "Itch + allergen history, no fever"],
];
// Table
const colW = [1.8, 2.2, 3.0, 2.55];
const rowH = 0.72;
const startX = 0.3;
const startY = 1.38;
// header row
let cx = startX;
headers.forEach((h, i) => {
s.addShape(pres.ShapeType.rect, { x: cx, y: startY, w: colW[i], h: 0.5, fill: { color: DARK_BG } });
s.addText(h, { x: cx + 0.05, y: startY, w: colW[i] - 0.1, h: 0.5, fontSize: 12, bold: true, color: WHITE, fontFace: "Calibri", align: "center", valign: "middle", margin: 0 });
cx += colW[i];
});
// data rows
rows.forEach((row, ri) => {
cx = startX;
const by = startY + 0.5 + ri * rowH;
const bg = ri % 2 === 0 ? "e8f4f0" : WHITE;
row.forEach((cell, ci) => {
s.addShape(pres.ShapeType.rect, { x: cx, y: by, w: colW[ci], h: rowH, fill: { color: ci === 0 ? MID_BG : bg }, line: { color: "ccdddd", width: 0.5 } });
s.addText(cell, {
x: cx + 0.05, y: by + 0.04, w: colW[ci] - 0.1, h: rowH - 0.08,
fontSize: ci === 0 ? 12 : 10.5,
bold: ci === 0,
color: ci === 0 ? WHITE : DARK_TXT,
fontFace: "Calibri",
wrap: true, valign: "middle"
});
cx += colW[ci];
});
});
}
// ══════════════════════════════════════════════════════════════
// SLIDE 12 – COMPLICATIONS
// ══════════════════════════════════════════════════════════════
{
const s = contentSlide("Complications");
const comps = [
{ icon: "🧫", title: "Abscess Formation", desc: "Localised pus collection within skin / subcutaneous tissue requiring drainage.", color: DARK_BG },
{ icon: "🦴", title: "Necrotising Fasciitis", desc: "Life-threatening deep tissue infection; surgical emergency — debridement required.", color: "7b1a1a" },
{ icon: "🩸", title: "Septicemia / Sepsis", desc: "Bacteria disseminate via bloodstream causing systemic inflammatory response.", color: "5b2c6f" },
{ icon: "💀", title: "Organ Failure", desc: "Uncontrolled sepsis may lead to multi-organ failure; ICU management needed.", color: "1a3a4a" },
{ icon: "🦠", title: "Gangrene", desc: "Tissue death due to ischaemia / infection; may necessitate amputation.", color: "4a1a00" },
{ icon: "👁️", title: "Orbital / Vision Loss", desc: "Facial & periorbital cellulitis may cause orbital cellulitis, cavernous sinus thrombosis, and vision loss.", color: "145a32" },
];
comps.forEach((c, i) => {
const row = Math.floor(i / 3);
const col = i % 3;
const bx = 0.3 + col * 3.23;
const by = 1.0 + row * 2.15;
s.addShape(pres.ShapeType.roundRect, { x: bx, y: by, w: 3.0, h: 2.0, fill: { color: c.color }, rectRadius: 0.12 });
s.addShape(pres.ShapeType.rect, { x: bx, y: by, w: 3.0, h: 0.06, fill: { color: ACCENT } });
s.addText(c.icon, { x: bx, y: by + 0.1, w: 3.0, h: 0.5, fontSize: 22, align: "center", fontFace: "Calibri", margin: 0 });
s.addText(c.title, { x: bx + 0.07, y: by + 0.6, w: 2.86, h: 0.45, fontSize: 13, bold: true, color: WHITE, fontFace: "Calibri", align: "center" });
s.addText(c.desc, { x: bx + 0.1, y: by + 1.1, w: 2.8, h: 0.82, fontSize: 10.5, color: LIGHT_TXT, fontFace: "Calibri", align: "center", wrap: true });
});
}
// ══════════════════════════════════════════════════════════════
// SLIDE 13 – CLOSING
// ══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: "100%", h: "100%", fill: { color: DARK_BG } });
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.18, h: "100%", fill: { color: ACCENT } });
s.addShape(pres.ShapeType.rect, { x: 0, y: 2.5, w: "100%", h: 0.06, fill: { color: ACCENT } });
s.addText("Thank You", { x: 0.5, y: 0.7, w: 9, h: 1.2, fontSize: 52, bold: true, color: WHITE, fontFace: "Calibri", align: "center" });
s.addText("Key Takeaway:", { x: 1.5, y: 2.75, w: 7, h: 0.45, fontSize: 17, bold: true, color: ACCENT, fontFace: "Calibri", align: "center" });
s.addText("Early diagnosis and prompt antibiotic therapy are the cornerstones of\nmanaging cellulitis and preventing life-threatening complications.", {
x: 1.2, y: 3.25, w: 7.6, h: 1.0,
fontSize: 15, color: WHITE, fontFace: "Calibri", align: "center", wrap: true
});
s.addText("Contents: Introduction • Definition • Causes • Types • Pathophysiology • Symptoms • Clinical Features • Diagnosis • Differential Diagnosis • Complications", {
x: 0.3, y: 4.55, w: 9.4, h: 0.6,
fontSize: 10, color: GREY, fontFace: "Calibri", align: "center", wrap: true
});
}
// ══════════════════════════════════════════════════════════════
// SAVE
// ══════════════════════════════════════════════════════════════
pres.writeFile({ fileName: "/home/daytona/workspace/cellulitis-ppt/Cellulitis_Presentation.pptx" })
.then(() => console.log("✅ Saved: /home/daytona/workspace/cellulitis-ppt/Cellulitis_Presentation.pptx"))
.catch(e => { console.error("❌ Error:", e); process.exit(1); });
cd /home/daytona/workspace/cellulitis-ppt && node cellulitis.js 2>&1
| Slide | Content |
|---|---|
| 1 | Title Slide - "CELLULITIS" with subtitle and specialty labels |
| 2 | Table of Contents - all 10 topics listed in two columns |
| 3 | Introduction - 3 stat boxes (global/Indian prevalence) + two risk factor group cards |
| 4 | Definition - formal definition quote block + 4 key-point cards |
| 5 | Causes - 4 pathogen cards + routes of entry section |
| 6 | Types & Classification - 5 cards (Non-purulent, Purulent, Periorbital, Orbital, Facial) |
| 7 | Pathophysiology - numbered 5-step flow (Entry → Invasion → Immune response → Toxin release → Systemic spread) |
| 8 | Symptoms - two-column layout: Local vs Systemic |
| 9 | Clinical Features - severity bands (Mild / Moderate / Severe) + cardinal signs + additional features |
| 10 | Diagnosis - diagnostic criterion box + 3 method cards (Clinical / Blood culture / Tissue culture) |
| 11 | Differential Diagnosis - full table comparing 4 conditions (Erysipelas, Necrotising Fasciitis, DVT, Contact Dermatitis) vs Cellulitis |
| 12 | Complications - 6 complication cards (Abscess, Necrotising Fasciitis, Septicemia, Organ Failure, Gangrene, Orbital/Vision loss) |
| 13 | Closing Slide - Thank You with key takeaway message |
Cellulitis Presentation
Presentation · PPTX
Merge the both urticaria and cellulitis ppt and make one ppt
/home/daytona/workspace
~/urticaria-ppt
~/cellulitis-ppt
python3 -c "import pptx; print('pptx available:', pptx.__version__)"
node -e "const p = require('pptxgenjs'); console.log('pptxgenjs ok');"
ls /home/daytona/skills/pptx/scripts/office/ && ls /home/daytona/skills/pptx/scripts/
cd /home/daytona/workspace && mkdir -p merged-ppt && \ python3 /home/daytona/skills/pptx/scripts/office/unpack.py cellulitis-ppt/Cellulitis_Presentation.pptx merged-ppt/unpacked_cellulitis/ 2>&1 | tail -5 && \ python3 /home/daytona/skills/pptx/scripts/office/unpack.py urticaria-ppt/Urticaria_Presentation.pptx merged-ppt/unpacked_urticaria/ 2>&1 | tail -5
cd /home/daytona/workspace && mkdir -p merged-ppt/unpacked_c merged-ppt/unpacked_u && \ unzip -q cellulitis-ppt/Cellulitis_Presentation.pptx -d merged-ppt/unpacked_c && \ unzip -q urticaria-ppt/Urticaria_Presentation.pptx -d merged-ppt/unpacked_u && \ echo "Both unpacked OK"
ls -lh /home/daytona/workspace/cellulitis-ppt/Cellulitis_Presentation.pptx /home/daytona/workspace/urticaria-ppt/Urticaria_Presentation.pptx
python3 << 'EOF' import zipfile, os os.makedirs("/home/daytona/workspace/merged-ppt/unpacked_c", exist_ok=True) with zipfile.ZipFile("/home/daytona/workspace/cellulitis-ppt/Cellulitis_Presentation.pptx") as z: z.extractall("/home/daytona/workspace/merged-ppt/unpacked_c") print("cellulitis extracted") EOF
# Extract urticaria body (lines 1-654 of urticaria.js, stripping require/pres init/writeFile) # Extract cellulitis body, stripping its require/pres init/writeFile # Combine into one file node << 'NODEOF' const fs = require('fs'); let u = fs.readFileSync('/home/daytona/workspace/urticaria-ppt/urticaria.js', 'utf8'); let c = fs.readFileSync('/home/daytona/workspace/cellulitis-ppt/cellulitis.js', 'utf8'); // Strip urticaria: remove require + pres init + color constants + helpers + writeFile at end // We keep only the SLIDE blocks // Find first slide block in urticaria const uStart = u.indexOf('// ─── SLIDE 1: TITLE SLIDE'); const uEnd = u.lastIndexOf('pres.writeFile'); const uSlides = u.substring(uStart, uEnd).trimEnd(); // Find first slide block in cellulitis (after helpers) const cStart = c.indexOf('// ══════════════════════════════════════════════════════════════\n// SLIDE 1 – TITLE'); const cEnd = c.lastIndexOf('pres.writeFile'); const cSlides = c.substring(cStart, cEnd).trimEnd(); // Extract urticaria color constants and helpers const uColorsStart = u.indexOf('// ─── COLOR PALETTE'); const uHelpersEnd = u.indexOf('// ─── SLIDE 1: TITLE SLIDE'); const uHelpers = u.substring(uColorsStart, uHelpersEnd); // Extract cellulitis color constants and helpers const cColorsStart = c.indexOf('// ── Color palette'); const cHelpersEnd = c.indexOf('// ══════════════════════════════════════════════════════════════\n// SLIDE 1 – TITLE'); const cHelpers = c.substring(cColorsStart, cHelpersEnd); fs.writeFileSync('/tmp/debug.txt', `uStart=${uStart}\nuEnd=${uEnd}\ncStart=${cStart}\ncEnd=${cEnd}\n` + `uHelpersLen=${uHelpers.length}\ncHelpersLen=${cHelpers.length}\n` ); console.log('u slides chars:', uSlides.length, '| c slides chars:', cSlides.length); console.log('Done parsing'); NODEOF
node << 'NODEOF' const fs = require('fs'); let u = fs.readFileSync('/home/daytona/workspace/urticaria-ppt/urticaria.js', 'utf8'); let c = fs.readFileSync('/home/daytona/workspace/cellulitis-ppt/cellulitis.js', 'utf8'); // ── Urticaria: colors, helpers, and slides const uColorsStart = u.indexOf('// ─── COLOR PALETTE'); const uEnd = u.lastIndexOf('pres.writeFile'); const uBody = u.substring(uColorsStart, uEnd).trimEnd(); // ── Cellulitis: colors, helpers, and slides // Cellulitis uses variable names like DARK_BG etc that conflict. // We prefix with C_ by renaming inside cBody const cColorsStart = c.indexOf('// ── Color palette'); const cEnd = c.lastIndexOf('pres.writeFile'); let cBody = c.substring(cColorsStart, cEnd).trimEnd(); // Rename cellulitis constants to avoid collision with urticaria (different names already – check) // Urticaria uses: DARK_TEAL, MED_TEAL, LIGHT_TEAL, ACCENT, WHITE, DARK_TEXT, LIGHT_GREY // Cellulitis uses: DARK_BG, MID_BG, LIGHT_BG, ACCENT, ACCENT2, WHITE, DARK_TXT, LIGHT_TXT, GREY // Conflicts: ACCENT (both use it), WHITE (both) // Rename cellulitis ACCENT -> C_ACCENT, ACCENT2 -> C_ACCENT2, WHITE -> C_WHITE (they are same value), // DARK_TXT -> C_DARK_TXT, LIGHT_TXT -> C_LIGHT_TXT, GREY -> C_GREY // Use word boundary replacements const renames = { 'DARK_BG': 'C_DARK_BG', 'MID_BG': 'C_MID_BG', 'LIGHT_BG': 'C_LIGHT_BG', 'ACCENT2': 'C_ACCENT2', 'DARK_TXT': 'C_DARK_TXT', 'LIGHT_TXT': 'C_LIGHT_TXT', }; // Also rename the cellulitis ACCENT -> C_ACCENT and contentSlide/sectionSlide helpers Object.entries(renames).forEach(([from, to]) => { cBody = cBody.split(from).join(to); }); // Rename ACCENT used in cellulitis body (but NOT the word ACCENT2 since we already did it) // We'll rename the standalone ACCENT uses: after the renames, remaining 'ACCENT' in cBody is the cellulitis accent // First rename C_ACCENT2 back to a placeholder to avoid double-rename: cBody = cBody.split('C_ACCENT2').join('__CACCENT2__'); cBody = cBody.split('ACCENT').join('C_ACCENT'); cBody = cBody.split('__CACCENT2__').join('C_ACCENT2'); // Rename WHITE in cellulitis (same hex but avoids confusion) cBody = cBody.split('WHITE').join('C_WHITE'); // Rename helper functions to avoid collision cBody = cBody.split('function sectionSlide').join('function c_sectionSlide'); cBody = cBody.split('function contentSlide').join('function c_contentSlide'); cBody = cBody.split('sectionSlide(').join('c_sectionSlide('); cBody = cBody.split('contentSlide(').join('c_contentSlide('); // Rename GREY -> C_GREY in cellulitis cBody = cBody.split('const C_GREY').join('const C_GREY__SKIP'); // already done if it was just GREY // Actually let's check: cellulitis uses GREY cBody = cBody.split('\nconst GREY').join('\nconst C_GREY'); cBody = cBody.split('"' + 'GREY"').join('"C_GREY"'); // Simple replacement for remaining bare GREY usage cBody = cBody.replace(/\bGREY\b/g, 'C_GREY'); cBody = cBody.split('C_GREY__SKIP').join('C_GREY'); // Build the merged script const merged = `const pptxgen = require("pptxgenjs"); const pres = new pptxgen(); pres.layout = "LAYOUT_16x9"; pres.title = "Urticaria & Cellulitis – Combined Clinical Presentation"; // ════════════════════════════════════════════════════════════ // UNIFIED COVER SLIDE // ════════════════════════════════════════════════════════════ { const s = pres.addSlide(); s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: "100%", h: "100%", fill: { color: "0B1F2E" } }); // Left accent stripe s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.2, h: "100%", fill: { color: "1FA688" } }); // Right accent stripe s.addShape(pres.ShapeType.rect, { x: 9.8, y: 0, w: 0.2, h: "100%", fill: { color: "F5A623" } }); // Center divider line s.addShape(pres.ShapeType.rect, { x: 0.2, y: 2.7, w: 9.6, h: 0.06, fill: { color: "1FA688" } }); s.addText("DERMATOLOGY", { x: 0.3, y: 0.4, w: 9.4, h: 0.5, fontSize: 14, color: "1FA688", fontFace: "Calibri", align: "center", charSpacing: 6, bold: true }); s.addText("URTICARIA", { x: 0.3, y: 0.95, w: 4.5, h: 1.3, fontSize: 44, bold: true, color: "FFFFFF", fontFace: "Calibri", align: "center" }); s.addText("&", { x: 4.6, y: 1.15, w: 0.8, h: 0.9, fontSize: 32, bold: true, color: "F5A623", fontFace: "Calibri", align: "center" }); s.addText("CELLULITIS", { x: 5.2, y: 0.95, w: 4.5, h: 1.3, fontSize: 44, bold: true, color: "FFFFFF", fontFace: "Calibri", align: "center" }); s.addText("A Combined Clinical Overview | Skin & Soft Tissue Disorders", { x: 0.3, y: 2.85, w: 9.4, h: 0.55, fontSize: 15, color: "F5A623", fontFace: "Calibri", align: "center", italic: true }); s.addText("Part I: Urticaria (Hives & Wheals) — Immunological Skin Hypersensitivity", { x: 0.3, y: 3.55, w: 9.4, h: 0.45, fontSize: 13, color: "AACFCF", fontFace: "Calibri", align: "center" }); s.addText("Part II: Cellulitis — Acute Bacterial Skin & Soft Tissue Infection", { x: 0.3, y: 4.1, w: 9.4, h: 0.45, fontSize: 13, color: "AACFCF", fontFace: "Calibri", align: "center" }); s.addText("Dermatology | Infectious Disease | Clinical Medicine", { x: 0.3, y: 4.9, w: 9.4, h: 0.45, fontSize: 11, color: "4A6274", fontFace: "Calibri", align: "center" }); } // ════════════════════════════════════════════════════════════ // PART I: URTICARIA SLIDES // ════════════════════════════════════════════════════════════ ${uBody} // ════════════════════════════════════════════════════════════ // PART I → PART II DIVIDER SLIDE // ════════════════════════════════════════════════════════════ { const s = pres.addSlide(); s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: "100%", h: "100%", fill: { color: "0B1F2E" } }); s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.2, h: "100%", fill: { color: "1FA688" } }); s.addShape(pres.ShapeType.rect, { x: 0.2, y: 2.55, w: 9.6, h: 0.07, fill: { color: "1FA688" } }); s.addText("PART II", { x: 0.3, y: 0.75, w: 9.4, h: 0.6, fontSize: 18, color: "1FA688", fontFace: "Calibri", align: "center", bold: true, charSpacing: 6 }); s.addText("CELLULITIS", { x: 0.3, y: 1.5, w: 9.4, h: 1.3, fontSize: 52, bold: true, color: "FFFFFF", fontFace: "Calibri", align: "center", charSpacing: 6 }); s.addText("Acute Bacterial Skin & Soft Tissue Infection", { x: 0.3, y: 2.75, w: 9.4, h: 0.55, fontSize: 17, color: "F5A623", fontFace: "Calibri", align: "center", italic: true }); s.addText("Caused by Streptococci & Staphylococci | Dermis & Subcutaneous Tissue", { x: 0.3, y: 3.45, w: 9.4, h: 0.45, fontSize: 13, color: "AACFCF", fontFace: "Calibri", align: "center" }); } // ════════════════════════════════════════════════════════════ // PART II: CELLULITIS SLIDES // ════════════════════════════════════════════════════════════ ${cBody} // ════════════════════════════════════════════════════════════ // UNIFIED CLOSING SLIDE // ════════════════════════════════════════════════════════════ { const s = pres.addSlide(); s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: "100%", h: "100%", fill: { color: "0B1F2E" } }); s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.2, h: "100%", fill: { color: "1FA688" } }); s.addShape(pres.ShapeType.rect, { x: 9.8, y: 0, w: 0.2, h: "100%", fill: { color: "F5A623" } }); s.addShape(pres.ShapeType.rect, { x: 0.2, y: 2.7, w: 9.6, h: 0.06, fill: { color: "1FA688" } }); s.addText("Thank You", { x: 0.3, y: 0.65, w: 9.4, h: 1.2, fontSize: 50, bold: true, color: "FFFFFF", fontFace: "Calibri", align: "center" }); s.addText("Key Takeaways", { x: 1.5, y: 2.85, w: 7, h: 0.45, fontSize: 17, bold: true, color: "1FA688", fontFace: "Calibri", align: "center" }); s.addText("Urticaria: IgE-mediated mast cell degranulation causing wheals; management with antihistamines.", { x: 0.8, y: 3.35, w: 8.4, h: 0.55, fontSize: 13, color: "AACFCF", fontFace: "Calibri", align: "center", wrap: true }); s.addText("Cellulitis: Bacterial invasion of dermis & subcutaneous tissue; prompt antibiotic therapy is key.", { x: 0.8, y: 3.95, w: 8.4, h: 0.55, fontSize: 13, color: "AACFCF", fontFace: "Calibri", align: "center", wrap: true }); s.addText("Dermatology | Infectious Disease | Clinical Medicine", { x: 0.3, y: 4.95, w: 9.4, h: 0.38, fontSize: 11, color: "4A6274", fontFace: "Calibri", align: "center" }); } // ════════════════════════════════════════════════════════════ // SAVE // ════════════════════════════════════════════════════════════ pres.writeFile({ fileName: "/home/daytona/workspace/merged-ppt/Urticaria_and_Cellulitis_Combined.pptx" }) .then(() => console.log("✅ Saved successfully!")) .catch(e => { console.error("❌ Error:", e); process.exit(1); }); `; fs.mkdirSync('/home/daytona/workspace/merged-ppt', { recursive: true }); fs.writeFileSync('/home/daytona/workspace/merged-ppt/merge.js', merged); console.log('merge.js written, length:', merged.length); NODEOF
cd /home/daytona/workspace/merged-ppt && node merge.js 2>&1
# The issue: c_contentSlide and c_sectionSlide functions are defined AFTER the slide code calls them. # This happens because the urticaria slides (which come first) run first and the cellulitis helpers # are declared later in the file using const/let (not hoisted). # Fix: move the cellulitis helper function declarations to the top of the cellulitis section, # before the slide blocks. node << 'NODEOF' const fs = require('fs'); let src = fs.readFileSync('/home/daytona/workspace/merged-ppt/merge.js', 'utf8'); // The c_contentSlide and c_sectionSlide are defined inside the cellulitis color/helper block. // Find where PART II cellulitis slides start and where the helper functions are. // The functions appear after "PART II: CELLULITIS SLIDES" section header. // Let's find the function definitions and move them before the first slide block. // Extract function c_sectionSlide and c_contentSlide from wherever they are const fnSectionMatch = src.match(/function c_sectionSlide\([\s\S]*?\n\}/); const fnContentMatch = src.match(/function c_contentSlide\([\s\S]*?\n\}/); console.log('sectionSlide found:', !!fnSectionMatch); console.log('contentSlide found:', !!fnContentMatch); // Find the PART II CELLULITIS block start const part2Marker = '// PART II: CELLULITIS SLIDES'; const part2Idx = src.indexOf(part2Marker); // Find where the cellulitis color constants start (after Part II marker) const cColorIdx = src.indexOf('// ── Color palette', part2Idx); // Find where the first cellulitis slide block starts const cFirstSlide = src.indexOf('// ══════════', cColorIdx); console.log('part2Idx:', part2Idx, 'cColorIdx:', cColorIdx, 'cFirstSlide:', cFirstSlide); // Check if functions are defined before or after cFirstSlide const fn1Idx = src.indexOf('function c_sectionSlide'); const fn2Idx = src.indexOf('function c_contentSlide'); console.log('fn1Idx:', fn1Idx, 'fn2Idx:', fn2Idx, 'cFirstSlide:', cFirstSlide); NODEOF