University Application Essay Helper
Brainstorm, draft, and refine your application essay with powerful tools.
Brainstorm Essay Ideas
Click "Generate New Prompt" to get an idea to write about.
Outline Your Essay
Draft Your Essay
Analysis Tools
Word Count:
0
Readability:
N/A
Passive Voice:
0
Repeated Words:
None
Final Essay & Analysis
Your Essay
Your essay will appear here once you've written it in the previous tab.
Analysis Report
${categoryPrompts[randomIndex]}
`; } function analyzeText() { const text = document.getElementById('essay-text')?.value || ''; // 1. Word Count const words = text.trim().split(/\s+/).filter(Boolean); const wordCount = words.length; const wordCountEl = document.querySelector('#analysis-word-count span:last-child'); if (wordCountEl) wordCountEl.textContent = wordCount; // 2. Readability (Flesch-Kincaid Grade Level) const sentences = text.match(/[^.!?]+[.!?]+/g) || []; const sentenceCount = sentences.length || 1; const syllableCount = countSyllables(text); let readabilityText = "N/A"; if (wordCount > 0 && sentenceCount > 0) { const grade = 0.39 * (wordCount / sentenceCount) + 11.8 * (syllableCount / wordCount) - 15.59; readabilityText = `Grade ${Math.max(1, grade).toFixed(1)}`; } const readabilityEl = document.querySelector('#analysis-readability span:last-child'); if (readabilityEl) readabilityEl.textContent = readabilityText; // 3. Passive Voice const passiveRegex = /\b(am|are|is|was|were|be|being|been)\b\s*(\w+ed|[\w]+en)\b/gi; const passiveMatches = text.match(passiveRegex) || []; const passiveEl = document.querySelector('#analysis-passive span:last-child'); if(passiveEl) passiveEl.textContent = passiveMatches.length; // 4. Repeated Words const wordMap = {}; words.forEach(word => { const lowerWord = word.toLowerCase().replace(/[.,!?;:"']/g, ''); if (lowerWord.length > 3) { // Ignore short words wordMap[lowerWord] = (wordMap[lowerWord] || 0) + 1; } }); const repeatedWords = Object.entries(wordMap) .filter(([_, count]) => count > 2) .sort(([, a], [, b]) => b - a); const repeatsEl = document.getElementById('analysis-repeats'); if(repeatsEl){ if (repeatedWords.length > 0) { repeatsEl.innerHTML = repeatedWords.map(([word, count]) => `${word} (${count})`).join(', '); } else { repeatsEl.innerHTML = 'None'; } } } function countSyllables(text) { if (!text) return 0; text = text.toLowerCase(); let count = 0; const words = text.split(/\s+/); words.forEach(word => { if (word.length <= 3) { count += 1; return; } word = word.replace(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/, ''); word = word.replace(/^y/, ''); const syllables = word.match(/[aeiouy]{1,2}/g); count += syllables ? syllables.length : 0; }); return count; } function populateReviewTab() { const finalEssayDisplay = document.getElementById('final-essay-display'); const finalAnalysisDisplay = document.getElementById('final-analysis-display'); if (!finalEssayDisplay || !finalAnalysisDisplay) return; const essayText = document.getElementById('essay-text')?.value || ''; // Populate essay if (essayText.trim()) { finalEssayDisplay.innerHTML = essayText.replace(/\n/g, ''); } else { finalEssayDisplay.innerHTML = `
Your essay will appear here once you've written it in the previous tab.
`; } // Populate analysis const wordCount = document.querySelector('#analysis-word-count span:last-child')?.textContent || '0'; const readability = document.querySelector('#analysis-readability span:last-child')?.textContent || 'N/A'; const passiveCount = document.querySelector('#analysis-passive span:last-child')?.textContent || '0'; const repeatsHTML = document.getElementById('analysis-repeats')?.innerHTML || 'None'; finalAnalysisDisplay.innerHTML = `Word Count: ${wordCount}
Readability Score: ${readability}
Passive Voice Instances: ${passiveCount}
Frequently Used Words: ${repeatsHTML}
`;
}
function downloadPDF() {
const { jsPDF } = window.jspdf;
const doc = new jsPDF({
orientation: 'portrait',
unit: 'pt',
format: 'a4'
});
// --- Get Data ---
const essayText = document.getElementById('essay-text')?.value || 'No essay provided.';
const wordCount = document.querySelector('#analysis-word-count span:last-child')?.textContent || '0';
const readability = document.querySelector('#analysis-readability span:last-child')?.textContent || 'N/A';
const passiveCount = document.querySelector('#analysis-passive span:last-child')?.textContent || '0';
const repeatsEl = document.getElementById('analysis-repeats');
let repeatedWordsText = "None";
if (repeatsEl && repeatsEl.innerHTML !== 'None') {
const tempDiv = document.createElement('div');
tempDiv.innerHTML = repeatsEl.innerHTML;
repeatedWordsText = tempDiv.innerText || tempDiv.textContent || '';
}
// --- PDF Styling & Layout Variables ---
const pageWidth = doc.internal.pageSize.getWidth();
const pageHeight = doc.internal.pageSize.getHeight();
const margin = 40;
const usableWidth = pageWidth - margin * 2;
let cursorY = margin;
// --- Helper function to add headers/footers ---
const addHeaderFooter = () => {
doc.setFontSize(16);
doc.setFont('helvetica', 'bold');
doc.text('University Application Essay Analysis', pageWidth / 2, margin / 2 + 10, { align: 'center' });
// Footer
const pageCount = doc.internal.getNumberOfPages();
doc.setFontSize(8);
doc.setFont('helvetica', 'normal');
for (let i = 1; i <= pageCount; i++) {
doc.setPage(i);
doc.text(`Page ${i} of ${pageCount}`, pageWidth / 2, pageHeight - margin / 2, { align: 'center' });
}
};
// --- 1. Draw Essay Section ---
doc.setFontSize(14);
doc.setFont('helvetica', 'bold');
doc.text('Your Essay', margin, cursorY);
cursorY += 25;
doc.setLineWidth(1);
doc.line(margin, cursorY - 5, pageWidth - margin, cursorY - 5);
doc.setFontSize(11);
doc.setFont('times', 'normal');
const essayLines = doc.splitTextToSize(essayText, usableWidth);
const lineHeight = doc.getLineHeight() * 0.9;
essayLines.forEach(line => {
if (cursorY + lineHeight > pageHeight - margin) {
doc.addPage();
cursorY = margin;
}
doc.text(line, margin, cursorY);
cursorY += lineHeight;
});
// --- 2. Draw Analysis Section ---
cursorY += 30; // Add space before analysis
if (cursorY + 120 > pageHeight - margin) { // Check if enough space for analysis header + content
doc.addPage();
cursorY = margin;
}
doc.setFontSize(14);
doc.setFont('helvetica', 'bold');
doc.text('Analysis Report', margin, cursorY);
cursorY += 25;
doc.setLineWidth(1);
doc.line(margin, cursorY - 5, pageWidth - margin, cursorY - 5);
doc.setFontSize(11);
doc.setFont('helvetica', 'normal');
const analysisData = [
{ label: 'Word Count:', value: wordCount },
{ label: 'Readability Score:', value: readability },
{ label: 'Passive Voice Instances:', value: passiveCount },
{ label: 'Frequently Used Words:', value: repeatedWordsText }
];
analysisData.forEach(item => {
if (cursorY + 40 > pageHeight - margin) {
doc.addPage();
cursorY = margin;
}
doc.setFont('helvetica', 'bold');
doc.text(item.label, margin, cursorY);
doc.setFont('helvetica', 'normal');
const valueLines = doc.splitTextToSize(item.value, usableWidth - 120); // Indent value
doc.text(valueLines, margin + 130, cursorY);
cursorY += (valueLines.length * lineHeight) + 10;
});
// --- 3. Finalize and Save ---
addHeaderFooter(); // Add header and footer to all pages
doc.save('University-Essay-Analysis-Report.pdf');
}
