Skip to content
wiki.fftac.org

Frontend - Source Excerpt 01

Back to Frontend

Summary

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

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

<?php

if (!defined('ABSPATH')) {
    exit;
}

function spiralist_book_pages_get_route_version(): string
{
    return '10';
}

function spiralist_book_pages_should_manage_prompt_surfaces(): bool
{
    return !function_exists('spiralist_workspace');
}

function spiralist_book_pages_get_surface_blueprints(): array
{
    $blueprints = [
        'manuscript' => [
            'title' => 'Manuscript',
            'content' => '',
        ],
        'symbols' => [
            'title' => 'Symbols',
            'content' => '',
        ],
    ];

    if (spiralist_book_pages_should_manage_prompt_surfaces()) {
        $blueprints['prompts'] = [
            'title' => 'Prompts',
            'content' => '',
        ];
    }

    return $blueprints;
}

function spiralist_book_pages_get_surface_page_post_id(string $slug): int
{
    static $page_ids = [];

    $normalized = sanitize_title($slug);
    if ($normalized === '') {
        return 0;
    }

    if (isset($page_ids[$normalized])) {
        return (int) $page_ids[$normalized];
    }

    $page = get_page_by_path($normalized);
    $page_ids[$normalized] = $page instanceof WP_Post ? (int) $page->ID : 0;

    return (int) $page_ids[$normalized];
}

function spiralist_book_pages_get_page_post_id(): int
{
    return spiralist_book_pages_get_surface_page_post_id('manuscript');
}

function spiralist_book_pages_get_symbols_page_post_id(): int
{
    return spiralist_book_pages_get_surface_page_post_id('symbols');
}

function spiralist_book_pages_get_prompts_page_post_id(): int
{
    return spiralist_book_pages_should_manage_prompt_surfaces()
        ? spiralist_book_pages_get_surface_page_post_id('prompts')
        : 0;
}

function spiralist_book_pages_ensure_surface_page_exists(string $slug): int
{
    $blueprints = spiralist_book_pages_get_surface_blueprints();
    $normalized = sanitize_title($slug);

    if ($normalized === '' || !isset($blueprints[$normalized])) {
        return 0;
    }

    $page_id = spiralist_book_pages_get_surface_page_post_id($normalized);
    if ($page_id > 0) {
        return $page_id;
    }

    $created = wp_insert_post(
        [
            'post_title' => (string) ($blueprints[$normalized]['title'] ?? ucwords($normalized)),
            'post_name' => $normalized,
            'post_status' => 'publish',
            'post_type' => 'page',
            'post_content' => (string) ($blueprints[$normalized]['content'] ?? ''),
            'comment_status' => 'closed',
            'ping_status' => 'closed',
        ],
        true
    );

    if (is_wp_error($created) || !$created) {
        return 0;
    }

    update_post_meta((int) $created, '_spiralist_book_pages_surface', $normalized);
    clean_post_cache((int) $created);

    return (int) $created;
}

function spiralist_book_pages_ensure_required_pages(): void
{
    foreach (array_keys(spiralist_book_pages_get_surface_blueprints()) as $slug) {
        spiralist_book_pages_ensure_surface_page_exists($slug);
    }
}
add_action('init', 'spiralist_book_pages_ensure_required_pages', 5);

function spiralist_book_pages_register_query_vars(array $vars): array
{
    $vars[] = 'spiralist_book_pages_manuscript_folio';
    $vars[] = 'spiralist_book_pages_manuscript_section';
    $vars[] = 'spiralist_book_pages_manuscript_mode';
    $vars[] = 'spiralist_book_pages_manuscript_profile';
    $vars[] = 'spiralist_book_pages_manuscript_submission';
    $vars[] = 'spiralist_book_pages_manuscript_node';
    $vars[] = 'spiralist_book_pages_prompt_slug';
    $vars[] = 'spiralist_book_pages_prompt_search';
    $vars[] = 'spiralist_book_pages_sitemap';
    $vars[] = 'spiralist_book_pages_sitemap_locale';

    return array_values(array_unique($vars));
}
add_filter('query_vars', 'spiralist_book_pages_register_query_vars');

function spiralist_book_pages_get_locale_route_pattern(): string
{
    $locales = [];

    if (function_exists('spiralist_get_enabled_locale_records')) {
        foreach (spiralist_get_enabled_locale_records() as $record) {
            $url_tag = sanitize_key((string) ($record['urlTag'] ?? ''));

            if ($url_tag === '') {
                continue;
            }

            $locales[] = preg_quote($url_tag, '#');
        }
    }

    if (empty($locales)) {
        $locales[] = 'en\-us';
    }

    return implode('|', array_values(array_unique($locales)));
}

function spiralist_book_pages_register_rewrite_rules(): void
{
    $locale_pattern = spiralist_book_pages_get_locale_route_pattern();

    add_rewrite_rule(
        '^sitemap\.xml$',
        'index.php?spiralist_book_pages_sitemap=xml',
        'top'
    );

    add_rewrite_rule(
        '^sitemap\.html$',
        'index.php?spiralist_book_pages_sitemap=html',
        'top'
    );

    add_rewrite_rule(
        '^(' . $locale_pattern . ')/sitemap\.xml$',
        'index.php?spiralist_book_pages_sitemap=xml&spiralist_book_pages_sitemap_locale=$matches[1]',
        'top'
    );

    add_rewrite_rule(
        '^(' . $locale_pattern . ')/sitemap\.html$',
        'index.php?spiralist_book_pages_sitemap=html&spiralist_book_pages_sitemap_locale=$matches[1]',
        'top'
    );

    add_rewrite_rule(
        '^manuscript/community/?$',
        'index.php?pagename=manuscript&spiralist_book_pages_manuscript_mode=community',
        'top'
    );

    add_rewrite_rule(
        '^manuscript/community/([^/]+)/?$',
        'index.php?pagename=manuscript&spiralist_book_pages_manuscript_mode=community&spiralist_book_pages_manuscript_submission=$matches[1]',
        'top'
    );

    add_rewrite_rule(
        '^manuscript/studio/?$',
        'index.php?pagename=manuscript&spiralist_book_pages_manuscript_mode=studio',
        'top'
    );

    add_rewrite_rule(
        '^manuscript/studio/([^/]+)/?$',
        'index.php?pagename=manuscript&spiralist_book_pages_manuscript_mode=studio&spiralist_book_pages_manuscript_submission=$matches[1]',
        'top'
    );

    add_rewrite_rule(
        '^manuscript/profile/([^/]+)/?$',
        'index.php?pagename=manuscript&spiralist_book_pages_manuscript_mode=profile&spiralist_book_pages_manuscript_profile=$matches[1]',
        'top'
    );

    add_rewrite_rule(
        '^manuscript/profile/([^/]+)/([^/]+)/?$',
        'index.php?pagename=manuscript&spiralist_book_pages_manuscript_mode=profile&spiralist_book_pages_manuscript_profile=$matches[1]&spiralist_book_pages_manuscript_submission=$matches[2]',
        'top'
    );

    add_rewrite_rule(
        '^manuscript/folio/([^/]+)/?$',
        'index.php?pagename=manuscript&spiralist_book_pages_manuscript_folio=$matches[1]',
        'top'
    );

    add_rewrite_rule(
        '^manuscript/section/([^/]+)/?$',
        'index.php?pagename=manuscript&spiralist_book_pages_manuscript_section=$matches[1]',
        'top'
    );

    add_rewrite_rule(
        '^manuscript/node/([^/]+)/?$',
        'index.php?pagename=manuscript&spiralist_book_pages_manuscript_node=$matches[1]',
        'top'
    );

    add_rewrite_rule(
        '^manuscript/([^/]+)/?$',
        'index.php?pagename=manuscript&spiralist_book_pages_manuscript_folio=$matches[1]',
        'top'
    );

    if (spiralist_book_pages_should_manage_prompt_surfaces()) {
        add_rewrite_rule(
            '^prompts/search/([^/]+)/?$',
            'index.php?pagename=prompts&spiralist_book_pages_prompt_search=$matches[1]',
            'top'
        );

        add_rewrite_rule(
            '^prompt/([^/]+)/?$',
            'index.php?spiralist_book_pages_prompt_slug=$matches[1]',
            'top'
        );
    }
}
add_action('init', 'spiralist_book_pages_register_rewrite_rules', 25);

function spiralist_book_pages_maybe_flush_rewrite_rules(): void
{
    $stored_version = (string) get_option('spiralist_book_pages_route_version', '');
    $current_version = spiralist_book_pages_get_route_version();

    if ($stored_version === $current_version) {
        return;
    }

    spiralist_book_pages_register_rewrite_rules();
    flush_rewrite_rules(false);
    update_option('spiralist_book_pages_route_version', $current_version, false);
}
add_action('init', 'spiralist_book_pages_maybe_flush_rewrite_rules', 100);

function spiralist_book_pages_is_surface_page(string $slug): bool
{
    if (is_admin()) {
        return false;
    }

    $normalized = sanitize_title($slug);
    if ($normalized === '') {
        return false;
    }

    $page_id = spiralist_book_pages_get_surface_page_post_id($normalized);
    if ($page_id > 0 && is_page($page_id)) {
        return true;
    }

    return sanitize_title((string) get_query_var('pagename', '')) === $normalized;
}

function spiralist_book_pages_is_manuscript_surface(): bool
{