(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}return e})()({1:[function(require,module,exports){ (function (global){ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.MultiStyleText = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ module.exports = require("./pixi-multistyle-text").default; },{"./pixi-multistyle-text":2}],2:[function(require,module,exports){ var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); (function (factory) { if (typeof module === "object" && typeof module.exports === "object") { var v = factory(require, exports); if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { define(["require", "exports"], factory); } })(function (require, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var MultiStyleText = (function (_super) { __extends(MultiStyleText, _super); function MultiStyleText(text, styles) { var _this = _super.call(this, text) || this; _this.styles = styles; return _this; } Object.defineProperty(MultiStyleText.prototype, "styles", { set: function (styles) { this.textStyles = {}; this.textStyles["default"] = this.assign({}, MultiStyleText.DEFAULT_TAG_STYLE); for (var style in styles) { if (style === "default") { this.assign(this.textStyles["default"], styles[style]); } else { this.textStyles[style] = this.assign({}, styles[style]); } } this._style = new PIXI.TextStyle(this.textStyles["default"]); this.dirty = true; }, enumerable: true, configurable: true }); MultiStyleText.prototype.setTagStyle = function (tag, style) { if (tag in this.textStyles) { this.assign(this.textStyles[tag], style); } else { this.textStyles[tag] = this.assign({}, style); } this._style = new PIXI.TextStyle(this.textStyles["default"]); this.dirty = true; }; MultiStyleText.prototype.deleteTagStyle = function (tag) { if (tag === "default") { this.textStyles["default"] = this.assign({}, MultiStyleText.DEFAULT_TAG_STYLE); } else { delete this.textStyles[tag]; } this._style = new PIXI.TextStyle(this.textStyles["default"]); this.dirty = true; }; MultiStyleText.prototype._getTextDataPerLine = function (lines) { var outputTextData = []; var tags = Object.keys(this.textStyles).join("|"); var re = new RegExp("</?(" + tags + ")>", "g"); var styleStack = [this.assign({}, this.textStyles["default"])]; var tagNameStack = ["default"]; for (var i = 0; i < lines.length; i++) { var lineTextData = []; var matches = []; var matchArray = void 0; while (matchArray = re.exec(lines[i])) { matches.push(matchArray); } if (matches.length === 0) { lineTextData.push(this.createTextData(lines[i], styleStack[styleStack.length - 1], tagNameStack[tagNameStack.length - 1])); } else { var currentSearchIdx = 0; for (var j = 0; j < matches.length; j++) { if (matches[j].index > currentSearchIdx) { lineTextData.push(this.createTextData(lines[i].substring(currentSearchIdx, matches[j].index), styleStack[styleStack.length - 1], tagNameStack[tagNameStack.length - 1])); } if (matches[j][0][1] === "/") { if (styleStack.length > 1) { styleStack.pop(); tagNameStack.pop(); } } else { styleStack.push(this.assign({}, styleStack[styleStack.length - 1], this.textStyles[matches[j][1]])); tagNameStack.push(matches[j][1]); } currentSearchIdx = matches[j].index + matches[j][0].length; } if (currentSearchIdx < lines[i].length) { lineTextData.push(this.createTextData(lines[i].substring(currentSearchIdx), styleStack[styleStack.length - 1], tagNameStack[tagNameStack.length - 1])); } } outputTextData.push(lineTextData); } return outputTextData; }; MultiStyleText.prototype.getFontString = function (style) { return new PIXI.TextStyle(style).toFontString(); }; MultiStyleText.prototype.createTextData = function (text, style, tagName) { return { text: text, style: style, width: 0, height: 0, fontProperties: undefined, tagName: tagName }; }; MultiStyleText.prototype.getDropShadowPadding = function () { var _this = this; var maxDistance = 0; var maxBlur = 0; Object.keys(this.textStyles).forEach(function (styleKey) { var _a = _this.textStyles[styleKey], dropShadowDistance = _a.dropShadowDistance, dropShadowBlur = _a.dropShadowBlur; maxDistance = Math.max(maxDistance, dropShadowDistance || 0); maxBlur = Math.max(maxBlur, dropShadowBlur || 0); }); return maxDistance + maxBlur; }; MultiStyleText.prototype.updateText = function () { var _this = this; if (!this.dirty) { return; } this.texture.baseTexture.resolution = this.resolution; var textStyles = this.textStyles; var outputText = this.text; if (this._style.wordWrap) { outputText = this.wordWrap(this.text); } var lines = outputText.split(/(?:\r\n|\r|\n)/); var outputTextData = this._getTextDataPerLine(lines); var lineWidths = []; var lineYMins = []; var lineYMaxs = []; var baselines = []; var maxLineWidth = 0; for (var i = 0; i < lines.length; i++) { var lineWidth = 0; var lineYMin = 0; var lineYMax = 0; var baseline = 0; for (var j = 0; j < outputTextData[i].length; j++) { var sty = outputTextData[i][j].style; this.context.font = this.getFontString(sty); outputTextData[i][j].width = this.context.measureText(outputTextData[i][j].text).width; if (outputTextData[i][j].text.length === 0) { outputTextData[i][j].width += (outputTextData[i][j].text.length - 1) * sty.letterSpacing; if (j > 0) { lineWidth += sty.letterSpacing / 2; } if (j < outputTextData[i].length - 1) { lineWidth += sty.letterSpacing / 2; } } lineWidth += outputTextData[i][j].width; outputTextData[i][j].fontProperties = PIXI.TextMetrics.measureFont(this.context.font); outputTextData[i][j].height = outputTextData[i][j].fontProperties.fontSize + outputTextData[i][j].style.strokeThickness; if (typeof sty.valign === "number") { lineYMin = Math.min(lineYMin, sty.valign - outputTextData[i][j].fontProperties.descent); lineYMax = Math.max(lineYMax, sty.valign + outputTextData[i][j].fontProperties.ascent); } else { lineYMin = Math.min(lineYMin, -outputTextData[i][j].fontProperties.descent); lineYMax = Math.max(lineYMax, outputTextData[i][j].fontProperties.ascent); } } lineWidths[i] = lineWidth; lineYMins[i] = lineYMin; lineYMaxs[i] = lineYMax; maxLineWidth = Math.max(maxLineWidth, lineWidth); } var stylesArray = Object.keys(textStyles).map(function (key) { return textStyles[key]; }); var maxStrokeThickness = stylesArray.reduce(function (prev, cur) { return Math.max(prev, cur.strokeThickness || 0); }, 0); var dropShadowPadding = this.getDropShadowPadding(); var totalHeight = lineYMaxs.reduce(function (prev, cur) { return prev + cur; }, 0) - lineYMins.reduce(function (prev, cur) { return prev + cur; }, 0); var width = maxLineWidth + maxStrokeThickness + 2 * dropShadowPadding; var height = totalHeight + 2 * dropShadowPadding; this.canvas.width = (width + this.context.lineWidth) * this.resolution; this.canvas.height = height * this.resolution; this.context.scale(this.resolution, this.resolution); this.context.textBaseline = "alphabetic"; this.context.lineJoin = "round"; var basePositionY = dropShadowPadding; var drawingData = []; for (var i = 0; i < outputTextData.length; i++) { var line = outputTextData[i]; var linePositionX = void 0; switch (this._style.align) { case "left": linePositionX = dropShadowPadding; break; case "center": linePositionX = dropShadowPadding + (maxLineWidth - lineWidths[i]) / 2; break; case "right": linePositionX = dropShadowPadding + maxLineWidth - lineWidths[i]; break; } for (var j = 0; j < line.length; j++) { var _a = line[j], style = _a.style, text = _a.text, fontProperties = _a.fontProperties, width_1 = _a.width, height_1 = _a.height, tagName = _a.tagName; linePositionX += maxStrokeThickness / 2; var linePositionY = maxStrokeThickness / 2 + basePositionY + fontProperties.ascent; switch (style.valign) { case "top": break; case "baseline": linePositionY += lineYMaxs[i] - fontProperties.ascent; break; case "middle": linePositionY += (lineYMaxs[i] - lineYMins[i] - fontProperties.ascent - fontProperties.descent) / 2; break; case "bottom": linePositionY += lineYMaxs[i] - lineYMins[i] - fontProperties.ascent - fontProperties.descent; break; default: linePositionY += lineYMaxs[i] - fontProperties.ascent - style.valign; break; } if (style.letterSpacing === 0) { drawingData.push({ text: text, style: style, x: linePositionX, y: linePositionY, width: width_1, ascent: fontProperties.ascent, descent: fontProperties.descent, tagName: tagName }); linePositionX += line[j].width; } else { this.context.font = this.getFontString(line[j].style); for (var k = 0; k < text.length; k++) { if (k > 0 || j > 0) { linePositionX += style.letterSpacing / 2; } drawingData.push({ text: text.charAt(k), style: style, x: linePositionX, y: linePositionY, width: width_1, ascent: fontProperties.ascent, descent: fontProperties.descent, tagName: tagName }); linePositionX += this.context.measureText(text.charAt(k)).width; if (k < text.length - 1 || j < line.length - 1) { linePositionX += style.letterSpacing / 2; } } } linePositionX -= maxStrokeThickness / 2; } basePositionY += lineYMaxs[i] - lineYMins[i]; } this.context.save(); drawingData.forEach(function (_a) { var style = _a.style, text = _a.text, x = _a.x, y = _a.y; if (!style.dropShadow) { return; } _this.context.font = _this.getFontString(style); var dropFillStyle = style.dropShadowColor; if (typeof dropFillStyle === "number") { dropFillStyle = PIXI.utils.hex2string(dropFillStyle); } _this.context.shadowColor = dropFillStyle; _this.context.shadowBlur = style.dropShadowBlur; _this.context.shadowOffsetX = Math.cos(style.dropShadowAngle) * style.dropShadowDistance * _this.resolution; _this.context.shadowOffsetY = Math.sin(style.dropShadowAngle) * style.dropShadowDistance * _this.resolution; _this.context.fillText(text, x, y); }); this.context.restore(); drawingData.forEach(function (_a) { var style = _a.style, text = _a.text, x = _a.x, y = _a.y, width = _a.width, ascent = _a.ascent, descent = _a.descent, tagName = _a.tagName; _this.context.font = _this.getFontString(style); var strokeStyle = style.stroke; if (typeof strokeStyle === "number") { strokeStyle = PIXI.utils.hex2string(strokeStyle); } _this.context.strokeStyle = strokeStyle; _this.context.lineWidth = style.strokeThickness; var fillStyle = style.fill; if (typeof fillStyle === "number") { fillStyle = PIXI.utils.hex2string(fillStyle); } else if (Array.isArray(fillStyle)) { for (var i = 0; i < fillStyle.length; i++) { var fill = fillStyle[i]; if (typeof fill === "number") { fillStyle[i] = PIXI.utils.hex2string(fill); } } } _this.context.fillStyle = _this._generateFillStyle(new PIXI.TextStyle(style), [text]); if (style.stroke && style.strokeThickness) { _this.context.strokeText(text, x, y); } if (style.fill) { _this.context.fillText(text, x, y); } var debugSpan = style.debug === undefined ? MultiStyleText.debugOptions.spans.enabled : style.debug; if (debugSpan) { _this.context.lineWidth = 1; if (MultiStyleText.debugOptions.spans.bounding) { _this.context.fillStyle = MultiStyleText.debugOptions.spans.bounding; _this.context.strokeStyle = MultiStyleText.debugOptions.spans.bounding; _this.context.beginPath(); _this.context.rect(x, y - ascent, width, ascent + descent); _this.context.fill(); _this.context.stroke(); _this.context.stroke(); } if (MultiStyleText.debugOptions.spans.baseline) { _this.context.strokeStyle = MultiStyleText.debugOptions.spans.baseline; _this.context.beginPath(); _this.context.moveTo(x, y); _this.context.lineTo(x + width, y); _this.context.closePath(); _this.context.stroke(); } if (MultiStyleText.debugOptions.spans.top) { _this.context.strokeStyle = MultiStyleText.debugOptions.spans.top; _this.context.beginPath(); _this.context.moveTo(x, y - ascent); _this.context.lineTo(x + width, y - ascent); _this.context.closePath(); _this.context.stroke(); } if (MultiStyleText.debugOptions.spans.bottom) { _this.context.strokeStyle = MultiStyleText.debugOptions.spans.bottom; _this.context.beginPath(); _this.context.moveTo(x, y + descent); _this.context.lineTo(x + width, y + descent); _this.context.closePath(); _this.context.stroke(); } if (MultiStyleText.debugOptions.spans.text) { _this.context.fillStyle = "#ffffff"; _this.context.strokeStyle = "#000000"; _this.context.lineWidth = 2; _this.context.font = "8px monospace"; _this.context.strokeText(tagName, x, y - ascent + 8); _this.context.fillText(tagName, x, y - ascent + 8); _this.context.strokeText(width.toFixed(2) + "x" + (ascent + descent).toFixed(2), x, y - ascent + 16); _this.context.fillText(width.toFixed(2) + "x" + (ascent + descent).toFixed(2), x, y - ascent + 16); } } }); if (MultiStyleText.debugOptions.objects.enabled) { if (MultiStyleText.debugOptions.objects.bounding) { this.context.fillStyle = MultiStyleText.debugOptions.objects.bounding; this.context.beginPath(); this.context.rect(0, 0, width, height); this.context.fill(); } if (MultiStyleText.debugOptions.objects.text) { this.context.fillStyle = "#ffffff"; this.context.strokeStyle = "#000000"; this.context.lineWidth = 2; this.context.font = "8px monospace"; this.context.strokeText(width.toFixed(2) + "x" + height.toFixed(2), 0, 8, width); this.context.fillText(width.toFixed(2) + "x" + height.toFixed(2), 0, 8, width); } } this.updateTexture(); }; MultiStyleText.prototype.wordWrap = function (text) { var result = ''; var tags = Object.keys(this.textStyles).join("|"); var re = new RegExp("(</?(" + tags + ")>)", "g"); var lines = text.split("\n"); var wordWrapWidth = this._style.wordWrapWidth; var styleStack = [this.assign({}, this.textStyles["default"])]; this.context.font = this.getFontString(this.textStyles["default"]); for (var i = 0; i < lines.length; i++) { var spaceLeft = wordWrapWidth; var words = lines[i].split(" "); for (var j = 0; j < words.length; j++) { var parts = words[j].split(re); for (var k = 0; k < parts.length; k++) { if (re.test(parts[k])) { result += parts[k]; if (parts[k][1] === "/") { k++; styleStack.pop(); } else { k++; styleStack.push(this.assign({}, styleStack[styleStack.length - 1], this.textStyles[parts[k]])); } this.context.font = this.getFontString(styleStack[styleStack.length - 1]); continue; } var partWidth = this.context.measureText(parts[k]).width; if (this._style.breakWords && partWidth > spaceLeft) { var characters = parts[k].split(''); if (j > 0 && k === 0) { result += " "; spaceLeft -= this.context.measureText(" ").width; } for (var c = 0; c < characters.length; c++) { var characterWidth = this.context.measureText(characters[c]).width; if (characterWidth > spaceLeft) { result += "\n" + characters[c]; spaceLeft = wordWrapWidth - characterWidth; } else { if (j > 0 && k === 0 && c === 0) { result += " "; } result += characters[c]; spaceLeft -= characterWidth; } } } else if (this._style.breakWords) { result += parts[k]; spaceLeft -= partWidth; } else { var paddedPartWidth = partWidth + (k === 0 ? this.context.measureText(" ").width : 0); if (j === 0 || paddedPartWidth > spaceLeft) { if (j > 0) { result += "\n"; } result += parts[k]; spaceLeft = wordWrapWidth - partWidth; } else { spaceLeft -= paddedPartWidth; if (k === 0) { result += " "; } result += parts[k]; } } } } if (i < lines.length - 1) { result += '\n'; } } return result; }; MultiStyleText.prototype.updateTexture = function () { var texture = this._texture; var dropShadowPadding = this.getDropShadowPadding(); texture.baseTexture.hasLoaded = true; texture.baseTexture.resolution = this.resolution; texture.baseTexture.realWidth = this.canvas.width; texture.baseTexture.realHeight = this.canvas.height; texture.baseTexture.width = this.canvas.width / this.resolution; texture.baseTexture.height = this.canvas.height / this.resolution; texture.trim.width = texture.frame.width = this.canvas.width / this.resolution; texture.trim.height = texture.frame.height = this.canvas.height / this.resolution; texture.trim.x = -this._style.padding - dropShadowPadding; texture.trim.y = -this._style.padding - dropShadowPadding; texture.orig.width = texture.frame.width - (this._style.padding + dropShadowPadding) * 2; texture.orig.height = texture.frame.height - (this._style.padding + dropShadowPadding) * 2; this._onTextureUpdate(); texture.baseTexture.emit('update', texture.baseTexture); this.dirty = false; }; MultiStyleText.prototype.assign = function (destination) { var sources = []; for (var _i = 1; _i < arguments.length; _i++) { sources[_i - 1] = arguments[_i]; } for (var _a = 0, sources_1 = sources; _a < sources_1.length; _a++) { var source = sources_1[_a]; for (var key in source) { destination[key] = source[key]; } } return destination; }; return MultiStyleText; }(PIXI.Text)); MultiStyleText.DEFAULT_TAG_STYLE = { align: "left", breakWords: false, dropShadow: false, dropShadowAngle: Math.PI / 6, dropShadowBlur: 0, dropShadowColor: "#000000", dropShadowDistance: 5, fill: "black", fillGradientType: PIXI.TEXT_GRADIENT.LINEAR_VERTICAL, fontFamily: "Arial", fontSize: 26, fontStyle: "normal", fontVariant: "normal", fontWeight: "normal", letterSpacing: 0, lineHeight: 0, lineJoin: "miter", miterLimit: 10, padding: 0, stroke: "black", strokeThickness: 0, textBaseline: "alphabetic", valign: "baseline", wordWrap: false, wordWrapWidth: 100 }; MultiStyleText.debugOptions = { spans: { enabled: false, baseline: "#44BB44", top: "#BB4444", bottom: "#4444BB", bounding: "rgba(255, 255, 255, 0.1)", text: true }, objects: { enabled: false, bounding: "rgba(255, 255, 255, 0.05)", text: true } }; exports.default = MultiStyleText; }); },{}]},{},[1])(1) }); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"./pixi-multistyle-text":1}]},{},[1]);