summaryrefslogtreecommitdiff
path: root/src/routes/api/cv.json/+server.ts
blob: 956525ff6389b80f5459cec5929390e367863796 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/*** IMPORT ------------------------------------------- ***/

import { error, json } from "@sveltejs/kit";

/*** EXPORT ------------------------------------------- ***/

export const POST = async({ fetch, request }) => {
  try {
    const response = await fetch("https://cv.webb.page", {
      headers: { "Content-Type": "text/plain" },
      method: "GET"
    });

    const content = await response.text();
    return json({ content: processCV(content) });
  } catch(welp) {
    console.error(`Error fetching CV: ${String(welp)}`);
    return error(500);
  }
};

/*** HELPER ------------------------------------------- ***/

function processCV(text) {
  const sections = text.split(/(^░▒▓[\s\S]*?^---$)/m);
  const intro = sections[1];
  const body = sections[2];
  const lines = body.split(/\n{2,}/);
  const table = processTable(body);

  const processedLines = lines.map(line => {
    if (line.includes("Proficiency") && line.includes("Notes"))
      return table.join("").trim();

    return line.replace(/\s+/g, " ");
  });

  return intro + processedLines.join("\n\n") + "\n\n\n";
}

function processTable(text) {
  const lines = text.split(/\r?\n/);
  const tableStartIndex = lines.findIndex(line => line.includes("|"));

  if (tableStartIndex === -1)
    return null;

  const separatorLineIndex = lines.findIndex((line, index) => index > tableStartIndex && line.includes("|-") || line.includes("| -"));

  if (separatorLineIndex === -1)
    return null;

  let tableEndIndex = separatorLineIndex + 1;

  while (tableEndIndex < lines.length && lines[tableEndIndex].includes("|")) {
    tableEndIndex++;
  }

  const contentRows = lines.slice(separatorLineIndex + 1, tableEndIndex);

  return contentRows.map(row => {
    let cells = row.split("|").map(cell => cell.trim());

    if (cells[0] === "")
      cells.shift();

    if (cells[cells.length - 1] === "")
      cells.pop();

    return cells.join(" / ") + "\n";
  });
}