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});
|
|
}
|