| 
									
										
										
										
											2020-11-11 16:28:49 +01:00
										 |  |  | // We HAVE to mark this while importing
 | 
					
						
							| 
									
										
										
										
											2021-01-06 02:21:50 +01:00
										 |  |  | import {Utils} from "../Utils"; | 
					
						
							| 
									
										
										
										
											2021-01-18 03:25:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-06 02:21:50 +01:00
										 |  |  | Utils.runningFromConsole = true; | 
					
						
							| 
									
										
										
										
											2020-11-11 16:28:49 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-06 02:21:50 +01:00
										 |  |  | import LayoutConfig from "../Customizations/JSON/LayoutConfig"; | 
					
						
							| 
									
										
										
										
											2020-11-17 02:22:48 +01:00
										 |  |  | import {AllKnownLayouts} from "../Customizations/AllKnownLayouts"; | 
					
						
							| 
									
										
										
										
											2020-11-15 15:08:09 +01:00
										 |  |  | import {existsSync, mkdirSync, readFileSync, writeFile, writeFileSync} from "fs"; | 
					
						
							| 
									
										
										
										
											2020-11-17 02:22:48 +01:00
										 |  |  | import Locale from "../UI/i18n/Locale"; | 
					
						
							| 
									
										
										
										
											2021-01-18 03:25:15 +01:00
										 |  |  | import * as sharp from "sharp" | 
					
						
							| 
									
										
										
										
											2020-11-17 02:22:48 +01:00
										 |  |  | import Translations from "../UI/i18n/Translations"; | 
					
						
							|  |  |  | import {Translation} from "../UI/i18n/Translation"; | 
					
						
							| 
									
										
										
										
											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()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-11 16:23:49 +01:00
										 |  |  | function validate(layout: LayoutConfig) { | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |     const translations: Translation[] = []; | 
					
						
							|  |  |  |     const queue: any[] = [layout] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while (queue.length > 0) { | 
					
						
							|  |  |  |         const item = queue.pop(); | 
					
						
							|  |  |  |         for (const key in item) { | 
					
						
							|  |  |  |             const v = item[key]; | 
					
						
							|  |  |  |             if (v === undefined) { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (v instanceof Translation || v?.translations !== undefined) { | 
					
						
							|  |  |  |                 translations.push(v); | 
					
						
							|  |  |  |             } else if ( | 
					
						
							|  |  |  |                 ["string", "function", "boolean", "number"].indexOf(typeof (v)) < 0) { | 
					
						
							|  |  |  |                 queue.push(v) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const missing = {} | 
					
						
							|  |  |  |     const present = {} | 
					
						
							| 
									
										
										
										
											2020-11-11 16:23:49 +01:00
										 |  |  |     for (const ln of layout.language) { | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |         missing[ln] = 0; | 
					
						
							|  |  |  |         present[ln] = 0; | 
					
						
							|  |  |  |         for (const translation of translations) { | 
					
						
							| 
									
										
										
										
											2020-09-25 23:59:19 +02:00
										 |  |  |             if (translation.translations["*"] !== undefined) { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |             const txt = translation.translations[ln]; | 
					
						
							|  |  |  |             const isMissing = txt === undefined || txt === "" || txt.toLowerCase().indexOf("todo") >= 0; | 
					
						
							|  |  |  |             if (isMissing) { | 
					
						
							| 
									
										
										
										
											2020-09-25 23:59:19 +02:00
										 |  |  |                 console.log(`   ${layout.id}: No translation for`, ln, "in", translation.translations, "got:", txt) | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |                 missing[ln]++ | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 present[ln]++; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-25 23:59:19 +02:00
										 |  |  |     let message = `Translation completenes for theme ${layout.id}` | 
					
						
							|  |  |  |     let isComplete = true; | 
					
						
							| 
									
										
										
										
											2020-11-11 16:23:49 +01:00
										 |  |  |     for (const ln of layout.language) { | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |         const amiss = missing[ln]; | 
					
						
							|  |  |  |         const ok = present[ln]; | 
					
						
							|  |  |  |         const total = amiss + ok; | 
					
						
							| 
									
										
										
										
											2020-09-25 23:59:19 +02:00
										 |  |  |         message += `\n${ln}: ${ok}/${total}` | 
					
						
							|  |  |  |         if (ok !== total) { | 
					
						
							|  |  |  |             isComplete = false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (isComplete) { | 
					
						
							|  |  |  |         console.log(`${layout.id} is fully translated!`) | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         console.log(message) | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-18 03:25:15 +01:00
										 |  |  | function generateWikiEntry(layout: LayoutConfig) { | 
					
						
							|  |  |  |     if (layout.hideFromOverview) { | 
					
						
							| 
									
										
										
										
											2020-09-17 19:06:32 +02:00
										 |  |  |         return ""; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-11-11 16:23:49 +01:00
										 |  |  |     const languages = layout.language.map(ln => `{{#language:${ln}|en}}`).join(", ") | 
					
						
							| 
									
										
										
										
											2020-10-25 17:26:15 +01:00
										 |  |  |     let auth = "Yes"; | 
					
						
							| 
									
										
										
										
											2021-01-18 03:25:15 +01:00
										 |  |  |     if (layout.maintainer !== "" && layout.maintainer !== "MapComplete") { | 
					
						
							|  |  |  |         auth = `Yes, by ${layout.maintainer};` | 
					
						
							| 
									
										
										
										
											2020-09-17 19:06:32 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-11-06 03:17:27 +01:00
										 |  |  |     return `{{service_item
 | 
					
						
							| 
									
										
										
										
											2020-12-31 22:41:52 +01:00
										 |  |  | |name= [https://mapcomplete.osm.be/${layout.id} ${layout.id}]
 | 
					
						
							| 
									
										
										
										
											2020-10-25 17:26:15 +01:00
										 |  |  | |region= Worldwide | 
					
						
							|  |  |  | |lang= ${languages} | 
					
						
							| 
									
										
										
										
											2020-12-18 02:10:26 +01:00
										 |  |  | |descr= A MapComplete theme: ${Translations.W(layout.description) | 
					
						
							|  |  |  |         .InnerRender() | 
					
						
							|  |  |  |         .replace("<a href='", "[[") | 
					
						
							|  |  |  |         .replace(/'>.*<\/a>/, "]]") | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-12-14 01:14:22 +01:00
										 |  |  | |material= {{yes|[https://mapcomplete.osm.be/ ${auth}]}}
 | 
					
						
							| 
									
										
										
										
											2020-10-25 17:26:15 +01:00
										 |  |  | |image= MapComplete_Screenshot.png | 
					
						
							|  |  |  | |genre= POI, editor, ${layout.id} | 
					
						
							| 
									
										
										
										
											2020-09-17 19:06:32 +02:00
										 |  |  | }}`
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  | const alreadyWritten = [] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-18 03:25:15 +01:00
										 |  |  | async function createIcon(iconPath: string, size: number, layout: LayoutConfig) { | 
					
						
							| 
									
										
										
										
											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) { | 
					
						
							| 
									
										
										
										
											2020-09-20 20:28:35 +02:00
										 |  |  |         // Errors are normal here if this file exists
 | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-25 23:37:59 +02:00
										 |  |  |     try { | 
					
						
							| 
									
										
										
										
											2021-01-18 01:48:08 +01:00
										 |  |  |         console.log("Could not create icon! ", name, newname) | 
					
						
							|  |  |  |         /* | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /*  svg2img(iconPath, | 
					
						
							|  |  |  |               // @ts-ignore
 | 
					
						
							|  |  |  |               {width: size, height: size, preserveAspectRatio: true}) | 
					
						
							|  |  |  |               .then((buffer) => { | 
					
						
							|  |  |  |                   console.log("Writing icon", newname) | 
					
						
							|  |  |  |                   writeFileSync(newname, buffer); | 
					
						
							|  |  |  |               }).catch((error) => { | 
					
						
							|  |  |  |               console.log("ERROR while writing" + iconPath, error) | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |   //*/
 | 
					
						
							| 
									
										
										
										
											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-01-18 03:25:15 +01:00
										 |  |  | async function createManifest(layout: LayoutConfig, relativePath: string) { | 
					
						
							| 
									
										
										
										
											2020-09-03 00:00:37 +02:00
										 |  |  |     const name = layout.id; | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const icons = []; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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")) { | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |         // This is an svg. Lets create the needed pngs!
 | 
					
						
							| 
									
										
										
										
											2021-01-17 21:04:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-01-18 03:25:15 +01:00
										 |  |  |             const name = await createIcon(path, size, layout); | 
					
						
							| 
									
										
										
										
											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" | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |     } 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
										 |  |  |     } | 
					
						
							|  |  |  |     const ogTitle = Translations.W(layout.title).InnerRender(); | 
					
						
							| 
									
										
										
										
											2020-08-22 03:15:42 +02:00
										 |  |  |     const ogDescr = Translations.W(layout.description ?? "").InnerRender(); | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const manif = { | 
					
						
							|  |  |  |         name: name, | 
					
						
							|  |  |  |         short_name: ogTitle, | 
					
						
							| 
									
										
										
										
											2020-09-03 00:00:37 +02:00
										 |  |  |         start_url: `${relativePath}/${layout.id.toLowerCase()}.html`, | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |         display: "standalone", | 
					
						
							|  |  |  |         background_color: "#fff", | 
					
						
							|  |  |  |         description: ogDescr, | 
					
						
							|  |  |  |         orientation: "portrait-primary, landscape-primary", | 
					
						
							|  |  |  |         icons: icons | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return manif; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const template = readFileSync("index.html", "utf8"); | 
					
						
							| 
									
										
										
										
											2021-01-18 03:25:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | async function createLandingPage(layout: LayoutConfig) { | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-03 00:00:37 +02:00
										 |  |  |     const ogTitle = Translations.W(layout.title)?.InnerRender(); | 
					
						
							| 
									
										
										
										
											2020-11-17 17:36:56 +01:00
										 |  |  |     const ogDescr = Translations.W(layout.shortDescription ?? "Easily add and edit geodata with OpenStreetMap")?.InnerRender(); | 
					
						
							| 
									
										
										
										
											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 = `
 | 
					
						
							| 
									
										
										
										
											2020-11-17 16:29:51 +01:00
										 |  |  |     <meta property="og:image" content="${ogImage ?? './assets/svg/add.svg'}"> | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |     <meta property="og:title" content="${ogTitle}"> | 
					
						
							|  |  |  |     <meta property="og:description" content="${ogDescr}">`
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-27 11:11:20 +02:00
										 |  |  |     let output = template | 
					
						
							| 
									
										
										
										
											2021-01-18 03:25:15 +01:00
										 |  |  |         .replace("./manifest.manifest", `${enc(layout.id)}.webmanifest`) | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  |         .replace("<!-- $$$OG-META -->", og) | 
					
						
							| 
									
										
										
										
											2020-10-23 02:15:58 +02:00
										 |  |  |         .replace(/<title>.+?<\/title>/, `<title>${ogTitle}</title>`) | 
					
						
							|  |  |  |         .replace("Loading MapComplete, hang on...", `Loading MapComplete theme <i>${ogTitle}</i>...`) | 
					
						
							|  |  |  |         .replace("<!-- $$$CUSTOM-CSS -->", customCss) | 
					
						
							| 
									
										
										
										
											2020-11-06 04:02:53 +01:00
										 |  |  |         .replace(`<link rel="icon" href="assets/svg/add.svg" sizes="any" type="image/svg+xml">`, | 
					
						
							| 
									
										
										
										
											2020-11-06 03:17:27 +01:00
										 |  |  |             `<link rel="icon" href="${icon}" sizes="any" type="image/svg+xml">`); | 
					
						
							| 
									
										
										
										
											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
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-18 03:25:15 +01:00
										 |  |  | const blacklist = ["", "test", ".", "..", "manifest", "index", "land", "preferences", "account", "openstreetmap", "custom"] | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  | const all = AllKnownLayouts.allSets; | 
					
						
							| 
									
										
										
										
											2020-09-17 19:06:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-25 17:26:15 +01:00
										 |  |  | let wikiPage = "{|class=\"wikitable sortable\"\n" + | 
					
						
							|  |  |  |     "! Name, link !! Genre !! Covered region !! Language !! Description !! Free materials !! Image\n" + | 
					
						
							|  |  |  |     "|-"; | 
					
						
							| 
									
										
										
										
											2020-09-17 19:06:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-15 15:08:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  | for (const layoutName in all) { | 
					
						
							|  |  |  |     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) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     const layout = all[layoutName]; | 
					
						
							|  |  |  |     validate(layout) | 
					
						
							| 
									
										
										
										
											2021-01-18 03:25:15 +01:00
										 |  |  |     createManifest(layout, "").then(manifObj => { | 
					
						
							|  |  |  |         const manif = JSON.stringify(manifObj); | 
					
						
							|  |  |  |         const manifestLocation = encodeURIComponent(layout.id.toLowerCase()) + ".webmanifest"; | 
					
						
							|  |  |  |         writeFile(manifestLocation, manif, err); | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2021-01-14 22:25:11 +01:00
										 |  |  |     // Create a landing page for the given theme
 | 
					
						
							| 
									
										
										
										
											2021-01-18 03:25:15 +01:00
										 |  |  |     createLandingPage(layout).then(landing => { | 
					
						
							|  |  |  |         writeFile(enc(layout.id) + ".html", landing, err) | 
					
						
							|  |  |  |         wikiPage += "\n" + generateWikiEntry(layout); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2020-07-26 02:01:34 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2020-11-29 16:02:15 +01:00
										 |  |  | wikiPage += "\n|}" | 
					
						
							| 
									
										
										
										
											2020-10-25 17:26:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-15 15:13:08 +01:00
										 |  |  | writeFile(generatedDir + "/wikiIndex", wikiPage, (err) => { | 
					
						
							| 
									
										
										
										
											2020-09-25 23:59:19 +02:00
										 |  |  |     if (err !== null) { | 
					
						
							|  |  |  |         console.log("Could not save wikiindex", err); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2020-08-22 03:15:42 +02:00
										 |  |  | console.log("Counting all translations") | 
					
						
							| 
									
										
										
										
											2020-07-31 17:11:44 +02:00
										 |  |  | Translations.CountTranslations(); | 
					
						
							| 
									
										
										
										
											2020-09-17 19:06:32 +02:00
										 |  |  | console.log("All done!"); |