Add glutenfree theme, fix #2031, some other improvements to fix output

This commit is contained in:
Pieter Vander Vennet 2024-07-18 17:58:39 +02:00
parent 29ee4ae155
commit f4fc954564
8 changed files with 41 additions and 16 deletions

View file

@ -261,6 +261,10 @@
"if": "theme=ghostsigns", "if": "theme=ghostsigns",
"then": "./assets/themes/advertising/wall_painting.svg" "then": "./assets/themes/advertising/wall_painting.svg"
}, },
{
"if": "theme=glutenfree",
"then": "./assets/themes/glutenfree/glutenfree.svg"
},
{ {
"if": "theme=grb", "if": "theme=grb",
"then": "./assets/themes/grb/logo.svg" "then": "./assets/themes/grb/logo.svg"

View file

@ -22,7 +22,7 @@ export default abstract class Script {
const green = (s) => "\x1b[92m" + s + "\x1b[0m" const green = (s) => "\x1b[92m" + s + "\x1b[0m"
console.log(green("All done! (" + millisNeeded + " ms)")) console.log(green("All done! (" + millisNeeded + " ms)"))
}) })
.catch((e) => console.log("ERROR:", e)) .catch((e) => console.log("ERROR in script:", e))
} }
public printHelp() { public printHelp() {

View file

@ -35,7 +35,15 @@ export abstract class Conversion<TIn, TOut> {
public convertStrict(json: TIn, context?: ConversionContext): TOut { public convertStrict(json: TIn, context?: ConversionContext): TOut {
context ??= ConversionContext.construct([], []) context ??= ConversionContext.construct([], [])
context = context.inOperation(this.name) context = context.inOperation(this.name)
const fixed = this.convert(json, context)
let fixed: TOut
try {
fixed = this.convert(json, context)
} catch (e) {
console.error(e)
context.err("ERROR WHILE RUNNING STEP " + this.name+": "+e)
fixed = undefined
}
for (const msg of context.messages) { for (const msg of context.messages) {
if (msg.level === "debug") { if (msg.level === "debug") {
continue continue
@ -46,11 +54,12 @@ export abstract class Conversion<TIn, TOut> {
throw new Error( throw new Error(
[ [
"Detected one or more errors, stopping now:", "Detected one or more errors, stopping now:",
context.getAll("error").map((e) => e.context.path.join(".") + ": " + e.message), context.getAll("error").map((e) => e.context.path.join(".") + ": " + e.message)
].join("\n\t") ].join("\n\t")
) )
} }
return fixed return fixed
} }
public andThenF<X>(f: (tout: TOut) => X): Conversion<TIn, X> { public andThenF<X>(f: (tout: TOut) => X): Conversion<TIn, X> {
@ -60,7 +69,8 @@ export abstract class Conversion<TIn, TOut> {
public abstract convert(json: TIn, context: ConversionContext): TOut public abstract convert(json: TIn, context: ConversionContext): TOut
} }
export abstract class DesugaringStep<T> extends Conversion<T, T> {} export abstract class DesugaringStep<T> extends Conversion<T, T> {
}
export class Pipe<TIn, TInter, TOut> extends Conversion<TIn, TOut> { export class Pipe<TIn, TInter, TOut> extends Conversion<TIn, TOut> {
private readonly _step0: Conversion<TIn, TInter> private readonly _step0: Conversion<TIn, TInter>
@ -247,7 +257,7 @@ export class Cached<TIn, TOut> extends Conversion<TIn, TOut> {
const converted = this._step.convert(json, context) const converted = this._step.convert(json, context)
Object.defineProperty(json, this.key, { Object.defineProperty(json, this.key, {
value: converted, value: converted,
enumerable: false, enumerable: false
}) })
return converted return converted
} }
@ -260,8 +270,8 @@ export class Fuse<T> extends DesugaringStep<T> {
constructor(doc: string, ...steps: DesugaringStep<T>[]) { constructor(doc: string, ...steps: DesugaringStep<T>[]) {
super( super(
(doc ?? "") + (doc ?? "") +
"This fused pipeline of the following steps: " + "This fused pipeline of the following steps: " +
steps.map((s) => s.name).join(", "), steps.map((s) => s.name).join(", "),
Utils.Dedup([].concat(...steps.map((step) => step.modifiedAttributes))), Utils.Dedup([].concat(...steps.map((step) => step.modifiedAttributes))),
"Fuse(" + steps.map((s) => s.name).join(", ") + ")" "Fuse(" + steps.map((s) => s.name).join(", ") + ")"
) )

View file

@ -124,9 +124,9 @@ export class ConversionContext {
this.messages.push({ context: this, level: "warning", message }) this.messages.push({ context: this, level: "warning", message })
} }
err(message: string) { err(...message: string[]) {
this._hasErrors = true this._hasErrors = true
this.messages.push({ context: this, level: "error", message }) this.messages.push({ context: this, level: "error", message: message.join(" ") })
} }
info(message: string) { info(message: string) {

View file

@ -83,7 +83,6 @@ class ExpandFilter extends DesugaringStep<LayerConfigJson> {
context.err("Got undefined as filter expansion in "+tagRendering["id"]) context.err("Got undefined as filter expansion in "+tagRendering["id"])
continue continue
} }
console.log("Adding filter",filterName," due to", tagRendering["id"])
filters.push(filterName) filters.push(filterName)
} }
} }

View file

@ -71,6 +71,10 @@ class SubstituteLayer extends Conversion<string | LayerConfigJson, LayerConfigJs
for (const name of names) { for (const name of names) {
const found = Utils.Clone(state.sharedLayers.get(name)) const found = Utils.Clone(state.sharedLayers.get(name))
if(found === undefined){
context.err("Layer with name "+name+" not found")
continue
}
found["_basedOn"] = name found["_basedOn"] = name
if (found === undefined) { if (found === undefined) {
reportNotFound(name) reportNotFound(name)
@ -367,7 +371,8 @@ class AddDependencyLayersToTheme extends DesugaringStep<LayoutConfigJson> {
private static CalculateDependencies( private static CalculateDependencies(
alreadyLoaded: LayerConfigJson[], alreadyLoaded: LayerConfigJson[],
allKnownLayers: Map<string, LayerConfigJson>, allKnownLayers: Map<string, LayerConfigJson>,
themeId: string themeId: string,
context: ConversionContext
): { config: LayerConfigJson; reason: string }[] { ): { config: LayerConfigJson; reason: string }[] {
const dependenciesToAdd: { config: LayerConfigJson; reason: string }[] = [] const dependenciesToAdd: { config: LayerConfigJson; reason: string }[] = []
const loadedLayerIds: Set<string> = new Set<string>(alreadyLoaded.map((l) => l?.id)) const loadedLayerIds: Set<string> = new Set<string>(alreadyLoaded.map((l) => l?.id))
@ -388,6 +393,7 @@ class AddDependencyLayersToTheme extends DesugaringStep<LayoutConfigJson> {
}[] = [] }[] = []
for (const layerConfig of alreadyLoaded) { for (const layerConfig of alreadyLoaded) {
try { try {
const layerDeps = DependencyCalculator.getLayerDependencies( const layerDeps = DependencyCalculator.getLayerDependencies(
new LayerConfig(layerConfig, themeId + "(dependencies)") new LayerConfig(layerConfig, themeId + "(dependencies)")
@ -396,7 +402,7 @@ class AddDependencyLayersToTheme extends DesugaringStep<LayoutConfigJson> {
} catch (e) { } catch (e) {
console.error(e) console.error(e)
throw ( throw (
"Detecting layer dependencies for " + layerConfig.id + " failed due to " + e "Detecting layer dependencies for " + layerConfig?.id + " failed due to " + e
) )
} }
} }
@ -467,7 +473,8 @@ class AddDependencyLayersToTheme extends DesugaringStep<LayoutConfigJson> {
const dependencies = AddDependencyLayersToTheme.CalculateDependencies( const dependencies = AddDependencyLayersToTheme.CalculateDependencies(
layers, layers,
allKnownLayers, allKnownLayers,
theme.id theme.id,
context
) )
if (dependencies.length > 0) { if (dependencies.length > 0) {
for (const dependency of dependencies) { for (const dependency of dependencies) {

View file

@ -25,8 +25,11 @@ export default class FilterConfig {
public readonly defaultSelection?: number public readonly defaultSelection?: number
constructor(json: FilterConfigJson, context: string) { constructor(json: FilterConfigJson, context: string) {
if(typeof json === "string"){
throw "Got a non-expanded filter, just a string: "+json
}
if (json.options === undefined) { if (json.options === undefined) {
throw `A filter without options was given at ${context}` throw `A filter without options was given at ${context}. The ID is ${JSON.stringify(json)}`
} }
if (json.id === undefined) { if (json.id === undefined) {
throw `A filter without id was found at ${context}` throw `A filter without id was found at ${context}`

View file

@ -72,7 +72,7 @@ export default class LayerConfig extends WithContextLoader {
private readonly _basedOn: string | undefined private readonly _basedOn: string | undefined
constructor(json: LayerConfigJson, context?: string, official: boolean = true) { constructor(json: LayerConfigJson, context?: string, official: boolean = true) {
context = context + "." + json.id context = context + "." + json?.id
const translationContext = "layers:" + json.id const translationContext = "layers:" + json.id
super(json, context) super(json, context)
this.id = json.id this.id = json.id
@ -292,7 +292,9 @@ export default class LayerConfig extends WithContextLoader {
this.filterIsSameAs = json.filter["sameAs"] this.filterIsSameAs = json.filter["sameAs"]
this.filters = [] this.filters = []
} else { } else {
this.filters = (<FilterConfigJson[]>json.filter ?? []).map((option, i) => { this.filters = (<FilterConfigJson[]>json.filter ?? [])
.filter(f => typeof f !== "string")
.map((option, i) => {
return new FilterConfig(option, `layers:${this.id}.filter.${i}`) return new FilterConfig(option, `layers:${this.id}.filter.${i}`)
}) })
} }