Reorganization and cleanup
parent
80d0fc828d
commit
4cdd2eaff6
@ -1,49 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
const componentsToLines = require("./parser/to-lines");
|
||||
const findAlignment = require("./parser/find-alignment");
|
||||
const generateStyle = require("./parser/generate-style");
|
||||
const fromTree = require("./parser/from-tree");
|
||||
const tagParser = require("./parser/tag-parser");
|
||||
const measureText = require("./render/measure-text");
|
||||
|
||||
module.exports = function layoutFormattedText(text, options) {
|
||||
if (options.tags === true) {
|
||||
let tree = tagParser.parse(text);
|
||||
|
||||
let lines = componentsToLines(fromTree(tree)).map((lineItems) => {
|
||||
let measuredItems = lineItems.map((item) => {
|
||||
let generatedStyle = generateStyle(item, {
|
||||
classes: options.classes,
|
||||
defaultStyle: options.defaultStyle
|
||||
});
|
||||
|
||||
return Object.assign({
|
||||
measurements: measureText(item.text, generatedStyle),
|
||||
style: generatedStyle
|
||||
}, item);
|
||||
});
|
||||
|
||||
let combinedWidth = measuredItems.reduce((total, item) => {
|
||||
return total + item.measurements.width;
|
||||
}, 0);
|
||||
|
||||
let lineHeight = Math.max.apply(null, measuredItems.map(item => item.measurements.height));
|
||||
let lineMinAscender = Math.min.apply(null, measuredItems.map(item => item.measurements.ascender));
|
||||
let lineMaxDescender = Math.max.apply(null, measuredItems.map(item => item.measurements.descender));
|
||||
|
||||
return {
|
||||
alignment: (lineItems.length > 0) ? findAlignment(lineItems[0]) : null,
|
||||
items: measuredItems,
|
||||
height: lineHeight,
|
||||
width: combinedWidth,
|
||||
minAscender: lineMinAscender,
|
||||
maxDescender: lineMaxDescender
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
}
|
||||
};
|
@ -0,0 +1,12 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = function adjustLineHeights(lines, lineHeight) {
|
||||
return lines.map((line, i) => {
|
||||
if (i !== lines.length - 1) {
|
||||
return line.height * lineHeight * 1.13;
|
||||
} else {
|
||||
/* The last line doesn't get a lineHeight multiplier... */
|
||||
return line.height * 1.13;
|
||||
}
|
||||
});
|
||||
};
|
@ -0,0 +1,102 @@
|
||||
'use strict';
|
||||
|
||||
const parser = require("../parser");
|
||||
const findAlignment = require("../parser/find-alignment");
|
||||
const generateStyle = require("../parser/generate-style");
|
||||
const measureText = require("../render/measure-text");
|
||||
const adjustLineHeights = require("./adjust-line-heights");
|
||||
|
||||
const sum = require("../util/sum");
|
||||
const min = require("../util/min");
|
||||
const max = require("../util/max");
|
||||
|
||||
module.exports = function layoutFormattedText(text, options) {
|
||||
if (options.tags === true) {
|
||||
let lines = parser(text).map((lineItems) => {
|
||||
let measuredItems = lineItems.map((item) => {
|
||||
let generatedStyle = generateStyle(item, {
|
||||
classes: options.classes,
|
||||
defaultStyle: options.defaultStyle
|
||||
});
|
||||
|
||||
return Object.assign({
|
||||
measurements: measureText(item.text, generatedStyle),
|
||||
style: generatedStyle
|
||||
}, item);
|
||||
});
|
||||
|
||||
return {
|
||||
alignment: (lineItems.length > 0) ? findAlignment(lineItems[0]) : null,
|
||||
items: measuredItems,
|
||||
height: max(measuredItems.map(item => item.measurements.height)),
|
||||
width: sum(measuredItems.map(item => item.measurements.width)),
|
||||
minAscender: min(measuredItems.map(item => item.measurements.ascender)),
|
||||
maxDescender: max(measuredItems.map(item => item.measurements.descender))
|
||||
}
|
||||
});
|
||||
|
||||
let adjustedLineHeights = adjustLineHeights(lines, options.lineHeight);
|
||||
|
||||
let currentLineOffset = 0;
|
||||
let currentComponentOffset = 0;
|
||||
|
||||
let positionedItems = lines.reduce((items, line, i) => {
|
||||
let newItems = items.concat(line.items.map((item) => {
|
||||
let positionedItem = Object.assign({
|
||||
x: currentComponentOffset,
|
||||
y: currentLineOffset - line.minAscender
|
||||
}, item);
|
||||
|
||||
currentComponentOffset += item.measurements.width;
|
||||
return positionedItem;
|
||||
}));
|
||||
|
||||
currentLineOffset += adjustedLineHeights[i];
|
||||
currentComponentOffset = 0;
|
||||
|
||||
return newItems;
|
||||
}, []);
|
||||
|
||||
return {
|
||||
width: Math.ceil(max(lines.map(line => line.width))),
|
||||
height: Math.ceil(sum(adjustedLineHeights)),
|
||||
items: positionedItems
|
||||
}
|
||||
} else {
|
||||
let lines = text.split("\n").map((line) => {
|
||||
return {
|
||||
text: line,
|
||||
measurements: measureText(line, options.defaultStyle)
|
||||
};
|
||||
});
|
||||
|
||||
let adjustedLineHeights = adjustLineHeights(lines.map((line) => {
|
||||
return {
|
||||
text: line.text,
|
||||
height: line.measurements.height
|
||||
}
|
||||
}), options.lineHeight);
|
||||
|
||||
let currentLineOffset = 0;
|
||||
|
||||
let positionedItems = lines.map((line, i) => {
|
||||
let newItem = {
|
||||
text: line.text,
|
||||
measurements: line.measurements,
|
||||
style: options.defaultStyle,
|
||||
x: 0,
|
||||
y: currentLineOffset - line.measurements.ascender
|
||||
}
|
||||
|
||||
currentLineOffset += adjustedLineHeights[i];
|
||||
|
||||
return newItem;
|
||||
});
|
||||
|
||||
return {
|
||||
width: Math.ceil(max(lines.map(line => line.measurements.width))),
|
||||
height: Math.ceil(sum(adjustedLineHeights)),
|
||||
items: positionedItems
|
||||
}
|
||||
}
|
||||
};
|
@ -0,0 +1,9 @@
|
||||
'use strict';
|
||||
|
||||
const componentsToLines = require("./to-lines");
|
||||
const fromTree = require("./from-tree");
|
||||
const tagParser = require("./tag-parser");
|
||||
|
||||
module.exports = function parseTextToLines(text) {
|
||||
return componentsToLines(fromTree(tagParser.parse(text)));
|
||||
};
|
@ -0,0 +1,5 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = function max(values) {
|
||||
return Math.max(...values);
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = function min(values) {
|
||||
return Math.min(...values);
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = function sum(values) {
|
||||
return values.reduce((total, value) => {
|
||||
return total + value;
|
||||
}, 0);
|
||||
};
|
Loading…
Reference in New Issue