import { ACTOR_TYPES } from "../../item.js" import { Misc } from "../../misc.js" import { EXPORT_CSV_SCRIPTARIUM, OptionsAvancees } from "../../settings/options-avancees.js" import { Mapping } from "./mapping.js" const IMG_SCRIPTARIUM = '' export class ExportScriptarium { static init() { ExportScriptarium.INSTANCE = new ExportScriptarium() } constructor() { this.mapping = Mapping.getMapping() Hooks.on("getActorDirectoryFolderContext", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) }) Hooks.on("getActorDirectoryEntryContext", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) }) } onActorDirectoryMenu(actorDirectory, menus) { menus.push({ name: 'Export Personnages', icon: IMG_SCRIPTARIUM, condition: (target) => game.user.isGM && OptionsAvancees.isUsing(EXPORT_CSV_SCRIPTARIUM) && this.$getActors(actorDirectory, target).length > 0, callback: target => this.exportActors(this.$getActors(actorDirectory, target), this.$getTargetName(actorDirectory, target)) }) } $getTargetName(actorDirectory, target) { const li = target.closest(".directory-item") const folderId = li.data("folderId") const actorId = li.data("documentId") return actorId ? game.actors.get(actorId).name : actorDirectory.folders.find(it => it.id == folderId).name } $getActors(actorDirectory, target) { const li = target.closest(".directory-item") const folderId = li.data("folderId") const actorId = li.data("documentId") const actors = actorId ? [game.actors.get(actorId)] : folderId ? actorDirectory.folders.find(it => it.id == folderId).contents : [] return actors.filter(it => it.type == ACTOR_TYPES.personnage) } exportActors(actors, targetName) { const eol = '\n' const header = Misc.join(this.getHeaderLine(), ';') const actorLines = actors.map(actor => Misc.join(this.getActorLine(actor), ';')) const data = Misc.join([header, ...actorLines], eol) const filename = `scriptarium-${targetName?.slugify()}.csv`; saveDataToFile(data, "text/csv;charset=utf-8", `${filename}`); } getHeaderLine() { return this.mapping.map(it => it.column) } getActorLine(actor) { const context = Mapping.prepareContext(actor) return this.mapping.map(it => it.getter(actor, context)) .map(it => this.$escapeQuotes(it)) .map(it => it.replaceAll("\n", " ").replaceAll("\r", "")) } $escapeQuotes(it) { it = '' + it if (it.includes('"') || it.includes(';')) { return `"${it.replaceAll('"', '\\"')}"` } return it } }