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