import { type RollTable, type RollTableAuthor, type RollTableDetails, type RollTableDetailsAndResults, type RollTableResult, type RollTableResultFull, type RollTableResultSet, rollTableToString } from '../../common/rolltable.js'; import escapeHTML from 'escape-html'; import slug from 'slug'; export function htmlTableIdentifier(table: RollTable): string { if (table.full) { return slug(table.identifier); } else { return slug(table.header); } } export function buildFooter({ creditsUrl, includesResponses, includesGenerator }: { readonly creditsUrl: string, readonly includesResponses: boolean, readonly includesGenerator: boolean }): string { return ` `; } export function buildAuthor({ author }: { readonly author: RollTableAuthor }): string { if (author.url) { return `
${escapeHTML(author.relation)} ${escapeHTML(author.name)}
`; } else { return `
${escapeHTML(author.relation)} ${escapeHTML(author.name)}
`; } } export function buildSet({ resultSet }: { readonly resultSet: RollTableResultSet }): string { return `
in ${resultSet.name ? 'the' : 'a'} ${resultSet.global ? 'global' : 'server-local'} set${resultSet.name ? ` ${escapeHTML(resultSet.name)}` : ''}
`; } export function buildResultAttribution({ result }: { readonly result: RollTableResultFull }): string { return `
${result.author ? buildAuthor({ author: result.author }) : ''}${buildSet({ resultSet: result.set })}
`; } export function buildGeneratedElement({ result, selected }: { readonly result: RollTableResult, readonly selected: boolean }): string { return ( `
  • ${result.table.full === 'results' ? `` : ''}

    ${escapeHTML(result.text)}${result.full ? buildResultAttribution({ result }) : ''}
  • `) } export function buildGeneratorPage( { results, baseUrl, clientId, creditsUrl, selected, includesResponses }: { readonly results: ReadonlyMap, readonly baseUrl: string, readonly clientId: string, readonly creditsUrl: string, readonly selected: ReadonlySet, readonly includesResponses: boolean }): string { return `

    Your generated scenario

      ${Array.from(results.values()).map(result => buildGeneratedElement({ result, selected: selected.has(result.table) })).join('')}
    ${clientId !== '' || includesResponses ? `` : ''}
    ${buildFooter({ includesResponses: includesResponses, includesGenerator: true, creditsUrl })}
    `; } export function buildResponseTypeButton({table}: {readonly table: RollTableDetails}) { return `${escapeHTML(table.emoji)} ${escapeHTML(table.name)}` } export function buildResponse({result, active}: {readonly result: RollTableResult, readonly active: boolean}) { return `
  • ${result.full ? buildResultAttribution({result}) : ''}
  • ` } export function buildResponseList({table, activeResult}: {readonly table: RollTableDetailsAndResults, readonly activeResult?: RollTableResult}) { return `
  • ${escapeHTML(table.emoji)}

    ${escapeHTML(table.title)}

      ${Array.from(table.results.values()).map(result => buildResponse({result, active: result === activeResult})).join('')}
  • ` } export function buildResponsesPage( { tables, results, creditsUrl, includesGenerator }: { readonly tables: Iterable, readonly results?: ReadonlyMap, readonly creditsUrl: string, readonly includesGenerator: boolean}): string { return `

    Possible Responses

      ${Array.from(tables).map(table => buildResponseList({table, activeResult: results?.get(table)})).join('')}
    ${buildFooter({ includesResponses: true, includesGenerator, creditsUrl })}
    `; } export function wrapPage( { title, bodyContent, script, styles, noscriptStyles }: { readonly title: string, readonly bodyContent: string, readonly script: string, readonly styles: string, readonly noscriptStyles: string }): string { return ` ${title} ${bodyContent} `; }