8 changed files with 431 additions and 936 deletions
@ -0,0 +1,94 @@ |
|||||
|
import path from 'path'; |
||||
|
import config from 'config'; |
||||
|
import {fileURLToPath} from 'url'; |
||||
|
import memFs from 'mem-fs'; |
||||
|
import editor from 'mem-fs-editor'; |
||||
|
|
||||
|
const __filename = fileURLToPath(import.meta.url); |
||||
|
const __dirname = path.dirname(__filename); |
||||
|
|
||||
|
export function getConfigs() { |
||||
|
const isDev = process.env.NODE_ENV === 'development'; // Check README file in case you get "missing files" error.
|
||||
|
const developmentBlockName = process.env.BLOCK_NAME; |
||||
|
|
||||
|
return { |
||||
|
isDev, |
||||
|
developmentBlockName, |
||||
|
modulesPath: isDev ? '' : 'node_modules/block-dev-tool', |
||||
|
projectPath: isDev ? path.join('blocks', developmentBlockName) : '', |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
import fsExtra from "fs-extra"; |
||||
|
|
||||
|
export async function readJSONFile(jsonFile) { |
||||
|
let data = {}; |
||||
|
|
||||
|
try { |
||||
|
data = await fsExtra.readJson(jsonFile); |
||||
|
} catch (e) { |
||||
|
return { |
||||
|
error: true, errorMessage: getErrorHtml("JSON Syntax error. Please make sure the dataFile is valid.", e), |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
return data; |
||||
|
} |
||||
|
|
||||
|
function getErrorHtml(message = '', errorMessage = '') { |
||||
|
return `<div style="padding: 10px 15px; font-family: Arial, sans-serif">
|
||||
|
<p>${message}</p> |
||||
|
<pre style="padding: 10px 15px; background-color: #ffd0d0; border: 1px solid red;">${errorMessage}</pre> |
||||
|
</div>`; |
||||
|
} |
||||
|
|
||||
|
export async function getBlockConfigs(jsonFileName = 'default', |
||||
|
{includeConfigs, projectPath, modulesPath, dataFiles} = {}) { |
||||
|
let data = await readJSONFile(path.join(projectPath, 'data', `${jsonFileName}.json`)); |
||||
|
if (data.error) { |
||||
|
return data; |
||||
|
} |
||||
|
|
||||
|
if (includeConfigs) { |
||||
|
Object.assign(data, { |
||||
|
config: Object.assign(JSON.parse(JSON.stringify(config)), // The entire config object.
|
||||
|
{ |
||||
|
projectDir: modulesPath, activeDataFile: jsonFileName, dataFiles: dataFiles.map((name) => { |
||||
|
return { |
||||
|
name, active: jsonFileName === name, |
||||
|
}; |
||||
|
}), remToPx: config.has('remToPx') ? config.get('remToPx') : 16, |
||||
|
}) |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
return data; |
||||
|
} |
||||
|
|
||||
|
export function getBlockName(name = '') { |
||||
|
if (name.startsWith('@')) { |
||||
|
name = name.substring(1); |
||||
|
} |
||||
|
|
||||
|
const arr = name.split('/'); |
||||
|
|
||||
|
return { |
||||
|
project: arr[0], |
||||
|
name: arr[1], |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
export async function createFiles(data, files = [], {pathDist, generatorsPath}) { |
||||
|
generatorsPath = generatorsPath ?? path.join(__dirname, 'generators/block/templates'); |
||||
|
|
||||
|
const store = memFs.create(); |
||||
|
const filesystem = editor.create(store); |
||||
|
for (let file of files) { |
||||
|
const from = typeof file !== 'string' ? `${generatorsPath}/${file.from}` : `${generatorsPath}/${file}`; |
||||
|
const to = typeof file !== 'string' ? `${pathDist}/${file.to}` : `${pathDist}/${file}`; |
||||
|
|
||||
|
await filesystem.copyTplAsync(from, to, data); |
||||
|
} |
||||
|
|
||||
|
return filesystem.commit(); // Promise
|
||||
|
} |
||||
File diff suppressed because it is too large
@ -0,0 +1,68 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace AXEWEB_Blocks\Blocks\<%= ownerClass %>\<%= blockClassModel %>; |
||||
|
|
||||
|
class <%= blockClassModel %>_Component extends \Core\Component { |
||||
|
|
||||
|
public function get_content( $args = [] ): string { |
||||
|
$args = array_merge( Helpers\<%= blockClassModel %>_Defaults::default_args(), $args ); |
||||
|
$args = Helpers\<%= blockClassModel %>_API::prepare_args( $args ); |
||||
|
|
||||
|
<% if (templateFormat === 'hbs') { %>return $this->get_component_template( __DIR__ . '/templates/<%= blockFilename %>.template.hbs', $args );<% } %> |
||||
|
<% if (templateFormat === 'php') { %> |
||||
|
$output = ( include( __DIR__ . '/templates/<%= blockFilename %>.template.php' ) )( array_merge( [], $args ), self::class ); |
||||
|
echo apply_filters( 'the_content', wpautop( $output ) ); |
||||
|
<% } %> |
||||
|
} |
||||
|
|
||||
|
<% if (!include_acf_block && !include_native_gutenberg_block) { %> |
||||
|
public function register_assets() { |
||||
|
$this->add_style( __DIR__ . '/templates/styles/<%= blockFilename %>.min.css' ); |
||||
|
<% if (include_script) { %>$this->add_script( __DIR__ . '/templates/scripts/<%= blockFilename %>.js' );<% } %> |
||||
|
} |
||||
|
|
||||
|
<% } %><% if (include_elementor_widget) { %> function register_custom_logic(): void { |
||||
|
add_action( 'elementor/widgets/widgets_registered', [ $this, 'register_elementor_widget' ] ); |
||||
|
} |
||||
|
|
||||
|
<% } %><% if (include_elementor_widget) { %> function register_elementor_widget( $widgets_manager ) { |
||||
|
$widgets_manager->register_widget_type( new Helpers\<%= blockClassModel %>_Elementor_Widget() ); |
||||
|
} |
||||
|
|
||||
|
<% } %><% if (include_acf_block) { %> function register_acf_block() { |
||||
|
$this->register_block( __DIR__ . "/<%= blockFilename %>.block.json", [ |
||||
|
'enqueue_assets' => function () { |
||||
|
wp_enqueue_style( '<%= blockFilename %>', \Core\Global_Functions::get_file_url( __DIR__ . '/templates/styles/<%= blockFilename %>.min.css', true ), [], get_blocks_version() );<% if (include_script) { %> |
||||
|
wp_enqueue_script( '<%= blockFilename %>', \Core\Global_Functions::get_file_url( __DIR__ . '/templates/scripts/<%= blockFilename %>.js', true ), ['assets-script'], get_blocks_version() );<% } %> |
||||
|
}, |
||||
|
'default' => Helpers\<%= blockClassModel %>_Defaults::default_args(), |
||||
|
'supports' => [ |
||||
|
//'jsx' => true, |
||||
|
'color' => [ |
||||
|
'background' => true, |
||||
|
'text' => true, |
||||
|
], |
||||
|
'spacing' => [ |
||||
|
'margin' => [ 'top', 'bottom' ], |
||||
|
'padding' => [ 'top', 'bottom' ] |
||||
|
], |
||||
|
] |
||||
|
] ); |
||||
|
} |
||||
|
|
||||
|
<% } %><% if (include_native_gutenberg_block) { %> function register_native_gutenberg_block() { |
||||
|
register_block_type( __DIR__ . '/templates/gutenberg-block/block.json' );<% if (include_script) { %> |
||||
|
|
||||
|
add_action( 'wp_enqueue_scripts', function () { |
||||
|
$asset_file_front = include( plugin_dir_path( __FILE__ ) . '/templates/gutenberg-block/build/front.asset.php' ); |
||||
|
wp_enqueue_script( |
||||
|
'gutenberg-<%= blockFilename %>-scripts-front', |
||||
|
plugins_url( 'templates/gutenberg-block/build/front.js', __FILE__ ), |
||||
|
$asset_file_front['dependencies'], |
||||
|
$asset_file_front['version'], |
||||
|
true |
||||
|
); |
||||
|
} );<% } %> |
||||
|
}<% } %> |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,47 @@ |
|||||
|
import path from "path"; |
||||
|
import {mkdir, copyFile} from "fs/promises"; |
||||
|
import {createFiles, getBlockName, getConfigs, readJSONFile} from "../../helpers.js"; |
||||
|
import {capitalize} from "lodash-es"; |
||||
|
import {fileURLToPath} from 'url'; |
||||
|
|
||||
|
const __filename = fileURLToPath(import.meta.url); |
||||
|
const __dirname = path.dirname(__filename); |
||||
|
|
||||
|
const {projectPath, modulesPath} = getConfigs(); |
||||
|
|
||||
|
export async function buildWordPress(blockName) { |
||||
|
const distPath = path.join(projectPath, 'exports', 'wordpress'); |
||||
|
await mkdir(distPath, {recursive: true}) |
||||
|
await copyFile(`${projectPath}/block.json`, `${distPath}/block.json`) |
||||
|
|
||||
|
let data = await readJSONFile(path.join(projectPath, `block.json`)); |
||||
|
|
||||
|
Object.assign(data, getBlockName(data.name)); |
||||
|
|
||||
|
// let data = await readJSONFile(path.join(projectPath, `block.json`));
|
||||
|
const title = capitalize(data.name); |
||||
|
const owner = capitalize(data.project); |
||||
|
|
||||
|
data = Object.assign(data, { |
||||
|
title, |
||||
|
blockClassModel: title.replace(/ /ig, '_'), |
||||
|
blockFilename: title.toLowerCase().replace(/ /ig, '-'), |
||||
|
blockClassName: title.toLowerCase().replace(/ /ig, '_'), |
||||
|
owner, |
||||
|
ownerClass: owner.replace(/ /ig, '_'), |
||||
|
ownerFilename: owner.toLowerCase().replace(/ /ig, '-'), |
||||
|
templateFormat: 'php', |
||||
|
include_acf_block: false, |
||||
|
include_native_gutenberg_block: false, |
||||
|
include_script: true, |
||||
|
include_elementor_widget: false, |
||||
|
}); |
||||
|
|
||||
|
await createFiles(data, [{ |
||||
|
to: `${data.blockClassModel}_Component.php`, |
||||
|
from: `templates/Template_Component.php` |
||||
|
}], { |
||||
|
pathDist: distPath, |
||||
|
generatorsPath: path.join(__dirname) |
||||
|
}); |
||||
|
} |
||||
Loading…
Reference in new issue