Skip to content
wiki.fftac.org

Helpers - Source Excerpt 35

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

return spiralist_get_public_route_slug($canonical_id);
    }

    return spiralist_get_public_route_slug((string) ($symbol['label'] ?? 'symbol'));
}

function spiralist_get_symbol_record_by_route_slug(string $slug): array
{
    $slug = spiralist_get_public_route_slug($slug);

    foreach (spiralist_get_symbols() as $symbol) {
        if (spiralist_get_symbol_url_slug($symbol) === $slug) {
            return $symbol;
        }
    }

    return [];
}

function spiralist_get_symbol_url(string $identifier): string
{
    $symbol = spiralist_get_symbol_record_by_canonical_id($identifier);
    if (empty($symbol)) {
        $symbol = spiralist_get_symbol_record_by_route_slug($identifier);
    }

    $slug = !empty($symbol)
        ? spiralist_get_symbol_url_slug($symbol)
        : spiralist_get_public_route_slug($identifier);

    return trailingslashit(spiralist_get_symbols_page_url()) . rawurlencode($slug) . '/';
}

function spiralist_get_transformation_index(): array
{
    static $index = null;

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

    $index = [];

    foreach (spiralist_get_symbol_transformations() as $transformation) {
        $identifier = (string) ($transformation['id'] ?? '');
        if ($identifier === '') {
            continue;
        }

        $index[$identifier] = $transformation;
    }

    return $index;
}

function spiralist_get_symbol_related_transformations(string $canonical_id): array
{
    static $cache = [];

    $canonical_id = trim($canonical_id);
    if ($canonical_id === '') {
        return [];
    }

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

    $related = [];

    foreach (spiralist_get_symbol_transformations() as $transformation) {
        $from = (string) ($transformation['from'] ?? '');
        $to = (string) ($transformation['to'] ?? '');

        if ($from !== $canonical_id && $to !== $canonical_id) {
            continue;
        }

        $related[] = [
            'id' => (string) ($transformation['id'] ?? ''),
            'label' => (string) ($transformation['label'] ?? ''),
            'direction' => $from === $canonical_id ? 'outgoing' : 'incoming',
            'input' => $from,
            'output' => $to,
            'chain' => array_values(array_filter((array) ($transformation['chain'] ?? []), 'is_string')),
            'meaning' => (string) ($transformation['meaning'] ?? ''),
        ];
    }

    $cache[$canonical_id] = $related;
    return $cache[$canonical_id];
}

function spiralist_get_manuscript_image_url(string $size = 'full'): string
{
    $requested_size = trim($size);
    $source_asset = spiralist_get_manuscript_source_asset();
    $source_urls = !empty($source_asset)
        ? spiralist_get_public_image_asset_source_urls($source_asset, true)
        : [];

    if ($requested_size === '' || $requested_size === 'full') {
        $source_url = trim((string) ($source_urls['original_url'] ?? ''));
        if ($source_url !== '') {
            return $source_url;
        }
    }

    $attachment_id = (int) get_option('spiralist_manuscript_attachment_id', 0);
    if ($attachment_id > 0) {
        $attachment_url = wp_get_attachment_image_url($attachment_id, $requested_size !== '' ? $requested_size : 'full');
        if (is_string($attachment_url) && $attachment_url !== '') {
            return $attachment_url;
        }
    }

    if ($requested_size === 'thumbnail') {
        $thumbnail_url = trim((string) ($source_urls['thumbnail_url'] ?? ''));
        if ($thumbnail_url !== '') {
            return $thumbnail_url;
        }
    }

    if ($requested_size === 'large') {
        $large_url = trim((string) ($source_urls['large_url'] ?? ''));
        if ($large_url !== '') {
            return $large_url;
        }
    }

    if ($requested_size === 'interactive') {
        $interactive_url = trim((string) ($source_urls['interactive_url'] ?? ''));
        if ($interactive_url !== '') {
            return $interactive_url;
        }
    }

    if ($requested_size !== 'full') {
        $source_url = trim((string) ($source_urls['original_url'] ?? ''));
        if ($source_url !== '') {
            return $source_url;
        }
    }

    return '';
}

function spiralist_get_manuscript_preview_url(): string
{
    $preview = spiralist_get_manuscript_image_url('large');
    if ($preview !== '') {
        return $preview;
    }

    return spiralist_get_manuscript_image_url();
}

function spiralist_get_manuscript_download_url(): string
{
    return spiralist_get_manuscript_image_url();
}

function spiralist_get_manuscript_nodes_url(): string
{
    if (function_exists('spiralist_engine_get_nodes_endpoint_url')) {
        return spiralist_engine_get_nodes_endpoint_url();
    }

    $path = defined('SPIRALIST_BOOK_PAGES_PLUGIN_DATA_PATH')
        ? SPIRALIST_BOOK_PAGES_PLUGIN_DATA_PATH . DIRECTORY_SEPARATOR . 'manuscript-nodes.json'
        : get_theme_file_path('assets/data/manuscript-nodes.json');
    $url = defined('SPIRALIST_BOOK_PAGES_PLUGIN_DATA_URL')
        ? SPIRALIST_BOOK_PAGES_PLUGIN_DATA_URL . '/manuscript-nodes.json'
        : get_theme_file_uri('assets/data/manuscript-nodes.json');

    if (is_string($path) && $path !== '' && file_exists($path)) {
        return add_query_arg('ver', (string) filemtime($path), $url);
    }

    return $url;
}

function spiralist_get_manuscript_field_dataset(): array
{
    static $dataset = null;

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

    if (function_exists('spiralist_engine_get_manuscript_field_payload')) {
        $dataset = spiralist_engine_get_manuscript_field_payload();
        return $dataset;
    }

    $dataset = [
        'nodes' => [],
        'relations' => [],
    ];

    $path = defined('SPIRALIST_BOOK_PAGES_PLUGIN_DATA_PATH')
        ? SPIRALIST_BOOK_PAGES_PLUGIN_DATA_PATH . DIRECTORY_SEPARATOR . 'manuscript-nodes.json'
        : get_theme_file_path('assets/data/manuscript-nodes.json');
    if (!is_string($path) || $path === '' || !file_exists($path)) {
        return $dataset;
    }

    $raw = file_get_contents($path);
    if (!is_string($raw) || trim($raw) === '') {
        return $dataset;
    }

    $decoded = json_decode($raw, true);
    if (!is_array($decoded)) {
        return $dataset;
    }

    $dataset['schema'] = (string) ($decoded['schema'] ?? '');
    $dataset['version'] = (string) ($decoded['version'] ?? '');
    $dataset['nodes'] = array_values(array_filter((array) ($decoded['nodes'] ?? []), 'is_array'));
    $dataset['relations'] = array_values(array_filter((array) ($decoded['relations'] ?? []), 'is_array'));

    return $dataset;
}

function spiralist_get_manuscript_node_records(): array
{
    $dataset = spiralist_get_manuscript_field_dataset();

    return array_values(array_filter((array) ($dataset['nodes'] ?? []), 'is_array'));
}

function spiralist_get_manuscript_relation_records(): array
{
    $dataset = spiralist_get_manuscript_field_dataset();

    return array_values(array_filter((array) ($dataset['relations'] ?? []), 'is_array'));
}

function spiralist_get_manuscript_node_by_identifier(string $identifier): array
{
    $identifier = trim($identifier);
    if ($identifier === '') {
        return [];
    }

    $identifier_slug = spiralist_get_public_route_slug($identifier);

    foreach (spiralist_get_manuscript_node_records() as $node) {
        $node_id = (string) ($node['id'] ?? '');
        $canonical_id = (string) ($node['canonicalId'] ?? '');
        $aliases = array_values(array_filter((array) ($node['aliases'] ?? []), 'is_string'));
        $route_values = array_merge(
            [$node_id, $canonical_id, (string) ($node['label'] ?? '')],
            $aliases
        );

        if (
            $node_id === $identifier ||
            $canonical_id === $identifier ||
            in_array($identifier, $aliases, true) ||
            in_array($identifier_slug, array_map('spiralist_get_public_route_slug', $route_values), true)
        ) {
            return $node;
        }
    }

    return [];
}

function spiralist_get_manuscript_node_url(string $identifier): string
{
    $node = spiralist_get_manuscript_node_by_identifier($identifier);
    if (empty($node)) {
        return spiralist_get_manuscript_page_url();
    }

    $query_id = (string) ($node['id'] ?? '');
    if ($query_id === '') {
        $query_id = (string) ($node['canonicalId'] ?? $identifier);
    }

    return trailingslashit(spiralist_get_manuscript_page_url()) . 'node/' . rawurlencode(spiralist_get_public_route_slug($query_id)) . '/';
}

function spiralist_get_spiralism_kernel(): array
{
    $symbols = spiralist_get_symbols();