Skip to content

Commit 62ea9e9

Browse files
Restructure metadata in preparation for truth source change.
1 parent 7ac1d41 commit 62ea9e9

File tree

7 files changed

+104
-11
lines changed

7 files changed

+104
-11
lines changed

extensions/includes/format.mjs

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { getLanguageCodes } from './language.mjs';
2+
import { InterwikiDataImpl, MetadataImpl } from './metadata.mjs';
13
import {
24
addPoints,
35
getBoolProperty,
@@ -156,14 +158,35 @@ function convertLayer(layer, datamap, convertedLayers, language) {
156158
convertedLayers.add(layer.id);
157159
}
158160

161+
/**
162+
* Retrieves map metadata to store in DataMaps for two-way conversion.
163+
* @param {TileMap} map Tiled map being converted to DataMaps
164+
* @param {string} mapName Filename of the Tiled map
165+
* @returns {MetadataImpl} Map metadata to store in DataMaps
166+
*/
167+
function getDataMapsMetadata(map, mapName) {
168+
const metadata = new MetadataImpl();
169+
for (const language of getLanguageCodes()) {
170+
const localizedMapName = getStringProperty(map, 'name', language);
171+
if (!localizedMapName && language !== 'en') {
172+
continue;
173+
}
174+
metadata.interwiki[language] = new InterwikiDataImpl({
175+
mapName: localizedMapName || mapName
176+
});
177+
}
178+
metadata.fileName = mapName;
179+
return metadata;
180+
}
181+
159182
/**
160183
* Converts a Tiled map to DataMaps format.
161184
* @param {TileMap} map Tiled map to convert to DataMaps
162185
* @param {string} mapName Filename of the Tiled map
163186
* @param {string} language Language to use for localized properties
164187
* @returns {DataMap} Converted DataMap object
165188
*/
166-
export function convertMap(map, mapName, language = 'en') {
189+
export function convertTiledToDataMaps(map, mapName, language = 'en') {
167190
const /** @type {DataMap} */ datamap = {
168191
$schema: '/extensions/DataMaps/schemas/v17.3.json',
169192
backgrounds: [{
@@ -179,9 +202,7 @@ export function convertMap(map, mapName, language = 'en') {
179202
map.height * map.tileHeight
180203
]
181204
},
182-
custom: {
183-
mapName: getStringProperty(map, 'name', language) || mapName
184-
},
205+
custom: getDataMapsMetadata(map, mapName),
185206
disclaimer: getStringProperty(map, 'disclaimer', language),
186207
include: getListProperty(map, 'include', language),
187208
markers: {},
@@ -208,14 +229,14 @@ export function convertMap(map, mapName, language = 'en') {
208229
*/
209230
function write(map, filePath) {
210231
const mapName = FileInfo.completeBaseName(FileInfo.fileName(filePath));
211-
const convertedMap = convertMap(map, mapName);
232+
const convertedMap = convertTiledToDataMaps(map, mapName);
212233
const file = new TextFile(filePath, TextFile.WriteOnly);
213234
file.write(`${JSON.stringify(convertedMap, null, 4)}\n`);
214235
file.commit();
215236
}
216237

217238
export default /** @type {ScriptedMapFormat} */ {
218-
extension: 'json',
239+
extension: 'mw-datamaps',
219240
name: 'DataMaps',
220241
write
221242
};

extensions/includes/language.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { getStringProperty } from './util.mjs';
55
* Gets all wiki language codes for the current Tiled project.
66
* @returns {string[]} Available wiki language codes
77
*/
8-
function getLanguageCodes() {
8+
export function getLanguageCodes() {
99
const languagesStr = getStringProperty(tiled.project, 'languages') || 'en';
1010
return languagesStr.split(',').map(lang => lang.trim());
1111
}

extensions/includes/metadata.mjs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
const CURRENT_VERSION = 0;
2+
3+
/**
4+
* @implements {Metadata}
5+
*/
6+
export class MetadataImpl {
7+
/**
8+
* Class constructor.
9+
* @param {Metadata|undefined} metadata Metadata
10+
*/
11+
constructor(metadata = undefined) {
12+
/** @type {Record<string, InterwikiDataImpl>} */
13+
this.interwiki = {};
14+
/** @type {number} */
15+
this.version = metadata?.version || CURRENT_VERSION;
16+
/** @type {string|undefined} */
17+
this.fileName = metadata?.fileName;
18+
if (metadata?.interwiki) {
19+
for (const [key, value] of Object.entries(metadata.interwiki)) {
20+
this.interwiki[key] = new InterwikiDataImpl(value);
21+
}
22+
}
23+
}
24+
/**
25+
* Serializes the metadata to JSON.
26+
* @returns {object} Metadata with unneeded properties removed.
27+
*/
28+
toJSON() {
29+
return {
30+
fileName: this.fileName,
31+
interwiki: this.interwiki,
32+
version: this.version,
33+
};
34+
}
35+
}
36+
37+
/**
38+
* @implements {InterwikiData}
39+
*/
40+
export class InterwikiDataImpl {
41+
/**
42+
* Class constructor.
43+
* @param {InterwikiData} data Interwiki data
44+
*/
45+
constructor(data) {
46+
/** @type {string} */
47+
this.mapName = data.mapName;
48+
/** @type {number} */
49+
this.revision = 0;
50+
}
51+
/**
52+
* Serializes the interwiki data to JSON.
53+
* @returns {object} Interwiki data with unneeded properties removed.
54+
*/
55+
toJSON() {
56+
return {
57+
mapName: this.mapName,
58+
};
59+
}
60+
}

extensions/includes/publish.mjs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
generateOAuthUrl,
55
getAccessToken
66
} from './auth.mjs';
7-
import { convertMap } from './format.mjs';
7+
import { convertTiledToDataMaps } from './format.mjs';
88
import { getDefaultLanguageIndex, getLanguageNames, selectLanguage } from './language.mjs';
99
import { getStoredToken, storeToken } from './session.mjs';
1010

@@ -128,9 +128,9 @@ function getToken(language) {
128128
*/
129129
function publishMap(accessToken, summary, map, language) {
130130
const mapName = FileInfo.completeBaseName(FileInfo.fileName(map.fileName));
131-
const datamap = convertMap(map, mapName, language);
131+
const datamap = convertTiledToDataMaps(map, mapName, language);
132132
return edit(
133-
`Map:${datamap.custom?.mapName}`,
133+
`Map:${datamap.custom?.interwiki?.[language].mapName}`,
134134
JSON.stringify(datamap),
135135
summary,
136136
accessToken,

extensions/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"target": "ES2016",
1212
"lib": [
1313
"ES2016",
14+
"ES2017.Object",
1415
"DOM"
1516
],
1617
"baseUrl": "extensions",

extensions/types/map.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@ interface DataMap {
1111
categories?: Record<string, MarkerCategory>
1212
disclaimer?: string
1313
markers: Record<string, Marker[]>
14-
custom?: Record<string, any>
14+
custom?: Metadata
1515
}

extensions/types/metadata.d.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
interface InterwikiData {
2+
mapName: string;
3+
[key: string]: any;
4+
}
5+
6+
interface Metadata {
7+
interwiki?: Record<string, InterwikiData>;
8+
fileName?: string;
9+
version: number;
10+
[key: string]: any;
11+
}

0 commit comments

Comments
 (0)