Skip to content
wiki.fftac.org

Admin Data - Source Excerpt 03

Back to Admin Data

Summary

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

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

foreach ($folios as $candidate_slug => $folio) {
            if (strtolower((string) ($folio['filename'] ?? '')) !== strtolower($filename)) {
                continue;
            }

            $folio_slug = $folio_slug !== '' ? $folio_slug : $candidate_slug;
            $section_slug = $section_slug !== '' ? $section_slug : sanitize_title((string) ($folio['section_slug'] ?? 'appendix'));
            break;
        }
    }

    $title = trim((string) ($source['title'] ?? ($existing['title'] ?? '')));
    if ($title === '') {
        if ($filename !== '' && function_exists('spiralist_book_pages_get_auto_book_page_title')) {
            $title = spiralist_book_pages_get_auto_book_page_title($filename);
        }

        if ($title === '') {
            $title = spiralist_book_pages_admin_humanize($slug);
        }
    }

    $placeholders = is_array($existing['placeholders'] ?? null) ? (array) $existing['placeholders'] : [];
    if (is_array($source['placeholders'] ?? null)) {
        $placeholders = array_filter((array) $source['placeholders'], 'is_scalar');
    }

    $placeholders = array_merge(
        $placeholders,
        [
            'TITLE' => $title,
            'FILENAME' => $filename,
            'SECTION' => $section_slug,
        ]
    );

    $extends = array_values(
        array_unique(
            array_filter(
                array_map(
                    'sanitize_title',
                    array_merge(
                        spiralist_book_pages_admin_parse_list($source['extends'] ?? ($existing['extends'] ?? [])),
                        spiralist_book_pages_admin_parse_list($source['extra_extends'] ?? '')
                    )
                ),
                'strlen'
            )
        )
    );

    if (empty($extends) && $section_slug !== '') {
        $extends = spiralist_book_pages_admin_default_prompt_extends($section_slug);
    }

    return [
        'schema' => 'spiralist-book-prompt/v1',
        'slug' => $slug,
        'source_version' => sanitize_text_field((string) ($source['source_version'] ?? ($existing['source_version'] ?? '1.0.0'))),
        'title' => sanitize_text_field($title),
        'summary' => sanitize_textarea_field((string) ($source['summary'] ?? ($existing['summary'] ?? ''))),
        'author_label' => sanitize_text_field((string) ($source['author_label'] ?? ($existing['author_label'] ?? 'Admin'))),
        'category' => sanitize_text_field((string) ($source['category'] ?? ($existing['category'] ?? 'Visual Design'))),
        'subcategory' => sanitize_text_field((string) ($source['subcategory'] ?? ($existing['subcategory'] ?? 'Manuscript Folios'))),
        'prompt_type' => sanitize_text_field((string) ($source['prompt_type'] ?? ($existing['prompt_type'] ?? 'image'))),
        'language' => sanitize_text_field((string) ($source['language'] ?? ($existing['language'] ?? 'all'))),
        'prompt_status' => sanitize_text_field((string) ($source['prompt_status'] ?? ($existing['prompt_status'] ?? 'published'))),
        'moderation_status' => sanitize_text_field((string) ($source['moderation_status'] ?? ($existing['moderation_status'] ?? 'approved'))),
        'tags' => spiralist_book_pages_admin_parse_list($source['tags'] ?? ($existing['tags'] ?? [])),
        'sample_output' => sanitize_textarea_field((string) ($source['sample_output'] ?? ($existing['sample_output'] ?? ''))),
        'related_manuscripts' => spiralist_book_pages_admin_parse_slug_list($source['related_manuscripts'] ?? ($existing['related_manuscripts'] ?? [])),
        'featured' => !empty($source['featured']) || (!isset($source['featured']) && !empty($existing['featured'])),
        'extends' => $extends,
        'filename' => $filename,
        'folio_slug' => $folio_slug,
        'section_slug' => $section_slug !== '' ? $section_slug : 'appendix',
        'placeholders' => $placeholders,
    ];
}

function spiralist_book_pages_admin_save_prompt(string $slug, array $meta, string $body): bool
{
    $content_root = function_exists('spiralist_book_pages_get_content_root')
        ? spiralist_book_pages_get_content_root()
        : '';
    $slug = sanitize_title($slug);

    if ($content_root === '' || $slug === '') {
        return false;
    }

    $directory = rtrim($content_root, '/\\') . DIRECTORY_SEPARATOR . 'prompts' . DIRECTORY_SEPARATOR . $slug;
    if (!wp_mkdir_p($directory)) {
        return false;
    }

    $meta['schema'] = 'spiralist-book-prompt/v1';
    $meta['slug'] = $slug;
    $meta['source_version'] = (string) ($meta['source_version'] ?? '1.0.0');

    $saved_meta = function_exists('spiralist_book_pages_write_json_file')
        && spiralist_book_pages_write_json_file($directory . DIRECTORY_SEPARATOR . 'meta.json', $meta);

    if (!$saved_meta) {
        return false;
    }

    return spiralist_book_pages_admin_write_text($directory . DIRECTORY_SEPARATOR . 'body.md', $body);
}

function spiralist_book_pages_admin_shared_fragments(): array
{
    $content_root = function_exists('spiralist_book_pages_get_content_root')
        ? spiralist_book_pages_get_content_root()
        : '';
    $directory = $content_root !== ''
        ? rtrim($content_root, '/\\') . DIRECTORY_SEPARATOR . 'prompts' . DIRECTORY_SEPARATOR . '_shared'
        : '';
    $usage = [];
    $fragments = [];

    foreach ((array) (function_exists('spiralist_book_pages_get_content_prompt_meta_map') ? spiralist_book_pages_get_content_prompt_meta_map() : []) as $meta) {
        foreach ((array) ($meta['extends'] ?? []) as $fragment_name) {
            $fragment_slug = sanitize_title((string) $fragment_name);
            if ($fragment_slug === '') {
                continue;
            }

            $usage[$fragment_slug] = (int) ($usage[$fragment_slug] ?? 0) + 1;
        }
    }

    if ($directory === '' || !is_dir($directory) || !is_readable($directory)) {
        return $fragments;
    }

    foreach (glob($directory . DIRECTORY_SEPARATOR . '*.md') ?: [] as $file) {
        $slug = sanitize_title((string) pathinfo($file, PATHINFO_FILENAME));
        if ($slug === '') {
            continue;
        }

        $fragments[$slug] = [
            'slug' => $slug,
            'content' => function_exists('spiralist_book_pages_read_text_file') ? spiralist_book_pages_read_text_file($file) : '',
            'usage_count' => (int) ($usage[$slug] ?? 0),
        ];
    }

    ksort($fragments, SORT_NATURAL | SORT_FLAG_CASE);

    return $fragments;
}

function spiralist_book_pages_admin_save_fragment(string $slug, string $body): bool
{
    $content_root = function_exists('spiralist_book_pages_get_content_root')
        ? spiralist_book_pages_get_content_root()
        : '';
    $slug = sanitize_title($slug);

    if ($content_root === '' || $slug === '') {
        return false;
    }

    $path = rtrim($content_root, '/\\') . DIRECTORY_SEPARATOR . 'prompts' . DIRECTORY_SEPARATOR . '_shared' . DIRECTORY_SEPARATOR . $slug . '.md';

    return spiralist_book_pages_admin_write_text($path, $body);
}

function spiralist_book_pages_admin_find_folio_for_prompt(array $meta): array
{
    $folios = spiralist_book_pages_admin_folios();
    $folio_slug = sanitize_title((string) ($meta['folio_slug'] ?? ''));
    $filename = strtolower((string) ($meta['filename'] ?? ''));
    $prompt_slug = sanitize_title((string) ($meta['slug'] ?? ''));

    if ($folio_slug !== '' && isset($folios[$folio_slug])) {
        return $folios[$folio_slug];
    }

    if ($filename !== '') {
        foreach ($folios as $folio) {
            if ($filename === strtolower((string) ($folio['filename'] ?? ''))) {
                return $folio;
            }
        }
    }

    return ($prompt_slug !== '' && isset($folios[$prompt_slug])) ? $folios[$prompt_slug] : [];
}

function spiralist_book_pages_admin_link_prompt(array $folio, array $meta, string $prompt_slug): array
{
    if (empty($folio)) {
        return $folio;
    }

    $status = (string) ($meta['prompt_status'] ?? 'published');
    $moderation = (string) ($meta['moderation_status'] ?? 'approved');
    $published = $status === 'published' && $moderation !== 'restricted';

    $folio['creation_prompt_title'] = trim((string) ($folio['creation_prompt_title'] ?? '')) !== '' ? (string) $folio['creation_prompt_title'] : 'Prompt Used';
    $folio['creation_prompt_status'] = $published ? 'Published prompt' : 'Draft prompt';
    if (trim((string) ($folio['creation_prompt_summary'] ?? '')) === '') {
        $folio['creation_prompt_summary'] = $published ? 'This folio now has an approved prompt record attached inside Spiralist Manuscript.' : 'This folio now has a saved draft prompt attached inside Spiralist Manuscript.';
    }
    $folio['creation_prompt_source_slug'] = $prompt_slug;