| 
									
										
										
										
											2021-12-21 18:35:31 +01:00
										 |  |  | import {appendFileSync, existsSync, mkdirSync, readFileSync, writeFile, writeFileSync} from "fs"; | 
					
						
							| 
									
										
										
										
											2020-11-17 02:22:48 +01:00
										 |  |  | import Locale from "../UI/i18n/Locale"; | 
					
						
							|  |  |  | import Translations from "../UI/i18n/Translations"; | 
					
						
							|  |  |  | import {Translation} from "../UI/i18n/Translation"; | 
					
						
							| 
									
										
										
										
											2021-02-28 00:30:58 +01:00
										 |  |  | import Constants from "../Models/Constants"; | 
					
						
							| 
									
										
										
										
											2021-04-10 15:01:28 +02:00
										 |  |  | import * as all_known_layouts from "../assets/generated/known_layers_and_themes.json" | 
					
						
							| 
									
										
										
										
											2021-08-07 23:11:34 +02:00
										 |  |  | import {LayoutConfigJson} from "../Models/ThemeConfig/Json/LayoutConfigJson"; | 
					
						
							|  |  |  | import LayoutConfig from "../Models/ThemeConfig/LayoutConfig"; | 
					
						
							| 
									
										
										
										
											2022-02-04 00:42:02 +01:00
										 |  |  | import xml2js from 'xml2js'; | 
					
						
							|  |  |  | import {exec} from "child_process"; | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-17 14:17:33 +01:00
										 |  |  | const sharp = require('sharp'); | 
					
						
							| 
									
										
										
										
											2021-12-21 18:35:31 +01:00
										 |  |  | const template = readFileSync("theme.html", "utf8"); | 
					
						
							|  |  |  | const codeTemplate = readFileSync("index_theme.ts.template", "utf8"); | 
					
						
							| 
									
										
										
										
											2021-03-17 14:17:33 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-06 02:21:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  | function enc(str: string): string { | 
					
						
							|  |  |  |     return encodeURIComponent(str.toLowerCase()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const alreadyWritten = [] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-23 13:56:16 +02:00
										 |  |  | async function createIcon(iconPath: string, size: number) { | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |     let name = iconPath.split(".").slice(0, -1).join("."); | 
					
						
							| 
									
										
										
										
											2020-11-17 16:29:51 +01:00
										 |  |  |     if (name.startsWith("./")) { | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |         name = name.substr(2) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     const newname = `${name}${size}.png` | 
					
						
							| 
									
										
										
										
											2020-11-06 03:17:27 +01:00
										 |  |  |         .replace(/\//g, "_") | 
					
						
							|  |  |  |         .replace("assets_", "assets/generated/"); | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (alreadyWritten.indexOf(newname) >= 0) { | 
					
						
							|  |  |  |         return newname; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     alreadyWritten.push(newname); | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |         readFileSync(newname); | 
					
						
							|  |  |  |         return newname; // File already exists - nothing to do
 | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							| 
									
										
										
										
											2022-02-04 00:42:02 +01:00
										 |  |  |         // Errors are normal here if this file does not exists
 | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-25 23:37:59 +02:00
										 |  |  |     try { | 
					
						
							| 
									
										
										
										
											2020-09-30 23:34:44 +02:00
										 |  |  |         // We already read to file, in order to crash here if the file is not found
 | 
					
						
							| 
									
										
										
										
											2020-11-06 03:17:27 +01:00
										 |  |  |         readFileSync(iconPath); | 
					
						
							| 
									
										
										
										
											2021-01-18 03:25:15 +01:00
										 |  |  |         let img = await sharp(iconPath) | 
					
						
							|  |  |  |         let resized = await img.resize(size) | 
					
						
							|  |  |  |         await resized.toFile(newname) | 
					
						
							| 
									
										
										
										
											2020-09-25 23:37:59 +02:00
										 |  |  |     } catch (e) { | 
					
						
							|  |  |  |         console.error("Could not read icon", iconPath, "due to", e) | 
					
						
							| 
									
										
										
										
											2020-09-20 20:28:35 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-09-25 23:37:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |     return newname; | 
					
						
							| 
									
										
										
										
											2020-07-25 18:00:08 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-10 23:43:30 +02:00
										 |  |  | async function createManifest(layout: LayoutConfig) { | 
					
						
							| 
									
										
										
										
											2020-09-03 00:00:37 +02:00
										 |  |  |     const name = layout.id; | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-16 20:03:19 +01:00
										 |  |  |     Translation.forcedLanguage = "en" | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |     const icons = []; | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-22 03:15:42 +02:00
										 |  |  |     let icon = layout.icon; | 
					
						
							| 
									
										
										
										
											2020-11-06 03:17:27 +01:00
										 |  |  |     if (icon.endsWith(".svg") || icon.startsWith("<svg") || icon.startsWith("<?xml")) { | 
					
						
							| 
									
										
										
										
											2022-02-04 00:42:02 +01:00
										 |  |  |         // This is an svg. Lets create the needed pngs and do some checkes!
 | 
					
						
							| 
									
										
										
										
											2021-01-17 21:04:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-04 00:42:02 +01:00
										 |  |  |         { | 
					
						
							|  |  |  |             const svgResult = await xml2js.parseStringPromise(readFileSync(icon, "UTF8")) | 
					
						
							|  |  |  |             const svg = svgResult.svg | 
					
						
							|  |  |  |             const width: string = svg.$.width; | 
					
						
							|  |  |  |             const height: string = svg.$.height; | 
					
						
							|  |  |  |             if(width !== height){ | 
					
						
							|  |  |  |                 console.warn("WARNING: the icon for theme "+layout.id+" is not square. Please square the icon at "+icon+"\n   Width = "+width, "height =", height) | 
					
						
							|  |  |  |                /* const process = exec("inkscape " + icon, ((error, stdout, stderr) => { | 
					
						
							|  |  |  |                     console.log("Inkscape: ", stdout) | 
					
						
							|  |  |  |                     if (error !== null) { | 
					
						
							|  |  |  |                         console.error(error) | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     if (stderr !== "") { | 
					
						
							|  |  |  |                         console.error(stderr) | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 }))//*/
 | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2020-11-06 03:17:27 +01:00
										 |  |  |         let path = layout.icon; | 
					
						
							|  |  |  |         if (layout.icon.startsWith("<")) { | 
					
						
							|  |  |  |             // THis is already the svg
 | 
					
						
							| 
									
										
										
										
											2020-11-17 16:29:51 +01:00
										 |  |  |             path = "./assets/generated/" + layout.id + "_logo.svg" | 
					
						
							| 
									
										
										
										
											2020-11-06 03:17:27 +01:00
										 |  |  |             writeFileSync(path, layout.icon) | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-01-17 21:04:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |         const sizes = [72, 96, 120, 128, 144, 152, 180, 192, 384, 512]; | 
					
						
							|  |  |  |         for (const size of sizes) { | 
					
						
							| 
									
										
										
										
											2021-04-23 13:56:16 +02:00
										 |  |  |             const name = await createIcon(path, size); | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |             icons.push({ | 
					
						
							|  |  |  |                 src: name, | 
					
						
							|  |  |  |                 sizes: size + "x" + size, | 
					
						
							|  |  |  |                 type: "image/png" | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         icons.push({ | 
					
						
							| 
									
										
										
										
											2020-11-06 03:17:27 +01:00
										 |  |  |             src: path, | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |             sizes: "513x513", | 
					
						
							|  |  |  |             type: "image/svg" | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |     } else if (icon.endsWith(".png")) { | 
					
						
							| 
									
										
										
										
											2021-07-06 15:43:21 +02:00
										 |  |  |         icons.push({ | 
					
						
							|  |  |  |             src: icon, | 
					
						
							|  |  |  |             sizes: "513x513", | 
					
						
							| 
									
										
										
										
											2021-07-06 15:53:42 +02:00
										 |  |  |             type: "image/png" | 
					
						
							| 
									
										
										
										
											2021-07-06 15:43:21 +02:00
										 |  |  |         }) | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2020-11-06 03:17:27 +01:00
										 |  |  |         console.log(icon) | 
					
						
							| 
									
										
										
										
											2020-09-03 00:00:37 +02:00
										 |  |  |         throw "Icon is not an svg for " + layout.id | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-18 01:24:31 +02:00
										 |  |  |     const ogTitle = Translations.WT(layout.title).txt; | 
					
						
							|  |  |  |     const ogDescr = Translations.WT(layout.description ?? "").txt; | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-17 14:17:33 +01:00
										 |  |  |     return { | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |         name: name, | 
					
						
							|  |  |  |         short_name: ogTitle, | 
					
						
							| 
									
										
										
										
											2021-05-10 23:43:30 +02:00
										 |  |  |         start_url: `${layout.id.toLowerCase()}.html`, | 
					
						
							| 
									
										
										
										
											2022-01-27 02:10:28 +01:00
										 |  |  |         lang: "en", | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |         display: "standalone", | 
					
						
							|  |  |  |         background_color: "#fff", | 
					
						
							|  |  |  |         description: ogDescr, | 
					
						
							|  |  |  |         orientation: "portrait-primary, landscape-primary", | 
					
						
							| 
									
										
										
										
											2022-01-06 21:05:52 +01:00
										 |  |  |         icons: icons, | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |         categories: ["map", "navigation"] | 
					
						
							| 
									
										
										
										
											2021-03-17 14:17:33 +01:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-18 03:25:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-17 14:17:33 +01:00
										 |  |  | async function createLandingPage(layout: LayoutConfig, manifest) { | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-11 16:23:49 +01:00
										 |  |  |     Locale.language.setData(layout.language[0]); | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-18 20:18:12 +01:00
										 |  |  |     const ogTitle = Translations.WT(layout.title).txt.replace(/"/g, '\\"'); | 
					
						
							|  |  |  |     const ogDescr = Translations.WT(layout.shortDescription ?? "Easily add and edit geodata with OpenStreetMap").txt.replace(/"/g, '\\"'); | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |     const ogImage = layout.socialImage; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-23 02:15:58 +02:00
										 |  |  |     let customCss = ""; | 
					
						
							|  |  |  |     if (layout.customCss !== undefined && layout.customCss !== "") { | 
					
						
							| 
									
										
										
										
											2020-11-14 02:54:33 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  |             const cssContent = readFileSync(layout.customCss); | 
					
						
							|  |  |  |             customCss = "<style>" + cssContent + "</style>"; | 
					
						
							|  |  |  |         } catch (e) { | 
					
						
							|  |  |  |             customCss = `<link rel='stylesheet' href="${layout.customCss}"/>` | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-10-23 02:15:58 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |     const og = `
 | 
					
						
							| 
									
										
										
										
											2022-01-18 20:18:12 +01:00
										 |  |  |     <meta property="og:image" content="${ogImage ?? 'assets/SocialImage.png'}"> | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |     <meta property="og:title" content="${ogTitle}"> | 
					
						
							| 
									
										
										
										
											2022-01-18 20:18:12 +01:00
										 |  |  |     <meta property="og:description" content="${ogDescr}"> | 
					
						
							|  |  |  |     <meta name="twitter:card" content="summary_large_image"> | 
					
						
							|  |  |  |     <meta name="twitter:site" content="@mapcomplete.osm;be"> | 
					
						
							|  |  |  |     <meta name="twitter:creator" content="@pietervdvn"> | 
					
						
							|  |  |  |     <meta name="twitter:title" content="${ogTitle}"> | 
					
						
							|  |  |  |     <meta name="twitter:description" content="${ogDescr}"> | 
					
						
							|  |  |  |     <meta name="twitter:image" content="${ogImage}">`
 | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-06 03:17:27 +01:00
										 |  |  |     let icon = layout.icon; | 
					
						
							|  |  |  |     if (icon.startsWith("<?xml") || icon.startsWith("<svg")) { | 
					
						
							|  |  |  |         // This already is an svg
 | 
					
						
							| 
									
										
										
										
											2020-11-17 16:29:51 +01:00
										 |  |  |         icon = `./assets/generated/${layout.id}_icon.svg` | 
					
						
							| 
									
										
										
										
											2020-11-06 03:17:27 +01:00
										 |  |  |         writeFileSync(icon, layout.icon); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-17 14:17:33 +01:00
										 |  |  |     const apple_icons = [] | 
					
						
							|  |  |  |     for (const icon of manifest.icons) { | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |         if (icon.type !== "image/png") { | 
					
						
							| 
									
										
										
										
											2021-03-17 14:17:33 +01:00
										 |  |  |             continue; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         apple_icons.push(`<link rel="apple-touch-icon" sizes="${icon.sizes}" href="${icon.src}">`) | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-16 20:03:19 +01:00
										 |  |  |     let themeSpecific = [ | 
					
						
							|  |  |  |         `<title>${ogTitle}</title>`, | 
					
						
							|  |  |  |         `<link rel="manifest" href="${enc(layout.id)}.webmanifest">`, | 
					
						
							|  |  |  |         og, | 
					
						
							|  |  |  |         customCss, | 
					
						
							|  |  |  |         `<link rel="icon" href="${icon}" sizes="any" type="image/svg+xml">`, | 
					
						
							| 
									
										
										
										
											2021-03-17 14:17:33 +01:00
										 |  |  |         ...apple_icons | 
					
						
							| 
									
										
										
										
											2021-03-16 20:03:19 +01:00
										 |  |  |     ].join("\n") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-27 11:11:20 +02:00
										 |  |  |     let output = template | 
					
						
							| 
									
										
										
										
											2020-10-23 02:15:58 +02:00
										 |  |  |         .replace("Loading MapComplete, hang on...", `Loading MapComplete theme <i>${ogTitle}</i>...`) | 
					
						
							| 
									
										
										
										
											2021-12-21 18:35:31 +01:00
										 |  |  |         .replace(/<!-- THEME-SPECIFIC -->.*<!-- THEME-SPECIFIC-END-->/s, themeSpecific) | 
					
						
							|  |  |  |         .replace("<script src=\"./index.ts\"></script>", `<script src='./index_${layout.id}.ts'></script>`); | 
					
						
							| 
									
										
										
										
											2020-08-27 11:11:20 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |         output = output | 
					
						
							| 
									
										
										
										
											2020-11-06 03:17:27 +01:00
										 |  |  |             .replace(/<!-- DECORATION 0 START -->.*<!-- DECORATION 0 END -->/s, `<img src='${icon}' width="100%" height="100%">`) | 
					
						
							|  |  |  |             .replace(/<!-- DECORATION 1 START -->.*<!-- DECORATION 1 END -->/s, `<img src='${icon}' width="100%" height="100%">`); | 
					
						
							| 
									
										
										
										
											2020-08-27 11:11:20 +02:00
										 |  |  |     } catch (e) { | 
					
						
							|  |  |  |         console.warn("Error while applying logo: ", e) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return output; | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | async function createIndexFor(theme: LayoutConfig) { | 
					
						
							|  |  |  |     const filename = "index_" + theme.id + ".ts" | 
					
						
							| 
									
										
										
										
											2021-12-21 18:35:31 +01:00
										 |  |  |     writeFileSync(filename, `import * as themeConfig from "./assets/generated/themes/${theme.id}.json"\n`) | 
					
						
							|  |  |  |     appendFileSync(filename, codeTemplate) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-17 16:29:51 +01:00
										 |  |  | const generatedDir = "./assets/generated"; | 
					
						
							| 
									
										
										
										
											2021-01-18 03:25:15 +01:00
										 |  |  | if (!existsSync(generatedDir)) { | 
					
						
							| 
									
										
										
										
											2020-11-17 16:29:51 +01:00
										 |  |  |     mkdirSync(generatedDir) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | const blacklist = ["", "test", ".", "..", "manifest", "index", "land", "preferences", "account", "openstreetmap", "custom", "theme"] | 
					
						
							| 
									
										
										
										
											2021-04-21 17:42:09 +02:00
										 |  |  | // @ts-ignore
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | const all: LayoutConfigJson[] = all_known_layouts.themes; | 
					
						
							| 
									
										
										
										
											2022-02-01 04:14:54 +01:00
										 |  |  | const args = process.argv | 
					
						
							|  |  |  | const theme = args[2] | 
					
						
							|  |  |  | if(theme !== undefined){ | 
					
						
							|  |  |  |     console.warn("Only generating layout "+theme) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-04-10 15:01:28 +02:00
										 |  |  | for (const i in all) { | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |     const layoutConfigJson: LayoutConfigJson = all[i] | 
					
						
							| 
									
										
										
										
											2022-02-01 04:14:54 +01:00
										 |  |  |     if(theme !== undefined && layoutConfigJson.id !== theme){ | 
					
						
							|  |  |  |         continue | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-04-10 15:01:28 +02:00
										 |  |  |     const layout = new LayoutConfig(layoutConfigJson, true, "generating layouts") | 
					
						
							|  |  |  |     const layoutName = layout.id | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |     if (blacklist.indexOf(layoutName.toLowerCase()) >= 0) { | 
					
						
							|  |  |  |         console.log(`Skipping a layout with name${layoutName}, it is on the blacklist`); | 
					
						
							|  |  |  |         continue; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     const err = err => { | 
					
						
							|  |  |  |         if (err !== null) { | 
					
						
							|  |  |  |             console.log("Could not write manifest for ", layoutName, " because ", err) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2021-05-10 23:43:30 +02:00
										 |  |  |     createManifest(layout).then(manifObj => { | 
					
						
							| 
									
										
										
										
											2021-02-28 23:46:47 +01:00
										 |  |  |         const manif = JSON.stringify(manifObj, undefined, 2); | 
					
						
							| 
									
										
										
										
											2021-01-18 03:25:15 +01:00
										 |  |  |         const manifestLocation = encodeURIComponent(layout.id.toLowerCase()) + ".webmanifest"; | 
					
						
							|  |  |  |         writeFile(manifestLocation, manif, err); | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-17 14:17:33 +01:00
										 |  |  |         // Create a landing page for the given theme
 | 
					
						
							|  |  |  |         createLandingPage(layout, manifObj).then(landing => { | 
					
						
							|  |  |  |             writeFile(enc(layout.id) + ".html", landing, err) | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2021-12-21 18:35:31 +01:00
										 |  |  |         createIndexFor(layout) | 
					
						
							| 
									
										
										
										
											2021-07-06 15:43:21 +02:00
										 |  |  |     }).catch(e => console.log("Could not generate the manifest: ", e)) | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2020-10-25 17:26:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-16 20:03:19 +01:00
										 |  |  | createManifest(new LayoutConfig({ | 
					
						
							| 
									
										
										
										
											2022-01-18 20:18:12 +01:00
										 |  |  |     icon: "assets/svg/mapcomplete_logo.svg", | 
					
						
							| 
									
										
										
										
											2021-02-28 00:30:58 +01:00
										 |  |  |     id: "index", | 
					
						
							|  |  |  |     layers: [], | 
					
						
							|  |  |  |     maintainer: "Pieter Vander Vennet", | 
					
						
							| 
									
										
										
										
											2022-01-18 20:18:12 +01:00
										 |  |  |     socialImage: "assets/SocialImage.png", | 
					
						
							| 
									
										
										
										
											2021-02-28 00:30:58 +01:00
										 |  |  |     startLat: 0, | 
					
						
							|  |  |  |     startLon: 0, | 
					
						
							|  |  |  |     startZoom: 0, | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |     title: {en: "MapComplete"}, | 
					
						
							| 
									
										
										
										
											2021-02-28 00:30:58 +01:00
										 |  |  |     version: Constants.vNumber, | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |     description: {en: "A thematic map viewer and editor based on OpenStreetMap"} | 
					
						
							| 
									
										
										
										
											2021-05-10 23:43:30 +02:00
										 |  |  | })).then(manifObj => { | 
					
						
							| 
									
										
										
										
											2021-03-16 20:03:19 +01:00
										 |  |  |     const manif = JSON.stringify(manifObj, undefined, 2); | 
					
						
							|  |  |  |     writeFileSync("index.manifest", manif) | 
					
						
							|  |  |  | }) | 
					
						
							| 
									
										
										
										
											2021-02-28 00:30:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-18 23:42:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-17 19:06:32 +02:00
										 |  |  | console.log("All done!"); |