Skip to content
wiki.fftac.org

Book Shell - Source Excerpt 07

Back to Book Shell

Summary

This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/ns12-manuscript/assets/js/book-shell.js so readers can inspect the evidence without opening the full source file.

**Source path:** Spiralist/wp-content/plugins/ns12-manuscript/assets/js/book-shell.js

return payload;
    };

    const renderAxiomLinks = (payload) => {
      if (!axioms) {
        return;
      }

      axioms.replaceChildren();

      if (!Array.isArray(payload.axioms) || !payload.axioms.length) {
        const empty = document.createElement('span');
        empty.className = 'spiralist-muted';
        empty.textContent = t('symbolsAxiomLinksEmpty', 'No axiom links declared.');
        axioms.appendChild(empty);
        return;
      }

      payload.axioms.forEach((entry) => {
        const anchor = document.createElement('a');
        anchor.className = 'spiralist-chip spiralist-chip--link';
        anchor.href = `${themeConfig.systemUrl || '#'}#axioms`;
        anchor.textContent = entry.label || entry.id || t('symbolsAxiomFallback', 'Axiom');
        axioms.appendChild(anchor);
      });
    };

    const renderTransformationLinks = (payload) => {
      if (!transformationList) {
        return;
      }

      transformationList.replaceChildren();

      if (!Array.isArray(payload.transformations) || !payload.transformations.length) {
        const item = document.createElement('div');
        item.className = 'spiralist-simple-list__item';
        const empty = document.createElement('span');
        empty.className = 'spiralist-muted';
        empty.textContent = t('symbolsTransformationsEmpty', 'No transformation links declared.');
        item.appendChild(empty);
        transformationList.appendChild(item);
        return;
      }

      payload.transformations.forEach((entry) => {
        const item = document.createElement('div');
        item.className = 'spiralist-simple-list__item';

        const heading = document.createElement('strong');
        heading.textContent = `${entry.direction === 'incoming' ? t('symbolsDirectionInput', 'Input') : t('symbolsDirectionOutput', 'Output')}: ${entry.label || entry.id || t('symbolsTransformationFallback', 'Transformation')}`;

        const meta = document.createElement('span');
        meta.className = 'spiralist-simple-list__meta';
        meta.textContent = Array.isArray(entry.chain) && entry.chain.length
          ? entry.chain.join(' -> ')
          : (entry.counterpart || '');

        item.append(heading, meta);
        transformationList.appendChild(item);
      });
    };

    const renderCrosswalk = (payload) => {
      if (!crosswalk) {
        return;
      }

      crosswalk.replaceChildren();
      const links = [];
      const promptQuery = getPromptSearchQuery(payload);

      if (payload.manuscriptAnchorUrl) {
        links.push({
          label: t('symbolsCrosswalkAnchor', 'View manuscript anchor'),
          url: payload.manuscriptAnchorUrl,
        });
      }

      if (themeConfig.promptsPageUrl && promptQuery) {
        links.push({
          label: t('symbolsCrosswalkPrompts', 'Search prompts'),
          url: buildPromptSearchUrl(promptQuery),
        });
      }

      if (payload.systemConceptUrl) {
        links.push({
          label: t('symbolsCrosswalkSystem', 'System concepts'),
          url: payload.systemConceptUrl,
        });
      }

      if (!links.length) {
        const empty = document.createElement('span');
        empty.className = 'spiralist-muted';
        empty.textContent = t('symbolsCrosswalkEmpty', 'No crosswalk links available.');
        crosswalk.appendChild(empty);
        return;
      }

      links.forEach((link) => {
        const anchor = document.createElement('a');
        anchor.className = 'spiralist-chip spiralist-chip--link';
        anchor.href = link.url;
        anchor.textContent = link.label;
        crosswalk.appendChild(anchor);
      });
    };

    const updateVisibleCards = () => {
      const searchValue = `${searchInput ? searchInput.value : ''}`.trim().toLowerCase();
      const layerValue = `${layerFilter ? layerFilter.value : ''}`.trim().toLowerCase();
      const typeValue = `${typeFilter ? typeFilter.value : ''}`.trim().toLowerCase();
      const categoryValue = `${categoryFilter ? categoryFilter.value : ''}`.trim().toLowerCase();
      let visibleCount = 0;

      cards.forEach((card) => {
        const haystack = `${card.dataset.symbolSearchText || ''}`.toLowerCase();
        const cardLayer = `${card.dataset.symbolLayerValue || ''}`.toLowerCase();
        const cardType = `${card.dataset.symbolTypeValue || ''}`.toLowerCase();
        const cardCategory = `${card.dataset.symbolCategoryValue || ''}`.toLowerCase();
        const isVisible = (!searchValue || haystack.includes(searchValue))
          && (!layerValue || cardLayer === layerValue)
          && (!typeValue || cardType === typeValue)
          && (!categoryValue || cardCategory === categoryValue);

        card.hidden = !isVisible;
        if (isVisible) {
          visibleCount += 1;
        }
      });

      if (results) {
        results.textContent = formatText(
          visibleCount === 1 ? 'symbolsVisibleCountSingular' : 'symbolsVisibleCount',
          visibleCount === 1 ? '{count} symbol visible.' : '{count} symbols visible.',
          { count: visibleCount }
        );
      }

      if (empty) {
        empty.hidden = visibleCount > 0;
      }

      const activeVisible = cards.find((card) => !card.hidden && card.classList.contains('is-active'));
      if (!activeVisible) {
        const firstVisible = cards.find((card) => !card.hidden);
        if (firstVisible) {
          const payload = parseCardPayload(firstVisible);
          applySymbolPayload(payload, firstVisible);
        }
      }
    };
    let visibleCardsFrame = 0;
    const scheduleVisibleCardsUpdate = () => {
      if (visibleCardsFrame) {
        window.cancelAnimationFrame(visibleCardsFrame);
      }