forked from MapComplete/MapComplete
Add more checks on parsing from JSON, fix of those issues on the builtin themes
This commit is contained in:
parent
8da0893c05
commit
97ec893479
9 changed files with 117 additions and 29 deletions
|
@ -107,6 +107,7 @@ export class FromJSON {
|
|||
}
|
||||
throw `Tagrendering ${propertyName} is undefined...`
|
||||
}
|
||||
|
||||
|
||||
if (typeof json === "string") {
|
||||
|
||||
|
@ -137,6 +138,8 @@ export class FromJSON {
|
|||
}
|
||||
});
|
||||
}
|
||||
// It's the question that drives us, neo
|
||||
const question = FromJSON.Translation(json.question);
|
||||
|
||||
let template = FromJSON.Translation(json.render);
|
||||
|
||||
|
@ -165,28 +168,35 @@ export class FromJSON {
|
|||
}
|
||||
}
|
||||
|
||||
const mappings = json.mappings?.map(mapping => (
|
||||
{
|
||||
k: FromJSON.Tag(mapping.if),
|
||||
txt: FromJSON.Translation(mapping.then),
|
||||
hideInAnswer: mapping.hideInAnswer
|
||||
})
|
||||
const mappings = json.mappings?.map((mapping, i) => {
|
||||
const k = FromJSON.Tag(mapping.if, `IN mapping #${i} of tagrendering ${propertyName}`)
|
||||
|
||||
if (question !== undefined && !mapping.hideInAnswer && !k.isUsableAsAnswer()) {
|
||||
throw `Invalid mapping in ${propertyName}: the tags use an OR-expression or regex expression but are also assignable as answer.`
|
||||
}
|
||||
|
||||
return {
|
||||
k: k,
|
||||
txt: FromJSON.Translation(mapping.then),
|
||||
hideInAnswer: mapping.hideInAnswer
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
if(template === undefined && (mappings === undefined || mappings.length === 0)){
|
||||
console.error("Empty tagrendering detected: no mappings nor template given", json)
|
||||
|
||||
if (template === undefined && (mappings === undefined || mappings.length === 0)) {
|
||||
console.error(`Empty tagrendering detected in ${propertyName}: no mappings nor template given`, json)
|
||||
throw `Empty tagrendering ${propertyName} detected: no mappings nor template given`
|
||||
}
|
||||
|
||||
|
||||
let rendering = new TagRenderingOptions({
|
||||
question: FromJSON.Translation(json.question),
|
||||
question: question,
|
||||
freeform: freeform,
|
||||
mappings: mappings
|
||||
});
|
||||
|
||||
if (json.condition) {
|
||||
return rendering.OnlyShowIf(FromJSON.Tag(json.condition));
|
||||
return rendering.OnlyShowIf(FromJSON.Tag(json.condition, `In tagrendering ${propertyName}.condition`));
|
||||
}
|
||||
|
||||
return rendering;
|
||||
|
@ -197,7 +207,7 @@ export class FromJSON {
|
|||
return new Tag(tag[0], tag[1]);
|
||||
}
|
||||
|
||||
public static Tag(json: AndOrTagConfigJson | string): TagsFilter {
|
||||
public static Tag(json: AndOrTagConfigJson | string, context: string): TagsFilter {
|
||||
if(json === undefined){
|
||||
throw "Error while parsing a tag: nothing defined. Make sure all the tags are defined and at least one tag is present in a complex expression"
|
||||
}
|
||||
|
@ -206,7 +216,7 @@ export class FromJSON {
|
|||
if (tag.indexOf("!~") >= 0) {
|
||||
const split = Utils.SplitFirst(tag, "!~");
|
||||
if (split[1] === "*") {
|
||||
split[1] = "..*"
|
||||
throw `Don't use 'key!~*' - use 'key=' instead (empty string as value (in the tag ${tag} while parsing ${context})`
|
||||
}
|
||||
return new RegexTag(
|
||||
split[0],
|
||||
|
@ -214,6 +224,16 @@ export class FromJSON {
|
|||
true
|
||||
);
|
||||
}
|
||||
if (tag.indexOf("~~") >= 0) {
|
||||
const split = Utils.SplitFirst(tag, "~~");
|
||||
if (split[1] === "*") {
|
||||
split[1] = "..*"
|
||||
}
|
||||
return new RegexTag(
|
||||
new RegExp("^" + split[0] + "$"),
|
||||
new RegExp("^" + split[1] + "$")
|
||||
);
|
||||
}
|
||||
if (tag.indexOf("!=") >= 0) {
|
||||
const split = Utils.SplitFirst(tag, "!=");
|
||||
if (split[1] === "*") {
|
||||
|
@ -236,13 +256,16 @@ export class FromJSON {
|
|||
);
|
||||
}
|
||||
const split = Utils.SplitFirst(tag, "=");
|
||||
if(split[1] == "*"){
|
||||
throw `Error while parsing tag '${tag}' in ${context}: detected a wildcard on a normal value. Use a regex pattern instead`
|
||||
}
|
||||
return new Tag(split[0], split[1])
|
||||
}
|
||||
if (json.and !== undefined) {
|
||||
return new And(json.and.map(FromJSON.Tag));
|
||||
return new And(json.and.map(t => FromJSON.Tag(t, context)));
|
||||
}
|
||||
if (json.or !== undefined) {
|
||||
return new Or(json.or.map(FromJSON.Tag));
|
||||
return new Or(json.or.map(t => FromJSON.Tag(t, context)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -265,7 +288,7 @@ export class FromJSON {
|
|||
|
||||
console.log("Parsing layer", json)
|
||||
const tr = FromJSON.Translation;
|
||||
const overpassTags = FromJSON.Tag(json.overpassTags);
|
||||
const overpassTags = FromJSON.Tag(json.overpassTags, "overpasstags for layer "+json.id);
|
||||
const icon = FromJSON.TagRenderingWithDefault(json.icon, "icon", "./assets/bug.svg");
|
||||
const iconSize = FromJSON.TagRenderingWithDefault(json.iconSize, "iconSize", "40,40,center");
|
||||
const color = FromJSON.TagRenderingWithDefault(json.color, "color", "#0000ff");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue