mirror of https://github.com/sveltejs/svelte
parent
063e76f322
commit
d0752cd6b1
@ -1,6 +1,6 @@
|
|||||||
import visitors from './visitors/index.js';
|
import visitors from './visitors/index.js';
|
||||||
|
|
||||||
export default function visit ( node, generator ) {
|
export default function visit ( generator, fragment, node ) {
|
||||||
const visitor = visitors[ node.type ];
|
const visitor = visitors[ node.type ];
|
||||||
visitor( generator, node );
|
visitor( generator, fragment, node );
|
||||||
}
|
}
|
@ -1,20 +1,21 @@
|
|||||||
import deindent from '../../../utils/deindent.js';
|
import deindent from '../../../utils/deindent.js';
|
||||||
import findBlock from '../utils/findBlock.js';
|
import findBlock from '../utils/findBlock.js';
|
||||||
|
|
||||||
export default function visitMustacheTag ( generator, node ) {
|
export default function visitMustacheTag ( generator, fragment, node ) {
|
||||||
const name = generator.current.getUniqueName( 'text' );
|
const name = fragment.getUniqueName( 'text' );
|
||||||
|
|
||||||
const { snippet } = generator.contextualise( node.expression );
|
const { snippet } = generator.contextualise( node.expression );
|
||||||
|
|
||||||
generator.current.builders.create.addLine( `var last_${name} = ${snippet};` );
|
fragment.builders.create.addLine( `var last_${name} = ${snippet};` );
|
||||||
generator.addElement( name, `${generator.helper( 'createText' )}( last_${name} )`, true );
|
fragment.addElement( name, `${generator.helper( 'createText' )}( last_${name} )`, true );
|
||||||
|
|
||||||
const fragment = findBlock( generator.current );
|
// TODO this should be unnecessary once we separate fragments from state
|
||||||
if ( !fragment.tmp ) fragment.tmp = fragment.getUniqueName( 'tmp' );
|
const parentFragment = findBlock( fragment );
|
||||||
|
if ( !parentFragment.tmp ) parentFragment.tmp = parentFragment.getUniqueName( 'tmp' );
|
||||||
|
|
||||||
generator.current.builders.update.addBlock( deindent`
|
fragment.builders.update.addBlock( deindent`
|
||||||
if ( ( ${fragment.tmp} = ${snippet} ) !== last_${name} ) {
|
if ( ( ${parentFragment.tmp} = ${snippet} ) !== last_${name} ) {
|
||||||
${name}.data = last_${name} = ${fragment.tmp};
|
${name}.data = last_${name} = ${parentFragment.tmp};
|
||||||
}
|
}
|
||||||
` );
|
` );
|
||||||
}
|
}
|
@ -1,41 +1,42 @@
|
|||||||
import deindent from '../../../utils/deindent.js';
|
import deindent from '../../../utils/deindent.js';
|
||||||
import findBlock from '../utils/findBlock.js';
|
import findBlock from '../utils/findBlock.js';
|
||||||
|
|
||||||
export default function visitRawMustacheTag ( generator, node ) {
|
export default function visitRawMustacheTag ( generator, fragment, node ) {
|
||||||
const name = generator.current.getUniqueName( 'raw' );
|
const name = fragment.getUniqueName( 'raw' );
|
||||||
|
|
||||||
const { snippet } = generator.contextualise( node.expression );
|
const { snippet } = generator.contextualise( node.expression );
|
||||||
|
|
||||||
// we would have used comments here, but the `insertAdjacentHTML` api only
|
// we would have used comments here, but the `insertAdjacentHTML` api only
|
||||||
// exists for `Element`s.
|
// exists for `Element`s.
|
||||||
const before = `${name}_before`;
|
const before = `${name}_before`;
|
||||||
generator.addElement( before, `${generator.helper( 'createElement' )}( 'noscript' )`, true );
|
fragment.addElement( before, `${generator.helper( 'createElement' )}( 'noscript' )`, true );
|
||||||
|
|
||||||
const after = `${name}_after`;
|
const after = `${name}_after`;
|
||||||
generator.addElement( after, `${generator.helper( 'createElement' )}( 'noscript' )`, true );
|
fragment.addElement( after, `${generator.helper( 'createElement' )}( 'noscript' )`, true );
|
||||||
|
|
||||||
const isToplevel = generator.current.localElementDepth === 0;
|
const isToplevel = fragment.localElementDepth === 0;
|
||||||
|
|
||||||
generator.current.builders.create.addLine( `var last_${name} = ${snippet};` );
|
fragment.builders.create.addLine( `var last_${name} = ${snippet};` );
|
||||||
const mountStatement = `${before}.insertAdjacentHTML( 'afterend', last_${name} );`;
|
const mountStatement = `${before}.insertAdjacentHTML( 'afterend', last_${name} );`;
|
||||||
const detachStatement = `${generator.helper( 'detachBetween' )}( ${before}, ${after} );`;
|
const detachStatement = `${generator.helper( 'detachBetween' )}( ${before}, ${after} );`;
|
||||||
|
|
||||||
if ( isToplevel ) {
|
if ( isToplevel ) {
|
||||||
generator.current.builders.mount.addLine( mountStatement );
|
fragment.builders.mount.addLine( mountStatement );
|
||||||
} else {
|
} else {
|
||||||
generator.current.builders.create.addLine( mountStatement );
|
fragment.builders.create.addLine( mountStatement );
|
||||||
}
|
}
|
||||||
|
|
||||||
const fragment = findBlock( generator.current );
|
// TODO this should be unnecessary once we separate fragments from state
|
||||||
if ( !fragment.tmp ) fragment.tmp = fragment.getUniqueName( 'tmp' );
|
const parentFragment = findBlock( fragment );
|
||||||
|
if ( !parentFragment.tmp ) parentFragment.tmp = parentFragment.getUniqueName( 'tmp' );
|
||||||
|
|
||||||
generator.current.builders.update.addBlock( deindent`
|
fragment.builders.update.addBlock( deindent`
|
||||||
if ( ( ${fragment.tmp} = ${snippet} ) !== last_${name} ) {
|
if ( ( ${parentFragment.tmp} = ${snippet} ) !== last_${name} ) {
|
||||||
last_${name} = ${fragment.tmp};
|
last_${name} = ${parentFragment.tmp};
|
||||||
${detachStatement}
|
${detachStatement}
|
||||||
${mountStatement}
|
${mountStatement}
|
||||||
}
|
}
|
||||||
` );
|
` );
|
||||||
|
|
||||||
generator.current.builders.detachRaw.addBlock( detachStatement );
|
fragment.builders.detachRaw.addBlock( detachStatement );
|
||||||
}
|
}
|
@ -1,8 +1,8 @@
|
|||||||
export default function visitText ( generator, node ) {
|
export default function visitText ( generator, fragment, node ) {
|
||||||
if ( generator.current.namespace && !/\S/.test( node.data ) ) {
|
if ( fragment.namespace && !/\S/.test( node.data ) ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const name = generator.current.getUniqueName( `text` );
|
const name = fragment.getUniqueName( `text` );
|
||||||
generator.addElement( name, `${generator.helper( 'createText' )}( ${JSON.stringify( node.data )} )`, false );
|
fragment.addElement( name, `${generator.helper( 'createText' )}( ${JSON.stringify( node.data )} )`, false );
|
||||||
}
|
}
|
@ -1,12 +1,12 @@
|
|||||||
export default function visitYieldTag ( generator ) {
|
export default function visitYieldTag ( generator, fragment ) {
|
||||||
const anchor = `yield_anchor`;
|
const anchor = `yield_anchor`;
|
||||||
generator.createAnchor( anchor );
|
fragment.createAnchor( anchor );
|
||||||
|
|
||||||
generator.current.builders.mount.addLine(
|
fragment.builders.mount.addLine(
|
||||||
`${generator.current.component}._yield && ${generator.current.component}._yield.mount( ${generator.current.target}, ${anchor} );`
|
`${fragment.component}._yield && ${fragment.component}._yield.mount( ${fragment.target}, ${anchor} );`
|
||||||
);
|
);
|
||||||
|
|
||||||
generator.current.builders.destroy.addLine(
|
fragment.builders.destroy.addLine(
|
||||||
`${generator.current.component}._yield && ${generator.current.component}._yield.destroy( detach );`
|
`${fragment.component}._yield && ${fragment.component}._yield.destroy( detach );`
|
||||||
);
|
);
|
||||||
}
|
}
|
Loading…
Reference in new issue