@gechiui/block-editor
Version:
274 lines (221 loc) • 5.27 kB
JavaScript
/* eslint-disable @gechiui/no-unused-vars-before-return */
// Adapted from https://github.com/reworkcss/css
// because we needed to remove source map support.
/**
* External dependencies
*/
import inherits from 'inherits';
/**
* Internal dependencies
*/
import Base from './compiler';
/**
* Expose compiler.
*/
export default Compiler;
/**
* Initialize a new `Compiler`.
*/
function Compiler( options ) {
options = options || {};
Base.call( this, options );
this.indentation = options.indent;
}
/**
* Inherit from `Base.prototype`.
*/
inherits( Compiler, Base );
/**
* Compile `node`.
*/
Compiler.prototype.compile = function ( node ) {
return this.stylesheet( node );
};
/**
* Visit stylesheet node.
*/
Compiler.prototype.stylesheet = function ( node ) {
return this.mapVisit( node.stylesheet.rules, '\n\n' );
};
/**
* Visit comment node.
*/
Compiler.prototype.comment = function ( node ) {
return this.emit(
this.indent() + '/*' + node.comment + '*/',
node.position
);
};
/**
* Visit import node.
*/
Compiler.prototype.import = function ( node ) {
return this.emit( '@import ' + node.import + ';', node.position );
};
/**
* Visit media node.
*/
Compiler.prototype.media = function ( node ) {
return (
this.emit( '@media ' + node.media, node.position ) +
this.emit( ' {\n' + this.indent( 1 ) ) +
this.mapVisit( node.rules, '\n\n' ) +
this.emit( this.indent( -1 ) + '\n}' )
);
};
/**
* Visit document node.
*/
Compiler.prototype.document = function ( node ) {
const doc = '@' + ( node.vendor || '' ) + 'document ' + node.document;
return (
this.emit( doc, node.position ) +
this.emit( ' ' + ' {\n' + this.indent( 1 ) ) +
this.mapVisit( node.rules, '\n\n' ) +
this.emit( this.indent( -1 ) + '\n}' )
);
};
/**
* Visit charset node.
*/
Compiler.prototype.charset = function ( node ) {
return this.emit( '@charset ' + node.charset + ';', node.position );
};
/**
* Visit namespace node.
*/
Compiler.prototype.namespace = function ( node ) {
return this.emit( '@namespace ' + node.namespace + ';', node.position );
};
/**
* Visit supports node.
*/
Compiler.prototype.supports = function ( node ) {
return (
this.emit( '@supports ' + node.supports, node.position ) +
this.emit( ' {\n' + this.indent( 1 ) ) +
this.mapVisit( node.rules, '\n\n' ) +
this.emit( this.indent( -1 ) + '\n}' )
);
};
/**
* Visit keyframes node.
*/
Compiler.prototype.keyframes = function ( node ) {
return (
this.emit(
'@' + ( node.vendor || '' ) + 'keyframes ' + node.name,
node.position
) +
this.emit( ' {\n' + this.indent( 1 ) ) +
this.mapVisit( node.keyframes, '\n' ) +
this.emit( this.indent( -1 ) + '}' )
);
};
/**
* Visit keyframe node.
*/
Compiler.prototype.keyframe = function ( node ) {
const decls = node.declarations;
return (
this.emit( this.indent() ) +
this.emit( node.values.join( ', ' ), node.position ) +
this.emit( ' {\n' + this.indent( 1 ) ) +
this.mapVisit( decls, '\n' ) +
this.emit( this.indent( -1 ) + '\n' + this.indent() + '}\n' )
);
};
/**
* Visit page node.
*/
Compiler.prototype.page = function ( node ) {
const sel = node.selectors.length ? node.selectors.join( ', ' ) + ' ' : '';
return (
this.emit( '@page ' + sel, node.position ) +
this.emit( '{\n' ) +
this.emit( this.indent( 1 ) ) +
this.mapVisit( node.declarations, '\n' ) +
this.emit( this.indent( -1 ) ) +
this.emit( '\n}' )
);
};
/**
* Visit font-face node.
*/
Compiler.prototype[ 'font-face' ] = function ( node ) {
return (
this.emit( '@font-face ', node.position ) +
this.emit( '{\n' ) +
this.emit( this.indent( 1 ) ) +
this.mapVisit( node.declarations, '\n' ) +
this.emit( this.indent( -1 ) ) +
this.emit( '\n}' )
);
};
/**
* Visit host node.
*/
Compiler.prototype.host = function ( node ) {
return (
this.emit( '@host', node.position ) +
this.emit( ' {\n' + this.indent( 1 ) ) +
this.mapVisit( node.rules, '\n\n' ) +
this.emit( this.indent( -1 ) + '\n}' )
);
};
/**
* Visit custom-media node.
*/
Compiler.prototype[ 'custom-media' ] = function ( node ) {
return this.emit(
'@custom-media ' + node.name + ' ' + node.media + ';',
node.position
);
};
/**
* Visit rule node.
*/
Compiler.prototype.rule = function ( node ) {
const indent = this.indent();
const decls = node.declarations;
if ( ! decls.length ) {
return '';
}
return (
this.emit(
node.selectors
.map( function ( s ) {
return indent + s;
} )
.join( ',\n' ),
node.position
) +
this.emit( ' {\n' ) +
this.emit( this.indent( 1 ) ) +
this.mapVisit( decls, '\n' ) +
this.emit( this.indent( -1 ) ) +
this.emit( '\n' + this.indent() + '}' )
);
};
/**
* Visit declaration node.
*/
Compiler.prototype.declaration = function ( node ) {
return (
this.emit( this.indent() ) +
this.emit( node.property + ': ' + node.value, node.position ) +
this.emit( ';' )
);
};
/**
* Increase, decrease or return current indentation.
*/
Compiler.prototype.indent = function ( level ) {
this.level = this.level || 1;
if ( null !== level ) {
this.level += level;
return '';
}
return Array( this.level ).join( this.indentation || ' ' );
};
/* eslint-enable @gechiui/no-unused-vars-before-return */