Transition Word Suggestion Tool
Enhance the flow and readability of your writing.
Suggested Improvements
Click the highlighted areas [+] to see transition word suggestions.
Please enter some text to analyze.
'; return; } // Split text into sentences but keep delimiters const sentences = text.match(/[^.?!]+[.?!]+(\s|$)/g) || [text]; let outputHTML = ''; sentences.forEach((sentence, index) => { if (index > 0) { // Add a suggestion point before each sentence (except the first) outputHTML += `[+] `; } outputHTML += `${sentence.trim()} `; }); analysisOutput.innerHTML = outputHTML; outputSection.classList.remove('hidden'); attachSuggestionListeners(); }; const attachSuggestionListeners = () => { document.querySelectorAll('.suggestion-point').forEach(point => { point.addEventListener('click', (e) => { e.stopPropagation(); activeSuggestionPoint = e.target; showSuggestionPopup(e.target); }); }); }; const showSuggestionPopup = (target) => { let popupHTML = 'Choose a transition word:
'; for (const category in transitionWords) { popupHTML += `${category}
`;
transitionWords[category].forEach(word => {
popupHTML += `${word}`;
});
}
suggestionPopup.innerHTML = popupHTML;
const rect = target.getBoundingClientRect();
suggestionPopup.style.display = 'block';
suggestionPopup.style.left = `${rect.left}px`;
suggestionPopup.style.top = `${rect.bottom + window.scrollY + 5}px`;
suggestionPopup.querySelectorAll('.suggestion-word').forEach(wordEl => {
wordEl.addEventListener('click', () => {
insertWord(wordEl.textContent);
});
});
};
const insertWord = (word) => {
if (activeSuggestionPoint) {
const newWordNode = document.createTextNode(`${word}, `);
activeSuggestionPoint.parentNode.insertBefore(newWordNode, activeSuggestionPoint);
activeSuggestionPoint.remove();
activeSuggestionPoint = null;
}
suggestionPopup.style.display = 'none';
};
const downloadPdf = () => {
const { jsPDF } = window.jspdf;
const doc = new jsPDF({ orientation: 'p', unit: 'mm', format: 'a4' });
const originalText = textInput.value;
const improvedTextContainer = analysisOutput;
const title = "Writing Flow Analysis";
const genDate = new Date().toLocaleDateString('en-US');
const pageWidth = doc.internal.pageSize.getWidth();
const margin = 15;
let yPos = 0;
// --- PDF Template: Writing Flow Analysis ---
doc.setFillColor(15, 118, 110); // Teal-700
doc.rect(0, 0, pageWidth, 25, 'F');
doc.setFont('helvetica', 'bold');
doc.setFontSize(16);
doc.setTextColor(255, 255, 255);
doc.text(title, margin, 16);
yPos = 35;
// Original Text Section
doc.setFont('helvetica', 'bold');
doc.setFontSize(12);
doc.setTextColor(30, 41, 59);
doc.text("Original Text", margin, yPos);
yPos += 8;
doc.setFont('helvetica', 'normal');
doc.setFontSize(10);
doc.setTextColor(71, 85, 105);
const originalLines = doc.splitTextToSize(originalText, pageWidth - margin * 2);
doc.text(originalLines, margin, yPos);
yPos += originalLines.length * 4 + 15;
// Improved Text Section
doc.setFont('helvetica', 'bold');
doc.setFontSize(12);
doc.setTextColor(30, 41, 59);
doc.text("Improved Text (with suggestions)", margin, yPos);
yPos += 8;
html2canvas(improvedTextContainer, { scale: 2, useCORS: true }).then(canvas => {
const imgData = canvas.toDataURL('image/png');
const imgProps = doc.getImageProperties(imgData);
const pdfWidth = pageWidth - (margin * 2);
const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width;
if (yPos + pdfHeight > 280) {
doc.addPage();
yPos = 15;
}
doc.addImage(imgData, 'PNG', margin, yPos, pdfWidth, pdfHeight);
// Footer
const pageCount = doc.internal.getNumberOfPages();
for(let i = 1; i <= pageCount; i++) {
doc.setPage(i);
doc.setLineWidth(0.2);
doc.setDrawColor(156, 163, 175);
doc.line(margin, 282, pageWidth - margin, 282);
doc.setFontSize(8);
doc.setTextColor(100, 116, 139);
doc.text(`Analysis Date: ${genDate}`, margin, 287);
doc.text(`Page ${i} of ${pageCount}`, pageWidth - margin, 287, { align: 'right' });
}
doc.save(`Writing_Flow_Analysis.pdf`);
}).catch(err => {
console.error("Error generating PDF:", err);
alert("Could not generate PDF. See console for details.");
});
};
// --- Event Listeners ---
analyzeTextBtn.addEventListener('click', analyzeText);
downloadPdfBtn.addEventListener('click', downloadPdf);
document.addEventListener('click', () => {
suggestionPopup.style.display = 'none'; // Hide popup if clicking anywhere else
});
suggestionPopup.addEventListener('click', (e) => e.stopPropagation()); // Don't hide if clicking inside popup
});
