Download script.js from mclarktechdir1/deepsite-project-7bdcb: direct link, hf CLI and curl.
- Browser
- Download file 13.9 kB
-
https://huggingface.co/spaces/mclarktechdir1/deepsite-project-7bdcb/resolve/main/script.js
- Command line
-
hf download hf://spaces/mclarktechdir1/deepsite-project-7bdcb/script.js
-
curl -L -o script.js https://huggingface.co/spaces/mclarktechdir1/deepsite-project-7bdcb/resolve/main/script.js
13.9 kB
| // DOM Elements | |
| const pdfFileInput = document.getElementById('pdfFile'); | |
| const pdfUploadArea = document.getElementById('pdfUploadArea'); | |
| const uploadedFileInfo = document.getElementById('uploadedFileInfo'); | |
| const fileNameElement = document.getElementById('fileName'); | |
| const fileSizeElement = document.getElementById('fileSize'); | |
| const removeFileButton = document.getElementById('removeFile'); | |
| const uploadProgressBar = document.getElementById('uploadProgressBar'); | |
| const uploadPercent = document.getElementById('uploadPercent'); | |
| const convertButton = document.getElementById('convertBtn'); | |
| const processingState = document.getElementById('processingState'); | |
| const initialPreview = document.getElementById('initialPreview'); | |
| const resultsSection = document.getElementById('resultsSection'); | |
| const processingProgressBar = document.getElementById('processingProgressBar'); | |
| const processingPercent = document.getElementById('processingPercent'); | |
| const textPreview = document.getElementById('textPreview'); | |
| const downloadButton = document.getElementById('downloadBtn'); | |
| const newConversionButton = document.getElementById('newConversionBtn'); | |
| const copyTextButton = document.getElementById('copyTextBtn'); | |
| const toast = document.getElementById('toast'); | |
| const toastMessage = document.getElementById('toastMessage'); | |
| const sectionCheckboxes = document.querySelectorAll('.section-checkbox'); | |
| const sectionLabels = document.querySelectorAll('.section-label'); | |
| // Sample resume data for demonstration | |
| const sampleResumeData = { | |
| contactInfo: "Jane Doe\n(123) 456-7890\njane.doe@email.com\n123 Main Street, New York, NY 10001", | |
| socialMedia: "LinkedIn: linkedin.com/in/janedoe\nGitHub: github.com/janedoe\nPortfolio: janedoe.dev", | |
| workExperience: "Senior Software Engineer, Tech Solutions Inc. (2020-Present)\n- Lead development of customer-facing web applications\n- Implemented Agile methodologies improving team productivity by 30%\n- Mentored 5 junior developers\n\nSoftware Developer, Innovate Corp. (2017-2020)\n- Developed and maintained internal tools using React and Node.js\n- Reduced application load time by 40% through performance optimization\n- Collaborated with cross-functional teams to deliver projects on schedule", | |
| education: "Master of Science in Computer Science\nUniversity of Technology (2015-2017)\nGPA: 3.8/4.0\n\nBachelor of Science in Information Technology\nState College (2011-2015)", | |
| certifications: "AWS Certified Solutions Architect - Associate\nGoogle Professional Cloud Architect\nScrum Master Certification (CSM)", | |
| skills: "Programming: JavaScript, Python, Java, C#\nFrameworks: React, Node.js, Angular, .NET\nDatabases: MySQL, MongoDB, PostgreSQL\nTools: Git, Docker, AWS, Jenkins\nSoft Skills: Leadership, Problem-solving, Communication, Team Collaboration", | |
| summary: "Senior Software Engineer with 8+ years of experience in full-stack development, specializing in scalable web applications. Proven track record of leading cross-functional teams, implementing Agile methodologies, and delivering projects that improve efficiency and user experience. Passionate about mentoring junior developers and staying current with emerging technologies." | |
| }; | |
| // Current state | |
| let currentFile = null; | |
| let selectedSections = ['contactInfo', 'socialMedia', 'workExperience', 'education', 'skills', 'summary']; | |
| // Initialize event listeners | |
| function init() { | |
| // File upload handlers | |
| pdfFileInput.addEventListener('change', handleFileSelect); | |
| // Drag and drop handlers | |
| pdfUploadArea.addEventListener('dragover', handleDragOver); | |
| pdfUploadArea.addEventListener('dragleave', handleDragLeave); | |
| pdfUploadArea.addEventListener('drop', handleDrop); | |
| // File removal | |
| removeFileButton.addEventListener('click', removeFile); | |
| // Section selection handlers | |
| sectionCheckboxes.forEach(checkbox => { | |
| checkbox.addEventListener('change', updateSectionSelection); | |
| // Initialize check icons | |
| if (checkbox.checked) { | |
| const label = checkbox.nextElementSibling; | |
| const checkIcon = label.querySelector('.check-icon'); | |
| if (checkIcon) checkIcon.classList.remove('hidden'); | |
| } | |
| }); | |
| // Convert button | |
| convertButton.addEventListener('click', startConversion); | |
| // Results buttons | |
| downloadButton.addEventListener('click', downloadTextFile); | |
| newConversionButton.addEventListener('click', resetToInitialState); | |
| copyTextButton.addEventListener('click', copyTextToClipboard); | |
| // Initialize with sample text preview | |
| updateTextPreview(); | |
| } | |
| // Handle file selection | |
| function handleFileSelect(event) { | |
| const file = event.target.files[0]; | |
| if (file && file.type === 'application/pdf') { | |
| processFile(file); | |
| } else { | |
| showToast('Please select a valid PDF file', 'error'); | |
| } | |
| } | |
| // Handle drag over | |
| function handleDragOver(event) { | |
| event.preventDefault(); | |
| event.stopPropagation(); | |
| pdfUploadArea.classList.add('dragover'); | |
| } | |
| // Handle drag leave | |
| function handleDragLeave(event) { | |
| event.preventDefault(); | |
| event.stopPropagation(); | |
| pdfUploadArea.classList.remove('dragover'); | |
| } | |
| // Handle drop | |
| function handleDrop(event) { | |
| event.preventDefault(); | |
| event.stopPropagation(); | |
| pdfUploadArea.classList.remove('dragover'); | |
| const files = event.dataTransfer.files; | |
| if (files.length > 0) { | |
| const file = files[0]; | |
| if (file.type === 'application/pdf') { | |
| processFile(file); | |
| } else { | |
| showToast('Please drop a valid PDF file', 'error'); | |
| } | |
| } | |
| } | |
| // Process the uploaded file | |
| function processFile(file) { | |
| currentFile = file; | |
| // Update UI with file info | |
| fileNameElement.textContent = file.name; | |
| fileSizeElement.textContent = formatFileSize(file.size); | |
| // Show upload progress animation | |
| uploadedFileInfo.classList.remove('hidden'); | |
| simulateUploadProgress(); | |
| // Enable convert button | |
| convertButton.disabled = false; | |
| convertButton.classList.remove('opacity-50'); | |
| showToast(`File "${file.name}" uploaded successfully`, 'success'); | |
| } | |
| // Simulate upload progress | |
| function simulateUploadProgress() { | |
| let progress = 0; | |
| const interval = setInterval(() => { | |
| progress += Math.random() * 15; | |
| if (progress >= 100) { | |
| progress = 100; | |
| clearInterval(interval); | |
| } | |
| uploadProgressBar.style.width = `${progress}%`; | |
| uploadPercent.textContent = `${Math.round(progress)}%`; | |
| }, 100); | |
| } | |
| // Format file size | |
| function formatFileSize(bytes) { | |
| if (bytes < 1024) return bytes + ' B'; | |
| else if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB'; | |
| else return (bytes / (1024 * 1024)).toFixed(1) + ' MB'; | |
| } | |
| // Remove file | |
| function removeFile() { | |
| currentFile = null; | |
| pdfFileInput.value = ''; | |
| uploadedFileInfo.classList.add('hidden'); | |
| convertButton.disabled = true; | |
| convertButton.classList.add('opacity-50'); | |
| } | |
| // Update section selection | |
| function updateSectionSelection(event) { | |
| const checkbox = event.target; | |
| const label = checkbox.nextElementSibling; | |
| const checkIcon = label.querySelector('.check-icon'); | |
| if (checkbox.checked) { | |
| checkIcon.classList.remove('hidden'); | |
| selectedSections.push(checkbox.id); | |
| } else { | |
| checkIcon.classList.add('hidden'); | |
| selectedSections = selectedSections.filter(id => id !== checkbox.id); | |
| } | |
| // Update preview if we have results | |
| if (resultsSection.classList.contains('hidden') === false) { | |
| updateTextPreview(); | |
| } | |
| } | |
| // Start the conversion process | |
| function startConversion() { | |
| if (!currentFile && selectedSections.length === 0) { | |
| showToast('Please upload a PDF and select at least one section', 'error'); | |
| return; | |
| } | |
| if (!currentFile) { | |
| showToast('Please upload a PDF file first', 'error'); | |
| return; | |
| } | |
| if (selectedSections.length === 0) { | |
| showToast('Please select at least one section to include', 'error'); | |
| return; | |
| } | |
| // Hide initial preview and show processing state | |
| initialPreview.classList.add('hidden'); | |
| processingState.classList.remove('hidden'); | |
| processingState.classList.add('fade-in'); | |
| // Start the processing animation | |
| simulateProcessing(); | |
| } | |
| // Simulate AI processing | |
| function simulateProcessing() { | |
| let progress = 0; | |
| const steps = document.querySelectorAll('.processing-step'); | |
| const interval = setInterval(() => { | |
| progress += Math.random() * 8; | |
| if (progress >= 100) { | |
| progress = 100; | |
| clearInterval(interval); | |
| // Show results after a brief delay | |
| setTimeout(showResults, 500); | |
| } | |
| // Update main progress bar | |
| processingProgressBar.style.width = `${progress}%`; | |
| processingPercent.textContent = `${Math.round(progress)}%`; | |
| // Update individual step progress | |
| const stepProgress = progress / 100; | |
| steps.forEach((step, index) => { | |
| const stepNum = parseInt(step.getAttribute('data-step')); | |
| const stepTarget = stepNum * 25; | |
| const stepWidth = Math.min(Math.max(0, (progress - (stepTarget - 25)) / 25 * 100), 100); | |
| step.style.width = `${stepWidth}%`; | |
| }); | |
| }, 200); | |
| } | |
| // Show results | |
| function showResults() { | |
| processingState.classList.add('hidden'); | |
| resultsSection.classList.remove('hidden'); | |
| resultsSection.classList.add('fade-in'); | |
| updateTextPreview(); | |
| showToast('Resume successfully converted to ATS-optimized text!', 'success'); | |
| } | |
| ===========================\n"; | |
| text += sampleResumeData.contactInfo + "\n\n"; | |
| } | |
| if (selectedSections.includes('socialMedia')) { | |
| text += "SOCIAL MEDIA & LINKS\n"; | |
| text += "====================\n"; | |
| text += sampleResumeData.socialMedia + "\n\n"; | |
| } | |
| if (selectedSections.includes('workExperience')) { | |
| text += "WORK EXPERIENCE\n"; | |
| text += "================\n"; | |
| text += sampleResumeData.workExperience + "\n\n"; | |
| } | |
| if (selectedSections.includes('education')) { | |
| text += "EDUCATION\n"; | |
| text += "=========\n"; | |
| text += sampleResumeData.education + "\n\n"; | |
| } | |
| if (selectedSections.includes('certifications')) { | |
| text += "CERTIFICATIONS\n"; | |
| text += "==============\n"; | |
| text += sampleResumeData.certifications + "\n\n"; | |
| } | |
| if (selectedSections.includes('skills')) { | |
| text += "SKILLS\n"; | |
| text += "======\n"; | |
| text += sampleResumeData.skills + "\n\n"; | |
| } | |
| text += "\n=== END OF RESUME ==="; | |
| text += "\n\n[This resume has been optimized for Applicant Tracking Systems by AI Resume ATS Optimizer]"; | |
| textPreview.textContent = text; | |
| } | |
| // Download text file | |
| function downloadTextFile() { | |
| const text = textPreview.textContent; | |
| const blob = new Blob([text], { type: 'text/plain' }); | |
| const url = URL.createObjectURL(blob); | |
| const a = document.createElement('a'); | |
| a.href = url; | |
| a.download = 'ats_optimized_resume.txt'; | |
| document.body.appendChild(a); | |
| a.click(); | |
| setTimeout(() => { | |
| document.body.removeChild(a); | |
| URL.revokeObjectURL(url); | |
| }, 100); | |
| showToast('Text file downloaded successfully!', 'success'); | |
| } | |
| // Copy text to clipboard | |
| function copyTextToClipboard() { | |
| const text = textPreview.textContent; | |
| navigator.clipboard.writeText(text).then(() => { | |
| showToast('Text copied to clipboard!', 'success'); | |
| }).catch(err => { | |
| console.error('Failed to copy text: ', err); | |
| showToast('Failed to copy text to clipboard', 'error'); | |
| }); | |
| } | |
| // Reset to initial state | |
| function resetToInitialState() { | |
| // Reset file | |
| removeFile(); | |
| // Reset sections | |
| sectionCheckboxes.forEach(checkbox => { | |
| if (checkbox.id !== 'certifications') { | |
| checkbox.checked = true; | |
| const label = checkbox.nextElementSibling; | |
| const checkIcon = label.querySelector('.check-icon'); | |
| checkIcon.classList.remove('hidden'); | |
| } else { | |
| checkbox.checked = false; | |
| const label = checkbox.nextElementSibling; | |
| const checkIcon = label.querySelector('.check-icon'); | |
| checkIcon.classList.add('hidden'); | |
| } | |
| }); | |
| selectedSections = ['contactInfo', 'socialMedia', 'workExperience', 'education', 'skills', 'summary']; | |
| // Hide results and show initial preview | |
| resultsSection.classList.add('hidden'); | |
| initialPreview.classList.remove('hidden'); | |
| initialPreview.classList.add('fade-in'); | |
| showToast('Ready for a new conversion!', 'success'); | |
| } | |
| // Show toast notification | |
| function showToast(message, type = 'success') { | |
| toastMessage.textContent = message; | |
| // Set color based on type | |
| if (type === 'error') { | |
| toast.style.backgroundColor = '#ef4444'; | |
| } else if (type === 'success') { | |
| toast.style.backgroundColor = '#10b981'; | |
| } else { | |
| toast.style.backgroundColor = '#3b82f6'; | |
| } | |
| // Show toast | |
| toast.classList.remove('translate-y-full'); | |
| // Hide after 3 seconds | |
| setTimeout(() => { | |
| toast.classList.add('translate-y-full'); | |
| }, 3000); | |
| } | |
| // Initialize the application when DOM is loaded | |
| document.addEventListener('DOMContentLoaded', init); | |
| // Add some interactivity to section labels | |
| sectionLabels.forEach(label => { | |
| label.addEventListener('click', function() { | |
| this.classList.add('transform', 'scale-[1.02]', 'transition-transform'); | |
| setTimeout(() => { | |
| this.classList.remove('transform', 'scale-[1.02]'); | |
| }, 150); | |
| }); | |
| }); |