You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte/src/generators/server-side-rendering/visitors/Element.js

73 lines
1.6 KiB

import Component from './Component.js';
import isVoidElementName from '../../../utils/isVoidElementName.js';
import visit from '../visit.js';
import Window from './meta/Window.js';
const meta = {
':Window': Window
};
export default {
enter ( generator, node ) {
if ( node.name in meta ) {
return meta[ node.name ].enter( generator, node );
}
if ( generator.components.has( node.name ) || node.name === ':Self' ) {
Component.enter( generator, node );
return;
}
let openingTag = `<${node.name}`;
node.attributes.forEach( attribute => {
if ( attribute.type !== 'Attribute' ) return;
let str = ` ${attribute.name}`;
if ( attribute.value !== true ) {
str += `="` + attribute.value.map( chunk => {
if ( chunk.type === 'Text' ) {
return chunk.data;
}
const { snippet } = generator.contextualise( chunk.expression );
return '${' + snippet + '}';
}).join( '' ) + `"`;
}
openingTag += str;
});
if ( generator.cssId && !generator.elementDepth ) {
openingTag += ` ${generator.cssId}`;
}
openingTag += '>';
generator.append( openingTag );
this.elementDepth += 1;
node.children.forEach( child => {
visit( child, generator );
});
this.elementDepth -= 1;
if ( node.name in meta ) {
if ( meta[ node.name ].leave ) meta[ node.name ].leave( generator, node );
return;
}
if ( generator.components.has( node.name ) || node.name === ':Self' ) {
Component.leave( generator, node );
return;
}
if ( !isVoidElementName( node.name ) ) {
generator.append( `</${node.name}>` );
}
}
};