Skip to content
wiki.fftac.org

Helpers - Source Excerpt 20

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

? 'This image is preserved as its own public page inside the Spiralist image codex.'
                : 'This supporting mark remains available as its own image page.')));

            $records[] = [
                'path' => $path,
                'url' => (string) ($asset_file['url'] ?? ''),
                'filename' => $filename,
                'slug' => $slug,
                'title' => $title,
                'label' => (string) ($blueprint['label'] ?? ($is_prominent ? 'Image Page' : 'Supporting Mark')),
                'eyebrow' => (string) ($blueprint['eyebrow'] ?? ($is_prominent ? 'Image Codex' : 'Supporting Mark')),
                'summary' => $summary,
                'caption' => $caption,
                'section_slug' => $section_slug,
                'section_label' => (string) ($section['label'] ?? 'Section'),
                'section_title' => (string) ($section['title'] ?? 'Section'),
                'section_summary' => (string) ($section['summary'] ?? ''),
                'display_order' => (int) ($blueprint['display_order'] ?? ($is_prominent ? 100 : 900)),
                'is_prominent' => $is_prominent,
                'width' => $width,
                'height' => $height,
                'filesize' => $filesize,
                'modifiedAt' => (int) ($asset_file['modifiedAt'] ?? 0),
                'orientation' => $orientation,
                'creation_prompt_title' => (string) ($blueprint['creation_prompt_title'] ?? 'Prompt Used'),
                'creation_prompt_status' => (string) ($blueprint['creation_prompt_status'] ?? 'Prompt pending'),
                'creation_prompt_summary' => (string) ($blueprint['creation_prompt_summary'] ?? ''),
                'creation_prompt_text' => (string) ($blueprint['creation_prompt_text'] ?? ''),
                'creation_prompt_source_slug' => sanitize_title((string) ($blueprint['creation_prompt_source_slug'] ?? '')),
                'related_workspace_prompt_slugs' => array_values(
                    array_filter(
                        array_map(
                            static function ($slug): string {
                                return sanitize_title((string) $slug);
                            },
                            (array) ($blueprint['related_workspace_prompt_slugs'] ?? [])
                        ),
                        'strlen'
                    )
                ),
            ];
        }

        usort($records, static function (array $left, array $right): int {
            $priority_compare = ((int) !empty($right['is_prominent'])) <=> ((int) !empty($left['is_prominent']));
            if ($priority_compare !== 0) {
                return $priority_compare;
            }

            $order_compare = ((int) ($left['display_order'] ?? 0)) <=> ((int) ($right['display_order'] ?? 0));
            if ($order_compare !== 0) {
                return $order_compare;
            }

            return strnatcasecmp((string) ($left['filename'] ?? ''), (string) ($right['filename'] ?? ''));
        });

        spiralist_write_runtime_cache(
            'gallery_assets_v2',
            [
                'signature' => $cache_signature,
                'records' => $records,
            ]
        );
    }

    $manuscript_pages = function_exists('spiralist_get_manuscript_page_assets')
        ? spiralist_get_manuscript_page_assets()
        : [];

    foreach ($records as $index => $record) {
        $records[$index]['sequence'] = $index + 1;
        $records[$index]['route_url'] = spiralist_get_gallery_image_url($record);

        foreach ($manuscript_pages as $page) {
            if (strtolower((string) ($page['filename'] ?? '')) !== strtolower((string) ($record['filename'] ?? ''))) {
                continue;
            }

            $records[$index]['related_manuscript_url'] = spiralist_get_manuscript_folio_url($page);
            $records[$index]['related_manuscript_title'] = (string) ($page['title'] ?? 'Manuscript Folio');
            break;
        }
    }

    $assets = $records;

    return $assets;
}

function spiralist_get_gallery_image_url($asset): string
{
    $slug = '';

    if (is_array($asset)) {
        $slug = (string) ($asset['slug'] ?? '');
    } else {
        $slug = sanitize_title((string) $asset);
    }

    if ($slug === '') {
        return spiralist_get_gallery_overview_url();
    }

    $url = trailingslashit(spiralist_get_gallery_page_url()) . 'image/' . rawurlencode($slug) . '/';
    $language = function_exists('spiralist_get_current_language_slug')
        ? spiralist_get_current_language_slug()
        : '';

    if ($language !== '') {
        return spiralist_get_language_prefixed_url($url, $language);
    }

    return $url;
}

function spiralist_get_gallery_asset_by_slug(string $slug): array
{
    $normalized = sanitize_title($slug);
    if ($normalized === '') {
        return [];
    }

    foreach (spiralist_get_gallery_assets() as $asset) {
        if ($normalized === (string) ($asset['slug'] ?? '')) {
            return $asset;
        }
    }

    return [];
}

function spiralist_get_plugin_book_pages_directory(): array
{
    if (!defined('SPIRALIST_BOOK_PAGES_PLUGIN_PATH') || !defined('SPIRALIST_BOOK_PAGES_PLUGIN_URL')) {
        return [];
    }

    $path = rtrim((string) constant('SPIRALIST_BOOK_PAGES_PLUGIN_PATH'), '/\\');
    $url = trim((string) constant('SPIRALIST_BOOK_PAGES_PLUGIN_URL'));

    if ($path === '' || $url === '' || !is_dir($path) || !is_readable($path)) {
        return [];
    }

    return [
        'path' => $path,
        'url' => untrailingslashit($url),
    ];
}

function spiralist_get_book_page_asset_directories(): array
{
    $directory = spiralist_get_plugin_book_pages_directory();
    if (empty($directory)) {
        return [];
    }

    return [
        [
            'path' => rtrim((string) ($directory['path'] ?? ''), '/\\'),
            'url' => trailingslashit((string) ($directory['url'] ?? '')),
        ],
    ];
}

function spiralist_get_available_book_page_assets_by_filename(): array
{
    static $assets = null;

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

    $allowed_extensions = ['png', 'jpg', 'jpeg', 'webp', 'gif', 'avif'];
    $manifest = spiralist_get_directory_asset_manifest(
        spiralist_get_book_page_asset_directories(),
        $allowed_extensions
    );
    $signature = (string) ($manifest['signature'] ?? '');
    $cached = spiralist_read_runtime_cache('book_page_assets_v1');

    if (
        $signature !== ''
        && ($cached['signature'] ?? '') === $signature
        && is_array($cached['assets'] ?? null)
    ) {
        $assets = $cached['assets'];
        return $assets;
    }

    $assets = [];

    foreach ((array) ($manifest['files'] ?? []) as $asset) {
        if (!is_array($asset)) {
            continue;
        }

        $filename = trim((string) ($asset['filename'] ?? ''));
        $key = strtolower($filename);
        if ($key === '' || isset($assets[$key])) {
            continue;
        }

        $assets[$key] = [
            'path' => (string) ($asset['path'] ?? ''),
            'url' => (string) ($asset['url'] ?? ''),
            'filename' => $filename,
            'filesize' => (int) ($asset['filesize'] ?? 0),
            'modifiedAt' => (int) ($asset['modifiedAt'] ?? 0),
        ];
    }

    spiralist_write_runtime_cache(
        'book_page_assets_v1',
        [
            'signature' => $signature,
            'assets' => $assets,
        ]
    );

    return $assets;
}

function spiralist_get_book_page_asset_by_filename(string $filename): array
{
    $basename = trim(basename($filename));
    if ($basename === '') {
        return [];
    }

    $asset_lookup = spiralist_get_available_book_page_assets_by_filename();
    $key = strtolower($basename);
    if (isset($asset_lookup[$key])) {
        return $asset_lookup[$key];
    }

    foreach (spiralist_get_book_page_asset_directories() as $directory) {
        $asset = spiralist_get_case_insensitive_asset_from_directory($directory, $basename);
        if (!empty($asset)) {
            return $asset;
        }
    }

    return [];
}

function spiralist_get_public_book_pages_directory(): array
{
    return spiralist_get_plugin_book_pages_directory();
}

function spiralist_get_case_insensitive_asset_from_directory(array $directory, string $basename): array
{
    $base_path = rtrim((string) ($directory['path'] ?? ''), '/\\');
    $base_url = trailingslashit((string) ($directory['url'] ?? ''));
    $target = strtolower(trim($basename));

    if ($base_path === '' || $base_url === '' || $target === '' || !is_dir($base_path) || !is_readable($base_path)) {
        return [];
    }