forked from MapComplete/MapComplete
Allow labels to be used as qualifier for borrowed tagrenderings, update comments
This commit is contained in:
parent
13c2c2309c
commit
aab2a308fc
4 changed files with 70 additions and 58 deletions
57
Models/ThemeConfig/Conversion/AddContextToTranslations.ts
Normal file
57
Models/ThemeConfig/Conversion/AddContextToTranslations.ts
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
import {DesugaringStep} from "./Conversion";
|
||||||
|
import {Utils} from "../../../Utils";
|
||||||
|
import Translations from "../../../UI/i18n/Translations";
|
||||||
|
|
||||||
|
export class AddContextToTranslations<T> extends DesugaringStep<T> {
|
||||||
|
private readonly _prefix: string;
|
||||||
|
|
||||||
|
constructor(prefix = "") {
|
||||||
|
super("Adds a '_context' to every object that is probably a translation", ["_context"], "AddContextToTranslation");
|
||||||
|
this._prefix = prefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* const theme = {
|
||||||
|
* layers: [
|
||||||
|
* {
|
||||||
|
* builtin: ["abc"],
|
||||||
|
* override: {
|
||||||
|
* title:{
|
||||||
|
* en: "Some title"
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* ]
|
||||||
|
* }
|
||||||
|
* const rewritten = new AddContextToTranslations<any>("prefix:").convert(theme, "context").result
|
||||||
|
* const expected = {
|
||||||
|
* layers: [
|
||||||
|
* {
|
||||||
|
* builtin: ["abc"],
|
||||||
|
* override: {
|
||||||
|
* title:{
|
||||||
|
* _context: "prefix:context.layers.0.override.title"
|
||||||
|
* en: "Some title"
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* ]
|
||||||
|
* }
|
||||||
|
* rewritten // => expected
|
||||||
|
*/
|
||||||
|
convert(json: T, context: string): { result: T; errors?: string[]; warnings?: string[]; information?: string[] } {
|
||||||
|
|
||||||
|
const result = Utils.WalkJson(json, (leaf, path) => {
|
||||||
|
if (typeof leaf === "object") {
|
||||||
|
return {...leaf, _context: this._prefix + context + "." + path.join(".")}
|
||||||
|
} else {
|
||||||
|
return leaf
|
||||||
|
}
|
||||||
|
}, obj => obj !== undefined && obj !== null && Translations.isProbablyATranslation(obj))
|
||||||
|
|
||||||
|
return {
|
||||||
|
result
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -7,6 +7,7 @@ import SpecialVisualizations from "../../../UI/SpecialVisualizations";
|
||||||
import Translations from "../../../UI/i18n/Translations";
|
import Translations from "../../../UI/i18n/Translations";
|
||||||
import {Translation} from "../../../UI/i18n/Translation";
|
import {Translation} from "../../../UI/i18n/Translation";
|
||||||
import * as tagrenderingconfigmeta from "../../../assets/tagrenderingconfigmeta.json"
|
import * as tagrenderingconfigmeta from "../../../assets/tagrenderingconfigmeta.json"
|
||||||
|
import {AddContextToTranslations} from "./AddContextToTranslations";
|
||||||
|
|
||||||
class ExpandTagRendering extends Conversion<string | TagRenderingConfigJson | { builtin: string | string[], override: any }, TagRenderingConfigJson[]> {
|
class ExpandTagRendering extends Conversion<string | TagRenderingConfigJson | { builtin: string | string[], override: any }, TagRenderingConfigJson[]> {
|
||||||
private readonly _state: DesugaringContext;
|
private readonly _state: DesugaringContext;
|
||||||
|
@ -43,20 +44,23 @@ class ExpandTagRendering extends Conversion<string | TagRenderingConfigJson | {
|
||||||
matchingTrs = layerTrs
|
matchingTrs = layerTrs
|
||||||
} else if (id.startsWith("*")) {
|
} else if (id.startsWith("*")) {
|
||||||
const id_ = id.substring(1)
|
const id_ = id.substring(1)
|
||||||
matchingTrs = layerTrs.filter(tr => tr.group === id_)
|
matchingTrs = layerTrs.filter(tr => tr.group === id_ || tr.labels?.indexOf(id_) >= 0)
|
||||||
} else {
|
} else {
|
||||||
matchingTrs = layerTrs.filter(tr => tr.id === id)
|
matchingTrs = layerTrs.filter(tr => tr.id === id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const contextWriter = new AddContextToTranslations<TagRenderingConfigJson>("layers:")
|
||||||
for (let i = 0; i < matchingTrs.length; i++) {
|
for (let i = 0; i < matchingTrs.length; i++) {
|
||||||
// The matched tagRenderings are 'stolen' from another layer. This means that they must match the layer condition before being shown
|
// The matched tagRenderings are 'stolen' from another layer. This means that they must match the layer condition before being shown
|
||||||
const found = Utils.Clone(matchingTrs[i]);
|
let found : TagRenderingConfigJson = Utils.Clone(matchingTrs[i]);
|
||||||
if (found.condition === undefined) {
|
if (found.condition === undefined) {
|
||||||
found.condition = layer.source.osmTags
|
found.condition = layer.source.osmTags
|
||||||
} else {
|
} else {
|
||||||
found.condition = {and: [found.condition, layer.source.osmTags]}
|
found.condition = {and: [found.condition, layer.source.osmTags]}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
found = contextWriter.convertStrict(found, layer.id+ ".tagRenderings."+found["id"])
|
||||||
matchingTrs[i] = found
|
matchingTrs[i] = found
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ import LayerConfig from "../LayerConfig";
|
||||||
import {TagRenderingConfigJson} from "../Json/TagRenderingConfigJson";
|
import {TagRenderingConfigJson} from "../Json/TagRenderingConfigJson";
|
||||||
import {SubstitutedTranslation} from "../../../UI/SubstitutedTranslation";
|
import {SubstitutedTranslation} from "../../../UI/SubstitutedTranslation";
|
||||||
import DependencyCalculator from "../DependencyCalculator";
|
import DependencyCalculator from "../DependencyCalculator";
|
||||||
import Translations from "../../../UI/i18n/Translations";
|
import {AddContextToTranslations} from "./AddContextToTranslations";
|
||||||
|
|
||||||
class SubstituteLayer extends Conversion<(string | LayerConfigJson), LayerConfigJson[]> {
|
class SubstituteLayer extends Conversion<(string | LayerConfigJson), LayerConfigJson[]> {
|
||||||
private readonly _state: DesugaringContext;
|
private readonly _state: DesugaringContext;
|
||||||
|
@ -293,60 +293,6 @@ class AddContextToTransltionsInLayout extends DesugaringStep <LayoutConfigJson>{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class AddContextToTranslations<T> extends DesugaringStep<T> {
|
|
||||||
private readonly _prefix: string;
|
|
||||||
|
|
||||||
constructor(prefix = "") {
|
|
||||||
super("Adds a '_context' to every object that is probably a translation", ["_context"], "AddContextToTranslation");
|
|
||||||
this._prefix = prefix;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* const theme = {
|
|
||||||
* layers: [
|
|
||||||
* {
|
|
||||||
* builtin: ["abc"],
|
|
||||||
* override: {
|
|
||||||
* title:{
|
|
||||||
* en: "Some title"
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* ]
|
|
||||||
* }
|
|
||||||
* const rewritten = new AddContextToTranslations<any>("prefix:").convert(theme, "context").result
|
|
||||||
* const expected = {
|
|
||||||
* layers: [
|
|
||||||
* {
|
|
||||||
* builtin: ["abc"],
|
|
||||||
* override: {
|
|
||||||
* title:{
|
|
||||||
* _context: "prefix:context.layers.0.override.title"
|
|
||||||
* en: "Some title"
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* ]
|
|
||||||
* }
|
|
||||||
* rewritten // => expected
|
|
||||||
*/
|
|
||||||
convert(json: T, context: string): { result: T; errors?: string[]; warnings?: string[]; information?: string[] } {
|
|
||||||
|
|
||||||
const result = Utils.WalkJson(json, (leaf, path) => {
|
|
||||||
if(typeof leaf === "object"){
|
|
||||||
return {...leaf, _context: this._prefix + context+"."+ path.join(".")}
|
|
||||||
}else{
|
|
||||||
return leaf
|
|
||||||
}
|
|
||||||
}, obj => obj !== undefined && obj !== null && Translations.isProbablyATranslation(obj))
|
|
||||||
|
|
||||||
return {
|
|
||||||
result
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
class ApplyOverrideAll extends DesugaringStep<LayoutConfigJson> {
|
class ApplyOverrideAll extends DesugaringStep<LayoutConfigJson> {
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
|
|
|
@ -262,7 +262,12 @@ export interface LayerConfigJson {
|
||||||
*
|
*
|
||||||
* Note that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,
|
* Note that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,
|
||||||
* where a few very general questions are defined e.g. website, phone number, ...
|
* where a few very general questions are defined e.g. website, phone number, ...
|
||||||
*
|
* Furthermore, _all_ the questions of another layer can be reused with `otherlayer.*`
|
||||||
|
* If you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`
|
||||||
|
* If one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`
|
||||||
|
* Remark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.
|
||||||
|
* If they are not wanted, remove them with an override
|
||||||
|
*
|
||||||
* A special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.
|
* A special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.
|
||||||
*
|
*
|
||||||
* At last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.
|
* At last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue