File size: 2,438 Bytes
b22f922
74164b2
9087846
b22f922
 
 
74164b2
b22f922
74164b2
 
 
dd7546f
74164b2
b22f922
 
 
 
 
 
 
 
 
32e427d
b22f922
32e427d
 
b22f922
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74164b2
 
9087846
 
74164b2
 
9087846
 
 
 
 
 
 
74164b2
9087846
 
 
1b4d3b3
 
9087846
74164b2
c10c2de
9087846
74164b2
9087846
74164b2
9087846
 
 
 
 
 
c10c2de
 
 
 
9087846
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
76
77
78
79
import pypandoc
import typst

## stdlib
import subprocess
import json
import os
from typing import Optional
from string import Template

from datetime import datetime
from pathlib import Path


def file_to_html(file_path: str) -> str:
    return pypandoc.convert_file(file_path, "html")


def extract_url(url: str) -> Optional[str]:
    cmd = f"""shot-scraper javascript -b firefox \
      "{url}" "
    async () => {{
      const sleep = duration => new Promise(resolve => setTimeout(() => resolve(), duration));
      const readability = await import('https://cdn.skypack.dev/@mozilla/readability');
      await sleep(3000);
      return new readability.Readability(document).parse();
    }}"
"""
    result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
    try:
        result.check_returncode()
    except:
        raise Exception(
            f"Please try copy-paste as input. Failed to extract content from url: {url}. Error: {result.stderr}"
        )
    result = json.loads(result.stdout)
    try:
        return result["textContent"]
    except:
        raise Exception(
            f"Please try copy-paste as input. Failed to extract content from: {url}. Didn't find content from given URL!"
        )


def _date() -> str:
    current_date = datetime.now()
    return current_date.strftime(
        f"%B %d{'th' if 4 <= current_date.day <= 20 or 24 <= current_date.day <= 30 else ['st', 'nd', 'rd'][current_date.day % 10 - 1]} , %Y"
    )


def _typst_escape(s) -> str:
    return str(s).replace("@", "\@").replace("#", "\#")


def compile_pdf(
    context: dict, tmpl_path: str, output_path="/tmp/cover_letter.pdf", is_debug=False
) -> list[str]:
    # letter_src_filepath = "typst/letter.typ"
    letter_src_filepath = "typst/" + output_path.split("/")[-1][: -len(".pdf")] + ".typ"
    with open(tmpl_path, "r", encoding="utf8") as f:
        tmpl = Template(f.read())
    context = {k: _typst_escape(v) for k, v in context.items()}
    context.update({"date_string": _date()})
    letter_typ = tmpl.safe_substitute(context)
    with open(letter_src_filepath, "w", encoding="utf8") as f:
        f.write(letter_typ)
    typst.compile(
        letter_src_filepath,
        output_path,
        root=Path("./typst/"),
        font_paths=[Path("./fonts/")],
    )
    # os.remove(letter_src_filepath)
    if is_debug:
        return [letter_src_filepath, output_path]
    else:
        return [output_path]