Admin Data - Source Excerpt 03
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;