Jake Vanderwerf
2025-11-10 e9967fa22781d922ba4eb8fb44fe72d200ac4b14
inc/blocks/CustomBlocks.php
@@ -20,7 +20,10 @@
        $this->cache = CacheManager::for('blocks', WEEK_IN_SECONDS);
      $this->imgCache = CacheManager::for('images', WEEK_IN_SECONDS);
        add_action('render_block', [$this, 'render'], 10, 3);
      add_filter('render_block', [$this, 'render'], 999, 3);
        add_action('init', [$this, 'registerBlockStyles']);
    }
@@ -67,8 +70,10 @@
    public function render(string $content, array $block, WP_Block $instance)
    {
        $method = 'render_'.$this->sanitizeBlockName($block);
      $blockName = $this->sanitizeBlockName($block);
        $method = 'render_'.$blockName;
      $function = BASE.$method;
      if (function_exists($function)) {
//       return $this->cache->remember(
//          $block,
@@ -77,8 +82,7 @@
//          }
//       );
         return $function($block, $content);
      }
      if (method_exists($this, $method)) {
      } else if (method_exists($this, $method)) {
         return $this->$method($block, $content);
         //TODO: Recache it
//       return $this->cache->remember(
@@ -94,9 +98,10 @@
            'core/post-title',
            'core/list-item',
            'core/site-title',
            'jvb/forms'
         ];
         if (!in_array($block['blockName'], $ignore)) {
            jvbDump('No method found for '.print_r($block['blockName'], true));
//          jvbDump('No method found for '.print_r($block['blockName'], true));
         }
      }
        if ($block['blockName'] === 'jvb/feed') {
@@ -220,6 +225,7 @@
        $attrs = $block['attrs'] ?? [];
        $innerContent = $this->innerBlocks($block);
      $position = 'object-position: center;';
      if (array_key_exists('focalPoint', $attrs)) {
         $x = (array_key_exists('x', $attrs['focalPoint'])) ? ($attrs['focalPoint']['x'] * 100).'%' : 'center';
         $y = (array_key_exists('y', $attrs['focalPoint'])) ? ($attrs['focalPoint']['y'] * 100).'%' : 'center';
@@ -231,8 +237,16 @@
        $backgroundType = $attrs['backgroundType'] ?? 'image';
        $background = '';
        if ($backgroundType === 'image' && isset($attrs['id'])) {
         $background .= str_replace('<img', '<img style="'.$position.'"', $this->image($attrs['id']));
      $ID = false;
      if (array_key_exists('useFeaturedImage', $attrs)) {
         global $post;
         $ID = get_post_thumbnail_id($post->ID);
      } else {
         $ID = (int)$attrs['id'];
      }
        if ($backgroundType === 'image' && $ID) {
         $background .= str_replace('<img', '<img style="'.$position.'"', $this->image($ID));
        } elseif ($backgroundType === 'video' && isset($attrs['url'])) {
            $background .= '<video style="'.$position.'"autoplay muted loop playsinline src="' . esc_url($attrs['url']) . '"></video>';
        }
@@ -471,8 +485,8 @@
            aria-label="Open Menu"
            aria-controls="navigation-' .$ID. '"
            aria-expanded="false">'.
            jvbIcon('menu', ['title'=>'Toggle Menu']).
            jvbIcon('close', ['title'=>'Toggle Menu']).
            jvbIcon('list', ['title'=>'Toggle Menu']).
            jvbIcon('x', ['title'=>'Toggle Menu']).
            '</button>';
        $class = ($toggle === '') ?
            $this->getClassesAndStyles($block['attrs'], ['mobile']) :
@@ -537,7 +551,7 @@
        $linkOpen = $this->build_navigation_link($block['attrs'], $aria);
        $content = '<li'.$classes.'>'.$linkOpen.$block['attrs']['label'].
                   '</a><button class="toggle" data-action="toggle-submenu" title="Toggle Submenu" aria-label="Open '.$block['attrs']['label'].' Submenu" aria-expanded="false" aria-controls="'.$id.'-submenu">'.
                   jvbIcon('submenu', ['title'=>'Toggle Submenu']).
                   jvbIcon('caret-down', ['title'=>'Toggle Submenu']).
                   '</button><ul class="submenu" id='.$id.'-submenu">';
        $content .= $this->innerBlocks($block);
@@ -607,8 +621,10 @@
    //core_post_excerpt
    protected function render_core_post_featured_image(array $block):string
    {
      global $post;
      $ID = get_post_thumbnail_id($post->ID);
        return '<figure'.$this->getClassesAndStyles($block['attrs']).'>'.
               $this->imageLink(true).
               $this->image($ID).
               '</figure>';
    }
    //core_post_navigation_link
@@ -767,12 +783,12 @@
      $check = ['header', 'footer'];
      $isHeaderTemplate = (
         (array_key_exists('slug', $block['attrs']) && str_contains($block['attrs']['slug'], 'header')) ||
         (array_key_exists('tagName', $block['attrs']) && str_contains($block['attrs']['tagName'], 'header'))
         (array_key_exists('slug', $block['attrs']) && str_contains(strtolower($block['attrs']['slug']), 'header')) ||
         (array_key_exists('tagName', $block['attrs']) && str_contains(strtolower($block['attrs']['tagName']), 'header'))
      ) ? 'header' : false;
      $isFooterTemplate = (
         (array_key_exists('slug', $block['attrs']) && str_contains($block['attrs']['slug'], 'footer')) ||
         (array_key_exists('tagName', $block['attrs']) && str_contains($block['attrs']['tagName'], 'footer'))
         (array_key_exists('slug', $block['attrs']) && str_contains(strtolower($block['attrs']['slug']), 'footer')) ||
         (array_key_exists('tagName', $block['attrs']) && str_contains(strtolower($block['attrs']['tagName']), 'footer'))
      ) ? 'footer' : false;
@@ -788,11 +804,12 @@
            }
                $checked = (is_user_logged_in() && current_user_can('prefers_dark_theme', true)) ? ' checked' : '';
                $title = ($checked == '') ? 'Toggle Dark Mode' : 'Toggle Light Mode';
                $themeSwitch = '<label title="'.$title.'" id="theme-switch" class="toggle-switch" for="theme-switcher">
            $showThemeSwitch = (bool)apply_filters('jvb_show_theme_switch', true);
                $themeSwitch = ($showThemeSwitch) ? '<label title="'.$title.'" id="theme-switch" class="toggle-switch" for="theme-switcher">
                    <input class="theme-switch row" id="theme-switcher" type="checkbox"'.$checked.' data-setting="theme" data-theme role="switch" name="dark-mode"><span class="slider">'.
               jvbIcon('light', ['title'=> 'Light Mode']).
               jvbIcon('dark', ['title'=>'Dark Mode']).
               '</span></label>';
               jvbIcon('sun-dim', ['title'=> 'Light Mode']).
               jvbIcon('moon', ['title'=>'Dark Mode']).
               '</span></label>' : '';
                $breadcrumbs = jvbBuildBreadcrumbs();
            $afterHeader = apply_filters('jvbBelowHeader', $afterHeader);
            if ($afterHeader !== '') {
@@ -859,8 +876,6 @@
                'id' => get_current_user_id()
            ] : null,
            'from'  => get_the_ID(),
            'icons' => jvbFeedBlockIcons(),
        ]);
    }
@@ -879,8 +894,12 @@
        $content = '';
        foreach ($block['innerBlocks'] as $b) {
            $method = 'render_'.$this->sanitizeBlockName($b);
         $function = BASE.$method;
            $content .= $before;
            if (method_exists($this, $method)) {
         if (function_exists($function)) {
            $content .= $function($b, '');
         } else if (method_exists($this, $method)) {
                $content .= $this->$method($b, '');
            } else {
                $content .= render_block($b);
@@ -946,8 +965,8 @@
    public function imageID(int|string $ID, array $block = []):int|false
    {
        if ($ID === '' && !empty($block)) {
            if (($block['blockName'] === 'core/post-featured-image' ||
                 (!array_key_exists('attrs', $block) && !array_key_exists('id', $block['attrs'])))) {
                $ID = get_post_thumbnail_id();
@@ -982,7 +1001,11 @@
        if (!$ID) {
            return '';
        }
        $imgSlug = get_post($ID)->post_name;
      $img = get_post($ID);
      if (!$img) {
         return '';
      }
        $imgSlug = $img->post_name;
        $img = '<a class="open-gallery" target="_blank" rel="nofollow" data-opens="gallery-'.$postSlug.'" data-focus="'.$postSlug.'-'.$imgSlug.'">'.$image;
        if ($close) {
@@ -1167,7 +1190,6 @@
    }
    protected function getClass(string $key, string|bool|array|int $value, array $attrs):string|array
    {
        switch ($key) {
            //Any additional classes the user adds
            case 'className':
@@ -1177,6 +1199,7 @@
                    default => str_replace('is-style-', '', $value),
                };
         case 'contentPosition':
            $classes = [];
            $pos = explode(' ', $value);
            foreach($pos as $p) {
@@ -1229,14 +1252,14 @@
//
//          }
            if (!array_key_exists('justifyContent', $value) && !array_key_exists('contentPosition', $attrs)) {
               $classes[] = 'start';
               $classes[] = ($type === 'row') ? 'start' : 'a-start';
            }
            if (array_key_exists('justifyContent', $value)  && !array_key_exists('contentPosition', $attrs)) {
               if (in_array($value['justifyContent'], ['left', 'right','space-between'])) {
//                jvbDump($type);
                  switch ($value['justifyContent']) {
                     case 'right':
                        $classes[] = 'end';
                        $classes[] = ($type === 'row') ? 'end' : 'a-end';
                        break;
                     case 'space-between':
                        $classes[] = 'btw';
@@ -1412,6 +1435,7 @@
            return '';
            default:
            $ignore = [
               'useFeaturedImage',
               'opacity',
               'borderColor',
               'backgroundColor',
@@ -1453,8 +1477,8 @@
            ];
            if (!is_admin() &&!in_array($key, $ignore)) {
//             TESTING
               jvbDump($key, 'getClass');
               jvbDump($attrs);
//             jvbDump($key, 'getClass');
//             jvbDump($attrs);
            }
                return '';
@@ -1674,6 +1698,7 @@
            // Any other attributes that need direct styling
            default:
            $ignore = [
               'useFeaturedImage',
               'opacity',
               'textAlign',
               'minHeightUnit',
@@ -1718,8 +1743,8 @@
            ];
            if (!is_admin() && !in_array($key, $ignore)) {
               //TESTING
               jvbDump($key, 'getStyle');
               jvbDump($attrs);
//             jvbDump($key, 'getStyle');
//             jvbDump($attrs);
            }
                // No default inline styles
                break;