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

'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 {
}
};