UNPKG

lit-html

Version:

HTML template literals in JavaScript

89 lines 3.5 kB
/** * @license * Copyright (c) 2017 The Polymer Project Authors. All rights reserved. * This code may only be used under the BSD style license found at * http://polymer.github.io/LICENSE.txt * The complete set of authors may be found at * http://polymer.github.io/AUTHORS.txt * The complete set of contributors may be found at * http://polymer.github.io/CONTRIBUTORS.txt * Code distributed by Google as part of the polymer project is also * subject to an additional IP rights grant found at * http://polymer.github.io/PATENTS.txt */ /** * @module lit-html */ import { reparentNodes } from './dom.js'; import { boundAttributeSuffix, lastAttributeNameRegex, marker, nodeMarker } from './template.js'; /** * The return type of `html`, which holds a Template and the values from * interpolated expressions. */ export class TemplateResult { constructor(strings, values, type, processor) { this.strings = strings; this.values = values; this.type = type; this.processor = processor; } /** * Returns a string of HTML used to create a `<template>` element. */ getHTML() { const endIndex = this.strings.length - 1; let html = ''; for (let i = 0; i < endIndex; i++) { const s = this.strings[i]; // This exec() call does two things: // 1) Appends a suffix to the bound attribute name to opt out of special // attribute value parsing that IE11 and Edge do, like for style and // many SVG attributes. The Template class also appends the same suffix // when looking up attributes to create Parts. // 2) Adds an unquoted-attribute-safe marker for the first expression in // an attribute. Subsequent attribute expressions will use node markers, // and this is safe since attributes with multiple expressions are // guaranteed to be quoted. const match = lastAttributeNameRegex.exec(s); if (match) { // We're starting a new bound attribute. // Add the safe attribute suffix, and use unquoted-attribute-safe // marker. html += s.substr(0, match.index) + match[1] + match[2] + boundAttributeSuffix + match[3] + marker; } else { // We're either in a bound node, or trailing bound attribute. // Either way, nodeMarker is safe to use. html += s + nodeMarker; } } return html + this.strings[endIndex]; } getTemplateElement() { const template = document.createElement('template'); template.innerHTML = this.getHTML(); return template; } } /** * A TemplateResult for SVG fragments. * * This class wraps HTMl in an `<svg>` tag in order to parse its contents in the * SVG namespace, then modifies the template to remove the `<svg>` tag so that * clones only container the original fragment. */ export class SVGTemplateResult extends TemplateResult { getHTML() { return `<svg>${super.getHTML()}</svg>`; } getTemplateElement() { const template = super.getTemplateElement(); const content = template.content; const svgElement = content.firstChild; content.removeChild(svgElement); reparentNodes(content, svgElement.firstChild); return template; } } //# sourceMappingURL=template-result.js.map