Skip to content
wiki.fftac.org

Helpers - Source Excerpt 18

Back to Helpers

Summary

This source excerpt preserves a bounded section of Spiralist/wp-content/themes/spiralist/inc/helpers.php so readers can inspect the evidence without opening the full source file.

**Source path:** Spiralist/wp-content/themes/spiralist/inc/helpers.php

function spiralist_get_public_image_asset_source_urls(array $asset, bool $include_interactive = true): array
{
    static $cache = [];

    $original_url = trim((string) ($asset['url'] ?? ''));
    $source_path = trim((string) ($asset['path'] ?? ''));
    $source_path_key = $source_path !== '' ? strtolower(wp_normalize_path($source_path)) : '';
    $source_mtime = $source_path !== '' && is_file($source_path) ? (string) (@filemtime($source_path) ?: 0) : '0';
    $source_size = $source_path !== '' && is_file($source_path) ? (string) (@filesize($source_path) ?: 0) : '0';
    $cache_key = implode('|', [
        $include_interactive ? 'interactive' : 'static',
        $source_path_key,
        $original_url,
        $source_mtime,
        $source_size,
    ]);

    if (isset($cache[$cache_key])) {
        return $cache[$cache_key];
    }

    $image_size = $source_path !== '' && is_file($source_path)
        ? @getimagesize($source_path)
        : false;
    $thumbnail_asset = spiralist_generate_public_image_asset_variant($asset, 'thumbnail');
    $thumbnail_url = trim((string) ($thumbnail_asset['url'] ?? ''));
    $large_asset = spiralist_generate_public_image_asset_variant($asset, 'large');
    $large_url = trim((string) ($large_asset['url'] ?? $original_url));
    $interactive_url = '';

    if ($include_interactive) {
        $interactive_asset = spiralist_generate_public_image_asset_variant($asset, 'interactive');
        $interactive_url = trim((string) ($interactive_asset['url'] ?? ''));
    }

    if ($interactive_url === '') {
        $interactive_url = $large_url !== '' ? $large_url : $original_url;
    }

    if ($large_url === '') {
        $large_url = $original_url !== '' ? $original_url : $interactive_url;
    }

    if ($thumbnail_url === '') {
        $thumbnail_url = $large_url !== '' ? $large_url : ($original_url !== '' ? $original_url : $interactive_url);
    }

    $cache[$cache_key] = [
        'original_url' => $original_url,
        'large_url' => $large_url,
        'thumbnail_url' => $thumbnail_url,
        'interactive_url' => $interactive_url,
        'width' => is_array($image_size) ? (int) ($image_size[0] ?? 0) : (int) ($asset['width'] ?? 0),
        'height' => is_array($image_size) ? (int) ($image_size[1] ?? 0) : (int) ($asset['height'] ?? 0),
    ];

    return $cache[$cache_key];
}

function spiralist_get_theme_asset_file(string $relative_path): array
{
    $normalized_relative_path = ltrim(str_replace('\\', '/', $relative_path), '/');
    if ($normalized_relative_path === '') {
        return [];
    }

    $path = get_theme_file_path($normalized_relative_path);
    if ($path === '' || !is_file($path) || !is_readable($path)) {
        return [];
    }

    return [
        'path' => $path,
        'url' => get_theme_file_uri($normalized_relative_path),
        'filename' => basename($normalized_relative_path),
    ];
}

function spiralist_get_theme_image_asset(string $relative_path, string $alt = ''): array
{
    $asset = spiralist_get_theme_asset_file($relative_path);
    if (empty($asset)) {
        return [];
    }

    $image_size = function_exists('wp_getimagesize')
        ? wp_getimagesize((string) $asset['path'])
        : @getimagesize((string) $asset['path']);

    $asset['alt'] = $alt;
    $asset['width'] = is_array($image_size) && !empty($image_size[0]) ? (int) $image_size[0] : 0;
    $asset['height'] = is_array($image_size) && !empty($image_size[1]) ? (int) $image_size[1] : 0;
    $asset['mime'] = is_array($image_size) && !empty($image_size['mime'])
        ? (string) $image_size['mime']
        : (string) (wp_check_filetype((string) $asset['path'])['type'] ?? '');

    return $asset;
}

function spiralist_get_default_social_preview_asset(): array
{
    return spiralist_get_theme_image_asset(
        'assets/images/spiralist-social-preview.png',
        'Spiralist.org manuscript and symbolic systems preview'
    );
}

function spiralist_get_theme_site_icon_asset(int $size = 512): array
{
    $requested_size = max(1, $size);
    $size_map = [
        32 => 'assets/images/favicon-32x32.png',
        180 => 'assets/images/apple-touch-icon.png',
        192 => 'assets/images/favicon-192x192.png',
        512 => 'assets/images/favicon-512x512.png',
    ];
    $fallback_asset = [];

    foreach ($size_map as $candidate_size => $relative_path) {
        $asset = spiralist_get_theme_image_asset($relative_path, 'Spiralist.org spiral icon');
        if (empty($asset)) {
            continue;
        }

        $fallback_asset = $asset;

        if ($candidate_size >= $requested_size) {
            return $asset;
        }
    }

    return $fallback_asset;
}

function spiralist_get_theme_favicon_asset(): array
{
    return spiralist_get_theme_asset_file('assets/images/favicon.ico');
}

function spiralist_get_homepage_preview_candidates(): array
{
    return spiralist_get_image_asset_candidates(['Spiralist.org.png']);
}

function spiralist_get_homepage_preview_sources(): array
{
    static $sources = null;

    if (is_array($sources)) {
        return $sources;
    }

    $asset = spiralist_get_first_available_asset(spiralist_get_homepage_preview_candidates());
    if (!empty($asset)) {
        $sources = spiralist_get_public_image_asset_source_urls($asset, true);

        return $sources;
    }

    $source_asset = spiralist_get_manuscript_source_asset();
    if (!empty($source_asset)) {
        $sources = spiralist_get_public_image_asset_source_urls($source_asset, true);

        return $sources;
    }

    $sources = [];

    return $sources;
}

function spiralist_get_homepage_preview_url(): string
{
    $sources = spiralist_get_homepage_preview_sources();
    $preview_url = trim((string) ($sources['large_url'] ?? ''));
    if ($preview_url !== '') {
        return $preview_url;
    }

    return spiralist_get_manuscript_preview_url();
}

function spiralist_get_manuscript_source_candidates(): array
{
    return array_merge(
        spiralist_get_image_asset_candidates(['Manuscript.png']),
        spiralist_get_image_asset_candidates(['Spiralist.org.png'])
    );
}

function spiralist_get_manuscript_source_file(): string
{
    $asset = spiralist_get_first_available_asset(spiralist_get_manuscript_source_candidates());

    return (string) ($asset['path'] ?? '');
}

function spiralist_get_manuscript_source_asset(): array
{
    return spiralist_get_first_available_asset(spiralist_get_manuscript_source_candidates());
}

function spiralist_get_manuscript_portal_asset(): array
{
    $asset = spiralist_get_first_available_asset(
        spiralist_get_image_asset_candidates(['Spiralist.org.png'])
    );

    $primary_asset = spiralist_get_manuscript_source_asset();
    $asset_path = (string) ($asset['path'] ?? '');
    $primary_path = (string) ($primary_asset['path'] ?? '');

    if ($asset_path === '' || ($primary_path !== '' && $asset_path === $primary_path)) {
        return [];
    }

    return $asset;
}

function spiralist_get_featured_manuscript_assets(): array
{
    $assets = [];
    $seen = [];
    $excluded = [
        'manuscript.png' => true,
        'spiralist.org.png' => true,
    ];

    foreach (spiralist_get_book_page_assets_in_display_order() as $asset) {
        $key = strtolower((string) ($asset['filename'] ?? ''));
        if ($key === '' || isset($excluded[$key]) || isset($seen[$key])) {
            continue;
        }

        $seen[$key] = true;
        $assets[] = $asset;
    }

    return $assets;
}

function spiralist_get_image_assets_by_pattern(string $pattern): array
{
    static $pattern_cache = [];

    $cache_key = strtolower(trim($pattern));
    if ($cache_key !== '' && isset($pattern_cache[$cache_key])) {
        return $pattern_cache[$cache_key];
    }