From 8dc3ed6a175374923097f74a3800dc5e0e4a487a Mon Sep 17 00:00:00 2001 From: "xTCry [Vladislav Kh]" Date: Sat, 6 Jul 2024 16:50:57 +0300 Subject: [PATCH] chore(metadata): improve tabulating for drawing xml tree combine `xmlns:xmp`, `xmlns:pdf`, `xmlns:dc` into to one `rdf:Description` --- lib/metadata.js | 25 +++++---- lib/mixins/metadata.js | 116 ++++++++++++++++++++++------------------- lib/mixins/pdfa.js | 12 ++--- lib/mixins/pdfua.js | 6 +-- lib/string.js | 12 +++++ 5 files changed, 97 insertions(+), 74 deletions(-) create mode 100644 lib/string.js diff --git a/lib/metadata.js b/lib/metadata.js index 0742bd50..1b8736e7 100644 --- a/lib/metadata.js +++ b/lib/metadata.js @@ -1,25 +1,28 @@ +import { sfix } from "./string" class PDFMetadata { constructor() { - this._metadata = ` + this._metadata = sfix` - - + + + `; } - + _closeTags() { - this._metadata = this._metadata.concat(` - + this._metadata = this._metadata.concat( + ' \n' + + sfix` - - `); + `, + ); } - append(xml, newline=true) { - this._metadata = this._metadata.concat(xml); + append(xml, newline = true) { + this._metadata = this._metadata.concat(xml); if (newline) - this._metadata = this._metadata.concat('\n'); + this._metadata = this._metadata.concat('\n'); } getXML() { return this._metadata; } diff --git a/lib/mixins/metadata.js b/lib/mixins/metadata.js index cf8a9bbd..ede9c7be 100644 --- a/lib/mixins/metadata.js +++ b/lib/mixins/metadata.js @@ -1,93 +1,101 @@ import PDFMetadata from "../metadata" +import { sfix } from "../string" export default { initMetadata() { this.metadata = new PDFMetadata(); }, - appendXML(xml, newline=true) { this.metadata.append(xml,newline); }, + appendXML(xml, tabs = 0, newline = true) { + tabs += 2 + xml = xml.split('\n').map(x => ' '.repeat(4).repeat(tabs) + x).join('\n'); + this.metadata.append(xml, newline); + }, _addInfo() { - this.appendXML(` - - `); - this.appendXML(` - ${this.info.CreationDate.toISOString().split('.')[0]+"Z"}` + this.appendXML( + sfix` + `, + 0, + ); + this.appendXML( + sfix` + ${this.info.CreationDate.toISOString().split('.')[0] + 'Z'}`, + 1, ); if (this.info.Creator) { - this.appendXML(` - ${this.info.Creator}` + this.appendXML( + sfix` + ${this.info.Creator}`, + 1, ); } - this.appendXML(` - - `); - - if (this.info.Title || this.info.Author || this.info.Subject) { - this.appendXML(` - - `); - - if (this.info.Title) { - this.appendXML(` + if (this.info.Title) { + this.appendXML( + sfix` ${this.info.Title} - - `); - } + `, + 1, + ); + } - if (this.info.Author) { - this.appendXML(` + if (this.info.Author) { + this.appendXML( + sfix` ${this.info.Author} - - `); - } + `, + 1, + ); + } - if (this.info.Subject) { - this.appendXML(` + if (this.info.Subject) { + this.appendXML( + sfix` ${this.info.Subject} - - `); - } - - this.appendXML(` - - `); + `, + 1, + ); } - if (this.info.Producer || this.info.Keywords) { - this.appendXML(` - - `); - - if (this.info.Producer) { - this.appendXML(` - ${this.info.Producer}`, false); - } - - if (this.info.Keywords) { - this.appendXML(` - ${this.info.Keywords}`, false); - } + if (this.info.Producer) { + this.appendXML( + sfix` + ${this.info.Producer}`, + 1, + ); + } - this.appendXML(` - - `); + if (this.info.Keywords) { + this.appendXML( + sfix` + ${this.info.Keywords}`, + 1, + ); } + + this.appendXML( + sfix` + `, + 0, + ); }, endMetadata() { this._addInfo(); - + this.metadata.end(); /* diff --git a/lib/mixins/pdfa.js b/lib/mixins/pdfa.js index f06dfc4a..7d9aea40 100644 --- a/lib/mixins/pdfa.js +++ b/lib/mixins/pdfa.js @@ -1,4 +1,5 @@ import fs from 'fs'; +import { sfix } from "../string" export default { initPDFA(pSubset) { @@ -42,12 +43,11 @@ export default { }, _getPdfaid() { - return ` - - ${this.subset} - ${this.subset_conformance} - - `; + return sfix` + + ${this.subset} + ${this.subset_conformance} + `; }, _addPdfaMetadata() { diff --git a/lib/mixins/pdfua.js b/lib/mixins/pdfua.js index 89fd9e3a..f86009b4 100644 --- a/lib/mixins/pdfua.js +++ b/lib/mixins/pdfua.js @@ -1,3 +1,4 @@ +import { sfix } from "../string" export default { @@ -14,11 +15,10 @@ export default { }, _getPdfuaid() { - return ` + return sfix` ${this.subset} - - `; + `; }, } \ No newline at end of file diff --git a/lib/string.js b/lib/string.js new file mode 100644 index 00000000..d60cb9db --- /dev/null +++ b/lib/string.js @@ -0,0 +1,12 @@ + +export const sfix = (strings, ...expressions) => { + const indent = !strings[0].startsWith('\n') + ? null + : new RegExp(`\n {${strings[0].match(/\n+( *)/)[1].length}}`, 'g'); + return expressions + .reduce( + (acc, expr, i) => `${acc}${expr}${strings[i + 1].replace(indent, '\n')}`, + strings[0].replace(indent, '\n'), + ) + .replace(/^\n|\n$/g, ''); +}; \ No newline at end of file