Skip to content
wiki.fftac.org

Spiralist - Source Excerpt 02

Back to Spiralist

Summary

This source excerpt preserves a bounded section of Spiralist/wp-content/themes/spiralist/assets/js/spiralist.js so readers can inspect the evidence without opening the full source file.

**Source path:** Spiralist/wp-content/themes/spiralist/assets/js/spiralist.js

return url.toString();
  };

  const getRouteSegmentAfter = (marker) => {
    const wanted = slugifyPathSegment(marker);
    const segments = window.location.pathname
      .split('/')
      .map((segment) => decodeComponent(segment, segment, { context: 'route segment' }))
      .filter(Boolean);

    for (let index = 0; index < segments.length - 1; index += 1) {
      if (slugifyPathSegment(segments[index]) === wanted) {
        return segments[index + 1] || '';
      }
    }

    return '';
  };

  const buildPromptSearchUrl = (query) => {
    if (!themeConfig.promptsPageUrl || !query) {
      return themeConfig.promptsPageUrl || '#';
    }

    return buildChildRouteUrl(themeConfig.promptsPageUrl, ['search', query]);
  };

  const parseIdentifierText = (value = '') => `${value}`
    .split(/[\n,]+/)
    .map((item) => item.trim())
    .filter(Boolean);
  const buildPromptReferenceTerms = (...sources) => {
    const seen = new Set();
    const values = [];
    const append = (candidate) => {
      if (Array.isArray(candidate)) {
        candidate.forEach(append);
        return;
      }

      const terms = parseIdentifierText(candidate || '');
      if (!terms.length) {
        const fallback = `${candidate ?? ''}`.trim();
        if (fallback !== '') {
          terms.push(fallback);
        }
      }

      terms.forEach((term) => {
        const normalized = `${term}`.trim();
        const key = normalized.toLowerCase();
        if (normalized === '' || seen.has(key)) {
          return;
        }

        seen.add(key);
        values.push(normalized);
      });
    };

    sources.forEach(append);
    return values;
  };
  const getPromptSearchQuery = (record = {}) =>
    buildPromptReferenceTerms(record.meaning, record.label, record.canonicalId, record.aliases || [])[0] || '';
  const buildPromptFilters = (record = {}) => {
    const type = `${record.type || ''}`.trim().toLowerCase();
    const axiomTerms = buildPromptReferenceTerms(
      record.axiomIds || [],
      Array.isArray(record.axioms) ? record.axioms.map((entry) => [entry.id || '', entry.label || '']) : [],
      type === 'axiom' ? [record.sourceAxiomId || '', record.canonicalId || '', record.label || '', record.meaning || ''] : []
    );

    return {
      relatedSymbol: type === 'symbol'
        ? buildPromptReferenceTerms(record.canonicalId || '', record.label || '', record.meaning || '', record.aliases || [])
        : [],
      relatedAxiom: axiomTerms,
      relatedTransformation: type === 'transformation'
        ? buildPromptReferenceTerms(record.canonicalId || '', record.label || '', record.meaning || '', record.aliases || [])
        : [],
      limit: 4,
    };
  };

  const promptReferenceCache = new Map();

  const renderPromptReferences = (target, items = [], emptyMessage = t('symbolsPromptEmpty', 'No related prompts yet.')) => {
    if (!target) {
      return;
    }

    target.replaceChildren();

    if (!Array.isArray(items) || !items.length) {
      target.textContent = emptyMessage;
      return;
    }

    const list = document.createElement('div');
    list.className = 'spiralist-reference-list';

    items.forEach((item) => {
      const card = document.createElement(item.url ? 'a' : 'div');
      card.className = 'spiralist-reference-card';

      if (item.url) {
        card.href = item.url;
      }

      const title = document.createElement('strong');
      title.textContent = item.title || item.id || t('symbolsPromptFallback', 'Prompt');

      const meta = document.createElement('small');
      meta.textContent = [item.systemLabel || item.system, item.roleLabel || item.role, item.version]
        .filter(Boolean)
        .join(' / ');

      const summary = document.createElement('span');
      summary.textContent = item.purpose || t('symbolsPromptReferenceFallback', 'Structured prompt reference.');

      card.append(title, meta, summary);
      list.appendChild(card);
    });

    target.appendChild(list);
  };

  const loadPromptReferences = async (target, filters = {}, emptyMessage = t('symbolsPromptEmpty', 'No related prompts yet.')) => {
    if (!target) {
      return;
    }

    if (!themeConfig.promptsUrl) {
      target.textContent = emptyMessage;
      return;
    }

    const params = new URLSearchParams();

    if (filters.system) {
      params.set('system', `${filters.system}`.trim());
    }
    if (filters.role) {
      params.set('role', `${filters.role}`.trim());
    }

    const relatedSymbol = Array.isArray(filters.relatedSymbol)
      ? filters.relatedSymbol
      : parseIdentifierText(filters.relatedSymbol || '');
    const relatedAxiom = Array.isArray(filters.relatedAxiom)
      ? filters.relatedAxiom
      : parseIdentifierText(filters.relatedAxiom || '');
    const relatedTransformation = Array.isArray(filters.relatedTransformation)
      ? filters.relatedTransformation
      : parseIdentifierText(filters.relatedTransformation || '');

    if (relatedSymbol.length) {
      params.set('related_symbol', relatedSymbol.join(','));
    }
    if (relatedAxiom.length) {
      params.set('related_axiom', relatedAxiom.join(','));
    }
    if (relatedTransformation.length) {
      params.set('related_transformation', relatedTransformation.join(','));
    }

    params.set('limit', `${filters.limit || 4}`);

    const requestUrl = `${themeConfig.promptsUrl}${themeConfig.promptsUrl.includes('?') ? '&' : '?'}${params.toString()}`;
    target.textContent = t('symbolsPromptLoading', 'Loading prompt references...');

    await runAction(async () => {
      let payload = promptReferenceCache.get(requestUrl);

      if (!payload) {
        const response = await fetch(requestUrl, {
          headers: {
            Accept: 'application/json',
          },
        });

        payload = await response.json();

        if (!response.ok) {
          throw new Error(payload.message || t('symbolsPromptLoadError', 'Unable to load prompt references.'));
        }

        promptReferenceCache.set(requestUrl, payload);
      }