forked from public/foundryvtt-reve-de-dragon
		
	Feuille de PNJ au format des encarts Scriptarium. Aucune possibilité de jets de dés pour l'instant.
		
			
				
	
	
		
			79 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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 = '<img class="context-menu-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/scriptarium.svg">'
 | |
| 
 | |
| export class ExportScriptarium {
 | |
| 
 | |
|   static init() {
 | |
|     ExportScriptarium.INSTANCE = new ExportScriptarium()
 | |
|   }
 | |
| 
 | |
|   constructor() {
 | |
|     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 <i class="fa-regular fa-file-csv"></i>',
 | |
|       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\r'
 | |
|     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=windows-1252", `${filename}`);
 | |
|   }
 | |
| 
 | |
|   getHeaderLine() {
 | |
|     return Mapping.getColumns()
 | |
|   }
 | |
| 
 | |
|   getActorLine(actor) {
 | |
|     const values = Mapping.getValues(actor)
 | |
|     return values
 | |
|       .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
 | |
|   }
 | |
| }
 |