Show More
Commit Description:
utf8mb4
Commit Description:
utf8mb4
References:
File last commit:
Show/Diff file:
Action:
node_modules/pdfmake/src/docPreprocessor.js
| 255 lines
| 6.5 KiB
| application/javascript
| JavascriptLexer
|
r789 | 'use strict'; | |||
var isString = require('./helpers').isString; | ||||
var isNumber = require('./helpers').isNumber; | ||||
var isBoolean = require('./helpers').isBoolean; | ||||
var isArray = require('./helpers').isArray; | ||||
var isUndefined = require('./helpers').isUndefined; | ||||
var fontStringify = require('./helpers').fontStringify; | ||||
function DocPreprocessor() { | ||||
} | ||||
DocPreprocessor.prototype.preprocessDocument = function (docStructure) { | ||||
this.parentNode = null; | ||||
this.tocs = []; | ||||
this.nodeReferences = []; | ||||
return this.preprocessNode(docStructure); | ||||
}; | ||||
DocPreprocessor.prototype.preprocessNode = function (node) { | ||||
// expand shortcuts and casting values | ||||
if (isArray(node)) { | ||||
node = { stack: node }; | ||||
} else if (isString(node)) { | ||||
node = { text: node }; | ||||
} else if (isNumber(node) || isBoolean(node)) { | ||||
node = { text: node.toString() }; | ||||
} else if (node === undefined || node === null) { | ||||
node = { text: '' }; | ||||
} else if (Object.keys(node).length === 0) { // empty object | ||||
node = { text: '' }; | ||||
} else if ('text' in node && (node.text === undefined || node.text === null)) { | ||||
node.text = ''; | ||||
} | ||||
if (node.columns) { | ||||
return this.preprocessColumns(node); | ||||
} else if (node.stack) { | ||||
return this.preprocessVerticalContainer(node); | ||||
} else if (node.ul) { | ||||
return this.preprocessList(node); | ||||
} else if (node.ol) { | ||||
return this.preprocessList(node); | ||||
} else if (node.table) { | ||||
return this.preprocessTable(node); | ||||
} else if (node.text !== undefined) { | ||||
return this.preprocessText(node); | ||||
} else if (node.toc) { | ||||
return this.preprocessToc(node); | ||||
} else if (node.image) { | ||||
return this.preprocessImage(node); | ||||
} else if (node.svg) { | ||||
return this.preprocessSVG(node); | ||||
} else if (node.canvas) { | ||||
return this.preprocessCanvas(node); | ||||
} else if (node.qr) { | ||||
return this.preprocessQr(node); | ||||
} else if (node.pageReference || node.textReference) { | ||||
return this.preprocessText(node); | ||||
} else { | ||||
throw 'Unrecognized document structure: ' + JSON.stringify(node, fontStringify); | ||||
} | ||||
}; | ||||
DocPreprocessor.prototype.preprocessColumns = function (node) { | ||||
var columns = node.columns; | ||||
for (var i = 0, l = columns.length; i < l; i++) { | ||||
columns[i] = this.preprocessNode(columns[i]); | ||||
} | ||||
return node; | ||||
}; | ||||
DocPreprocessor.prototype.preprocessVerticalContainer = function (node) { | ||||
var items = node.stack; | ||||
for (var i = 0, l = items.length; i < l; i++) { | ||||
items[i] = this.preprocessNode(items[i]); | ||||
} | ||||
return node; | ||||
}; | ||||
DocPreprocessor.prototype.preprocessList = function (node) { | ||||
var items = node.ul || node.ol; | ||||
for (var i = 0, l = items.length; i < l; i++) { | ||||
items[i] = this.preprocessNode(items[i]); | ||||
} | ||||
return node; | ||||
}; | ||||
DocPreprocessor.prototype.preprocessTable = function (node) { | ||||
var col, row, cols, rows; | ||||
for (col = 0, cols = node.table.body[0].length; col < cols; col++) { | ||||
for (row = 0, rows = node.table.body.length; row < rows; row++) { | ||||
var rowData = node.table.body[row]; | ||||
var data = rowData[col]; | ||||
if (data !== undefined) { | ||||
if (data === null) { // transform to object | ||||
data = ''; | ||||
} | ||||
if (!data._span) { | ||||
rowData[col] = this.preprocessNode(data); | ||||
} | ||||
} | ||||
} | ||||
} | ||||
return node; | ||||
}; | ||||
DocPreprocessor.prototype.preprocessText = function (node) { | ||||
if (node.tocItem) { | ||||
if (!isArray(node.tocItem)) { | ||||
node.tocItem = [node.tocItem]; | ||||
} | ||||
for (var i = 0, l = node.tocItem.length; i < l; i++) { | ||||
if (!isString(node.tocItem[i])) { | ||||
node.tocItem[i] = '_default_'; | ||||
} | ||||
var tocItemId = node.tocItem[i]; | ||||
if (!this.tocs[tocItemId]) { | ||||
this.tocs[tocItemId] = { toc: { _items: [], _pseudo: true } }; | ||||
} | ||||
if (!node.id) { | ||||
node.id = 'toc-' + tocItemId + '-' + this.tocs[tocItemId].toc._items.length; | ||||
} | ||||
var tocItemRef = { | ||||
_nodeRef: this._getNodeForNodeRef(node), | ||||
_textNodeRef: node | ||||
}; | ||||
this.tocs[tocItemId].toc._items.push(tocItemRef); | ||||
} | ||||
} | ||||
if (node.id) { | ||||
if (this.nodeReferences[node.id]) { | ||||
if (!this.nodeReferences[node.id]._pseudo) { | ||||
throw "Node id '" + node.id + "' already exists"; | ||||
} | ||||
this.nodeReferences[node.id]._nodeRef = this._getNodeForNodeRef(node); | ||||
this.nodeReferences[node.id]._textNodeRef = node; | ||||
this.nodeReferences[node.id]._pseudo = false; | ||||
} else { | ||||
this.nodeReferences[node.id] = { | ||||
_nodeRef: this._getNodeForNodeRef(node), | ||||
_textNodeRef: node | ||||
}; | ||||
} | ||||
} | ||||
if (node.pageReference) { | ||||
if (!this.nodeReferences[node.pageReference]) { | ||||
this.nodeReferences[node.pageReference] = { | ||||
_nodeRef: {}, | ||||
_textNodeRef: {}, | ||||
_pseudo: true | ||||
}; | ||||
} | ||||
node.text = '00000'; | ||||
node.linkToDestination = node.pageReference; | ||||
node._pageRef = this.nodeReferences[node.pageReference]; | ||||
} | ||||
if (node.textReference) { | ||||
if (!this.nodeReferences[node.textReference]) { | ||||
this.nodeReferences[node.textReference] = { _nodeRef: {}, _pseudo: true }; | ||||
} | ||||
node.text = ''; | ||||
node.linkToDestination = node.textReference; | ||||
node._textRef = this.nodeReferences[node.textReference]; | ||||
} | ||||
if (node.text && node.text.text) { | ||||
node.text = [this.preprocessNode(node.text)]; | ||||
} else if (isArray(node.text)) { | ||||
var isSetParentNode = false; | ||||
if (this.parentNode === null) { | ||||
this.parentNode = node; | ||||
isSetParentNode = true; | ||||
} | ||||
for (var i = 0, l = node.text.length; i < l; i++) { | ||||
node.text[i] = this.preprocessNode(node.text[i]); | ||||
} | ||||
if (isSetParentNode) { | ||||
this.parentNode = null; | ||||
} | ||||
} | ||||
return node; | ||||
}; | ||||
DocPreprocessor.prototype.preprocessToc = function (node) { | ||||
if (!node.toc.id) { | ||||
node.toc.id = '_default_'; | ||||
} | ||||
node.toc.title = node.toc.title ? this.preprocessNode(node.toc.title) : null; | ||||
node.toc._items = []; | ||||
if (this.tocs[node.toc.id]) { | ||||
if (!this.tocs[node.toc.id].toc._pseudo) { | ||||
throw "TOC '" + node.toc.id + "' already exists"; | ||||
} | ||||
node.toc._items = this.tocs[node.toc.id].toc._items; | ||||
} | ||||
this.tocs[node.toc.id] = node; | ||||
return node; | ||||
}; | ||||
DocPreprocessor.prototype.preprocessImage = function (node) { | ||||
if (!isUndefined(node.image.type) && !isUndefined(node.image.data) && (node.image.type === 'Buffer') && isArray(node.image.data)) { | ||||
node.image = Buffer.from(node.image.data); | ||||
} | ||||
return node; | ||||
}; | ||||
DocPreprocessor.prototype.preprocessSVG = function (node) { | ||||
return node; | ||||
}; | ||||
DocPreprocessor.prototype.preprocessCanvas = function (node) { | ||||
return node; | ||||
}; | ||||
DocPreprocessor.prototype.preprocessQr = function (node) { | ||||
return node; | ||||
}; | ||||
DocPreprocessor.prototype._getNodeForNodeRef = function (node) { | ||||
if (this.parentNode) { | ||||
return this.parentNode; | ||||
} | ||||
return node; | ||||
} | ||||
module.exports = DocPreprocessor; | ||||