As you begin with ${topic.toLowerCase()}, watch out for these common mistakes:
- Ignoring Small Expenses: The daily coffee or lunch out can add up significantly. Track every dollar.
- Not Having an Emergency Fund: Unexpected expenses can derail your progress. Aim to have 3-6 months of living expenses saved.
- Getting Discouraged: You might have setbacks. The key is to stay persistent and not give up on your financial goals.
`,
Conclusion: (topic) => `
Conclusion: Take Charge of Your Future
Mastering ${topic.toLowerCase()} is not about restriction; it's about freedom. It gives you the power to make conscious decisions with your money and build the life you want. Start today, and you'll thank yourself in the future.
`
};
const generatePost = () => {
const topic = topicInput.value.trim();
const audience = audienceInput.value.trim();
const selectedSections = Array.from(document.querySelectorAll('#sections-container input:checked')).map(cb => cb.value);
if (!topic) {
postContainer.innerHTML = '
Please enter a topic for the blog post.
';
return;
}
let postHTML = `
A Beginner's Guide to ${topic} for ${audience}
`;
selectedSections.forEach(key => {
if (sectionTemplates[key]) {
postHTML += sectionTemplates[key](topic, audience);
}
});
postContainer.innerHTML = postHTML;
outputTitle.textContent = `Generated Post: ${topic}`;
downloadPdfBtn.classList.remove('hidden');
};
const downloadPdf = () => {
const { jsPDF } = window.jspdf;
const doc = new jsPDF({ orientation: 'p', unit: 'mm', format: 'a4' });
const content = getEl('generated-post-container');
const title = `A Beginner's Guide to ${topicInput.value.trim()}`;
const pageWidth = doc.internal.pageSize.getWidth();
const margin = 15;
const generationDate = new Date().toLocaleDateString('en-US');
// --- PDF Template: Financial Article ---
// Header
doc.setFillColor(6, 78, 59); // Emerald-900
doc.rect(0, 0, pageWidth, 30, 'F');
doc.setFont('helvetica', 'bold');
doc.setFontSize(16);
doc.setTextColor(255, 255, 255);
const splitTitle = doc.splitTextToSize(title, pageWidth - (margin * 2));
doc.text(splitTitle, margin, 15);
doc.setFont('helvetica', 'normal');
doc.setFontSize(9);
doc.setTextColor(209, 213, 219); // Gray-300
doc.text(`Published on: ${generationDate}`, margin, 25);
html2canvas(content, { scale: 2, useCORS: true, windowWidth: content.scrollWidth, windowHeight: content.scrollHeight }).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;
let heightLeft = pdfHeight;
let position = 40; // Start content below header
doc.addImage(imgData, 'PNG', margin, position, pdfWidth, pdfHeight, undefined, 'FAST');
heightLeft -= (doc.internal.pageSize.getHeight() - position - margin);
while (heightLeft >= 0) {
position = heightLeft - pdfHeight;
doc.addPage();
doc.addImage(imgData, 'PNG', margin, position, pdfWidth, pdfHeight, undefined, 'FAST');
heightLeft -= doc.internal.pageSize.getHeight();
}
// Footer on all pages
const pageCount = doc.internal.getNumberOfPages();
for(let i = 1; i <= pageCount; i++) {
doc.setPage(i);
doc.setDrawColor(16, 185, 129); // Emerald-500
doc.setLineWidth(0.2);
doc.line(margin, 282, pageWidth - margin, 282);
doc.setFontSize(8);
doc.setTextColor(107, 114, 128);
doc.text(
`Finance Blog Post Generator`,
margin,
287
);
doc.text(
`Page ${i} of ${pageCount}`,
pageWidth - margin,
287,
{ align: 'right' }
);
}
doc.save(`Finance_Post_${topicInput.value.trim().replace(/\s/g, '_')}.pdf`);
}).catch(err => {
console.error("Error generating PDF:", err);
alert("Could not generate PDF. See console for details.");
});
};
const showTab = (tabNum) => {
currentTab = tabNum;
tabButtons.forEach(btn => btn.classList.toggle('active', parseInt(btn.dataset.tab) === tabNum));
tabPanes.forEach(pane => pane.classList.toggle('hidden', parseInt(pane.id.split('-')[2]) !== tabNum));
prevBtn.classList.toggle('invisible', currentTab === 1);
nextBtn.textContent = currentTab === 1 ? 'Generate Post' : 'Generate Again';
};
// --- Event Listeners ---
tabButtons.forEach(button => {
button.addEventListener('click', () => {
const tabNum = parseInt(button.dataset.tab);
if (tabNum === 2 && currentTab === 1) generatePost();
showTab(tabNum);
});
});
prevBtn.addEventListener('click', () => { if (currentTab > 1) showTab(currentTab - 1) });
nextBtn.addEventListener('click', () => {
if (currentTab === 1) {
generatePost();
showTab(2);
} else {
generatePost();
}
});
downloadPdfBtn.addEventListener('click', downloadPdf);
// --- Initial Setup ---
showTab(1);
});