diff --git a/atsScoreFinder.js b/atsScoreFinder.js new file mode 100644 index 0000000..ff31364 --- /dev/null +++ b/atsScoreFinder.js @@ -0,0 +1,27 @@ +// atsScoreFinder.js + +function calculateATSScore(resumeText, jobDescription) { + const resumeKeywords = resumeText.split(/\W+/).map(word => word.toLowerCase()); + const jobKeywords = jobDescription.split(/\W+/).map(word => word.toLowerCase()); + + const matchedKeywords = resumeKeywords.filter(word => jobKeywords.includes(word)); + const score = (matchedKeywords.length / jobKeywords.length) * 100; + + return score; +} + +function analyzeFormatting(resumeText) { + const feedback = []; + const lines = resumeText.split('\n'); + + if (lines.length < 3) { + feedback.push("Resume should have at least 3 lines."); + } + if (resumeText.length < 300) { + feedback.push("Resume is too short; consider adding more content."); + } + + return feedback; +} + +module.exports = { calculateATSScore, analyzeFormatting }; diff --git a/atsscore.css b/atsscore.css new file mode 100644 index 0000000..510a9b0 --- /dev/null +++ b/atsscore.css @@ -0,0 +1,78 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: Arial, sans-serif; + background-color: #f4f4f4; + padding: 20px; +} + +.container { + max-width: 600px; + margin: 0 auto; + background-color: white; + padding: 20px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + border-radius: 8px; +} + +h1 { + text-align: center; + color: #333; + margin-bottom: 20px; +} + +label { + display: block; + margin-bottom: 10px; + font-weight: bold; + color: #555; +} + +input[type="file"], +textarea { + width: 100%; + padding: 10px; + margin-bottom: 20px; + border: 1px solid #ccc; + border-radius: 4px; +} + +textarea { + resize: vertical; +} + +button { + display: block; + width: 100%; + padding: 10px; + background-color: #28a745; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 16px; +} + +button:hover { + background-color: #218838; +} + +#result-section { + margin-top: 20px; + text-align: center; +} + +#score { + font-size: 2em; + color: #28a745; +} + +#feedback { + margin-top: 10px; + font-size: 1.2em; + color: #555; +} diff --git a/atsscore.html b/atsscore.html new file mode 100644 index 0000000..1f6a4e1 --- /dev/null +++ b/atsscore.html @@ -0,0 +1,30 @@ + + + + + + Resume ATS Score Finder + + + +
+

Resume ATS Score Finder

+ + + + + + + + + + + +
+

ATS Compatibility Score:

+

Feedback:

+
+
+ + + diff --git a/atsscore.js b/atsscore.js new file mode 100644 index 0000000..1c2d237 --- /dev/null +++ b/atsscore.js @@ -0,0 +1,51 @@ +// Function to calculate the ATS score based on job description and resume +function calculateATSScore(jobDescription, resumeText) { + // Normalize text by converting to lowercase to ensure case-insensitive matching + const jobDescriptionLower = jobDescription.toLowerCase(); + const resumeTextLower = resumeText.toLowerCase(); + + // Split the text into arrays of words using space or comma as separators + const jobKeywords = jobDescriptionLower.split(/[\s,]+/); // Keywords from job description + const resumeWords = resumeTextLower.split(/[\s,]+/); // Words from resume + + // Count how many keywords from the job description appear in the resume + let matchCount = 0; + jobKeywords.forEach(keyword => { + if (resumeWords.includes(keyword)) { + matchCount++; + } + }); + + // Calculate the percentage match as the ATS score + const score = (matchCount / jobKeywords.length) * 100; + return Math.round(score * 100) / 100; // Round the score to two decimal places +} + +// Function to provide feedback based on the ATS score +function displayFeedback(score) { + if (score === 100) { + return "Excellent! Your resume is highly compatible with the job description."; + } else if (score >= 75) { + return "Good job! Your resume is quite compatible, but consider adding more relevant keywords."; + } else if (score >= 50) { + return "Fair. Your resume needs improvement. Focus on including more keywords from the job description."; + } else { + return "Low compatibility. Revise your resume to better match the job description."; + } +} + +// Main function to handle form submission +document.getElementById("analyze-button").addEventListener("click", function() { + const jobDescription = document.getElementById("job-description").value; + const resumeText = document.getElementById("resume-text").value; + + if (jobDescription && resumeText) { + const atsScore = calculateATSScore(jobDescription, resumeText); + const feedback = displayFeedback(atsScore); + + document.getElementById("score").innerText = atsScore + "%"; + document.getElementById("feedback").innerText = feedback; + } else { + document.getElementById("feedback").innerText = "Please enter both the job description and resume."; + } +}); diff --git a/client.js b/client.js new file mode 100644 index 0000000..cda15e4 --- /dev/null +++ b/client.js @@ -0,0 +1,49 @@ +// ATS Score Calculation Functionality +document.getElementById('atsForm').addEventListener('submit', function (event) { + event.preventDefault(); // Prevent form submission + + const resumeInput = document.getElementById('resumeInput').value; + const resumeFile = document.getElementById('resumeFile').files[0]; + + let resumeText = resumeInput; + + if (resumeFile) { + const reader = new FileReader(); + reader.onload = function (e) { + const fileContent = e.target.result; + // Here you could extract text from the file + resumeText = fileContent; // For demo purposes, directly use file content + calculateATSScore(resumeText); + }; + reader.readAsText(resumeFile); + } else { + calculateATSScore(resumeText); + } +}); + +function calculateATSScore(resumeText) { + // Sample ATS score calculation logic + const keywords = ["JavaScript", "HTML", "CSS", "Python", "Java"]; // Example keywords + let score = 0; + + keywords.forEach(keyword => { + if (resumeText.includes(keyword)) { + score += 20; // Increment score for each keyword found + } + }); + + // Display the result + document.getElementById('score').innerText = `${score}/100`; + document.getElementById('feedback').innerText = getFeedback(score); + document.getElementById('atsResult').style.display = 'block'; +} + +function getFeedback(score) { + if (score >= 80) { + return "Great job! Your resume is highly compatible with ATS."; + } else if (score >= 50) { + return "Your resume is moderately compatible. Consider adding more keywords."; + } else { + return "Your resume may not perform well with ATS. It's recommended to revise it."; + } +} diff --git a/demo.html b/demo.html new file mode 100644 index 0000000..8d891f1 --- /dev/null +++ b/demo.html @@ -0,0 +1,220 @@ + + + + + + Resume ATS Score Finder + + + + + + + + + + +
+

Resume ATS Score Finder

+ + + + + + + + + + + +
ATS Compatibility Score: 0%
+
+
+ + + + + diff --git a/server.js b/server.js new file mode 100644 index 0000000..84564c7 --- /dev/null +++ b/server.js @@ -0,0 +1,69 @@ +const express = require('express'); +const bodyParser = require('body-parser'); +const multer = require('multer'); +const fs = require('fs'); +const path = require('path'); + +const app = express(); +const PORT = process.env.PORT || 3000; + +// Middleware +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ extended: true })); +app.use(express.static('public')); // Serve static files from the 'public' directory + +// Set up multer for file uploads +const upload = multer({ dest: 'uploads/' }); // Destination for uploaded files + +// Serve the main HTML page +app.get('/', (req, res) => { + res.sendFile(path.join(__dirname, 'public', 'index.html')); +}); + +// Handle ATS score calculation +app.post('/calculate-ats-score', upload.single('resumeFile'), (req, res) => { + let resumeText = req.body.resumeInput; + + if (req.file) { + const fileContent = fs.readFileSync(req.file.path, 'utf8'); // Read uploaded file + resumeText += '\n' + fileContent; // Combine text from textarea and file + } + + const score = calculateATSScore(resumeText); + res.json({ score, feedback: getFeedback(score) }); + + // Optionally delete the uploaded file after processing + if (req.file) { + fs.unlinkSync(req.file.path); + } +}); + +// Function to calculate ATS score +function calculateATSScore(resumeText) { + const keywords = ["JavaScript", "HTML", "CSS", "Python", "Java"]; // Example keywords + let score = 0; + + keywords.forEach(keyword => { + if (resumeText.includes(keyword)) { + score += 20; // Increment score for each keyword found + } + }); + + return score; +} + +// Function to get feedback based on the score +function getFeedback(score) { + if (score >= 80) { + return "Great job! Your resume is highly compatible with ATS."; + } else if (score >= 50) { + return "Your resume is moderately compatible. Consider adding more keywords."; + } else { + return "Your resume may not perform well with ATS. It's recommended to revise it."; + } +} + +// Start the server +app.listen(PORT, () => { + console.log(`Server is running on http://localhost:${PORT}`); +}); diff --git a/test.js b/test.js new file mode 100644 index 0000000..5791b51 --- /dev/null +++ b/test.js @@ -0,0 +1,9 @@ +// test.js + +const { calculateATSScore } = require('./atsScoreFinder'); + +const resumeText = "Experienced software engineer with a strong background in JavaScript and web development. Proficient in React, Node.js, and agile methodologies. Excellent problem-solving skills and a passion for technology."; +const jobDescription = "We are looking for a software engineer with experience in JavaScript and React. The ideal candidate should have strong problem-solving skills and experience in agile methodologies."; + +const score = calculateATSScore(resumeText, jobDescription); +console.log(`ATS Score: ${score.toFixed(2)}%`);