From 45a936c05ddbee9d25608025c5cf7e1ec47d29e8 Mon Sep 17 00:00:00 2001 From: Sergej Kasper Date: Mon, 15 Jan 2024 10:43:32 +0100 Subject: [PATCH] fix(import): LinkedIn Profile.csv parsing fixes --- libs/parser/src/linkedin/index.ts | 25 +++++++++++++++---------- libs/utils/src/namespaces/csv.ts | 8 ++++++++ 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/libs/parser/src/linkedin/index.ts b/libs/parser/src/linkedin/index.ts index 87965593..7686b3fc 100644 --- a/libs/parser/src/linkedin/index.ts +++ b/libs/parser/src/linkedin/index.ts @@ -11,7 +11,7 @@ import { ResumeData, resumeDataSchema, } from "@reactive-resume/schema"; -import { extractUrl, Json, parseCSV } from "@reactive-resume/utils"; +import { extractUrl, Json, parseArrayLikeCSVEntry, parseCSV } from "@reactive-resume/utils"; import * as JSZip from "jszip"; import { Schema } from "zod"; @@ -64,16 +64,21 @@ export class LinkedInParser implements Parser { result.basics.name = `${profile["First Name"]} ${profile["Last Name"]}`; result.basics.location = profile["Geo Location"]; result.basics.headline = profile.Headline; - result.basics.url.href = extractUrl(profile.Websites) ?? ""; + // profile.Websites is represented as an array-like structure f.e. [COMPANY:https://some.link,PORTFOLIO:...] + const extractFirstWebsiteLink = (entry: string) => + (parseArrayLikeCSVEntry(entry)[0] ?? "").replace(/.*?:/, ""); + result.basics.url.href = extractUrl(extractFirstWebsiteLink(profile.Websites)) ?? ""; result.sections.summary.content = profile.Summary; - result.sections.profiles.items.push({ - ...defaultProfile, - id: createId(), - icon: "twitter", - network: "Twitter", - username: twitterHandle, - url: { ...defaultProfile.url, href: `https://twitter.com/${twitterHandle}` }, - }); + if (twitterHandle) { + result.sections.profiles.items.push({ + ...defaultProfile, + id: createId(), + icon: "twitter", + network: "Twitter", + username: twitterHandle, + url: { ...defaultProfile.url, href: `https://twitter.com/${twitterHandle}` }, + }); + } } // Email Addresses diff --git a/libs/utils/src/namespaces/csv.ts b/libs/utils/src/namespaces/csv.ts index 495c43ab..e71ffb26 100644 --- a/libs/utils/src/namespaces/csv.ts +++ b/libs/utils/src/namespaces/csv.ts @@ -12,3 +12,11 @@ export const parseCSV = async (string: string) => { }); }); }; + +/** + * Parser for cases when we receive an array like structure f.e. a in the LinkedIn Profile.csv import + * @param csvEntry array-like entry such as [TAG:https://some.link,TAG:https://someother.link] + * @returns + */ +export const parseArrayLikeCSVEntry = (csvEntry: string) => + csvEntry.replace(/^\[/, "").replace(/$\]/, "").split(",");