Skip to content

Commit cbdf4e0

Browse files
committed
Improve data compression
1 parent f011df1 commit cbdf4e0

File tree

4 files changed

+71
-29
lines changed

4 files changed

+71
-29
lines changed

scripts/config.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ Hooks.once("libWrapper.Ready", () => {
5353
processStringArray(`flags.${MODULE_ID}.textStyle.fill`);
5454
processNumberArray(`flags.${MODULE_ID}.textStyle.fillGradientStops`);
5555

56-
return cleanData(data, !this.options.configureDefault);
56+
return cleanData(data, { deletionKeys: !this.options.configureDefault });
5757
}, "WRAPPER");
5858
});
5959

scripts/const.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ export const DEFAULT_FLAGS = Object.freeze({
2121
[`flags.${MODULE_ID}.textStyle.dropShadowColor`]: "#000000",
2222
[`flags.${MODULE_ID}.textStyle.dropShadowDistance`]: 0,
2323
[`flags.${MODULE_ID}.textStyle.arc`]: 0,
24-
[`flags.${MODULE_ID}.textStyle.fill`]: null,
25-
[`flags.${MODULE_ID}.textStyle.fillGradientStops`]: null,
24+
[`flags.${MODULE_ID}.textStyle.fill`]: [],
25+
[`flags.${MODULE_ID}.textStyle.fillGradientStops`]: [],
2626
[`flags.${MODULE_ID}.textStyle.fillGradientType`]: 0,
2727
[`flags.${MODULE_ID}.textStyle.fontStyle`]: "normal",
2828
[`flags.${MODULE_ID}.textStyle.fontVariant`]: "normal",

scripts/index.js

+16-2
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,20 @@ Hooks.once("libWrapper.Ready", () => {
4646
}, "OVERRIDE");
4747
});
4848

49-
Hooks.on("preCreateDrawing", (document, data) => {
50-
foundry.utils.mergeObject(data, cleanData(data), { performDeletions: true });
49+
function preProcess(data) {
50+
const fill = foundry.utils.getProperty(data, `flags.${MODULE_ID}.textStyle.fill`);
51+
52+
if (fill != null && !Array.isArray(fill)) {
53+
foundry.utils.setProperty(data, `flags.${MODULE_ID}.textStyle.fill`, [fill]);
54+
}
55+
56+
return data;
57+
}
58+
59+
Hooks.on("preCreateDrawing", (document) => {
60+
document.updateSource(cleanData(preProcess(document.toObject()), { deletionKeys: true }));
61+
});
62+
63+
Hooks.on("preUpdateDrawing", (document, data) => {
64+
cleanData(preProcess(data), { inplace: true, deletionKeys: true, partial: true });
5165
});

scripts/utils.js

+52-24
Original file line numberDiff line numberDiff line change
@@ -81,28 +81,29 @@ export function saveValue(value) {
8181
return value;
8282
}
8383

84-
export function cleanData(data, deletionKeys = true) {
85-
data = foundry.utils.flattenObject(data);
84+
export function cleanData(data, { inplace = false, deletionKeys = false, keepOthers = true, partial = false }) {
85+
const flatData = foundry.utils.flattenObject(data);
86+
let newData = {};
8687

87-
const newData = {};
88-
89-
if (deletionKeys) {
90-
for (const key of Object.keys(DEFAULT_FLAGS).concat(Object.keys(data))) {
91-
if (!key.startsWith(`flags.${MODULE_ID}.`)) {
88+
if (deletionKeys || inplace) {
89+
for (const key of (partial ? [] : Object.keys(DEFAULT_FLAGS)).concat(Object.keys(flatData))) {
90+
if (!(key.startsWith(`flags.${MODULE_ID}.`) && !key.includes(".-="))) {
9291
continue;
9392
}
9493

9594
const split = key.split(".");
9695

97-
for (let i = 1; i < split.length; i++) {
96+
for (let i = partial ? split.length - 1 : 1; i < split.length; i++) {
9897
newData[`${split.slice(0, i).join(".")}.-=${split[i]}`] = null;
9998
}
10099
}
101100
}
102101

103-
for (let [key, value] of Object.entries(data)) {
104-
if (!key.startsWith(`flags.${MODULE_ID}.`)) {
105-
newData[key] = value;
102+
for (let [key, value] of Object.entries(flatData)) {
103+
if (!(key.startsWith(`flags.${MODULE_ID}.`) && !key.includes(".-="))) {
104+
if (keepOthers && !inplace) {
105+
newData[key] = value;
106+
}
106107

107108
continue;
108109
}
@@ -112,33 +113,44 @@ export function cleanData(data, deletionKeys = true) {
112113
}
113114

114115
const defaultValue = DEFAULT_FLAGS[key];
116+
const normalizeValue = value => {
117+
value = value ?? null;
118+
119+
if (parseValue(defaultValue)) {
120+
value = saveValue(value);
121+
} else if (typeof value === "string") {
122+
if (!value) {
123+
value = null;
124+
} else {
125+
value = value.trim().toLowerCase();
126+
}
127+
}
115128

116-
value = value ?? null;
129+
return value;
130+
};
117131

118-
if (parseValue(defaultValue)) {
119-
value = saveValue(value);
120-
} else if (typeof value === "string") {
121-
if (!value) {
122-
value = null;
123-
} else {
124-
value = value.trim().toLowerCase();
125-
}
132+
if (value instanceof Array) {
133+
value = value.map(normalizeValue);
134+
} else {
135+
value = normalizeValue(value);
126136
}
127137

128-
if (value !== defaultValue && value !== null) {
138+
if (value != null && value !== defaultValue && !value.equals?.(defaultValue)) {
129139
newData[key] = value;
130140

131-
if (deletionKeys) {
141+
if (deletionKeys || inplace) {
132142
const split = key.split(".");
133143

134144
for (let i = 1; i < split.length; i++) {
135145
delete newData[`${split.slice(0, i).join(".")}.-=${split[i]}`];
136146
}
137147
}
148+
} else if (!deletionKeys) {
149+
newData[key] = foundry.utils.deepClone(defaultValue);
138150
}
139151
}
140152

141-
if (deletionKeys) {
153+
if (deletionKeys || inplace) {
142154
for (const key in newData) {
143155
if (!key.startsWith(`flags.${MODULE_ID}.`) && !key.startsWith(`flags.-=${MODULE_ID}`)) {
144156
continue;
@@ -164,5 +176,21 @@ export function cleanData(data, deletionKeys = true) {
164176
}
165177
}
166178

167-
return foundry.utils.expandObject(Object.fromEntries(Object.entries(newData).sort((a, b) => b[0].length - a[0].length)));
179+
newData = foundry.utils.expandObject(Object.fromEntries(Object.entries(newData).sort((a, b) => b[0].length - a[0].length)));
180+
181+
if (!inplace) {
182+
return newData;
183+
}
184+
185+
foundry.utils.mergeObject(data, newData, { performDeletions: true });
186+
187+
if (deletionKeys) {
188+
foundry.utils.mergeObject(data, newData);
189+
}
190+
191+
if (!keepOthers) {
192+
foundry.utils.filterObject(data, foundry.utils.expandObject(DEFAULT_FLAGS));
193+
}
194+
195+
return data;
168196
}

0 commit comments

Comments
 (0)