}
+export enum ExportFormat {
+ Markdown = "md",
+ BBCode = "bb",
+ TextEmoji = "emoji",
+ TextOnly = "text",
+}
+
+export function exportResult(result: RollTableResult, format: ExportFormat): string {
+ switch (format) {
+ case ExportFormat.Markdown:
+ return `**${markdownEscape(result.table.header)}**\n${markdownEscape(result.text)}`
+ case ExportFormat.BBCode:
+ return `[b]${bbcodeEscape(result.table.title)}[/b]\n${bbcodeEscape(result.text)}`
+ case ExportFormat.TextEmoji:
+ return `${result.table.header}\n${result.text}`
+ case ExportFormat.TextOnly:
+ return `${result.table.title}\n${result.text}`
+ }
+}
+
+export function exportScenario(contents: RollTableResult[], format: ExportFormat): string {
+ return contents.map(r => exportResult(r, format)).join("\n\n")
+}
+
export function generatedStateToString(contents: GeneratedState): string {
if (contents.final) {
- return `Final state: ${Array.from(contents.rolled).map(([key, value]) => `${rollTableToString(key)} : ${resultToString(value)}`).join(" ::: ")}`
+ return `Final state: ${Array.from(contents.rolled).map(([key, value]) => `${rollTableToString(key)} : ${rollResultToString(value)}`).join(" ::: ")}`
} else {
- return `Current state: ${Array.from(contents.rolled).map(([key, value]) => `${rollTableToString(key)} : ${resultToString(value)}`).join(" ::: ")}. Selection: ${Array.from(contents.selected).map(v => `${rollTableToStringShort(v)}`).join(", ")}`
+ return `Current state: ${Array.from(contents.rolled).map(([key, value]) => `${rollTableToString(key)} : ${rollResultToString(value)}`).join(" ::: ")}. Selection: ${Array.from(contents.selected).map(v => `${rollTableToStringShort(v)}`).join(", ")}`
}
}
diff --git a/src/server/web/template.ts b/src/common/template.ts
similarity index 52%
rename from src/server/web/template.ts
rename to src/common/template.ts
index c9700e8..34ea78a 100644
--- a/src/server/web/template.ts
+++ b/src/common/template.ts
@@ -1,8 +1,8 @@
import {
- type RollTable, type RollTableAuthor, type RollTableDetails,
+ type RollTable, type RollTableAuthor, RollTableDatabase, type RollTableDetails,
type RollTableDetailsAndResults,
- type RollTableResult, type RollTableResultFull, type RollTableResultSet, rollTableToString
-} from '../../common/rolltable.js';
+ type RollTableResult, type RollTableResultFull, type RollTableResultSet
+} from './rolltable';
import escapeHTML from 'escape-html';
import slug from 'slug';
@@ -17,17 +17,17 @@ export function htmlTableIdentifier(table: RollTable): string {
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 ``;
+ return ``;
} else {
return `${escapeHTML(author.relation)} ${escapeHTML(author.name)}
`;
}
@@ -41,41 +41,54 @@ export function buildResultAttribution({ result }: { readonly result: RollTableR
return `${result.author ? buildAuthor({ author: result.author }) : ''}${buildSet({ resultSet: result.set })}
`;
}
-export function buildGeneratedElement({ result, selected }: { readonly result: RollTableResult, readonly selected: boolean }): string {
+export const selectedIdPrefix = 'selected-'
+export function buildGeneratedElement({ result, selected }: { readonly result: RollTableResult, readonly selected: boolean|null }): string {
return (
`
-
- ${escapeHTML(result.text)}${result.full ? buildResultAttribution({ result }) : ''}
+ ${selected !== null ? `` : ''}
+ ${result.full ? buildResultAttribution({ result }) : ''}
`)
}
+export const submitName = "submit"
+export const rerollId = "reroll"
+export const rerollAllId = "rerollAll"
+export const saveScenarioId = "saveScenario"
+export const selectAllId = "selectAll"
+export const selectNoneId = "selectNone"
+export const copyMDID = "copyMD"
+export const copyBBID = "copyBB"
+export const copyEmojiTextID = "copyEmojiText"
+export const copyTextID = "copyText"
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 {
+ { results, generatorTargetUrl, clientId, creditsUrl, editable, selected, includesResponses }:
+ { readonly results: ReadonlyMap, readonly generatorTargetUrl: string, readonly clientId: string, readonly creditsUrl: string, readonly editable: boolean, readonly selected: ReadonlySet, readonly includesResponses: boolean }): string {
return `