claude-presentation-master 7.2.1 → 7.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +9 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +73 -29
- package/dist/index.mjs +73 -29
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -354,6 +354,8 @@ interface ContentAnalysis$1 {
|
|
|
354
354
|
detectedType: PresentationType$1;
|
|
355
355
|
/** Main title */
|
|
356
356
|
title: string;
|
|
357
|
+
/** Subtitle (line after title) */
|
|
358
|
+
subtitle?: string;
|
|
357
359
|
/** Content sections */
|
|
358
360
|
sections: ContentSection$1[];
|
|
359
361
|
/** SCQA structure extracted */
|
|
@@ -950,6 +952,7 @@ interface ContentSection {
|
|
|
950
952
|
interface ContentAnalysis {
|
|
951
953
|
detectedType: PresentationType;
|
|
952
954
|
title: string;
|
|
955
|
+
subtitle: string;
|
|
953
956
|
sections: ContentSection[];
|
|
954
957
|
keyMessages: string[];
|
|
955
958
|
dataPoints: Array<{
|
|
@@ -990,7 +993,12 @@ declare class ContentAnalyzer {
|
|
|
990
993
|
*/
|
|
991
994
|
private parseContent;
|
|
992
995
|
/**
|
|
993
|
-
* Extract the main title from content
|
|
996
|
+
* Extract the main title AND subtitle from content
|
|
997
|
+
* Subtitle is the line immediately after the H1 title (if not another header)
|
|
998
|
+
*/
|
|
999
|
+
private extractTitleAndSubtitle;
|
|
1000
|
+
/**
|
|
1001
|
+
* Extract the main title from content (legacy wrapper)
|
|
994
1002
|
*/
|
|
995
1003
|
private extractTitle;
|
|
996
1004
|
/**
|
package/dist/index.d.ts
CHANGED
|
@@ -354,6 +354,8 @@ interface ContentAnalysis$1 {
|
|
|
354
354
|
detectedType: PresentationType$1;
|
|
355
355
|
/** Main title */
|
|
356
356
|
title: string;
|
|
357
|
+
/** Subtitle (line after title) */
|
|
358
|
+
subtitle?: string;
|
|
357
359
|
/** Content sections */
|
|
358
360
|
sections: ContentSection$1[];
|
|
359
361
|
/** SCQA structure extracted */
|
|
@@ -950,6 +952,7 @@ interface ContentSection {
|
|
|
950
952
|
interface ContentAnalysis {
|
|
951
953
|
detectedType: PresentationType;
|
|
952
954
|
title: string;
|
|
955
|
+
subtitle: string;
|
|
953
956
|
sections: ContentSection[];
|
|
954
957
|
keyMessages: string[];
|
|
955
958
|
dataPoints: Array<{
|
|
@@ -990,7 +993,12 @@ declare class ContentAnalyzer {
|
|
|
990
993
|
*/
|
|
991
994
|
private parseContent;
|
|
992
995
|
/**
|
|
993
|
-
* Extract the main title from content
|
|
996
|
+
* Extract the main title AND subtitle from content
|
|
997
|
+
* Subtitle is the line immediately after the H1 title (if not another header)
|
|
998
|
+
*/
|
|
999
|
+
private extractTitleAndSubtitle;
|
|
1000
|
+
/**
|
|
1001
|
+
* Extract the main title from content (legacy wrapper)
|
|
994
1002
|
*/
|
|
995
1003
|
private extractTitle;
|
|
996
1004
|
/**
|
package/dist/index.js
CHANGED
|
@@ -961,7 +961,8 @@ var ContentAnalyzer = class {
|
|
|
961
961
|
async analyze(content, contentType) {
|
|
962
962
|
await this.initialize();
|
|
963
963
|
const text = this.parseContent(content, contentType);
|
|
964
|
-
const title = this.
|
|
964
|
+
const { title, subtitle } = this.extractTitleAndSubtitle(text);
|
|
965
|
+
logger.step(`Title: "${title}", Subtitle: "${subtitle || "(none)"}"`);
|
|
965
966
|
const detectedType = this.detectPresentationType(text);
|
|
966
967
|
logger.step(`Detected type: ${detectedType}`);
|
|
967
968
|
const sections = this.extractSections(text);
|
|
@@ -974,9 +975,13 @@ var ContentAnalyzer = class {
|
|
|
974
975
|
const titles = sections.map((s) => s.header).filter((h) => h.length > 0);
|
|
975
976
|
const starMoments = this.extractStarMoments(text);
|
|
976
977
|
const estimatedSlideCount = Math.max(5, sections.length + 3);
|
|
978
|
+
const whatIsContent = scqa.situation ? [scqa.situation] : [];
|
|
979
|
+
const whatCouldBeContent = scqa.answer ? [scqa.answer] : keyMessages.slice(0, 2);
|
|
977
980
|
return {
|
|
978
981
|
detectedType,
|
|
979
982
|
title,
|
|
983
|
+
subtitle,
|
|
984
|
+
// NEW: Use explicit subtitle from content
|
|
980
985
|
sections,
|
|
981
986
|
keyMessages,
|
|
982
987
|
dataPoints,
|
|
@@ -987,8 +992,10 @@ var ContentAnalyzer = class {
|
|
|
987
992
|
answer: scqa.answer || ""
|
|
988
993
|
},
|
|
989
994
|
sparkline: {
|
|
990
|
-
whatIs:
|
|
991
|
-
|
|
995
|
+
whatIs: whatIsContent,
|
|
996
|
+
// FIX: Use situation, not CTA
|
|
997
|
+
whatCouldBe: whatCouldBeContent,
|
|
998
|
+
// FIX: Use answer/vision, not random messages
|
|
992
999
|
callToAdventure: sparkline.callToAction || ""
|
|
993
1000
|
},
|
|
994
1001
|
titles,
|
|
@@ -1016,18 +1023,46 @@ var ContentAnalyzer = class {
|
|
|
1016
1023
|
return text;
|
|
1017
1024
|
}
|
|
1018
1025
|
/**
|
|
1019
|
-
* Extract the main title from content
|
|
1026
|
+
* Extract the main title AND subtitle from content
|
|
1027
|
+
* Subtitle is the line immediately after the H1 title (if not another header)
|
|
1020
1028
|
*/
|
|
1021
|
-
|
|
1022
|
-
const
|
|
1023
|
-
|
|
1024
|
-
|
|
1029
|
+
extractTitleAndSubtitle(text) {
|
|
1030
|
+
const lines = text.split("\n");
|
|
1031
|
+
let title = "Presentation";
|
|
1032
|
+
let subtitle = "";
|
|
1033
|
+
let foundTitle = false;
|
|
1034
|
+
let titleLineIndex = -1;
|
|
1035
|
+
for (let i = 0; i < lines.length; i++) {
|
|
1036
|
+
const rawLine = lines[i];
|
|
1037
|
+
if (!rawLine) continue;
|
|
1038
|
+
const line = rawLine.trim();
|
|
1039
|
+
const h1Match = line.match(/^#\s+(.+)$/);
|
|
1040
|
+
if (h1Match && h1Match[1] && !foundTitle) {
|
|
1041
|
+
title = h1Match[1].replace(/\*\*/g, "").trim();
|
|
1042
|
+
foundTitle = true;
|
|
1043
|
+
titleLineIndex = i;
|
|
1044
|
+
continue;
|
|
1045
|
+
}
|
|
1046
|
+
if (foundTitle && i > titleLineIndex && line.length > 0) {
|
|
1047
|
+
if (line.startsWith("#")) break;
|
|
1048
|
+
if (line.startsWith("-") || line.startsWith("*") || /^\d+\./.test(line)) break;
|
|
1049
|
+
subtitle = line.replace(/\*\*/g, "").trim().slice(0, 100);
|
|
1050
|
+
break;
|
|
1051
|
+
}
|
|
1025
1052
|
}
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1053
|
+
if (!foundTitle) {
|
|
1054
|
+
const firstLine = lines.find((l) => l.trim().length > 0);
|
|
1055
|
+
if (firstLine) {
|
|
1056
|
+
title = firstLine.replace(/^#+\s*/, "").replace(/\*\*/g, "").trim().slice(0, 80);
|
|
1057
|
+
}
|
|
1029
1058
|
}
|
|
1030
|
-
return
|
|
1059
|
+
return { title, subtitle };
|
|
1060
|
+
}
|
|
1061
|
+
/**
|
|
1062
|
+
* Extract the main title from content (legacy wrapper)
|
|
1063
|
+
*/
|
|
1064
|
+
extractTitle(text) {
|
|
1065
|
+
return this.extractTitleAndSubtitle(text).title;
|
|
1031
1066
|
}
|
|
1032
1067
|
/**
|
|
1033
1068
|
* Detect presentation type from content signals
|
|
@@ -1830,9 +1865,10 @@ var SlideFactory = class {
|
|
|
1830
1865
|
const data = {
|
|
1831
1866
|
title: this.truncateText(analysis.title, this.config.rules.wordsPerSlide.max)
|
|
1832
1867
|
};
|
|
1833
|
-
|
|
1868
|
+
const subtitleSource = analysis.subtitle || analysis.keyMessages[0] || "";
|
|
1869
|
+
if (subtitleSource) {
|
|
1834
1870
|
data.subtitle = this.truncateText(
|
|
1835
|
-
|
|
1871
|
+
subtitleSource,
|
|
1836
1872
|
this.config.defaults.subtitle.maxWords
|
|
1837
1873
|
// FROM KB
|
|
1838
1874
|
);
|
|
@@ -1876,7 +1912,9 @@ var SlideFactory = class {
|
|
|
1876
1912
|
addSCQASlides(slides, analysis) {
|
|
1877
1913
|
const scqa = analysis.scqa;
|
|
1878
1914
|
const titles = this.config.scqaTitles;
|
|
1879
|
-
|
|
1915
|
+
const minBodyLength = 20;
|
|
1916
|
+
const situationBody = scqa?.situation ? this.truncateText(scqa.situation, this.config.rules.wordsPerSlide.max) : "";
|
|
1917
|
+
if (situationBody.length >= minBodyLength && !this.usedContent.has("scqa-situation")) {
|
|
1880
1918
|
this.usedContent.add("scqa-situation");
|
|
1881
1919
|
slides.push({
|
|
1882
1920
|
index: slides.length,
|
|
@@ -1884,12 +1922,13 @@ var SlideFactory = class {
|
|
|
1884
1922
|
data: {
|
|
1885
1923
|
title: titles.situation,
|
|
1886
1924
|
// FROM KB - not hardcoded 'Current Situation'
|
|
1887
|
-
body:
|
|
1925
|
+
body: situationBody
|
|
1888
1926
|
},
|
|
1889
1927
|
classes: ["situation-slide"]
|
|
1890
1928
|
});
|
|
1891
1929
|
}
|
|
1892
|
-
|
|
1930
|
+
const complicationBody = scqa?.complication ? this.truncateText(scqa.complication, this.config.rules.wordsPerSlide.max) : "";
|
|
1931
|
+
if (complicationBody.length >= minBodyLength && !this.usedContent.has("scqa-complication")) {
|
|
1893
1932
|
this.usedContent.add("scqa-complication");
|
|
1894
1933
|
slides.push({
|
|
1895
1934
|
index: slides.length,
|
|
@@ -1897,12 +1936,13 @@ var SlideFactory = class {
|
|
|
1897
1936
|
data: {
|
|
1898
1937
|
title: titles.complication,
|
|
1899
1938
|
// FROM KB - not hardcoded 'The Challenge'
|
|
1900
|
-
body:
|
|
1939
|
+
body: complicationBody
|
|
1901
1940
|
},
|
|
1902
1941
|
classes: ["complication-slide"]
|
|
1903
1942
|
});
|
|
1904
1943
|
}
|
|
1905
|
-
|
|
1944
|
+
const questionBody = scqa?.question ? this.truncateText(scqa.question, this.config.rules.wordsPerSlide.max) : "";
|
|
1945
|
+
if (questionBody.length >= minBodyLength && !this.usedContent.has("scqa-question")) {
|
|
1906
1946
|
this.usedContent.add("scqa-question");
|
|
1907
1947
|
slides.push({
|
|
1908
1948
|
index: slides.length,
|
|
@@ -1910,7 +1950,7 @@ var SlideFactory = class {
|
|
|
1910
1950
|
data: {
|
|
1911
1951
|
title: titles.question,
|
|
1912
1952
|
// FROM KB - not hardcoded 'The Question'
|
|
1913
|
-
body:
|
|
1953
|
+
body: questionBody
|
|
1914
1954
|
},
|
|
1915
1955
|
classes: ["question-slide"]
|
|
1916
1956
|
});
|
|
@@ -1920,7 +1960,8 @@ var SlideFactory = class {
|
|
|
1920
1960
|
const spark = analysis.sparkline;
|
|
1921
1961
|
const titles = this.config.sparklineTitles;
|
|
1922
1962
|
const whatIsFirst = spark?.whatIs?.[0];
|
|
1923
|
-
|
|
1963
|
+
const whatIsBody = whatIsFirst ? this.truncateText(whatIsFirst, this.config.rules.wordsPerSlide.max) : "";
|
|
1964
|
+
if (whatIsBody.length >= 20 && !this.usedContent.has("spark-what-is")) {
|
|
1924
1965
|
this.usedContent.add("spark-what-is");
|
|
1925
1966
|
slides.push({
|
|
1926
1967
|
index: slides.length,
|
|
@@ -1928,13 +1969,14 @@ var SlideFactory = class {
|
|
|
1928
1969
|
data: {
|
|
1929
1970
|
title: titles.whatIs,
|
|
1930
1971
|
// FROM KB - not hardcoded 'Where We Are Today'
|
|
1931
|
-
body:
|
|
1972
|
+
body: whatIsBody
|
|
1932
1973
|
},
|
|
1933
1974
|
classes: ["what-is-slide"]
|
|
1934
1975
|
});
|
|
1935
1976
|
}
|
|
1936
1977
|
const whatCouldBeFirst = spark?.whatCouldBe?.[0];
|
|
1937
|
-
|
|
1978
|
+
const whatCouldBeBody = whatCouldBeFirst ? this.truncateText(whatCouldBeFirst, this.config.rules.wordsPerSlide.max) : "";
|
|
1979
|
+
if (whatCouldBeBody.length >= 20 && !this.usedContent.has("spark-could-be")) {
|
|
1938
1980
|
this.usedContent.add("spark-could-be");
|
|
1939
1981
|
slides.push({
|
|
1940
1982
|
index: slides.length,
|
|
@@ -1942,7 +1984,7 @@ var SlideFactory = class {
|
|
|
1942
1984
|
data: {
|
|
1943
1985
|
title: titles.whatCouldBe,
|
|
1944
1986
|
// FROM KB - not hardcoded 'What Could Be'
|
|
1945
|
-
body:
|
|
1987
|
+
body: whatCouldBeBody
|
|
1946
1988
|
},
|
|
1947
1989
|
classes: ["what-could-be-slide"]
|
|
1948
1990
|
});
|
|
@@ -2151,16 +2193,18 @@ var SlideFactory = class {
|
|
|
2151
2193
|
};
|
|
2152
2194
|
}
|
|
2153
2195
|
createSingleStatementSlide(index, section) {
|
|
2196
|
+
const bodyContent = section.content || section.bullets.join(" ") || "";
|
|
2197
|
+
const truncatedBody = this.truncateText(bodyContent, this.config.rules.wordsPerSlide.max);
|
|
2198
|
+
if (truncatedBody.length < 15 && section.bullets.length > 0) {
|
|
2199
|
+
return this.createBulletSlide(index, section);
|
|
2200
|
+
}
|
|
2154
2201
|
return {
|
|
2155
2202
|
index,
|
|
2156
2203
|
type: "single-statement",
|
|
2157
2204
|
data: {
|
|
2158
2205
|
title: this.createTitle(section.header, section),
|
|
2159
|
-
body:
|
|
2160
|
-
|
|
2161
|
-
this.config.rules.wordsPerSlide.max
|
|
2162
|
-
// FROM KB
|
|
2163
|
-
)
|
|
2206
|
+
body: truncatedBody || section.header
|
|
2207
|
+
// Fallback to header if no body
|
|
2164
2208
|
},
|
|
2165
2209
|
classes: ["single-statement-slide"]
|
|
2166
2210
|
};
|
package/dist/index.mjs
CHANGED
|
@@ -889,7 +889,8 @@ var ContentAnalyzer = class {
|
|
|
889
889
|
async analyze(content, contentType) {
|
|
890
890
|
await this.initialize();
|
|
891
891
|
const text = this.parseContent(content, contentType);
|
|
892
|
-
const title = this.
|
|
892
|
+
const { title, subtitle } = this.extractTitleAndSubtitle(text);
|
|
893
|
+
logger.step(`Title: "${title}", Subtitle: "${subtitle || "(none)"}"`);
|
|
893
894
|
const detectedType = this.detectPresentationType(text);
|
|
894
895
|
logger.step(`Detected type: ${detectedType}`);
|
|
895
896
|
const sections = this.extractSections(text);
|
|
@@ -902,9 +903,13 @@ var ContentAnalyzer = class {
|
|
|
902
903
|
const titles = sections.map((s) => s.header).filter((h) => h.length > 0);
|
|
903
904
|
const starMoments = this.extractStarMoments(text);
|
|
904
905
|
const estimatedSlideCount = Math.max(5, sections.length + 3);
|
|
906
|
+
const whatIsContent = scqa.situation ? [scqa.situation] : [];
|
|
907
|
+
const whatCouldBeContent = scqa.answer ? [scqa.answer] : keyMessages.slice(0, 2);
|
|
905
908
|
return {
|
|
906
909
|
detectedType,
|
|
907
910
|
title,
|
|
911
|
+
subtitle,
|
|
912
|
+
// NEW: Use explicit subtitle from content
|
|
908
913
|
sections,
|
|
909
914
|
keyMessages,
|
|
910
915
|
dataPoints,
|
|
@@ -915,8 +920,10 @@ var ContentAnalyzer = class {
|
|
|
915
920
|
answer: scqa.answer || ""
|
|
916
921
|
},
|
|
917
922
|
sparkline: {
|
|
918
|
-
whatIs:
|
|
919
|
-
|
|
923
|
+
whatIs: whatIsContent,
|
|
924
|
+
// FIX: Use situation, not CTA
|
|
925
|
+
whatCouldBe: whatCouldBeContent,
|
|
926
|
+
// FIX: Use answer/vision, not random messages
|
|
920
927
|
callToAdventure: sparkline.callToAction || ""
|
|
921
928
|
},
|
|
922
929
|
titles,
|
|
@@ -944,18 +951,46 @@ var ContentAnalyzer = class {
|
|
|
944
951
|
return text;
|
|
945
952
|
}
|
|
946
953
|
/**
|
|
947
|
-
* Extract the main title from content
|
|
954
|
+
* Extract the main title AND subtitle from content
|
|
955
|
+
* Subtitle is the line immediately after the H1 title (if not another header)
|
|
948
956
|
*/
|
|
949
|
-
|
|
950
|
-
const
|
|
951
|
-
|
|
952
|
-
|
|
957
|
+
extractTitleAndSubtitle(text) {
|
|
958
|
+
const lines = text.split("\n");
|
|
959
|
+
let title = "Presentation";
|
|
960
|
+
let subtitle = "";
|
|
961
|
+
let foundTitle = false;
|
|
962
|
+
let titleLineIndex = -1;
|
|
963
|
+
for (let i = 0; i < lines.length; i++) {
|
|
964
|
+
const rawLine = lines[i];
|
|
965
|
+
if (!rawLine) continue;
|
|
966
|
+
const line = rawLine.trim();
|
|
967
|
+
const h1Match = line.match(/^#\s+(.+)$/);
|
|
968
|
+
if (h1Match && h1Match[1] && !foundTitle) {
|
|
969
|
+
title = h1Match[1].replace(/\*\*/g, "").trim();
|
|
970
|
+
foundTitle = true;
|
|
971
|
+
titleLineIndex = i;
|
|
972
|
+
continue;
|
|
973
|
+
}
|
|
974
|
+
if (foundTitle && i > titleLineIndex && line.length > 0) {
|
|
975
|
+
if (line.startsWith("#")) break;
|
|
976
|
+
if (line.startsWith("-") || line.startsWith("*") || /^\d+\./.test(line)) break;
|
|
977
|
+
subtitle = line.replace(/\*\*/g, "").trim().slice(0, 100);
|
|
978
|
+
break;
|
|
979
|
+
}
|
|
953
980
|
}
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
981
|
+
if (!foundTitle) {
|
|
982
|
+
const firstLine = lines.find((l) => l.trim().length > 0);
|
|
983
|
+
if (firstLine) {
|
|
984
|
+
title = firstLine.replace(/^#+\s*/, "").replace(/\*\*/g, "").trim().slice(0, 80);
|
|
985
|
+
}
|
|
957
986
|
}
|
|
958
|
-
return
|
|
987
|
+
return { title, subtitle };
|
|
988
|
+
}
|
|
989
|
+
/**
|
|
990
|
+
* Extract the main title from content (legacy wrapper)
|
|
991
|
+
*/
|
|
992
|
+
extractTitle(text) {
|
|
993
|
+
return this.extractTitleAndSubtitle(text).title;
|
|
959
994
|
}
|
|
960
995
|
/**
|
|
961
996
|
* Detect presentation type from content signals
|
|
@@ -1758,9 +1793,10 @@ var SlideFactory = class {
|
|
|
1758
1793
|
const data = {
|
|
1759
1794
|
title: this.truncateText(analysis.title, this.config.rules.wordsPerSlide.max)
|
|
1760
1795
|
};
|
|
1761
|
-
|
|
1796
|
+
const subtitleSource = analysis.subtitle || analysis.keyMessages[0] || "";
|
|
1797
|
+
if (subtitleSource) {
|
|
1762
1798
|
data.subtitle = this.truncateText(
|
|
1763
|
-
|
|
1799
|
+
subtitleSource,
|
|
1764
1800
|
this.config.defaults.subtitle.maxWords
|
|
1765
1801
|
// FROM KB
|
|
1766
1802
|
);
|
|
@@ -1804,7 +1840,9 @@ var SlideFactory = class {
|
|
|
1804
1840
|
addSCQASlides(slides, analysis) {
|
|
1805
1841
|
const scqa = analysis.scqa;
|
|
1806
1842
|
const titles = this.config.scqaTitles;
|
|
1807
|
-
|
|
1843
|
+
const minBodyLength = 20;
|
|
1844
|
+
const situationBody = scqa?.situation ? this.truncateText(scqa.situation, this.config.rules.wordsPerSlide.max) : "";
|
|
1845
|
+
if (situationBody.length >= minBodyLength && !this.usedContent.has("scqa-situation")) {
|
|
1808
1846
|
this.usedContent.add("scqa-situation");
|
|
1809
1847
|
slides.push({
|
|
1810
1848
|
index: slides.length,
|
|
@@ -1812,12 +1850,13 @@ var SlideFactory = class {
|
|
|
1812
1850
|
data: {
|
|
1813
1851
|
title: titles.situation,
|
|
1814
1852
|
// FROM KB - not hardcoded 'Current Situation'
|
|
1815
|
-
body:
|
|
1853
|
+
body: situationBody
|
|
1816
1854
|
},
|
|
1817
1855
|
classes: ["situation-slide"]
|
|
1818
1856
|
});
|
|
1819
1857
|
}
|
|
1820
|
-
|
|
1858
|
+
const complicationBody = scqa?.complication ? this.truncateText(scqa.complication, this.config.rules.wordsPerSlide.max) : "";
|
|
1859
|
+
if (complicationBody.length >= minBodyLength && !this.usedContent.has("scqa-complication")) {
|
|
1821
1860
|
this.usedContent.add("scqa-complication");
|
|
1822
1861
|
slides.push({
|
|
1823
1862
|
index: slides.length,
|
|
@@ -1825,12 +1864,13 @@ var SlideFactory = class {
|
|
|
1825
1864
|
data: {
|
|
1826
1865
|
title: titles.complication,
|
|
1827
1866
|
// FROM KB - not hardcoded 'The Challenge'
|
|
1828
|
-
body:
|
|
1867
|
+
body: complicationBody
|
|
1829
1868
|
},
|
|
1830
1869
|
classes: ["complication-slide"]
|
|
1831
1870
|
});
|
|
1832
1871
|
}
|
|
1833
|
-
|
|
1872
|
+
const questionBody = scqa?.question ? this.truncateText(scqa.question, this.config.rules.wordsPerSlide.max) : "";
|
|
1873
|
+
if (questionBody.length >= minBodyLength && !this.usedContent.has("scqa-question")) {
|
|
1834
1874
|
this.usedContent.add("scqa-question");
|
|
1835
1875
|
slides.push({
|
|
1836
1876
|
index: slides.length,
|
|
@@ -1838,7 +1878,7 @@ var SlideFactory = class {
|
|
|
1838
1878
|
data: {
|
|
1839
1879
|
title: titles.question,
|
|
1840
1880
|
// FROM KB - not hardcoded 'The Question'
|
|
1841
|
-
body:
|
|
1881
|
+
body: questionBody
|
|
1842
1882
|
},
|
|
1843
1883
|
classes: ["question-slide"]
|
|
1844
1884
|
});
|
|
@@ -1848,7 +1888,8 @@ var SlideFactory = class {
|
|
|
1848
1888
|
const spark = analysis.sparkline;
|
|
1849
1889
|
const titles = this.config.sparklineTitles;
|
|
1850
1890
|
const whatIsFirst = spark?.whatIs?.[0];
|
|
1851
|
-
|
|
1891
|
+
const whatIsBody = whatIsFirst ? this.truncateText(whatIsFirst, this.config.rules.wordsPerSlide.max) : "";
|
|
1892
|
+
if (whatIsBody.length >= 20 && !this.usedContent.has("spark-what-is")) {
|
|
1852
1893
|
this.usedContent.add("spark-what-is");
|
|
1853
1894
|
slides.push({
|
|
1854
1895
|
index: slides.length,
|
|
@@ -1856,13 +1897,14 @@ var SlideFactory = class {
|
|
|
1856
1897
|
data: {
|
|
1857
1898
|
title: titles.whatIs,
|
|
1858
1899
|
// FROM KB - not hardcoded 'Where We Are Today'
|
|
1859
|
-
body:
|
|
1900
|
+
body: whatIsBody
|
|
1860
1901
|
},
|
|
1861
1902
|
classes: ["what-is-slide"]
|
|
1862
1903
|
});
|
|
1863
1904
|
}
|
|
1864
1905
|
const whatCouldBeFirst = spark?.whatCouldBe?.[0];
|
|
1865
|
-
|
|
1906
|
+
const whatCouldBeBody = whatCouldBeFirst ? this.truncateText(whatCouldBeFirst, this.config.rules.wordsPerSlide.max) : "";
|
|
1907
|
+
if (whatCouldBeBody.length >= 20 && !this.usedContent.has("spark-could-be")) {
|
|
1866
1908
|
this.usedContent.add("spark-could-be");
|
|
1867
1909
|
slides.push({
|
|
1868
1910
|
index: slides.length,
|
|
@@ -1870,7 +1912,7 @@ var SlideFactory = class {
|
|
|
1870
1912
|
data: {
|
|
1871
1913
|
title: titles.whatCouldBe,
|
|
1872
1914
|
// FROM KB - not hardcoded 'What Could Be'
|
|
1873
|
-
body:
|
|
1915
|
+
body: whatCouldBeBody
|
|
1874
1916
|
},
|
|
1875
1917
|
classes: ["what-could-be-slide"]
|
|
1876
1918
|
});
|
|
@@ -2079,16 +2121,18 @@ var SlideFactory = class {
|
|
|
2079
2121
|
};
|
|
2080
2122
|
}
|
|
2081
2123
|
createSingleStatementSlide(index, section) {
|
|
2124
|
+
const bodyContent = section.content || section.bullets.join(" ") || "";
|
|
2125
|
+
const truncatedBody = this.truncateText(bodyContent, this.config.rules.wordsPerSlide.max);
|
|
2126
|
+
if (truncatedBody.length < 15 && section.bullets.length > 0) {
|
|
2127
|
+
return this.createBulletSlide(index, section);
|
|
2128
|
+
}
|
|
2082
2129
|
return {
|
|
2083
2130
|
index,
|
|
2084
2131
|
type: "single-statement",
|
|
2085
2132
|
data: {
|
|
2086
2133
|
title: this.createTitle(section.header, section),
|
|
2087
|
-
body:
|
|
2088
|
-
|
|
2089
|
-
this.config.rules.wordsPerSlide.max
|
|
2090
|
-
// FROM KB
|
|
2091
|
-
)
|
|
2134
|
+
body: truncatedBody || section.header
|
|
2135
|
+
// Fallback to header if no body
|
|
2092
2136
|
},
|
|
2093
2137
|
classes: ["single-statement-slide"]
|
|
2094
2138
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-presentation-master",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.3.0",
|
|
4
4
|
"description": "Generate world-class presentations using expert methodologies from Duarte, Reynolds, Gallo, and Anderson. Enforces rigorous quality standards through real visual validation.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|