-
Notifications
You must be signed in to change notification settings - Fork 8
/
XsltRenderer.ts
85 lines (70 loc) · 2.19 KB
/
XsltRenderer.ts
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
80
81
82
83
84
85
import path from 'path'
import fs from 'fs/promises'
import tmpFileAsync from './utils/tmpFileAsync'
import htmlToPdf, { PdfOptions } from './utils/htmlToPdf'
import EInvoiceTypeError from './errors/EInvoiceTypeError'
import xsltproc, { XsltprocOptions } from './utils/xsltproc'
class XsltRenderer {
private xmlBuffer: Buffer | undefined
constructor(
private readonly xsltFilePath: string,
private readonly getXmlBuffer: () => Promise<Buffer>,
private readonly xsltprocOptions?: XsltprocOptions
) {}
/**
* XSLT şablonunun pdf çıktısını verir.
*/
async toPdf(options?: PdfOptions): Promise<Buffer> {
const htmlBuffer = await this.toHtml()
return htmlToPdf(htmlBuffer.toString('utf-8'), options)
}
/**
* XSLT şablonunun html çıktısını verir.
*/
toHtml(): Promise<Buffer> {
return this.render()
}
/**
* İlgili faturaya ait xml çıktısını verir.
*/
async toXml(): Promise<Buffer> {
if (!this.xmlBuffer) {
this.xmlBuffer = await this.getXmlBuffer()
}
if (!this.xmlBuffer) {
throw new EInvoiceTypeError('Faturaya ait xml içeriği yüklenemedi.')
}
const filename = path.basename(this.xsltFilePath)
const xsltBase64String = await this.xsltToBase64Encoded()
return Buffer.from(
this.xmlBuffer
.toString('utf-8')
.replace(
/<(cbc:EmbeddedDocumentBinaryObject)\s(.*?)\sfilename=".*">.*<\/cbc:EmbeddedDocumentBinaryObject>/g,
`<$1 $2 filename="${filename}">${xsltBase64String}</$1>`
)
)
}
/**
* XSLT şablonunun içeriğini verir.
*/
getXsltContent(): Promise<Buffer> {
return fs.readFile(this.xsltFilePath)
}
/**
* XSLT şablonunun base64 ile kodlanmış içeriğini verir.
*/
xsltToBase64Encoded(): Promise<string> {
return fs.readFile(this.xsltFilePath, 'base64url')
}
private async render(): Promise<Buffer> {
const xmlTmpFile = await tmpFileAsync()
const xmlBuffer = await this.toXml()
await fs.writeFile(xmlTmpFile.name, xmlBuffer, 'utf-8')
return xsltproc(
[this.xsltFilePath, xmlTmpFile.name],
this.xsltprocOptions
).finally(() => xmlTmpFile.cleanup())
}
}
export default XsltRenderer