/** FRESH to JSON Resume conversion routiens. @license MIT. Copyright (c) 2015 James Devlin / FluentDesk. @module convert.js */ (function(){ /** Convert between FRESH and JRS resume/CV formats. @class FRESHConverter */ var FRESHConverter = module.exports = { /** Convert from JSON Resume format to FRESH. @method toFresh */ toFRESH: function( src, foreign ) { foreign = (foreign === undefined || foreign === null) ? true : foreign; return { name: src.basics.name, info: { label: src.basics.label, class: src.basics.class, // <--> round-trip image: src.basics.picture, brief: src.basics.summary }, contact: { email: src.basics.email, phone: src.basics.phone, website: src.basics.website, other: src.basics.other // <--> round-trip }, meta: meta( true, src.meta ), location: { city: src.basics.location.city, region: src.basics.location.region, country: src.basics.location.countryCode, code: src.basics.location.postalCode, address: src.basics.location.address }, employment: employment( src.work, true ), education: education( src.education, true), service: service( src.volunteer, true), skills: skillsToFRESH( src.skills ), writing: writing( src.publications, true), recognition: recognition( src.awards, true, foreign ), social: social( src.basics.profiles, true ), interests: src.interests, testimonials: references( src.references, true ), languages: src.languages, disposition: src.disposition // <--> round-trip }; }, /** Convert from FRESH format to JSON Resume. @param foreign True if non-JSON-Resume properties should be included in the result, false if those properties should be excluded. */ toJRS: function( src, foreign ) { foreign = (foreign === undefined || foreign === null) ? false : foreign; return { basics: { name: src.name, label: src.info.label, class: foreign ? src.info.class : undefined, summary: src.info.brief, website: src.contact.website, phone: src.contact.phone, email: src.contact.email, picture: src.info.image, location: { address: src.location.address, postalCode: src.location.code, city: src.location.city, countryCode: src.location.country, region: src.location.region }, profiles: social( src.social, false ) }, work: employment( src.employment, false ), education: education( src.education, false ), skills: skillsToJRS( src.skills, false ), volunteer: service( src.service, false ), awards: recognition( src.recognition, false, foreign ), publications: writing( src.writing, false ), interests: src.interests, references: references( src.testimonials, false ), samples: foreign ? src.samples : undefined, disposition: foreign ? src.disposition : undefined, languages: src.languages }; } }; function meta( direction, obj ) { if( direction ) { obj = obj || { }; obj.format = obj.format || "FRESH@0.1.0"; obj.version = obj.version || "0.1.0"; } return obj; } function employment( obj, direction ) { if( !direction ) { return obj && obj.history ? obj.history.map(function(emp){ return { company: emp.employer, website: emp.url, position: emp.position, startDate: emp.start, endDate: emp.end, summary: emp.summary, highlights: emp.highlights }; }) : undefined; } else { return { history: obj && obj.length ? obj.map( function( job ) { return { position: job.position, employer: job.company, summary: job.summary, current: (!job.endDate || !job.endDate.trim() || job.endDate.trim().toLowerCase() === 'current') || undefined, start: job.startDate, end: job.endDate, url: job.website, keywords: "", highlights: job.highlights }; }) : undefined }; } } function education( obj, direction ) { if( direction ) { return obj && obj.length ? { history: obj.map(function(edu){ return { institution: edu.institution, start: edu.startDate, end: edu.endDate, grade: edu.gpa, curriculum: edu.courses, url: edu.website || edu.url || null, summary: null, area: edu.area, studyType: edu.studyType }; }) } : undefined; } else { return obj && obj.history ? obj.history.map(function(edu){ return { institution: edu.institution, gpa: edu.grade, courses: edu.curriculum, startDate: edu.start, endDate: edu.end, area: edu.area, studyType: edu.studyType }; }) : undefined; } } function service( obj, direction, foreign ) { if( direction ) { return { history: obj && obj.length ? obj.map(function(vol) { return { type: 'volunteer', position: vol.position, organization: vol.organization, start: vol.startDate, end: vol.endDate, url: vol.website, summary: vol.summary, highlights: vol.highlights }; }) : undefined }; } else { return obj && obj.history ? obj.history.map(function(srv){ return { flavor: foreign ? srv.flavor : undefined, organization: srv.organization, position: srv.position, startDate: srv.start, endDate: srv.end, website: srv.url, summary: srv.summary, highlights: srv.highlights }; }) : undefined; } } function social( obj, direction ) { if( direction ) { return obj.map(function(pro){ return { label: pro.network, network: pro.network, url: pro.url, user: pro.username }; }); } else { return obj.map( function( soc ) { return { network: soc.network, username: soc.user, url: soc.url }; }); } } function recognition( obj, direction, foreign ) { if( direction ) { return obj && obj.length ? obj.map( function(awd){ return { flavor: foreign ? awd.flavor : undefined, url: foreign ? awd.url: undefined, title: awd.title, date: awd.date, from: awd.awarder, summary: awd.summary }; }) : undefined; } else { return obj && obj.length ? obj.map(function(awd){ return { flavor: foreign ? awd.flavor : undefined, url: foreign ? awd.url: undefined, title: awd.title, date: awd.date, awarder: awd.from, summary: awd.summary }; }) : undefined; } } function references( obj, direction ) { if( direction ) { return obj && obj.length && obj.map(function(ref){ return { name: ref.name, flavor: 'professional', quote: ref.reference, private: false }; }); } else { return obj && obj.length && obj.map(function(ref){ return { name: ref.name, reference: ref.quote }; }); } } function writing( obj, direction ) { if( direction ) { return obj.map(function( pub ) { return { title: pub.name, flavor: undefined, publisher: pub.publisher, url: pub.website, date: pub.releaseDate, summary: pub.summary }; }); } else { return obj && obj.length ? obj.map(function(pub){ return { name: pub.title, publisher: pub.publisher && pub.publisher.name ? pub.publisher.name : pub.publisher, releaseDate: pub.date, website: pub.url, summary: pub.summary }; }) : undefined; } } function skillsToFRESH( skills ) { return { sets: skills.map(function(set) { return { name: set.name, level: set.level, skills: set.keywords }; }) }; } function skillsToJRS( skills ) { var ret = []; if( skills.sets && skills.sets.length ) { ret = skills.sets.map(function(set){ return { name: set.name, level: set.level, keywords: set.skills }; }); } else if( skills.list ) { ret = skills.list.map(function(sk){ return { name: sk.name, level: sk.level, keywords: sk.keywords }; }); } return ret; } }());