<svelte:head>

pull/1367/head
Rich Harris 7 years ago
parent 53374daf42
commit ec50c5ec8c

@ -3,10 +3,16 @@ import { stringify } from '../../utils/stringify';
import Node from './shared/Node'; import Node from './shared/Node';
import Block from '../dom/Block'; import Block from '../dom/Block';
import Attribute from './Attribute'; import Attribute from './Attribute';
import mapChildren from './shared/mapChildren';
export default class Head extends Node { export default class Head extends Node {
type: 'Head'; type: 'Head';
attributes: Attribute[]; children: any[]; // TODO
constructor(compiler, parent, scope, info) {
super(compiler, parent, scope, info);
this.children = mapChildren(compiler, parent, scope, info.children);
}
init( init(
block: Block, block: Block,
@ -21,8 +27,6 @@ export default class Head extends Node {
parentNode: string, parentNode: string,
parentNodes: string parentNodes: string
) { ) {
const { generator } = this;
this.var = 'document.head'; this.var = 'document.head';
this.children.forEach((child: Node) => { this.children.forEach((child: Node) => {

@ -2,8 +2,17 @@ import { stringify } from '../../utils/stringify';
import getExpressionPrecedence from '../../utils/getExpressionPrecedence'; import getExpressionPrecedence from '../../utils/getExpressionPrecedence';
import Node from './shared/Node'; import Node from './shared/Node';
import Block from '../dom/Block'; import Block from '../dom/Block';
import mapChildren from './shared/mapChildren';
export default class Title extends Node { export default class Title extends Node {
type: 'Title';
children: any[]; // TODO
constructor(compiler, parent, scope, info) {
super(compiler, parent, scope, info);
this.children = mapChildren(compiler, parent, scope, info.children);
}
build( build(
block: Block, block: Block,
parentNode: string, parentNode: string,
@ -22,8 +31,7 @@ export default class Title extends Node {
if (this.children.length === 1) { if (this.children.length === 1) {
// single {{tag}} — may be a non-string // single {{tag}} — may be a non-string
const { expression } = this.children[0]; const { expression } = this.children[0];
const { indexes } = block.contextualise(expression); const { dependencies, snippet, indexes } = this.children[0].expression;
const { dependencies, snippet } = this.children[0].metadata;
value = snippet; value = snippet;
dependencies.forEach(d => { dependencies.forEach(d => {
@ -43,14 +51,13 @@ export default class Title extends Node {
if (chunk.type === 'Text') { if (chunk.type === 'Text') {
return stringify(chunk.data); return stringify(chunk.data);
} else { } else {
const { indexes } = block.contextualise(chunk.expression); const { dependencies, snippet } = chunk.expression;
const { dependencies, snippet } = chunk.metadata;
dependencies.forEach(d => { dependencies.forEach(d => {
allDependencies.add(d); allDependencies.add(d);
}); });
return getExpressionPrecedence(chunk.expression) <= 13 ? `(${snippet})` : snippet; return getExpressionPrecedence(chunk) <= 13 ? `(${snippet})` : snippet;
} }
}) })
.join(' + '); .join(' + ');

@ -2,11 +2,13 @@ import AwaitBlock from '../AwaitBlock';
import Component from '../Component'; import Component from '../Component';
import EachBlock from '../EachBlock'; import EachBlock from '../EachBlock';
import Element from '../Element'; import Element from '../Element';
import Head from '../Head';
import IfBlock from '../IfBlock'; import IfBlock from '../IfBlock';
import Slot from '../Slot';
import Text from '../Text';
import MustacheTag from '../MustacheTag'; import MustacheTag from '../MustacheTag';
import RawMustacheTag from '../RawMustacheTag'; import RawMustacheTag from '../RawMustacheTag';
import Slot from '../Slot';
import Text from '../Text';
import Title from '../Title';
import Window from '../Window'; import Window from '../Window';
import Node from './Node'; import Node from './Node';
@ -16,11 +18,13 @@ function getConstructor(type): typeof Node {
case 'Component': return Component; case 'Component': return Component;
case 'EachBlock': return EachBlock; case 'EachBlock': return EachBlock;
case 'Element': return Element; case 'Element': return Element;
case 'Head': return Head;
case 'IfBlock': return IfBlock; case 'IfBlock': return IfBlock;
case 'Slot': return Slot;
case 'Text': return Text;
case 'MustacheTag': return MustacheTag; case 'MustacheTag': return MustacheTag;
case 'RawMustacheTag': return RawMustacheTag; case 'RawMustacheTag': return RawMustacheTag;
case 'Slot': return Slot;
case 'Text': return Text;
case 'Title': return Title;
case 'Window': return Window; case 'Window': return Window;
default: throw new Error(`Not implemented: ${type}`); default: throw new Error(`Not implemented: ${type}`);
} }

@ -60,6 +60,16 @@ const disallowedContents = new Map([
['th', new Set(['td', 'th', 'tr'])], ['th', new Set(['td', 'th', 'tr'])],
]); ]);
function parentIsHead(stack) {
let i = stack.length;
while (i--) {
const { type } = stack[i];
if (type === 'Head') return true;
if (type === 'Element' || type === 'Component') return false;
}
return false;
}
export default function tag(parser: Parser) { export default function tag(parser: Parser) {
const start = parser.index++; const start = parser.index++;
@ -114,6 +124,7 @@ export default function tag(parser: Parser) {
const type = metaTags.has(name) const type = metaTags.has(name)
? metaTags.get(name) ? metaTags.get(name)
: (/[A-Z]/.test(name[0]) || name === 'svelte:self' || name === 'svelte:component') ? 'Component' : (/[A-Z]/.test(name[0]) || name === 'svelte:self' || name === 'svelte:component') ? 'Component'
: name === 'title' && parentIsHead(parser.stack) ? 'Title'
: name === 'slot' ? 'Slot' : 'Element'; : name === 'slot' ? 'Slot' : 'Element';
const element: Node = { const element: Node = {

Loading…
Cancel
Save