You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.5 KiB
JavaScript
50 lines
1.5 KiB
JavaScript
'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 {
|
|
|
|
}
|
|
};
|