Skip to content

Commit

Permalink
remove node-latex in favour of swiftlatex
Browse files Browse the repository at this point in the history
  • Loading branch information
ducaale committed Dec 17, 2023
1 parent 6772f1d commit a4bb930
Show file tree
Hide file tree
Showing 8 changed files with 66 additions and 201 deletions.
137 changes: 0 additions & 137 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
"fs-extra": "^10.1.0",
"jotai": "^1.7.0",
"next": "^13.5.4",
"node-latex": "^3.1.0",
"polished": "^4.2.2",
"react": "^18.2.0",
"react-dom": "^18.2.0",
Expand Down
17 changes: 6 additions & 11 deletions src/components/generator/form/Form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { useRouter } from 'next/router'
import { FormProvider, useForm } from 'react-hook-form'
import { useAtom } from 'jotai'
import styled from 'styled-components'

import { ProfileSection } from './sections/ProfileSection'
import { EducationSection } from './sections/EducationSection'
import { WorkSection } from './sections/WorkSection'
Expand All @@ -12,19 +13,13 @@ import { ProjectsSection } from './sections/projectsSection'
import { resumeAtom } from '../../../atoms/resume'
import { FormValues } from '../../../types'

async function generateResume(formData: FormValues): Promise<string> {
const pdfResponse = await fetch('/api/generate-pdf', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(formData)
})
import latex from '../../../lib/latex'
import getTemplateData from '../../../lib/templates'

const pdfBlob = await pdfResponse.blob()
const pdfUrl = URL.createObjectURL(pdfBlob)

return pdfUrl
async function generateResume(formData: FormValues): Promise<string> {
const { texDoc, opts } = getTemplateData({...formData, sections: ['profile']})
return latex(texDoc, opts)
}

const StyledForm = styled.form`
Expand Down
47 changes: 47 additions & 0 deletions src/lib/latex.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { PdfTeXEngine, XeTeXEngine, DvipdfmxEngine } from 'swiftlatex'
import { LaTeXOpts } from '../types'

let pdftex
let xetex
let dvipdfmx
let engineLoaded = false

export default async function latex(texDoc: string, opts: LaTeXOpts) {
if (!engineLoaded) {
pdftex = new PdfTeXEngine()
await pdftex.loadEngine()

xetex = new XeTeXEngine()
await xetex.loadEngine()

dvipdfmx = new DvipdfmxEngine()
await dvipdfmx.loadEngine()

engineLoaded = true
}

switch(opts.cmd) {
case 'pdflatex': {
await pdftex.writeMemFSFile("main.tex", texDoc)
await pdftex.setEngineMainFile("main.tex")
const { pdf } = await pdftex.compileLaTeX()

return URL.createObjectURL(new Blob([pdf], {type: 'application/pdf'}))
}
case 'xelatex': {
await xetex.writeMemFSFile("main.tex", texDoc)
await xetex.setEngineMainFile("main.tex")
const res = await xetex.compileLaTeX()
console.log(res)

await dvipdfmx.writeMemFSFile("main.xdv", res.pdf)
await dvipdfmx.setEngineMainFile("main.xdv")
const { pdf } = await dvipdfmx.compilePDF()

return URL.createObjectURL(new Blob([pdf], {type: 'application/pdf'}))
}
case 'lualatex': {
throw new Error(`${opts.cmd} is not supported yet`)
}
}
}
28 changes: 11 additions & 17 deletions src/lib/templates/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import path from 'node:path'
import template1 from './template1'
import template2 from './template2'
import template3 from './template3'
Expand All @@ -21,21 +20,16 @@ import {
} from './constants'
import { FormValues, TemplateData } from '../../types'

function resolveTemplatePath(templatePath: string) {
return path.resolve(process.cwd(), 'src/lib/templates' + templatePath)
}

/**
* Generates the LaTeX document based on the selected template
* as well as the necessary options needed for it to create a
* pdf via node-latex.
* as well as the necessary options needed for it to create a pdf.
*
* @param data - The sanitized form data from the request body.
*
* @return The generated LaTeX document as well as its additional opts.
*/
export default function getTemplateData(data: FormValues): TemplateData {
// TODO: list required packages for each template
switch (data.selectedTemplate) {
case TEMPLATE1:
return {
Expand All @@ -50,8 +44,8 @@ export default function getTemplateData(data: FormValues): TemplateData {
texDoc: template2(data),
opts: {
cmd: 'xelatex',
inputs: resolveTemplatePath('/template2/inputs'),
fonts: resolveTemplatePath('/template2/inputs')
inputs: '/template2/inputs',
fonts: '/template2/inputs'
}
}

Expand All @@ -68,8 +62,8 @@ export default function getTemplateData(data: FormValues): TemplateData {
texDoc: template4(data),
opts: {
cmd: 'xelatex',
inputs: resolveTemplatePath('/template4/inputs'),
fonts: resolveTemplatePath('/template4/inputs')
inputs: '/template4/inputs',
fonts: '/template4/inputs'
}
}

Expand All @@ -78,8 +72,8 @@ export default function getTemplateData(data: FormValues): TemplateData {
texDoc: template5(data),
opts: {
cmd: 'pdflatex',
inputs: resolveTemplatePath('/template5/inputs'),
fonts: resolveTemplatePath('/template5/inputs')
inputs: '/template5/inputs',
fonts: '/template5/inputs'
}
}

Expand All @@ -88,8 +82,8 @@ export default function getTemplateData(data: FormValues): TemplateData {
texDoc: template6(data),
opts: {
cmd: 'xelatex',
inputs: resolveTemplatePath('/template6/inputs'),
fonts: resolveTemplatePath('/template6/inputs')
inputs: '/template6/inputs',
fonts: '/template6/inputs'
}
}

Expand All @@ -98,7 +92,7 @@ export default function getTemplateData(data: FormValues): TemplateData {
texDoc: template7(data),
opts: {
cmd: 'pdflatex',
inputs: resolveTemplatePath('/template7/inputs')
inputs: '/template7/inputs'
}
}

Expand All @@ -107,7 +101,7 @@ export default function getTemplateData(data: FormValues): TemplateData {
texDoc: template8(data),
opts: {
cmd: 'lualatex',
inputs: resolveTemplatePath('/template8/inputs')
inputs: '/template8/inputs'
}
}

Expand Down
33 changes: 0 additions & 33 deletions src/pages/api/generate-pdf.ts

This file was deleted.

Loading

0 comments on commit a4bb930

Please sign in to comment.