From 069ce73c07547b372e1f072b3ed03006decd9498 Mon Sep 17 00:00:00 2001 From: Dolan Date: Tue, 13 Feb 2018 23:20:14 +0000 Subject: [PATCH] Add My CV Demo --- My Document.docx | Bin 5445 -> 0 bytes README.md | 1 + demo/demo10.js | 314 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 315 insertions(+) delete mode 100644 My Document.docx create mode 100644 demo/demo10.js diff --git a/My Document.docx b/My Document.docx deleted file mode 100644 index 30ef3abd7f0dbd9af9391d7f181d5fcbaae9baf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5445 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 { + document.addParagraph(this.createBullet(bulletPoint)); + }); + } + + document.addParagraph(this.createHeading("Experience")); + + for (const position of experiences) { + document.addParagraph( + this.createInstitutionHeader( + position.company.name, + this.createPositionDateText(position.startDate, position.endDate, position.isCurrent), + ), + ); + document.addParagraph(this.createRoleText(position.title)); + + const bulletPoints = this.splitParagraphIntoBullets(position.summary); + + bulletPoints.forEach((bulletPoint) => { + document.addParagraph(this.createBullet(bulletPoint)); + }); + } + + document.addParagraph(this.createHeading("Skills, Achievements and Interests")); + + document.addParagraph(this.createSubHeading("Skills")); + document.addParagraph(this.createSkillList(skills)); + + document.addParagraph(this.createSubHeading("Achievements")); + + for (const achievementParagraph of this.createAchivementsList(achivements)) { + document.addParagraph(achievementParagraph); + } + + document.addParagraph(this.createSubHeading("Interests")); + + document.addParagraph(this.createInterests("Programming, Technology, Music Production, Web Design, 3D Modelling, Dancing.")); + + document.addParagraph(this.createHeading("References")); + + document.addParagraph( + new docx.Paragraph( + "Dr. Dean Mohamedally Director of Postgraduate Studies Department of Computer Science, University College London Malet Place, Bloomsbury, London WC1E d.mohamedally@ucl.ac.uk", + ), + ); + document.addParagraph(new docx.Paragraph("More references upon request")); + document.addParagraph( + new docx.Paragraph( + "This CV was generated in real-time based on my Linked-In profile from my personal website www.dolan.bio.", + ).center(), + ); + return document; + } + + createContactInfo(phoneNumber, profileUrl, email) { + const paragraph = new docx.Paragraph().center(); + const contactInfo = new docx.TextRun(`Mobile: ${phoneNumber} | LinkedIn: ${profileUrl} | Email: ${email}`); + const address = new docx.TextRun("Address: 58 Elm Avenue, Kent ME4 6ER, UK").break(); + + paragraph.addRun(contactInfo); + paragraph.addRun(address); + + return paragraph; + } + + createHeading(text) { + return new docx.Paragraph(text).heading1().thematicBreak(); + } + + createSubHeading(text) { + return new docx.Paragraph(text).heading2(); + } + + createInstitutionHeader(institutionName, dateText) { + const paragraph = new docx.Paragraph().maxRightTabStop(); + const institution = new docx.TextRun(institutionName).bold(); + const date = new docx.TextRun(dateText).tab().bold(); + + paragraph.addRun(institution); + paragraph.addRun(date); + + return paragraph; + } + + createRoleText(roleText) { + const paragraph = new docx.Paragraph(); + const role = new docx.TextRun(roleText).italic(); + + paragraph.addRun(role); + + return paragraph; + } + + createBullet(text) { + return new docx.Paragraph(text).bullet(); + } + + createSkillList(skills) { + const paragraph = new docx.Paragraph(); + const skillConcat = skills.map((skill) => skill.name).join(", ") + "."; + + paragraph.addRun(new docx.TextRun(skillConcat)); + + return paragraph; + } + + createAchivementsList(achivements) { + const arr = []; + + for (const achievement of achivements) { + arr.push(new docx.Paragraph(achievement.name).bullet()); + } + + return arr; + } + + createInterests(interests) { + const paragraph = new docx.Paragraph(); + + paragraph.addRun(new docx.TextRun(interests)); + return paragraph; + } + + splitParagraphIntoBullets(text) { + return text.split("\n\n"); + } + + createPositionDateText(startDate, endDate, isCurrent) { + const startDateText = this.getMonthFromInt(startDate.month) + ". " + startDate.year; + const endDateText = isCurrent ? "Present" : `${this.getMonthFromInt(endDate.month)}. ${endDate.year}`; + + return `${startDateText} - ${endDateText}`; + } + + getMonthFromInt(value) { + switch (value) { + case 1: + return "Jan"; + case 2: + return "Feb"; + case 3: + return "Mar"; + case 4: + return "Apr"; + case 5: + return "May"; + case 6: + return "Jun"; + case 7: + return "Jul"; + case 8: + return "Aug"; + case 9: + return "Sept"; + case 10: + return "Oct"; + case 11: + return "Nov"; + case 12: + return "Dec"; + } + } +} + +const documentCreator = new DocumentCreator(); + +const doc = documentCreator.create([experiences, education, skills, achievements]); + +var exporter = new docx.LocalPacker(doc); +exporter.pack("Dolan Miu CV"); + +console.log('Document created successfully at project root!');