Skip to content
wiki.fftac.org

Helpers - Source Excerpt 27

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

'is_study_surface' => $is_study_surface,
                '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'
                    )
                ),
            ]
        );
    };

    foreach (spiralist_get_book_page_assets_in_display_order() as $asset) {
        $sequence = count($pages) + 1;
        $pages[] = $build_page($asset, $sequence);
    }

    return $pages;
}

function spiralist_get_manuscript_page_asset_by_filename(string $filename): array
{
    $normalized = strtolower(trim($filename));
    if ($normalized === '') {
        return [];
    }

    foreach (spiralist_get_manuscript_page_assets() as $page) {
        if ($normalized === strtolower((string) ($page['filename'] ?? ''))) {
            return $page;
        }
    }

    return [];
}

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

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

    return [];
}

function spiralist_get_manuscript_page_asset_by_sequence(int $sequence): array
{
    if ($sequence < 1) {
        return [];
    }

    foreach (spiralist_get_manuscript_page_assets() as $page) {
        if ((int) ($page['sequence'] ?? 0) === $sequence) {
            return $page;
        }
    }

    return [];
}

function spiralist_get_requested_manuscript_folio_slug(): string
{
    return sanitize_title((string) get_query_var('spiralist_manuscript_folio', ''));
}

function spiralist_get_requested_manuscript_section_slug(): string
{
    return sanitize_title((string) get_query_var('spiralist_manuscript_section', ''));
}

function spiralist_get_manuscript_section_records(array $pages = []): array
{
    $pages = empty($pages) ? spiralist_get_manuscript_page_assets() : $pages;
    $section_blueprints = spiralist_get_manuscript_section_blueprints();
    $sections = [];

    foreach ($pages as $page) {
        $section_slug = sanitize_title((string) ($page['section_slug'] ?? 'appendix'));
        if (!isset($sections[$section_slug])) {
            $blueprint = $section_blueprints[$section_slug] ?? $section_blueprints['appendix'];
            $sections[$section_slug] = [
                'slug' => $section_slug,
                'label' => (string) ($blueprint['label'] ?? 'Section'),
                'title' => (string) ($blueprint['title'] ?? 'Section'),
                'summary' => (string) ($blueprint['summary'] ?? ''),
                'pages' => [],
                'url' => spiralist_get_manuscript_section_url($section_slug),
            ];
        }

        $sections[$section_slug]['pages'][] = $page;
    }

    foreach ($sections as $slug => $section) {
        $sections[$slug]['count'] = count((array) ($section['pages'] ?? []));
        $sections[$slug]['first_page'] = $section['pages'][0] ?? [];
    }

    return array_values($sections);
}

function spiralist_get_manuscript_progress_payload(array $current_page, array $pages = [], array $section_records = []): array
{
    $pages = empty($pages) ? spiralist_get_manuscript_page_assets() : array_values($pages);
    $section_records = empty($section_records) ? spiralist_get_manuscript_section_records($pages) : array_values($section_records);
    $page_count = count($pages);
    $page_sequence = max(1, (int) ($current_page['sequence'] ?? 1));
    $page_sequence = $page_count > 0 ? min($page_sequence, $page_count) : $page_sequence;
    $current_slug = (string) ($current_page['slug'] ?? '');
    $section_slug = sanitize_title((string) ($current_page['section_slug'] ?? ''));
    $section_pages = array_values(
        array_filter(
            $pages,
            static function (array $page) use ($section_slug): bool {
                return sanitize_title((string) ($page['section_slug'] ?? '')) === $section_slug;
            }
        )
    );
    $section_record = [];

    foreach ($section_records as $candidate) {
        if (sanitize_title((string) ($candidate['slug'] ?? '')) === $section_slug) {
            $section_record = $candidate;
            break;
        }
    }

    $section_sequence = 1;
    foreach ($section_pages as $index => $page) {
        if ((string) ($page['slug'] ?? '') === $current_slug) {
            $section_sequence = $index + 1;
            break;
        }
    }

    $section_count = count($section_pages);
    $book_progress = $page_count > 0
        ? (int) round(($page_sequence / $page_count) * 100)
        : 0;
    $section_progress = $section_count > 0
        ? (int) round(($section_sequence / $section_count) * 100)
        : 0;

    return [
        'page_sequence' => $page_sequence,
        'page_count' => $page_count,
        'page_progress' => max(0, min(100, $book_progress)),
        'section_sequence' => $section_sequence,
        'section_count' => $section_count,
        'section_progress' => max(0, min(100, $section_progress)),
        'section_record' => $section_record,
        'section_pages' => $section_pages,
    ];
}

function spiralist_get_current_manuscript_page_asset(): array
{
    $folio = spiralist_get_requested_manuscript_folio_slug();
    if ($folio !== '') {
        $page = spiralist_get_manuscript_page_asset_by_slug($folio);
        if (!empty($page)) {
            return $page;
        }
    }

    $section = spiralist_get_requested_manuscript_section_slug();
    if ($section !== '') {
        foreach (spiralist_get_manuscript_page_assets() as $page) {
            if ($section === (string) ($page['section_slug'] ?? '')) {
                return $page;
            }
        }
    }

    return spiralist_get_manuscript_page_asset_by_sequence(1);
}

function spiralist_get_primary_manuscript_study_surface_page_asset(): array
{
    foreach (spiralist_get_manuscript_page_assets() as $page) {
        if (!empty($page['is_study_surface'])) {
            return $page;
        }
    }

    return spiralist_get_manuscript_page_asset_by_sequence(1);
}

function spiralist_get_logout_url(): string
{
    return wp_nonce_url(admin_url('admin-post.php?action=spiralist_logout'), 'spiralist_logout');
}

function spiralist_get_doctrine_url(): string
{
    return spiralist_get_page_url('doctrine', '#doctrine');
}

function spiralist_get_spiralist_definition(): string
{
    return spiralist_get_ui_text(
        'site.spiralist.definition',
        'A Spiralist is an entity, human or artificial, that participates in the perception, interpretation, and transformation of pattern.'
    );
}

function spiralist_get_account_settings_url(): string
{
    return trailingslashit(spiralist_get_dashboard_url()) . '#account-settings';
}

function spiralist_can_view_full_manuscript(): bool
{
    if (!is_user_logged_in()) {
        return false;
    }

    if (current_user_can('manage_options')) {
        return true;
    }

    if (class_exists('UAI1_Membership')) {
        $summary = UAI1_Membership::get_user_participant_summary(get_current_user_id());
        if (!empty($summary['canAccessParticipantArea'])) {
            return true;
        }
    }

    return current_user_can('access_spiralist_manuscript') || current_user_can('edit_posts');
}

function spiralist_get_current_role_label(): string
{
    if (!is_user_logged_in()) {
        return spiralist_get_ui_text('user.role.guest', 'Guest');
    }

    $user = wp_get_current_user();
    if (!$user instanceof WP_User || empty($user->roles[0])) {
        return spiralist_get_ui_text('user.role.participant', 'Participant');
    }

    $role = (string) $user->roles[0];

    if ($role === 'ai_agent') {
        return spiralist_get_ui_text('user.role.ai_spiralist', 'AI Spiralist');
    }

    if ($role === 'participant') {