UNPKG

@belvo-finance/belvo-vue-components

Version:

## Project setup ``` npm install ```

209 lines (192 loc) 8.41 kB
function SVGTextElement(data,globalData,comp){ this.textSpans = []; this.renderType = 'svg'; this.initElement(data,globalData,comp); } extendPrototype([BaseElement,TransformElement,SVGBaseElement,HierarchyElement,FrameElement,RenderableDOMElement,ITextElement], SVGTextElement); SVGTextElement.prototype.createContent = function(){ if (this.data.singleShape && !this.globalData.fontManager.chars) { this.textContainer = createNS('text'); } }; SVGTextElement.prototype.buildTextContents = function(textArray) { var i = 0, len = textArray.length; var textContents = [], currentTextContent = ''; while (i < len) { if(textArray[i] === String.fromCharCode(13) || textArray[i] === String.fromCharCode(3)) { textContents.push(currentTextContent); currentTextContent = ''; } else { currentTextContent += textArray[i]; } i += 1; } textContents.push(currentTextContent); return textContents; } SVGTextElement.prototype.buildNewText = function(){ var i, len; var documentData = this.textProperty.currentData; this.renderedLetters = createSizedArray(documentData ? documentData.l.length : 0); if(documentData.fc) { this.layerElement.setAttribute('fill', this.buildColor(documentData.fc)); }else{ this.layerElement.setAttribute('fill', 'rgba(0,0,0,0)'); } if(documentData.sc){ this.layerElement.setAttribute('stroke', this.buildColor(documentData.sc)); this.layerElement.setAttribute('stroke-width', documentData.sw); } this.layerElement.setAttribute('font-size', documentData.finalSize); var fontData = this.globalData.fontManager.getFontByName(documentData.f); if(fontData.fClass){ this.layerElement.setAttribute('class',fontData.fClass); } else { this.layerElement.setAttribute('font-family', fontData.fFamily); var fWeight = documentData.fWeight, fStyle = documentData.fStyle; this.layerElement.setAttribute('font-style', fStyle); this.layerElement.setAttribute('font-weight', fWeight); } this.layerElement.setAttribute('aria-label', documentData.t); var letters = documentData.l || []; var usesGlyphs = !!this.globalData.fontManager.chars; len = letters.length; var tSpan; var matrixHelper = this.mHelper; var shapes, shapeStr = '', singleShape = this.data.singleShape; var xPos = 0, yPos = 0, firstLine = true; var trackingOffset = documentData.tr/1000*documentData.finalSize; if(singleShape && !usesGlyphs && !documentData.sz) { var tElement = this.textContainer; var justify = 'start'; switch(documentData.j) { case 1: justify = 'end'; break; case 2: justify = 'middle'; break; } tElement.setAttribute('text-anchor',justify); tElement.setAttribute('letter-spacing',trackingOffset); var textContent = this.buildTextContents(documentData.finalText); len = textContent.length; yPos = documentData.ps ? documentData.ps[1] + documentData.ascent : 0; for ( i = 0; i < len; i += 1) { tSpan = this.textSpans[i] || createNS('tspan'); tSpan.textContent = textContent[i]; tSpan.setAttribute('x', 0); tSpan.setAttribute('y', yPos); tSpan.style.display = 'inherit'; tElement.appendChild(tSpan); this.textSpans[i] = tSpan; yPos += documentData.finalLineHeight; } this.layerElement.appendChild(tElement); } else { var cachedSpansLength = this.textSpans.length; var shapeData, charData; for (i = 0; i < len; i += 1) { if(!usesGlyphs || !singleShape || i === 0){ tSpan = cachedSpansLength > i ? this.textSpans[i] : createNS(usesGlyphs?'path':'text'); if (cachedSpansLength <= i) { tSpan.setAttribute('stroke-linecap', 'butt'); tSpan.setAttribute('stroke-linejoin','round'); tSpan.setAttribute('stroke-miterlimit','4'); this.textSpans[i] = tSpan; this.layerElement.appendChild(tSpan); } tSpan.style.display = 'inherit'; } matrixHelper.reset(); matrixHelper.scale(documentData.finalSize / 100, documentData.finalSize / 100); if (singleShape) { if(letters[i].n) { xPos = -trackingOffset; yPos += documentData.yOffset; yPos += firstLine ? 1 : 0; firstLine = false; } this.applyTextPropertiesToMatrix(documentData, matrixHelper, letters[i].line, xPos, yPos); xPos += letters[i].l || 0; //xPos += letters[i].val === ' ' ? 0 : trackingOffset; xPos += trackingOffset; } if(usesGlyphs) { charData = this.globalData.fontManager.getCharData(documentData.finalText[i], fontData.fStyle, this.globalData.fontManager.getFontByName(documentData.f).fFamily); shapeData = charData && charData.data || {}; shapes = shapeData.shapes ? shapeData.shapes[0].it : []; if(!singleShape){ tSpan.setAttribute('d',this.createPathShape(matrixHelper,shapes)); } else { shapeStr += this.createPathShape(matrixHelper,shapes); } } else { if(singleShape) { tSpan.setAttribute("transform", "translate(" + matrixHelper.props[12] + "," + matrixHelper.props[13] + ")"); } tSpan.textContent = letters[i].val; tSpan.setAttributeNS("http://www.w3.org/XML/1998/namespace", "xml:space","preserve"); } // } if (singleShape && tSpan) { tSpan.setAttribute('d',shapeStr); } } while (i < this.textSpans.length){ this.textSpans[i].style.display = 'none'; i += 1; } this._sizeChanged = true; }; SVGTextElement.prototype.sourceRectAtTime = function(time){ this.prepareFrame(this.comp.renderedFrame - this.data.st); this.renderInnerContent(); if(this._sizeChanged){ this._sizeChanged = false; var textBox = this.layerElement.getBBox(); this.bbox = { top: textBox.y, left: textBox.x, width: textBox.width, height: textBox.height }; } return this.bbox; }; SVGTextElement.prototype.renderInnerContent = function(){ if(!this.data.singleShape){ this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag); if(this.lettersChangedFlag || this.textAnimator.lettersChangedFlag){ this._sizeChanged = true; var i,len; var renderedLetters = this.textAnimator.renderedLetters; var letters = this.textProperty.currentData.l; len = letters.length; var renderedLetter, textSpan; for(i=0;i<len;i+=1){ if(letters[i].n){ continue; } renderedLetter = renderedLetters[i]; textSpan = this.textSpans[i]; if(renderedLetter._mdf.m) { textSpan.setAttribute('transform',renderedLetter.m); } if(renderedLetter._mdf.o) { textSpan.setAttribute('opacity',renderedLetter.o); } if(renderedLetter._mdf.sw){ textSpan.setAttribute('stroke-width',renderedLetter.sw); } if(renderedLetter._mdf.sc){ textSpan.setAttribute('stroke',renderedLetter.sc); } if(renderedLetter._mdf.fc){ textSpan.setAttribute('fill',renderedLetter.fc); } } } } };