'an ability to stay committed long after the initial excitement fades',
],
'creative': [
- 'a creative sensibility that surfaces in every project they undertake',
+ 'a creative sensibility that surfaces in every project that comes {P_POSS} way',
'a knack for approaching problems from unexpected, often more effective angles',
'the imagination to see solutions that aren\'t obvious to everyone else',
- 'a creative instinct that makes their work distinctively their own',
+ 'a creative instinct that makes {P_POSS} work distinctively {P_POSS} own',
],
'dependable': [
'a level of dependability that both peers and teachers can count on without question',
- 'consistent follow-through that makes them the kind of person you want on any team',
- 'reliability that is simply part of how they operate, not something they have to try at',
- 'a track record of doing what they say they will, without needing reminders',
+ 'consistent follow-through that makes {P_OBJ} the kind of person you want on any team',
+ 'reliability that is simply part of {P_POSS} character, never something {P_SUBJ} {P_HAS} to perform',
+ 'a track record of following through on commitments, without needing reminders',
],
'curious': [
- 'an intellectual curiosity that keeps them asking questions long after the lesson ends',
+ 'an intellectual curiosity that keeps {P_OBJ} asking questions long after the lesson ends',
'a genuine hunger to understand the "why" behind every concept, not just the "what"',
'the kind of restless curiosity that turns course material into a personal investigation',
- 'an inquisitive mind that elevates classroom discussions for everyone around them',
+ 'an inquisitive mind that elevates classroom discussions for everyone around {P_OBJ}',
],
'collaborative': [
'an instinct for bringing people together and making group work genuinely productive',
'the ability to listen, adapt, and contribute in ways that strengthen any team',
'a collaborative spirit that makes others more effective simply by being present',
- 'a consistent effort to lift teammates up rather than stand apart from them',
+ 'a consistent effort to lift teammates up and elevate the group rather than stand apart',
],
'leadership': [
'a quiet but unmistakable leadership presence that others naturally gravitate toward',
'the ability to guide a group without overshadowing the contributions of others',
- 'leadership qualities that show up in how they organize, encourage, and model behavior',
+ 'leadership qualities that show up in every group interaction and collaborative moment',
'the kind of leadership that earns respect through example rather than authority',
],
'resilient': [
- 'a resilience that allows them to treat setbacks as data rather than failures',
+ 'a resilience that allows {P_OBJ} to treat setbacks as data rather than failures',
'the ability to reset after a difficult challenge and come back stronger each time',
- 'a composure under pressure that lets them stay productive when others disengage',
+ 'a composure under pressure that lets {P_OBJ} stay productive when others disengage',
'the persistence to keep going even when the path forward is unclear',
],
'detail-oriented': [
'a meticulous attention to detail that catches what others miss',
- 'the kind of precision that elevates the quality of everything they produce',
+ 'the kind of precision that elevates the quality of everything in {P_POSS} work',
'a habit of reviewing and refining work that reflects genuine pride in the outcome',
- 'a careful, systematic approach that makes their completed work notably thorough',
+ 'a careful, systematic approach that makes {P_POSS} completed work notably thorough',
],
'growth-mindset': [
'a growth mindset that treats every mistake as an opportunity to improve',
- 'the awareness to recognize where they can grow and the drive to act on it',
- 'an openness to feedback that makes them one of the most coachable students I\'ve taught',
- 'a belief in their own ability to improve that translates into real, visible progress',
+ 'the awareness to recognize where {P_SUBJ} can grow and the drive to act on it',
+ 'an openness to feedback that makes {P_OBJ} one of the most coachable students I\'ve taught',
+ 'a belief in {P_POSS} own ability to improve that translates into real, visible progress',
],
'communicator': [
'a rare ability to explain technical ideas clearly to a wide range of audiences',
@@ -775,34 +789,34 @@
Site
'clarity in both written and verbal communication that most students are still working toward',
],
'self-starter': [
- 'a natural initiative that means they are often working before the instructions are finished',
+ 'a natural initiative that means {P_SUBJ} {P_IS} often working before the instructions are finished',
'the ability to identify what needs to be done and begin without waiting to be told',
- 'an intrinsic motivation that sets them apart from peers who need frequent prompting',
- 'a proactive energy that consistently raises the bar for everyone working alongside them',
+ 'an intrinsic motivation that sets {P_OBJ} apart from peers who need frequent prompting',
+ 'a proactive energy that consistently raises the bar for everyone working alongside {P_OBJ}',
],
'empathetic': [
- 'a genuine empathy that shapes how they engage with teammates and solve human-centered problems',
- 'the social awareness to understand how their actions affect others, and to care about that',
- 'an ability to see problems through multiple perspectives, which consistently improves their solutions',
- 'a warmth and consideration for others that makes them a stabilizing presence in any group',
+ 'a genuine empathy that shapes every interaction and collaborative moment',
+ 'the social awareness to understand how {P_POSS} actions affect others, and to care about that',
+ 'an ability to see problems through multiple perspectives, which consistently improves {P_POSS} solutions',
+ 'a warmth and consideration for others that makes {P_OBJ} a stabilizing presence in any group',
],
'focused': [
- 'an ability to maintain focus and output quality even when the environment around them is noisy or uncertain',
+ 'an ability to maintain focus and output quality even when the environment around {P_OBJ} is noisy or uncertain',
'the composure to prioritize effectively when multiple demands compete for attention',
- 'a mental discipline that lets them stay on task when others have long since drifted',
+ 'a mental discipline that lets {P_OBJ} stay on task when others have long since drifted',
'the kind of sustained concentration that produces work of consistently high quality',
],
'organized': [
- 'an organizational discipline that keeps their work clean, accessible, and always on schedule',
+ 'an organizational discipline that keeps {P_POSS} work clean, accessible, and always on schedule',
'a systematic approach to managing materials and time that others in the class often look to as a model',
'the ability to impose structure on complex projects without losing sight of the bigger picture',
- 'a natural tendency to plan ahead that means they rarely find themselves scrambling at the last minute',
+ 'a natural tendency to plan ahead that means {P_SUBJ} {P_IS} rarely scrambling at the last minute',
],
'enthusiastic': [
- 'an enthusiasm for the subject that is contagious and genuinely raises the energy of any room they\'re in',
+ 'an enthusiasm for the subject that is contagious and genuinely raises the energy of any room {P_SUBJ} {P_IS} in',
'a visible excitement about learning that makes classroom discussions more dynamic and engaging',
- 'a passion for this field that comes through in everything from their questions to their project choices',
- 'the kind of authentic enthusiasm that signals a student who has found something they truly care about',
+ 'a passion for this field that comes through in everything from {P_POSS} questions to {P_POSS} project choices',
+ 'the kind of authentic enthusiasm that signals a student who has found something {P_SUBJ} {P_IS} truly passionate about',
],
};
@@ -817,7 +831,7 @@
Site
],
closingStatement: [
'I recommend {name} with confidence for future academic, professional, and leadership opportunities.',
- 'Whoever has the opportunity to work with {name} next will be fortunate. I recommend them fully and without reservation.',
+ 'Whoever has the opportunity to work with {name} next will be fortunate. I recommend {P_OBJ} fully and without reservation.',
'I recommend {name} with confidence for future academic, professional, and leadership opportunities, and I do so proudly.',
'{name} is exactly the kind of person any school, employer, or program would be glad to welcome. I offer this recommendation wholeheartedly.',
],
@@ -832,8 +846,8 @@
Site
],
closingStatement: [
'{name} will contribute meaningfully to your campus community, both inside the classroom and beyond it.',
- 'Your institution will be fortunate to have {name}. They bring exactly the kind of curiosity and drive that make campus communities stronger.',
- 'I have no reservations whatsoever in recommending {name} for admission, and I look forward to following their continued success.',
+ 'Your institution will be fortunate to have {name}, someone whose curiosity and drive will make your campus community stronger.',
+ 'I have no reservations whatsoever in recommending {name} for admission, and I look forward to following {P_POSS} continued success.',
'{name} is the kind of student who will make the most of every opportunity your institution offers, and then some.',
],
},
@@ -847,8 +861,8 @@
Site
],
closingStatement: [
'I am confident that {name} will make excellent use of this opportunity and reflect the values this scholarship was created to honor.',
- '{name} represents exactly the kind of student this scholarship was designed to support, someone whose potential is matched only by their commitment to their own growth.',
- 'This scholarship would be in excellent hands with {name}, and I cannot recommend them highly enough for this recognition.',
+ '{name} represents exactly the kind of student this scholarship was designed to support, someone whose potential is matched only by {P_POSS} commitment to {P_POSS} own growth.',
+ 'This scholarship would be in excellent hands with {name}, and I cannot recommend {P_OBJ} highly enough for this recognition.',
'Investing in {name} through this scholarship is investing in someone who will return that investment many times over.',
],
},
@@ -861,9 +875,9 @@
Site
'on behalf of {name} as they pursue this internship',
],
closingStatement: [
- '{name} is ready for a real professional environment. They are technically capable, grounded, and genuinely eager to learn on the job.',
+ '{name} is ready for a real professional environment. {P_SUBJ_CAP} {P_IS} technically capable, grounded, and genuinely eager to learn on the job.',
'Any team that works with {name} will quickly see what I already know: this is a student worth investing in.',
- 'I recommend {name} without reservation for this internship and am confident they will exceed your expectations.',
+ 'I recommend {name} without reservation for this internship and am confident {P_SUBJ} will exceed your expectations.',
'{name} brings both the technical foundation and the professional maturity to make a real contribution from day one.',
],
},
@@ -878,8 +892,8 @@
Site
closingStatement: [
'{name} is work-ready in the truest sense, technically capable, professionally grounded, and eager to contribute from day one.',
'Any organization that brings {name} on board will quickly discover what I already know: this is someone worth investing in.',
- 'I recommend {name} without reservation for this role and am confident they will meet and exceed your expectations.',
- '{name} combines technical skill and professional maturity that will help them hit the ground running in almost any workplace.',
+ 'I recommend {name} without reservation for this role and am confident {P_SUBJ} will meet and exceed your expectations.',
+ '{name} combines technical skill and professional maturity that will help {P_OBJ} hit the ground running in almost any workplace.',
],
},
'leadership': {
@@ -893,7 +907,7 @@
Site
closingStatement: [
'{name} is prepared not just to participate in a leadership program, but to grow through it in ways that will ripple outward for years.',
'Your program would benefit greatly from what {name} brings, and {name} would benefit equally from the challenges your program offers.',
- 'I am confident that {name} will not only meet the bar this program sets. They will raise it.',
+ 'I am confident that {name} will not only meet the bar this program sets. {P_SUBJ_CAP} will raise it.',
'Selecting {name} for this program means choosing someone who will make the program proud.',
],
},
@@ -906,35 +920,35 @@
Site
'on behalf of {name} as they pursue this next step',
],
closingStatement: [
- 'I recommend {name} fully and without reservation, and I look forward to hearing about their continued growth.',
- '{name} has more than earned this opportunity, and I am proud to put their name forward.',
+ 'I recommend {name} fully and without reservation, and I look forward to hearing about {P_POSS} continued growth.',
+ '{name} has more than earned this opportunity, and I am proud to put {P_POSS} name forward.',
'I hold {name} in the highest regard and offer this recommendation with genuine enthusiasm.',
- '{name} is exactly the kind of person who makes the most of every opportunity given to them.',
+ '{name} is exactly the kind of person who makes the most of every opportunity given to {P_OBJ}.',
],
},
};
const OPENINGS = [
- (name, cls, purposeCtx) =>
- `It is my genuine pleasure to write this letter ${purposeCtx}. As ${name}'s teacher in ${cls}, I have had the opportunity to watch them grow in ways that go well beyond the technical content of the course.`,
- (name, cls, purposeCtx) =>
+ (name, cls, purposeCtx, p) =>
+ `It is my genuine pleasure to write this letter ${purposeCtx}. As ${name}'s teacher in ${cls}, I have had the opportunity to watch ${p.obj} grow in ways that go well beyond the technical content of the course.`,
+ (name, cls, purposeCtx, p) =>
`I am writing ${purposeCtx}, and I do so with genuine enthusiasm. ${name} is one of those students who reminds you why teaching matters, someone whose growth in ${cls} has been both impressive and deeply satisfying to witness.`,
- (name, cls, purposeCtx) =>
- `Without hesitation, I am writing to offer my strongest recommendation ${purposeCtx}. Having worked closely with ${name} in ${cls}, I have developed a clear and confident picture of who they are as both a student and a person.`,
- (name, cls, purposeCtx) =>
- `I have had the privilege of teaching ${name} in ${cls}, and this letter ${purposeCtx} comes from a place of genuine admiration. ${name} consistently demonstrated qualities that set them apart, not just in my class, but as a person.`,
- (name, cls, purposeCtx) =>
- `Rarely do I encounter a student who leaves such a lasting impression in a single semester, but ${name} has done exactly that. I am writing ${purposeCtx} with full confidence that my recommendation reflects not just their performance in ${cls}, but their broader potential.`,
- (name, cls, purposeCtx) =>
- `Some students show up, do the work, and leave. ${name} did something different. In ${cls}, they showed me what it looks like when a student genuinely invests in their own growth, and I am glad to write this letter ${purposeCtx}.`,
- (name, cls, purposeCtx) =>
+ (name, cls, purposeCtx, p) =>
+ `Without hesitation, I am writing to offer my strongest recommendation ${purposeCtx}. Having worked closely with ${name} in ${cls}, I have developed a clear and confident picture of who ${p.subj} ${p.is} as both a student and a person.`,
+ (name, cls, purposeCtx, p) =>
+ `I have had the privilege of teaching ${name} in ${cls}, and this letter ${purposeCtx} comes from a place of genuine admiration. ${name} consistently demonstrated qualities that set ${p.obj} apart, not just in my class, but as a person.`,
+ (name, cls, purposeCtx, p) =>
+ `Rarely do I encounter a student who leaves such a lasting impression in a single semester, but ${name} has done exactly that. I am writing ${purposeCtx} with full confidence that my recommendation reflects not just ${p.poss} performance in ${cls}, but ${p.poss} broader potential.`,
+ (name, cls, purposeCtx, p) =>
+ `Some students show up, do the work, and leave. ${name} did something different. In ${cls}, ${p.subjCap} showed me what it looks like when a student genuinely invests in ${p.poss} own growth, and I am glad to write this letter ${purposeCtx}.`,
+ (name, cls, purposeCtx, p) =>
`I don't write recommendation letters casually, but writing this one ${purposeCtx} is easy. ${name} has been one of the most memorable students I have taught in ${cls}, and that is not something I say often.`,
];
const TRANSITIONS = [
- 'Beyond their technical abilities,',
+ 'Beyond {P_POSS} technical abilities,',
'What sets {name} apart, however, is more than coursework performance.',
- 'Equally important to their technical growth has been their character.',
+ 'Equally important to {P_POSS} technical growth has been {P_POSS} character.',
'The technical skills tell only part of the story.',
'Academic performance, of course, only begins to describe {name}.',
'What I find most compelling about {name}, though, is not captured in grades alone.',
@@ -942,18 +956,18 @@
Site
];
const CLOSINGS = [
- (name) =>
- `I hold ${name} in the highest regard and offer this recommendation wholeheartedly. Please feel free to contact me if you would like to discuss their qualifications in greater detail.`,
- (name) =>
+ (name, p) =>
+ `I hold ${name} in the highest regard and offer this recommendation wholeheartedly. Please feel free to contact me if you would like to discuss ${p.poss} qualifications in greater detail.`,
+ (name, p) =>
`It is rare to recommend a student with this level of certainty, and I do so for ${name} without reservation. I am happy to speak further should it be helpful.`,
- (name) =>
+ (name, p) =>
`I recommend ${name} with confidence and pride. Should you have any questions or wish to speak with me directly, I welcome the conversation.`,
- (name) =>
- `My support for ${name} is unconditional. They have more than earned this opportunity, and I look forward to hearing of their continued success.`,
- (name) =>
+ (name, p) =>
+ `My support for ${name} is unconditional. ${p.subjCap} ${p.has} more than earned this opportunity, and I look forward to hearing of ${p.poss} continued success.`,
+ (name, p) =>
`Thank you for your consideration of ${name}. I am available to provide any additional context and would be glad to speak with you at your convenience.`,
- (name) =>
- `Teaching ${name} has been a genuinely rewarding experience, and I have every confidence in where they are headed. Please reach out if I can be of any further help.`,
+ (name, p) =>
+ `Teaching ${name} has been a genuinely rewarding experience, and I have every confidence in where ${p.subj} ${p.is} headed. Please reach out if I can be of any further help.`,
];
// ─── Utilities ──────────────────────────────────────────────────────────────
@@ -975,14 +989,47 @@
Site
return str.charAt(0).toUpperCase() + str.slice(1);
}
+ // Returns a pronoun set for use throughout generated letters
+ function getPronouns(selection, firstName) {
+ if (selection === 'he-him') {
+ return { subj: 'he', obj: 'him', poss: 'his', subjCap: 'He', objCap: 'Him', possCap: 'His', is: 'is', has: 'has' };
+ }
+ if (selection === 'she-her') {
+ return { subj: 'she', obj: 'her', poss: 'her', subjCap: 'She', objCap: 'Her', possCap: 'Her', is: 'is', has: 'has' };
+ }
+ if (selection === 'prefer') {
+ return { subj: firstName, obj: firstName, poss: firstName + "'s", subjCap: firstName, objCap: firstName, possCap: firstName + "'s", is: 'is', has: 'has' };
+ }
+ // they/them (default)
+ return { subj: 'they', obj: 'them', poss: 'their', subjCap: 'They', objCap: 'Them', possCap: 'Their', is: 'are', has: 'have' };
+ }
+
+ // Replaces {name}, {P_SUBJ}, {P_OBJ}, {P_POSS}, {P_SUBJ_CAP}, {P_IS}, {P_HAS} tokens
+ function fillTemplate(text, firstName, p) {
+ return text
+ .replace(/\{name\}/g, firstName)
+ .replace(/\{P_SUBJ_CAP\}/g, p.subjCap)
+ .replace(/\{P_SUBJ\}/g, p.subj)
+ .replace(/\{P_OBJ_CAP\}/g, p.objCap)
+ .replace(/\{P_OBJ\}/g, p.obj)
+ .replace(/\{P_POSS_CAP\}/g, p.possCap)
+ .replace(/\{P_POSS\}/g, p.poss)
+ .replace(/\{P_IS\}/g, p.is)
+ .replace(/\{P_HAS\}/g, p.has);
+ }
+
// Build a paragraph that weaves selected traits together naturally
- function buildTraitParagraph(firstName, selectedTraitIds) {
+ function buildTraitParagraph(firstName, selectedTraitIds, p) {
if (!selectedTraitIds.length) return '';
- const transition = pick(TRANSITIONS).replace('{name}', firstName);
+ const rawTransition = pick(TRANSITIONS).replace('{name}', firstName);
+ const transition = fillTemplate(rawTransition, firstName, p);
- // Grab a phrase for each selected trait
- const phrases = selectedTraitIds.map(id => pick(TRAIT_PHRASES[id] || ['a standout quality that defines who they are']));
+ // Grab a phrase for each selected trait and apply pronouns
+ const phrases = selectedTraitIds.map(id => {
+ const raw = pick(TRAIT_PHRASES[id] || ['a standout quality that defines who {P_SUBJ} {P_IS}']);
+ return fillTemplate(raw, firstName, p);
+ });
let body = '';
if (phrases.length === 1) {
@@ -1025,6 +1072,7 @@
errorEl.style.display = 'block';
return null;
}
+ if (!pronounKey) {
+ errorEl.textContent = 'Please select pronouns for this student.';
+ errorEl.style.display = 'block';
+ return null;
+ }
if (!classKey) {
errorEl.textContent = 'Please select a class.';
errorEl.style.display = 'block';
@@ -1061,6 +1114,7 @@
Site
errorEl.style.display = 'none';
const name = `${firstName} ${lastName}`;
+ const p = getPronouns(pronounKey, firstName);
const cd = CLASS_DATA[classKey];
const pd = PURPOSE_DATA[purposeKey];
const today = new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' });
@@ -1091,10 +1145,10 @@
Site
if (purposeKey === 'general') {
// General Recommendation: broad, reusable, no specific opportunity
const generalOpening = pick([
- `It is my genuine pleasure to write this letter of recommendation for ${firstName} ${lastName}. Having had the privilege of teaching ${firstName} in my ${cd.name} course, I can speak with full confidence about the kind of student and person they are.`,
- `I am pleased to offer this letter of recommendation for ${firstName} ${lastName}, a student who made a real impression on me during their time in ${cd.name}. The qualities I witnessed are ones that will carry ${firstName} far, in school, in the workplace, and in life.`,
+ `It is my genuine pleasure to write this letter of recommendation for ${firstName} ${lastName}. Having had the privilege of teaching ${firstName} in my ${cd.name} course, I can speak with full confidence about the kind of student and person ${p.subj} ${p.is}.`,
+ `I am pleased to offer this letter of recommendation for ${firstName} ${lastName}, a student who made a real impression on me during ${p.poss} time in ${cd.name}. The qualities I witnessed are ones that will carry ${firstName} far, in school, in the workplace, and in life.`,
`Writing a general letter of recommendation for ${firstName} ${lastName} is something I do with genuine pride. I taught ${firstName} in ${cd.name}, and what I observed was a student who brought something meaningful to the classroom every single day.`,
- `To anyone who has the opportunity to work with ${firstName} ${lastName}: you will be glad you did. I taught ${firstName} in ${cd.name}, and I can say without hesitation that they are a person of strong character, real ability, and genuine heart.`,
+ `To anyone who has the opportunity to work with ${firstName} ${lastName}: you will be glad you did. I taught ${firstName} in ${cd.name}, and I can say without hesitation that ${p.subj} ${p.is} a person of strong character, real ability, and genuine heart.`,
]);
const classDescPhrase = pick(cd.classDesc);
@@ -1102,17 +1156,17 @@
Site
const strengthPhrase = pick(cd.strengthPhrase);
const generalP2 = pick([
- `In ${cd.name}, students are expected to engage with ${classDescPhrase}. ${firstName} did not just meet that expectation. They approached the course with focus and purpose, ${classActionPhrase}. They have ${strengthPhrase}, and that kind of foundation does not disappear when a course ends.`,
- `My ${cd.name} course asks students to work seriously with ${classDescPhrase}. ${firstName} showed up to that challenge with effort and integrity, ${classActionPhrase}. In doing so, they demonstrated ${strengthPhrase} that I believe will define how they approach everything ahead of them.`,
+ `In ${cd.name}, students are expected to engage with ${classDescPhrase}. ${firstName} did not just meet that expectation. ${p.subjCap} approached the course with focus and purpose, ${classActionPhrase}. ${p.subjCap} ${p.has} ${strengthPhrase}, and that kind of foundation does not disappear when a course ends.`,
+ `My ${cd.name} course asks students to work seriously with ${classDescPhrase}. ${firstName} showed up to that challenge with effort and integrity, ${classActionPhrase}. In doing so, ${p.subj} demonstrated ${strengthPhrase} that I believe will define ${p.poss} path well beyond this course.`,
`The work in ${cd.name} centers on ${classDescPhrase}. ${firstName} engaged with that material thoughtfully and persistently, ${classActionPhrase}. The result is a student who has ${strengthPhrase}, a quality I see as genuinely rare at this stage.`,
]);
- const traitPara = buildTraitParagraph(firstName, checkedIds);
+ const traitPara = buildTraitParagraph(firstName, checkedIds, p);
const customPara = customText ? integrateCustomParagraph(firstName, customText, cd.keywords) : '';
- const generalClosingStatement = pick(pd.closingStatement).replace(/\{name\}/g, firstName);
- const generalSignoff = pick(CLOSINGS)(firstName);
+ const generalClosingStatement = fillTemplate(pick(pd.closingStatement), firstName, p);
+ const generalSignoff = pick(CLOSINGS)(firstName, p);
const generalParts = [
today,
@@ -1143,7 +1197,7 @@
const strengthPhrase = pick(cd.strengthPhrase);
const p2Templates = [
- `In my ${cd.name} course, students engage with ${classDescPhrase}. ${name} distinguished themselves through ${classActionPhrase}. They have ${strengthPhrase}, a quality that speaks to more than academic ability. It reflects who they are as a learner.`,
- `My ${cd.name} course challenges students to engage seriously with ${classDescPhrase}. ${capitalize(classActionPhrase)} is exactly what ${name} did, consistently, throughout the semester. In doing so, they ${strengthPhrase}.`,
+ `In my ${cd.name} course, students engage with ${classDescPhrase}. ${name} rose to that challenge through ${classActionPhrase}. ${p.subjCap} ${p.has} ${strengthPhrase}, a quality that speaks to more than academic ability. It reflects who ${p.subj} ${p.is} as a learner.`,
+ `My ${cd.name} course challenges students to engage seriously with ${classDescPhrase}. ${capitalize(classActionPhrase)} is exactly what ${name} did, consistently, throughout the semester. In doing so, ${p.subj} demonstrated ${strengthPhrase}.`,
`${name} completed my ${cd.name} course, a class that asks students to grapple with ${classDescPhrase}. What I observed was a student committed to ${classActionPhrase}, which is why I can say with confidence that ${name} has ${strengthPhrase}.`,
- `The work in ${cd.name} centers on ${classDescPhrase}, and not every student rises to meet that challenge with purpose. ${name} did. By ${classActionPhrase}, they have ${strengthPhrase} in a way that will serve them long after this course.`,
+ `The work in ${cd.name} centers on ${classDescPhrase}, and not every student rises to meet that challenge with purpose. ${name} did. By ${classActionPhrase}, ${p.subj} ${p.has} ${strengthPhrase} in a way that will serve ${p.obj} long after this course.`,
];
const p2 = pick(p2Templates);
// Paragraph 3: Trait-based character paragraph
- const p3 = buildTraitParagraph(firstName, checkedIds);
+ const p3 = buildTraitParagraph(firstName, checkedIds, p);
// Paragraph 4 (optional): Custom content
const p4 = customText ? integrateCustomParagraph(firstName, customText, cd.keywords) : '';
// Closing
- const closingStatement = pick(pd.closingStatement).replace(/\{name\}/g, firstName);
- const signoff = pick(CLOSINGS)(firstName);
+ const closingStatement = fillTemplate(pick(pd.closingStatement), firstName, p);
+ const signoff = pick(CLOSINGS)(firstName, p);
const parts = [
today,
@@ -1270,6 +1324,7 @@