forked from MapComplete/MapComplete
		
	Better handling of image detection when running from ts-node; add some tests
This commit is contained in:
		
							parent
							
								
									eb1dfe84da
								
							
						
					
					
						commit
						3e75921754
					
				
					 4 changed files with 42 additions and 12 deletions
				
			
		| 
						 | 
					@ -214,16 +214,9 @@ Park icon via http://www.onlinewebfonts.com/icon/425974, CC BY 3.0 (@sterankofra
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Forest icon via https://www.onlinewebfonts.com/icon/498112, CC BY
 | 
					Forest icon via https://www.onlinewebfonts.com/icon/498112, CC BY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Statistics icon via https://www.onlinewebfonts.com/icon/197818
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Shower icon (used in 'bike_cleaning.svg'):
 | 
					Shower icon (used in 'bike_cleaning.svg'):
 | 
				
			||||||
https://commons.wikimedia.org/wiki/File:Shower_symbol.svg
 | 
					https://commons.wikimedia.org/wiki/File:Shower_symbol.svg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Bench icons from StreetComplete: https://github.com/westnordost/StreetComplete/tree/v25.0-beta1/res/graphics/quest%20icons, GPLv3.0
 | 
					Bench icons from StreetComplete: https://github.com/westnordost/StreetComplete/tree/v25.0-beta1/res/graphics/quest%20icons, GPLv3.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
Urinal icon: https://thenounproject.com/term/urinal/1307984/
 | 
					Urinal icon: https://thenounproject.com/term/urinal/1307984/
 | 
				
			||||||
 | 
					 | 
				
			||||||
24/7 icon: https://www.vecteezy.com/vector-art/1394992-24-7-service-and-support-icon-set
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Translation-icon: https://commons.wikimedia.org/wiki/File:OOjs_UI_icon_language-ltr.svg
 | 
					 | 
				
			||||||
| 
						 | 
					@ -125,12 +125,22 @@ export class Translation extends UIElement {
 | 
				
			||||||
            if (isIcon) {
 | 
					            if (isIcon) {
 | 
				
			||||||
                const icons = render.split(";").filter(part => part.match(/(\.svg|\.png|\.jpg)$/) != null)
 | 
					                const icons = render.split(";").filter(part => part.match(/(\.svg|\.png|\.jpg)$/) != null)
 | 
				
			||||||
                allIcons.push(...icons)
 | 
					                allIcons.push(...icons)
 | 
				
			||||||
            } else if(!Utils.runningFromConsole){
 | 
					            } else if (!Utils.runningFromConsole) {
 | 
				
			||||||
                // This might be a tagrendering containing some img as html
 | 
					                // This might be a tagrendering containing some img as html
 | 
				
			||||||
                const htmlElement = document.createElement("div")
 | 
					                const htmlElement = document.createElement("div")
 | 
				
			||||||
                htmlElement.innerHTML = render
 | 
					                htmlElement.innerHTML = render
 | 
				
			||||||
                const images = Array.from(htmlElement.getElementsByTagName("img")).map(img => img.src)
 | 
					                const images = Array.from(htmlElement.getElementsByTagName("img")).map(img => img.src)
 | 
				
			||||||
                allIcons.push(...images)
 | 
					                allIcons.push(...images)
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                // We are running this in ts-node (~= nodejs), and can not access document
 | 
				
			||||||
 | 
					                // So, we fallback to simple regex
 | 
				
			||||||
 | 
					                const matches = render.match(/<img[^>]+>/g)
 | 
				
			||||||
 | 
					                if (matches != null) {
 | 
				
			||||||
 | 
					                    const sources = matches.map(img => img.match(/src=("[^"]+"|'[^']+'|[^/ ]+)/))
 | 
				
			||||||
 | 
					                        .filter(match => match != null)
 | 
				
			||||||
 | 
					                        .map(match => match[1].trim().replace(/^['"]/, '').replace(/['"]$/, ''));
 | 
				
			||||||
 | 
					                    allIcons.push(...sources)
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return allIcons.filter(icon => icon != undefined)
 | 
					        return allIcons.filter(icon => icon != undefined)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,17 +18,39 @@ import {And} from "../Logic/Tags/And";
 | 
				
			||||||
import {ImageSearcher} from "../Logic/Actors/ImageSearcher";
 | 
					import {ImageSearcher} from "../Logic/Actors/ImageSearcher";
 | 
				
			||||||
import {AllKnownLayouts} from "../Customizations/AllKnownLayouts";
 | 
					import {AllKnownLayouts} from "../Customizations/AllKnownLayouts";
 | 
				
			||||||
import AllKnownLayers from "../Customizations/AllKnownLayers";
 | 
					import AllKnownLayers from "../Customizations/AllKnownLayers";
 | 
				
			||||||
 | 
					import LayerConfig from "../Customizations/JSON/LayerConfig";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
new T("ImageAttribution Tests", [
 | 
					new T("ImageAttribution Tests", [
 | 
				
			||||||
    [
 | 
					    [
 | 
				
			||||||
        "Should find all the images",
 | 
					        "Should find all the images",
 | 
				
			||||||
        () => {
 | 
					        () => {
 | 
				
			||||||
            const pumps = AllKnownLayers.sharedLayers["bike_repair_station"]
 | 
					            const pumps: LayerConfig = AllKnownLayers.sharedLayers["bike_repair_station"]
 | 
				
			||||||
            const expected = "./assets/layers/bike_repair_station/pump_example_manual.jpg"
 | 
					 | 
				
			||||||
            const images = pumps.ExtractImages();
 | 
					            const images = pumps.ExtractImages();
 | 
				
			||||||
 | 
					            const expectedValues = ['./assets/layers/bike_repair_station/repair_station.svg',
 | 
				
			||||||
 | 
					                './assets/layers/bike_repair_station/repair_station_pump.svg',
 | 
				
			||||||
 | 
					                './assets/layers/bike_repair_station/broken_pump_2.svg',
 | 
				
			||||||
 | 
					                './assets/layers/bike_repair_station/pump.svg',
 | 
				
			||||||
 | 
					                './assets/themes/cyclofix/fietsambassade_gent_logo_small.svg',
 | 
				
			||||||
 | 
					                './assets/layers/bike_repair_station/pump_example_manual.jpg',
 | 
				
			||||||
 | 
					                './assets/layers/bike_repair_station/pump_example.png',
 | 
				
			||||||
 | 
					                './assets/layers/bike_repair_station/pump_example_round.jpg',
 | 
				
			||||||
 | 
					                './assets/layers/bike_repair_station/repair_station_example.jpg']
 | 
				
			||||||
 | 
					            for (const expected of expectedValues) {
 | 
				
			||||||
 | 
					                T.isTrue(images.has(expected), expected + " not found")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    [
 | 
				
			||||||
 | 
					        "Test image discovery regex",
 | 
				
			||||||
 | 
					        () => {
 | 
				
			||||||
 | 
					            const tr = new Translation({en: "XYZ <img src='a.svg'/> XYZ <img src=\"some image.svg\"></img> XYZ <img src=b.svg/>"})
 | 
				
			||||||
 | 
					            const images = new Set<string>(tr.ExtractImages(false));
 | 
				
			||||||
 | 
					            equal(3, images.size)
 | 
				
			||||||
 | 
					            T.isTrue(images.has("a.svg"), "a.svg not found")
 | 
				
			||||||
 | 
					            T.isTrue(images.has("b.svg"), "b.svg not found")
 | 
				
			||||||
 | 
					            T.isTrue(images.has("some image.svg"), "some image.svg not found")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            equal(images.length, 5, "The pump example was not found")
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,4 +25,9 @@ export default class T {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static isTrue(b: boolean, msg: string) {
 | 
				
			||||||
 | 
					        if(!b){
 | 
				
			||||||
 | 
					            throw "Expected true, but got false: "+msg
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue