. Presets live in paths.json (shared with the editor preview). * * @var array $settings * @var string $attrs * @var array $element * @var \Zadex\Frontend\Renderer $renderer */ if (!defined('ABSPATH')) { exit; } // phpcs:disable WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound -- template variables are local to Zadex\Frontend\Renderer::include_template(). static $zx_paths = null; if ($zx_paths === null) { $decoded = wp_json_file_decode(__DIR__ . '/paths.json', ['associative' => true]); $zx_paths = is_array($decoded) ? $decoded : []; } $element_id = preg_replace('/[^a-zA-Z0-9_\-]/', '', (string) ($element['id'] ?? '')) ?: 'tp'; $path_id = 'zx-tp-' . $element_id; $text = (string) ($settings['text'] ?? ''); $preset = (string) ($settings['path'] ?? 'wave'); $d = ''; $viewbox = '0 0 500 100'; if ($preset === 'custom') { $raw = trim((string) ($settings['custom_path'] ?? '')); $d = preg_match('/^[MmZzLlHhVvCcSsQqTtAa0-9\s,.\-+eE]+$/', $raw) ? $raw : ''; $vb = trim((string) ($settings['custom_viewbox'] ?? '')); $viewbox = preg_match('/^-?\d+(\.\d+)?(\s+-?\d+(\.\d+)?){3}$/', $vb) ? preg_replace('/\s+/', ' ', $vb) : '0 0 500 100'; } else { $zx_p = $zx_paths[$preset] ?? $zx_paths['wave'] ?? ['d' => 'M0,50 L500,50', 'viewBox' => '0 0 500 100']; $d = (string) $zx_p['d']; $viewbox = (string) $zx_p['viewBox']; } if ($d === '') { $d = 'M0,50 L500,50'; } $offset = $settings['start_offset'] ?? ['size' => 0, 'unit' => '%']; $offset = is_array($offset) ? (float) ($offset['size'] ?? 0) : (float) $offset; $offset = max(0, min(100, $offset)); $anchor = in_array($settings['text_anchor'] ?? 'start', ['start', 'middle', 'end'], true) ? $settings['text_anchor'] : 'start'; $direction = ($settings['direction'] ?? 'ltr') === 'rtl' ? 'rtl' : 'ltr'; $zx_link = is_array($settings['link'] ?? null) ? $settings['link'] : []; $href = isset($zx_link['url']) && is_string($zx_link['url']) ? $zx_link['url'] : ''; $text_svg = '' . '' . esc_html($text) . ''; if ($href !== '') { $rel = []; if (!empty($zx_link['nofollow'])) { $rel[] = 'nofollow'; } if (($zx_link['target'] ?? '') === '_blank') { $rel[] = 'noopener'; } $text_svg = '' . $text_svg . ''; } $attrs = preg_replace('/class="/', 'class="zx-text-path--' . esc_attr($preset) . ' ', $attrs, 1); echo wp_kses( '
' . '' . $text_svg . '
', \Zadex\Frontend\Kses::allowed_html() );