forked from MapComplete/MapComplete
		
	Fixes creating images with sharp instead of svg2img, add playground icon as svg
This commit is contained in:
		
							parent
							
								
									b104feb080
								
							
						
					
					
						commit
						16458d4fec
					
				
					 5 changed files with 13576 additions and 113 deletions
				
			
		
							
								
								
									
										1
									
								
								assets/themes/playgrounds/playground.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								assets/themes/playgrounds/playground.svg
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | <svg version="1.2" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50" overflow="inherit"><path d="M7.206 31.141c2.885 0 5.219-2.399 5.219-5.368 0-2.953-2.334-5.353-5.219-5.353-2.873 0-5.206 2.4-5.206 5.353 0 2.968 2.333 5.368 5.206 5.368zm29.23 9.216c.243-.172.564-.12.741.117l.965 1.372c.164.238.114.58-.116.766l-7.08 5.287c-.229.172-.562.118-.743-.118l-.962-1.372c-.165-.238-.113-.579.116-.764l7.079-5.288zm-8.003-6.817l-2.808-5.063-1.474 1.107 2.808 5.09zm-6.551-11.827l-10.92-19.713-2.089.014 11.522 20.82zm10.281 10.43c.617-.461 2.029-1.143 2.837-1.143h10c1.974 0 3 1.986 3 4.004 0 2.03-1.026 2.996-3 2.996h-9l-10.836 8.502c-3.808 2.819-6.116-.278-6.116-.278l-8.483-8.729c-1.423-1.753-1.115-5.089.591-6.566l11.739-8.597c1.166-1 2.897-.843 3.885.343.976 1.2.822 2.994-.346 3.996l-7.515 5.657 5.399 5.484 7.845-5.669z"/></svg> | ||||||
| After Width: | Height: | Size: 875 B | 
|  | @ -13,7 +13,7 @@ | ||||||
|     "nl" |     "nl" | ||||||
|   ], |   ], | ||||||
|   "maintainer": "", |   "maintainer": "", | ||||||
|   "icon": "https://upload.wikimedia.org/wikipedia/commons/0/00/Map_icons_by_Scott_de_Jonge_-_playground.svg", |   "icon": "./assets/themes/playgrounds/playground.svg", | ||||||
|   "version": "0", |   "version": "0", | ||||||
|   "startLat": 50.535, |   "startLat": 50.535, | ||||||
|   "startLon": 4.399, |   "startLon": 4.399, | ||||||
|  |  | ||||||
							
								
								
									
										13605
									
								
								package-lock.json
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										13605
									
								
								package-lock.json
									
										
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -49,6 +49,7 @@ | ||||||
|     "osm-auth": "^1.0.2", |     "osm-auth": "^1.0.2", | ||||||
|     "osmtogeojson": "^3.0.0-beta.4", |     "osmtogeojson": "^3.0.0-beta.4", | ||||||
|     "parcel": "^1.12.4", |     "parcel": "^1.12.4", | ||||||
|  |     "sharp": "^0.27.0", | ||||||
|     "turf": "^3.0.14" |     "turf": "^3.0.14" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|  | @ -58,7 +59,6 @@ | ||||||
|     "canvas": "^2.6.1", |     "canvas": "^2.6.1", | ||||||
|     "fs": "0.0.1-security", |     "fs": "0.0.1-security", | ||||||
|     "marked": "^1.1.1", |     "marked": "^1.1.1", | ||||||
|     "promise-svg2img": "^0.2.0", |  | ||||||
|     "read-file": "^0.2.0", |     "read-file": "^0.2.0", | ||||||
|     "ts-node": "^9.0.0", |     "ts-node": "^9.0.0", | ||||||
|     "ts-node-dev": "^1.0.0-pre.63", |     "ts-node-dev": "^1.0.0-pre.63", | ||||||
|  |  | ||||||
|  | @ -1,17 +1,17 @@ | ||||||
| // We HAVE to mark this while importing
 | // We HAVE to mark this while importing
 | ||||||
| import {Utils} from "../Utils"; | import {Utils} from "../Utils"; | ||||||
|  | 
 | ||||||
| Utils.runningFromConsole = true; | Utils.runningFromConsole = true; | ||||||
| 
 | 
 | ||||||
| import LayoutConfig from "../Customizations/JSON/LayoutConfig"; | import LayoutConfig from "../Customizations/JSON/LayoutConfig"; | ||||||
| import {AllKnownLayouts} from "../Customizations/AllKnownLayouts"; | import {AllKnownLayouts} from "../Customizations/AllKnownLayouts"; | ||||||
| import {existsSync, mkdirSync, readFileSync, writeFile, writeFileSync} from "fs"; | import {existsSync, mkdirSync, readFileSync, writeFile, writeFileSync} from "fs"; | ||||||
| import Locale from "../UI/i18n/Locale"; | import Locale from "../UI/i18n/Locale"; | ||||||
| import svg2img from 'promise-svg2img'; | import * as sharp from "sharp" | ||||||
| import Translations from "../UI/i18n/Translations"; | import Translations from "../UI/i18n/Translations"; | ||||||
| import {Translation} from "../UI/i18n/Translation"; | import {Translation} from "../UI/i18n/Translation"; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| function enc(str: string): string { | function enc(str: string): string { | ||||||
|     return encodeURIComponent(str.toLowerCase()); |     return encodeURIComponent(str.toLowerCase()); | ||||||
| } | } | ||||||
|  | @ -75,14 +75,14 @@ function validate(layout: LayoutConfig) { | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function generateWikiEntry(layout: LayoutConfig){ | function generateWikiEntry(layout: LayoutConfig) { | ||||||
|     if(layout.hideFromOverview){ |     if (layout.hideFromOverview) { | ||||||
|         return ""; |         return ""; | ||||||
|     } |     } | ||||||
|     const languages = layout.language.map(ln => `{{#language:${ln}|en}}`).join(", ") |     const languages = layout.language.map(ln => `{{#language:${ln}|en}}`).join(", ") | ||||||
|     let auth = "Yes"; |     let auth = "Yes"; | ||||||
|     if(layout.maintainer !== "" && layout.maintainer !== "MapComplete"){ |     if (layout.maintainer !== "" && layout.maintainer !== "MapComplete") { | ||||||
|         auth=`Yes, by ${layout.maintainer};` |         auth = `Yes, by ${layout.maintainer};` | ||||||
|     } |     } | ||||||
|     return `{{service_item
 |     return `{{service_item
 | ||||||
| |name= [https://mapcomplete.osm.be/${layout.id} ${layout.id}]
 | |name= [https://mapcomplete.osm.be/${layout.id} ${layout.id}]
 | ||||||
|  | @ -101,7 +101,7 @@ function generateWikiEntry(layout: LayoutConfig){ | ||||||
| 
 | 
 | ||||||
| const alreadyWritten = [] | const alreadyWritten = [] | ||||||
| 
 | 
 | ||||||
| function createIcon(iconPath: string, size: number, layout: LayoutConfig) { | async function createIcon(iconPath: string, size: number, layout: LayoutConfig) { | ||||||
|     let name = iconPath.split(".").slice(0, -1).join("."); |     let name = iconPath.split(".").slice(0, -1).join("."); | ||||||
|     if (name.startsWith("./")) { |     if (name.startsWith("./")) { | ||||||
|         name = name.substr(2) |         name = name.substr(2) | ||||||
|  | @ -125,6 +125,11 @@ function createIcon(iconPath: string, size: number, layout: LayoutConfig) { | ||||||
|         console.log("Creating icon ", name, newname) |         console.log("Creating icon ", name, newname) | ||||||
|         // We already read to file, in order to crash here if the file is not found
 |         // We already read to file, in order to crash here if the file is not found
 | ||||||
|         readFileSync(iconPath); |         readFileSync(iconPath); | ||||||
|  | 
 | ||||||
|  |         let img = await sharp(iconPath) | ||||||
|  |         let resized = await img.resize(size) | ||||||
|  |         await resized.toFile(newname) | ||||||
|  | 
 | ||||||
|         /*  svg2img(iconPath, |         /*  svg2img(iconPath, | ||||||
|               // @ts-ignore
 |               // @ts-ignore
 | ||||||
|               {width: size, height: size, preserveAspectRatio: true}) |               {width: size, height: size, preserveAspectRatio: true}) | ||||||
|  | @ -134,7 +139,7 @@ function createIcon(iconPath: string, size: number, layout: LayoutConfig) { | ||||||
|               }).catch((error) => { |               }).catch((error) => { | ||||||
|               console.log("ERROR while writing" + iconPath, error) |               console.log("ERROR while writing" + iconPath, error) | ||||||
|           }); |           }); | ||||||
| //*/
 |   //*/
 | ||||||
|     } catch (e) { |     } catch (e) { | ||||||
|         console.error("Could not read icon", iconPath, "due to", e) |         console.error("Could not read icon", iconPath, "due to", e) | ||||||
|     } |     } | ||||||
|  | @ -142,7 +147,7 @@ function createIcon(iconPath: string, size: number, layout: LayoutConfig) { | ||||||
|     return newname; |     return newname; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function createManifest(layout: LayoutConfig, relativePath: string) { | async function createManifest(layout: LayoutConfig, relativePath: string) { | ||||||
|     const name = layout.id; |     const name = layout.id; | ||||||
| 
 | 
 | ||||||
|     const icons = []; |     const icons = []; | ||||||
|  | @ -159,10 +164,9 @@ function createManifest(layout: LayoutConfig, relativePath: string) { | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|          |  | ||||||
|         const sizes = [72, 96, 120, 128, 144, 152, 180, 192, 384, 512]; |         const sizes = [72, 96, 120, 128, 144, 152, 180, 192, 384, 512]; | ||||||
|         for (const size of sizes) { |         for (const size of sizes) { | ||||||
|             const name = createIcon(path, size, layout); |             const name = await createIcon(path, size, layout); | ||||||
|             icons.push({ |             icons.push({ | ||||||
|                 src: name, |                 src: name, | ||||||
|                 sizes: size + "x" + size, |                 sizes: size + "x" + size, | ||||||
|  | @ -195,7 +199,8 @@ function createManifest(layout: LayoutConfig, relativePath: string) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| const template = readFileSync("index.html", "utf8"); | const template = readFileSync("index.html", "utf8"); | ||||||
| function createLandingPage(layout: LayoutConfig) { | 
 | ||||||
|  | async function createLandingPage(layout: LayoutConfig) { | ||||||
| 
 | 
 | ||||||
|     Locale.language.setData(layout.language[0]); |     Locale.language.setData(layout.language[0]); | ||||||
| 
 | 
 | ||||||
|  | @ -227,7 +232,7 @@ function createLandingPage(layout: LayoutConfig) { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     let output = template |     let output = template | ||||||
|         .replace("./manifest.manifest",`${enc(layout.id)}.webmanifest`) |         .replace("./manifest.manifest", `${enc(layout.id)}.webmanifest`) | ||||||
|         .replace("<!-- $$$OG-META -->", og) |         .replace("<!-- $$$OG-META -->", og) | ||||||
|         .replace(/<title>.+?<\/title>/, `<title>${ogTitle}</title>`) |         .replace(/<title>.+?<\/title>/, `<title>${ogTitle}</title>`) | ||||||
|         .replace("Loading MapComplete, hang on...", `Loading MapComplete theme <i>${ogTitle}</i>...`) |         .replace("Loading MapComplete, hang on...", `Loading MapComplete theme <i>${ogTitle}</i>...`) | ||||||
|  | @ -247,11 +252,11 @@ function createLandingPage(layout: LayoutConfig) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| const generatedDir = "./assets/generated"; | const generatedDir = "./assets/generated"; | ||||||
| if (! existsSync(generatedDir)) { | if (!existsSync(generatedDir)) { | ||||||
|     mkdirSync(generatedDir) |     mkdirSync(generatedDir) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| const blacklist = ["", "test", ".", "..", "manifest", "index", "land", "preferences", "account", "openstreetmap","custom"] | const blacklist = ["", "test", ".", "..", "manifest", "index", "land", "preferences", "account", "openstreetmap", "custom"] | ||||||
| const all = AllKnownLayouts.allSets; | const all = AllKnownLayouts.allSets; | ||||||
| 
 | 
 | ||||||
| let wikiPage = "{|class=\"wikitable sortable\"\n" + | let wikiPage = "{|class=\"wikitable sortable\"\n" + | ||||||
|  | @ -259,8 +264,6 @@ let wikiPage = "{|class=\"wikitable sortable\"\n" + | ||||||
|     "|-"; |     "|-"; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| for (const layoutName in all) { | for (const layoutName in all) { | ||||||
|     if (blacklist.indexOf(layoutName.toLowerCase()) >= 0) { |     if (blacklist.indexOf(layoutName.toLowerCase()) >= 0) { | ||||||
|         console.log(`Skipping a layout with name${layoutName}, it is on the blacklist`); |         console.log(`Skipping a layout with name${layoutName}, it is on the blacklist`); | ||||||
|  | @ -273,16 +276,16 @@ for (const layoutName in all) { | ||||||
|     }; |     }; | ||||||
|     const layout = all[layoutName]; |     const layout = all[layoutName]; | ||||||
|     validate(layout) |     validate(layout) | ||||||
|     const manif = JSON.stringify(createManifest(layout, "")); |     createManifest(layout, "").then(manifObj => { | ||||||
| 
 |         const manif = JSON.stringify(manifObj); | ||||||
|         const manifestLocation = encodeURIComponent(layout.id.toLowerCase()) + ".webmanifest"; |         const manifestLocation = encodeURIComponent(layout.id.toLowerCase()) + ".webmanifest"; | ||||||
|         writeFile(manifestLocation, manif, err); |         writeFile(manifestLocation, manif, err); | ||||||
| 
 |     }) | ||||||
|     // Create a landing page for the given theme
 |     // Create a landing page for the given theme
 | ||||||
|     const landing = createLandingPage(layout); |     createLandingPage(layout).then(landing => { | ||||||
|         writeFile(enc(layout.id) + ".html", landing, err) |         writeFile(enc(layout.id) + ".html", landing, err) | ||||||
| 
 |         wikiPage += "\n" + generateWikiEntry(layout); | ||||||
|     wikiPage += "\n"+generateWikiEntry(layout); |     }); | ||||||
| } | } | ||||||
| wikiPage += "\n|}" | wikiPage += "\n|}" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue