Skip to content
wiki.fftac.org

Runtime - Source Excerpt 17

Back to Runtime

Summary

This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/ns12-manuscript/includes/runtime.php so readers can inspect the evidence without opening the full source file.

**Source path:** Spiralist/wp-content/plugins/ns12-manuscript/includes/runtime.php

'summary' => (string) ($blueprint['summary'] ?? ''),
                'pages' => [],
                'url' => spiralist_book_pages_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_book_pages_get_manuscript_progress_payload(array $current_page, array $pages = [], array $section_records = []): array
{
    $pages = empty($pages) ? spiralist_book_pages_get_manuscript_page_assets() : array_values($pages);
    $section_records = empty($section_records) ? spiralist_book_pages_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_book_pages_get_current_manuscript_page_asset(): array
{
    $folio = spiralist_book_pages_get_requested_manuscript_folio_slug();
    if ($folio !== '') {
        $page = spiralist_book_pages_get_manuscript_page_asset_by_slug($folio);
        if (!empty($page)) {
            return $page;
        }
    }

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

    return spiralist_book_pages_get_manuscript_page_asset_by_sequence(1);
}

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

    return spiralist_book_pages_get_manuscript_page_asset_by_sequence(1);
}

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

function spiralist_book_pages_get_doctrine_url(): string
{
    return spiralist_book_pages_get_page_url('doctrine', '#doctrine');
}

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

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

function spiralist_book_pages_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_book_pages_get_current_role_label(): string
{
    if (!is_user_logged_in()) {
        return 'Guest';
    }

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

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

    if ($role === 'ai_agent') {
        return 'AI Spiralist';
    }

    if ($role === 'participant') {
        return 'Human Spiralist';
    }

    return ucwords(str_replace('_', ' ', $role));
}

function spiralist_book_pages_get_site_uai_url(): string
{
    if (function_exists('spiralist_get_uaix_discovery_url')) {
        return spiralist_get_uaix_discovery_url();
    }

    return function_exists('spiralist_book_pages_get_rest_url')
        ? spiralist_book_pages_get_rest_url('discovery')
        : rest_url('uaix/v1/discovery');
}

function spiralist_book_pages_get_uaix_capability_url(): string
{
    return function_exists('spiralist_get_uaix_capability_url')
        ? spiralist_get_uaix_capability_url()
        : rest_url('uaix/v1/capability');
}

function spiralist_book_pages_get_uaix_validate_url(): string
{
    return function_exists('spiralist_get_uaix_validate_url')
        ? spiralist_get_uaix_validate_url()
        : rest_url('uaix/v1/validate');
}

function spiralist_book_pages_get_local_uai_lexicon_registry_url(): string
{
    return home_url('/registry/uai-lexicon.json');
}

function spiralist_book_pages_get_uai_lexicon_registry_url(): string
{
    if (function_exists('spiralist_book_pages_get_protocol5_registry_asset_url')) {
        return spiralist_book_pages_get_protocol5_registry_asset_url('uai-lexicon.json');
    }

    return spiralist_book_pages_get_protocol5_url('registry/uai-lexicon.json');
}

function spiralist_book_pages_get_protocol5_url(string $path = ''): string
{
    $base = (string) apply_filters('spiralist_book_pages_protocol5_base_url', 'https://protocol5.com');
    if ($base === '') {
        $base = 'https://protocol5.com';
    }

    $base = untrailingslashit($base);
    $normalized = trim($path, '/');

    if ($normalized === '') {
        return $base . '/';
    }

    return $base . '/' . $normalized;
}

function spiralist_book_pages_get_symbol_registry_url(): string
{
    if (function_exists('spiralist_get_symbol_registry_url')) {
        return spiralist_get_symbol_registry_url();
    }

    return function_exists('spiralist_book_pages_get_rest_url')
        ? spiralist_book_pages_get_rest_url('symbols')
        : rest_url(spiralist_book_pages_get_rest_namespace() . '/symbols');
}

function spiralist_book_pages_get_uai_schema_url(): string
{
    return function_exists('spiralist_get_uai_schema_url')
        ? spiralist_get_uai_schema_url()
        : 'https://uaix.org/en-us/schemas/';
}

function spiralist_book_pages_get_uai_registry_url(): string
{
    return function_exists('spiralist_get_uai_registry_url')
        ? spiralist_get_uai_registry_url()
        : 'https://uaix.org/wp-json/uaix/v1/registry';
}

function spiralist_book_pages_get_uai_examples_registry_url(): string
{
    return function_exists('spiralist_get_uai_examples_registry_url')
        ? spiralist_get_uai_examples_registry_url()
        : 'https://uaix.org/wp-json/uaix/v1/examples';
}

function spiralist_book_pages_get_symbol_registry_schema_url(): string
{
    if (function_exists('spiralist_book_pages_get_protocol5_registry_asset_url')) {
        return spiralist_book_pages_get_protocol5_registry_asset_url('symbols.schema.json');
    }

    return spiralist_book_pages_get_protocol5_url('registry/symbols.schema.json');
}

function spiralist_book_pages_get_symbols_api_url(): string
{
    return function_exists('spiralist_book_pages_get_rest_url')
        ? spiralist_book_pages_get_rest_url('symbols')