pdfmake
Version:
Client/server side PDF printing in pure JavaScript
139 lines (136 loc) • 3.61 kB
JavaScript
;
exports.__esModule = true;
exports.default = void 0;
var _linebreak = _interopRequireDefault(require("@foliojs-fork/linebreak"));
var _variableType = require("./helpers/variableType");
var _StyleContextStack = _interopRequireDefault(require("./StyleContextStack"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/**
* @param {string} text
* @param {boolean} noWrap
* @returns {Array}
*/
const splitWords = (text, noWrap) => {
let words = [];
if (noWrap) {
words.push({
text: text
});
return words;
}
let breaker = new _linebreak.default(text);
let last = 0;
let bk;
while (bk = breaker.nextBreak()) {
let word = text.slice(last, bk.position);
if (bk.required || word.match(/\r?\n$|\r$/)) {
// new line
word = word.replace(/\r?\n$|\r$/, '');
words.push({
text: word,
lineEnd: true
});
} else {
words.push({
text: word
});
}
last = bk.position;
}
return words;
};
/**
* @param {Array} words
* @param {boolean} noWrap
* @returns {?string}
*/
const getFirstWord = (words, noWrap) => {
let word = words[0];
if (word === undefined) {
return null;
}
if (noWrap) {
// text was not wrapped, we need only first word
let tmpWords = splitWords(word.text, false);
if (tmpWords[0] === undefined) {
return null;
}
word = tmpWords[0];
}
return word.text;
};
/**
* @param {Array} words
* @param {boolean} noWrap
* @returns {?string}
*/
const getLastWord = (words, noWrap) => {
let word = words[words.length - 1];
if (word === undefined) {
return null;
}
if (word.lineEnd) {
return null;
}
if (noWrap) {
// text was not wrapped, we need only last word
let tmpWords = splitWords(word.text, false);
if (tmpWords[tmpWords.length - 1] === undefined) {
return null;
}
word = tmpWords[tmpWords.length - 1];
}
return word.text;
};
class TextBreaker {
/**
* @param {string|Array} texts
* @param {StyleContextStack} styleContextStack
* @returns {Array}
*/
getBreaks(texts, styleContextStack) {
let results = [];
if (!Array.isArray(texts)) {
texts = [texts];
}
let lastWord = null;
for (let i = 0, l = texts.length; i < l; i++) {
let item = texts[i];
let style = null;
let words;
let noWrap = _StyleContextStack.default.getStyleProperty(item || {}, styleContextStack, 'noWrap', false);
if ((0, _variableType.isObject)(item)) {
if (item._textRef && item._textRef._textNodeRef.text) {
item.text = item._textRef._textNodeRef.text;
}
words = splitWords(item.text, noWrap);
style = _StyleContextStack.default.copyStyle(item);
} else {
words = splitWords(item, noWrap);
}
if (lastWord && words.length) {
let firstWord = getFirstWord(words, noWrap);
let wrapWords = splitWords(lastWord + firstWord, false);
if (wrapWords.length === 1) {
results[results.length - 1].noNewLine = true;
}
}
for (let i2 = 0, l2 = words.length; i2 < l2; i2++) {
let result = {
text: words[i2].text
};
if (words[i2].lineEnd) {
result.lineEnd = true;
}
_StyleContextStack.default.copyStyle(style, result);
results.push(result);
}
lastWord = null;
if (i + 1 < l) {
lastWord = getLastWord(words, noWrap);
}
}
return results;
}
}
var _default = exports.default = TextBreaker;