      1:   2:   3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:  41:  42:  43:  44:  45:  46:  47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74:  75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:  91:  92:  93:  94:  95:  96:  97:  98:  99: 100: 101: 102: 103: 104: 105:

    <?php

    namespace WPGMZA\Integration;

    /**
     * This module integrates the plugin with the Gutenberg editor
     */
    class Gutenberg extends \WPGMZA\Factory
    {
        /**
         * Constructor.
         */
        public function __construct()
        {
            global $wpgmza;

            add_action('enqueue_block_assets', array(
                $this,
                'onEnqueueBlockAssets'
            ));

            add_action('init', array(
                $this,
                'onInit'
            ));

            if(function_exists('register_block_type'))
            {
                register_block_type('gutenberg-wpgmza/block', array(
                    'render_callback' => array(
                        $this,
                        'onRender'
                    )
                ));
            }
        }

        /**
         * Enqueues assets to be used with the Gutenberg editor
         */
        public function onEnqueueBlockAssets()
        {
            global $wpgmza;

            if(!is_admin())
                return;

            $wpgmza->loadScripts();

            wp_enqueue_style(
                'wpgmza-gutenberg-integration',
                plugin_dir_url(WPGMZA_FILE) . 'css/gutenberg.css',
                '',
                WPGMZA_VERSION
            );
        }

        /**
         * Called on the WordPress init action. This function strips out JS module generated by the babel compiler, for browser compatibility.
         */
        public function onInit()
        {
            global $wpgmza;

            if(!$wpgmza->isInDeveloperMode())
                return;

            // NB: Commented out, false positives were causing this file to be wiped

            // Strip out JS module code for browser compatibility
            /*$filename = plugin_dir_path(WPGMZA_FILE) . 'js/v8/3rd-party-integration/gutenberg/dist/gutenberg.js';

            $contents = file_get_contents($filename);

            $contents = preg_replace('/Object\.defineProperty\(exports.+?;/s', '', $contents);

            $contents = preg_replace('/exports\.default = /', '', $contents);

            if(empty($contents))
                throw new \Exception('Gutenberg module would be blank');

            file_put_contents($filename, $contents);*/
        }

        /**
         * Called to render the plugins Gutenberg block front end.
         * @param mixed[] $atts An array of attributes passed in from the editor.
         */
        public function onRender($attr)
        {
            extract($attr);

            $attributes = array_merge(array('id' => 1), $attr);

            $str = "[wpgmza";

            foreach($attributes as $name => $value)
                $str .= " $name=\"" . addslashes($value) . "\"";

            $str .= "]";

            return $str;
        }
    }