Feature: add button to download mangrove identity

This commit is contained in:
Pieter Vander Vennet 2023-07-17 01:07:01 +02:00
parent e48571a80a
commit 02203dd05b
5 changed files with 87 additions and 56 deletions

View file

@ -1,5 +1,5 @@
import colors from "./assets/colors.json"
import { HTMLElement } from "node-html-parser"
import {HTMLElement} from "node-html-parser"
export class Utils {
/**
@ -437,6 +437,11 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
/**
* Given a piece of text, will replace any key occuring in 'tags' by the corresponding value
*
* Utils.SubstituteKeys("abc{def}ghi", {def: 'XYZ'}) // => "abcXYZghi"
* Utils.SubstituteKeys("abc{def}{def}ghi", {def: 'XYZ'}) // => "abcXYZXYZghi"
* Utils.SubstituteKeys("abc{def}ghi", {def: '{XYZ}'}) // => "abc{XYZ}ghi"
*
* @param txt
* @param tags
* @param useLang
@ -450,12 +455,16 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
if (txt === undefined) {
return undefined
}
const regex = /.*{([^}]*)}.*/
const regex = /(.*?){([^}]*)}(.*)/
let match = txt.match(regex)
if(!match){
return txt
}
let result = ""
while (match) {
const key = match[1]
const [_, normal, key, leftover] = match
let v = tags === undefined ? undefined : tags[key]
if (v !== undefined && v !== null) {
if (v["toISOString"] != undefined) {
@ -490,11 +499,14 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
// v === undefined
v = ""
}
txt = txt.replace("{" + key + "}", v)
match = txt.match(regex)
}
return txt
result += normal + v
match = leftover.match(regex)
if(!match){
result += leftover
}
}
return result
}
public static LoadCustomCss(location: string) {
@ -687,10 +699,10 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
if (Array.isArray(leaf)) {
for (let i = 0; i < (<any[]>leaf).length; i++) {
const l = (<any[]>leaf)[i]
collectedList.push({ leaf: l, path: [...travelledPath, "" + i] })
collectedList.push({leaf: l, path: [...travelledPath, "" + i]})
}
} else {
collectedList.push({ leaf, path: travelledPath })
collectedList.push({leaf, path: travelledPath})
}
return collectedList
}
@ -768,7 +780,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
})
}
const cp = { ...json }
const cp = {...json}
for (const key in json) {
cp[key] = Utils.WalkJson(json[key], f, isLeaf, [...path, key])
}
@ -898,11 +910,11 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
const xhr = new XMLHttpRequest()
xhr.onload = () => {
if (xhr.status == 200) {
resolve({ content: xhr.response })
resolve({content: xhr.response})
} else if (xhr.status === 302) {
resolve({ redirect: xhr.getResponseHeader("location") })
resolve({redirect: xhr.getResponseHeader("location")})
} else if (xhr.status === 509 || xhr.status === 429) {
resolve({ error: "rate limited", url, statuscode: xhr.status })
resolve({error: "rate limited", url, statuscode: xhr.status})
} else {
resolve({
error: "other error: " + xhr.statusText,
@ -972,10 +984,10 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
}
const promise =
/*NO AWAIT as we work with the promise directly */ Utils.downloadJsonAdvanced(
url,
headers
)
Utils._download_cache.set(url, { promise, timestamp: new Date().getTime() })
url,
headers
)
Utils._download_cache.set(url, {promise, timestamp: new Date().getTime()})
return await promise
}
@ -994,11 +1006,11 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
const injected = Utils.injectedDownloads[url]
if (injected !== undefined) {
console.log("Using injected resource for test for URL", url)
return new Promise((resolve, _) => resolve({ content: injected }))
return new Promise((resolve, _) => resolve({content: injected}))
}
const result = await Utils.downloadAdvanced(
url,
Utils.Merge({ accept: "application/json" }, headers ?? {})
Utils.Merge({accept: "application/json"}, headers ?? {})
)
if (result["error"] !== undefined) {
return <{ error: string; url: string; statuscode?: number }>result
@ -1006,12 +1018,12 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
const data = result["content"]
try {
if (typeof data === "string") {
return { content: JSON.parse(data) }
return {content: JSON.parse(data)}
}
return { content: data }
return {content: data}
} catch (e) {
console.error("Could not parse ", data, "due to", e, "\n", e.stack)
return { error: "malformed", url }
return {error: "malformed", url}
}
}
@ -1035,7 +1047,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
const element = document.createElement("a")
let file
if (typeof contents === "string") {
file = new Blob([contents], { type: options?.mimetype ?? "text/plain" })
file = new Blob([contents], {type: options?.mimetype ?? "text/plain"})
} else {
file = contents
}
@ -1306,7 +1318,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
if (match == undefined) {
return undefined
}
return { r: Number(match[1]), g: Number(match[2]), b: Number(match[3]) }
return {r: Number(match[1]), g: Number(match[2]), b: Number(match[3])}
}
if (!hex.startsWith("#")) {
@ -1366,7 +1378,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
if (inView) {
return
}
element.scrollIntoView({ behavior: "smooth", block: "nearest" })
element.scrollIntoView({behavior: "smooth", block: "nearest"})
}
public static findParentWithScrolling(element: HTMLBaseElement): HTMLBaseElement {
@ -1443,13 +1455,6 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
return false
}
private static colorDiff(
c0: { r: number; g: number; b: number },
c1: { r: number; g: number; b: number }
) {
return Math.abs(c0.r - c1.r) + Math.abs(c0.g - c1.g) + Math.abs(c0.b - c1.b)
}
/**
*
* Utils.splitIntoSubstitutionParts("abc") // => [{message: "abc"}]
@ -1465,15 +1470,22 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
const postParts = prepart.split("}")
if (postParts.length === 1) {
// This was a normal part
spec.push({ message: postParts[0] })
spec.push({message: postParts[0]})
} else {
const [subs, message] = postParts
spec.push({ subs })
spec.push({subs})
if (message !== "") {
spec.push({ message })
spec.push({message})
}
}
}
return spec
}
private static colorDiff(
c0: { r: number; g: number; b: number },
c1: { r: number; g: number; b: number }
) {
return Math.abs(c0.r - c1.r) + Math.abs(c0.g - c1.g) + Math.abs(c0.b - c1.b)
}
}