`;
if (!hasSkills) sectionHTML = '';
break;
default:
if (section.content) {
sectionHTML = `
`;
}
}
return sectionHTML;
}function exportAsPDF() {
// Check if jsPDF is available
if (typeof jsPDF !== 'undefined') {
const { jsPDF } = window.jspdf;
const doc = new jsPDF('p', 'pt', 'a4');
// Get the CV preview element
const element = document.getElementById('cv-preview');
// Use html2canvas to capture the CV preview
html2canvas(element, {
scale: 2,
logging: false,
useCORS: true,
allowTaint: true
}).then(canvas => {
const imgData = canvas.toDataURL('image/png');
const imgWidth = doc.internal.pageSize.getWidth();
const imgHeight = canvas.height * imgWidth / canvas.width;
doc.addImage(imgData, 'PNG', 0, 0, imgWidth, imgHeight);
doc.save('my-cv.pdf');
});
} else {
alert('PDF export functionality not loaded. Please try again.');
}
}function exportAsImage() {
// Get the CV preview element
const element = document.getElementById('cv-preview');
// Use html2canvas to capture the CV preview
html2canvas(element, {
scale: 2,
logging: false,
useCORS: true,
allowTaint: true
}).then(canvas => {
const link = document.createElement('a');
link.download = 'my-cv.png';
link.href = canvas.toDataURL('image/png');
link.click();
});
}// Helper functions for data management
function getPersonalInfo() {
const profilePicPreview = document.getElementById('profile-pic-preview').querySelector('img');
return {
fullName: document.getElementById('full-name').value,
address: document.getElementById('address').value,
email: document.getElementById('email').value,
phone: document.getElementById('phone').value,
profilePic: profilePicPreview ? profilePicPreview.src : null
};
}function getAllSectionsData() {
const sections = [];
document.querySelectorAll('.sections-container .section').forEach(sectionEl => {
const sectionId = sectionEl.id;
const sectionType = sectionId.split('-')[0];
let sectionData = { type: sectionType };
switch(sectionType) {
case 'education':
const educationItems = [];
sectionEl.querySelectorAll('.education-item').forEach(itemEl => {
educationItems.push({
degree: itemEl.querySelector('.education-degree')?.value,
institution: itemEl.querySelector('.education-institution')?.value,
dates: itemEl.querySelector('.education-dates')?.value,
description: itemEl.querySelector('.education-description')?.value
});
});
sectionData.items = educationItems;
break;
case 'experience':
const experienceItems = [];
sectionEl.querySelectorAll('.experience-item').forEach(itemEl => {
experienceItems.push({
title: itemEl.querySelector('.experience-title')?.value,
company: itemEl.querySelector('.experience-company')?.value,
dates: itemEl.querySelector('.experience-dates')?.value,
description: itemEl.querySelector('.experience-description')?.value
});
});
sectionData.items = experienceItems;
break;
case 'skills':
sectionData.technical = sectionEl.querySelector('.skills-technical')?.value;
sectionData.soft = sectionEl.querySelector('.skills-soft')?.value;
sectionData.languages = sectionEl.querySelector('.skills-languages')?.value;
break;
default:
sectionData.content = sectionEl.querySelector('textarea')?.value;
}
sections.push(sectionData);
});
return sections;
}function saveToLocalStorage(data) {
try {
localStorage.setItem('cvBuilderData', JSON.stringify(data));
} catch (e) {
console.error('Failed to save to localStorage', e);
}
}function loadFromLocalStorage() {
try {
const savedData = localStorage.getItem('cvBuilderData');
if (savedData) {
const data = JSON.parse(savedData);
// Load personal info
if (data.personalInfo) {
document.getElementById('full-name').value = data.personalInfo.fullName || '';
document.getElementById('address').value = data.personalInfo.address || '';
document.getElementById('email').value = data.personalInfo.email || '';
document.getElementById('phone').value = data.personalInfo.phone || '';
if (data.personalInfo.profilePic) {
document.getElementById('profile-pic-preview').innerHTML = `
`;
}
}
// Load template
if (data.template) {
document.getElementById('template-selector').value = data.template;
}
// Load sections
if (data.sections && data.sections.length > 0) {
document.getElementById('sections-container').innerHTML = '';
data.sections.forEach(section => {
addSection(section.type);
// Wait for the section to be added, then populate it
setTimeout(() => {
const lastSection = document.querySelector('.sections-container .section:last-child');
if (!lastSection) return;
switch(section.type) {
case 'education':
if (section.items && section.items.length > 0) {
// Clear the default item
lastSection.querySelector('.education-items').innerHTML = '';
section.items.forEach((item, index) => {
if (index > 0) {
lastSection.querySelector('.add-education-btn').click();
}
const itemsContainer = lastSection.querySelector('.education-items');
const itemEl = itemsContainer.querySelector('.education-item:last-child');
if (itemEl) {
if (item.degree) itemEl.querySelector('.education-degree').value = item.degree;
if (item.institution) itemEl.querySelector('.education-institution').value = item.institution;
if (item.dates) itemEl.querySelector('.education-dates').value = item.dates;
if (item.description) itemEl.querySelector('.education-description').value = item.description;
}
});
}
break;
case 'experience':
if (section.items && section.items.length > 0) {
// Clear the default item
lastSection.querySelector('.experience-items').innerHTML = '';
section.items.forEach((item, index) => {
if (index > 0) {
lastSection.querySelector('.add-experience-btn').click();
}
const itemsContainer = lastSection.querySelector('.experience-items');
const itemEl = itemsContainer.querySelector('.experience-item:last-child');
if (itemEl) {
if (item.title) itemEl.querySelector('.experience-title').value = item.title;
if (item.company) itemEl.querySelector('.experience-company').value = item.company;
if (item.dates) itemEl.querySelector('.experience-dates').value = item.dates;
if (item.description) itemEl.querySelector('.experience-description').value = item.description;
}
});
}
break;
case 'skills':
if (section.technical) lastSection.querySelector('.skills-technical').value = section.technical;
if (section.soft) lastSection.querySelector('.skills-soft').value = section.soft;
if (section.languages) lastSection.querySelector('.skills-languages').value = section.languages;
break;
default:
if (section.content) lastSection.querySelector('textarea').value = section.content;
}
}, 10);
});
}
}
} catch (e) {
console.error('Failed to load from localStorage', e);
}
}// Load external libraries dynamically
function loadExternalLibraries() {
// Check if jsPDF is already loaded
if (typeof jsPDF === 'undefined') {
const script = document.createElement('script');
script.src = 'https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js';
script.onload = function() {
// Check if html2canvas is already loaded
if (typeof html2canvas === 'undefined') {
const script2 = document.createElement('script');
script2.src = 'https://html2canvas.hertzen.com/dist/html2canvas.min.js';
document.head.appendChild(script2);
}
};
document.head.appendChild(script);
} else if (typeof html2canvas === 'undefined') {
const script = document.createElement('script');
script.src = 'https://html2canvas.hertzen.com/dist/html2canvas.min.js';
document.head.appendChild(script);
}
}// Initialize library loading
loadExternalLibraries();
${section.type.charAt(0).toUpperCase() + section.type.slice(1)}
${section.content.replace(/\n/g, '
')}
