All user data for FoundryVTT. Includes worlds, systems, modules, and any asset in the "foundryuserdata" directory. Does NOT include the FoundryVTT installation itself.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

107 lines
2.8 KiB

import CONFIG from "./adventure.mjs";
/**
* Define the structure of adventure data fields which require localization.
* @type {Object<string|Array<object>>}
*/
const LOCALIZATION_FIELDS = {
name: "",
description: "",
actors: [{
name: "",
"token.name": ""
}],
folders: [{
name: ""
}],
items: [{
name: "",
"system.description.value": ""
}],
journal: [{
name: ""
}],
macros: [{
name: ""
}],
playlists: [{
name: "",
description: "",
sounds: [{
name: "",
description: ""
}]
}],
scenes: [{
name: "",
navName: "",
notes: [{
text: ""
}],
tokens: [{
name: ""
}]
}]
}
/**
* Extract the values of all localization fields from the provided adventure data
* @returns {Array<object>} The localization schema
*/
export async function extractLocalization() {
const pack = game.packs.get(`${CONFIG.moduleId}.${CONFIG.packName}`);
await pack.getDocuments();
for ( const adventure of pack.contents ) {
const adventureConfig = CONFIG.adventure;
const path = `modules/${CONFIG.moduleId}/lang/en/${adventureConfig.slug}`;
await FilePicker.createDirectory("data", path).catch(err => {});
// Extract localization fields
const i18n = _extractLocalizedFields(adventure.toObject());
const lf = _createFile(JSON.stringify(i18n, null, 2), `${adventureConfig.slug}.json`)
await FilePicker.upload("data", path, lf, {}, {notify: false});
// Extract HTML
for ( const entry of adventure.data.journal ) {
if ( !entry.content.trim() ) continue;
const hf = _createFile(entry.content, `${entry._id}-${entry.name.slugify({strict: true})}.html`, "text/html");
await FilePicker.upload("data", path, hf, {}, {notify: false});
}
}
}
/**
* Extract the values of all localization fields from a single document.
* @param {object} documentData
* @param {Object<string|Array<object>>} fields
* @returns {Object<string|Array<object>>}
*/
function _extractLocalizedFields(documentData, fields=LOCALIZATION_FIELDS) {
const mapping = {};
for ( const [key, value] of Object.entries(fields) ) {
if ( value instanceof Array ) {
const collection = documentData[key];
const entries = collection.reduce((arr, d) => {
const inner = _extractLocalizedFields(d, value[0]);
if ( inner ) arr.push(inner);
return arr;
}, []);
if ( entries.length > 0 ) mapping[key] = entries;
}
else if ( documentData[key] ) mapping[key] = documentData[key];
}
if ( foundry.utils.isObjectEmpty(mapping) ) return null;
mapping._id = documentData._id;
return mapping;
}
/**
* Create a File object which can be uploaded.
* @returns {File}
* @private
*/
function _createFile(content, fileName, dataType) {
const blob = new Blob([content], {type: dataType});
return new File([blob], fileName, {type: dataType});
}