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"
|
||||
],
|
||||
"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",
|
||||
"startLat": 50.535,
|
||||
"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",
|
||||
"osmtogeojson": "^3.0.0-beta.4",
|
||||
"parcel": "^1.12.4",
|
||||
"sharp": "^0.27.0",
|
||||
"turf": "^3.0.14"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
@ -58,7 +59,6 @@
|
|||
"canvas": "^2.6.1",
|
||||
"fs": "0.0.1-security",
|
||||
"marked": "^1.1.1",
|
||||
"promise-svg2img": "^0.2.0",
|
||||
"read-file": "^0.2.0",
|
||||
"ts-node": "^9.0.0",
|
||||
"ts-node-dev": "^1.0.0-pre.63",
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
// We HAVE to mark this while importing
|
||||
import {Utils} from "../Utils";
|
||||
|
||||
Utils.runningFromConsole = true;
|
||||
|
||||
import LayoutConfig from "../Customizations/JSON/LayoutConfig";
|
||||
import {AllKnownLayouts} from "../Customizations/AllKnownLayouts";
|
||||
import {existsSync, mkdirSync, readFileSync, writeFile, writeFileSync} from "fs";
|
||||
import Locale from "../UI/i18n/Locale";
|
||||
import svg2img from 'promise-svg2img';
|
||||
import * as sharp from "sharp"
|
||||
import Translations from "../UI/i18n/Translations";
|
||||
import {Translation} from "../UI/i18n/Translation";
|
||||
|
||||
|
||||
|
||||
function enc(str: string): string {
|
||||
return encodeURIComponent(str.toLowerCase());
|
||||
}
|
||||
|
@ -75,14 +75,14 @@ function validate(layout: LayoutConfig) {
|
|||
|
||||
}
|
||||
|
||||
function generateWikiEntry(layout: LayoutConfig){
|
||||
if(layout.hideFromOverview){
|
||||
function generateWikiEntry(layout: LayoutConfig) {
|
||||
if (layout.hideFromOverview) {
|
||||
return "";
|
||||
}
|
||||
const languages = layout.language.map(ln => `{{#language:${ln}|en}}`).join(", ")
|
||||
let auth = "Yes";
|
||||
if(layout.maintainer !== "" && layout.maintainer !== "MapComplete"){
|
||||
auth=`Yes, by ${layout.maintainer};`
|
||||
if (layout.maintainer !== "" && layout.maintainer !== "MapComplete") {
|
||||
auth = `Yes, by ${layout.maintainer};`
|
||||
}
|
||||
return `{{service_item
|
||||
|name= [https://mapcomplete.osm.be/${layout.id} ${layout.id}]
|
||||
|
@ -101,7 +101,7 @@ function generateWikiEntry(layout: LayoutConfig){
|
|||
|
||||
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(".");
|
||||
if (name.startsWith("./")) {
|
||||
name = name.substr(2)
|
||||
|
@ -125,16 +125,21 @@ function createIcon(iconPath: string, size: number, layout: LayoutConfig) {
|
|||
console.log("Creating icon ", name, newname)
|
||||
// We already read to file, in order to crash here if the file is not found
|
||||
readFileSync(iconPath);
|
||||
/* 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)
|
||||
});
|
||||
//*/
|
||||
|
||||
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)
|
||||
});
|
||||
//*/
|
||||
} catch (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;
|
||||
}
|
||||
|
||||
function createManifest(layout: LayoutConfig, relativePath: string) {
|
||||
async function createManifest(layout: LayoutConfig, relativePath: string) {
|
||||
const name = layout.id;
|
||||
|
||||
const icons = [];
|
||||
|
@ -150,19 +155,18 @@ function createManifest(layout: LayoutConfig, relativePath: string) {
|
|||
let icon = layout.icon;
|
||||
if (icon.endsWith(".svg") || icon.startsWith("<svg") || icon.startsWith("<?xml")) {
|
||||
// This is an svg. Lets create the needed pngs!
|
||||
|
||||
|
||||
let path = layout.icon;
|
||||
if (layout.icon.startsWith("<")) {
|
||||
// THis is already the svg
|
||||
path = "./assets/generated/" + layout.id + "_logo.svg"
|
||||
writeFileSync(path, layout.icon)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
const sizes = [72, 96, 120, 128, 144, 152, 180, 192, 384, 512];
|
||||
for (const size of sizes) {
|
||||
const name = createIcon(path, size, layout);
|
||||
const name = await createIcon(path, size, layout);
|
||||
icons.push({
|
||||
src: name,
|
||||
sizes: size + "x" + size,
|
||||
|
@ -195,7 +199,8 @@ function createManifest(layout: LayoutConfig, relativePath: string) {
|
|||
}
|
||||
|
||||
const template = readFileSync("index.html", "utf8");
|
||||
function createLandingPage(layout: LayoutConfig) {
|
||||
|
||||
async function createLandingPage(layout: LayoutConfig) {
|
||||
|
||||
Locale.language.setData(layout.language[0]);
|
||||
|
||||
|
@ -227,7 +232,7 @@ function createLandingPage(layout: LayoutConfig) {
|
|||
}
|
||||
|
||||
let output = template
|
||||
.replace("./manifest.manifest",`${enc(layout.id)}.webmanifest`)
|
||||
.replace("./manifest.manifest", `${enc(layout.id)}.webmanifest`)
|
||||
.replace("<!-- $$$OG-META -->", og)
|
||||
.replace(/<title>.+?<\/title>/, `<title>${ogTitle}</title>`)
|
||||
.replace("Loading MapComplete, hang on...", `Loading MapComplete theme <i>${ogTitle}</i>...`)
|
||||
|
@ -247,11 +252,11 @@ function createLandingPage(layout: LayoutConfig) {
|
|||
}
|
||||
|
||||
const generatedDir = "./assets/generated";
|
||||
if (! existsSync(generatedDir)) {
|
||||
if (!existsSync(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;
|
||||
|
||||
let wikiPage = "{|class=\"wikitable sortable\"\n" +
|
||||
|
@ -259,8 +264,6 @@ let wikiPage = "{|class=\"wikitable sortable\"\n" +
|
|||
"|-";
|
||||
|
||||
|
||||
|
||||
|
||||
for (const layoutName in all) {
|
||||
if (blacklist.indexOf(layoutName.toLowerCase()) >= 0) {
|
||||
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];
|
||||
validate(layout)
|
||||
const manif = JSON.stringify(createManifest(layout, ""));
|
||||
|
||||
const manifestLocation = encodeURIComponent(layout.id.toLowerCase()) + ".webmanifest";
|
||||
writeFile(manifestLocation, manif, err);
|
||||
|
||||
createManifest(layout, "").then(manifObj => {
|
||||
const manif = JSON.stringify(manifObj);
|
||||
const manifestLocation = encodeURIComponent(layout.id.toLowerCase()) + ".webmanifest";
|
||||
writeFile(manifestLocation, manif, err);
|
||||
})
|
||||
// Create a landing page for the given theme
|
||||
const landing = createLandingPage(layout);
|
||||
writeFile(enc(layout.id) + ".html", landing, err)
|
||||
|
||||
wikiPage += "\n"+generateWikiEntry(layout);
|
||||
createLandingPage(layout).then(landing => {
|
||||
writeFile(enc(layout.id) + ".html", landing, err)
|
||||
wikiPage += "\n" + generateWikiEntry(layout);
|
||||
});
|
||||
}
|
||||
wikiPage += "\n|}"
|
||||
|
||||
|
|
Loading…
Reference in a new issue