diff --git a/Logic/Basemap.js b/Logic/Basemap.js deleted file mode 100644 index 4f35171..0000000 --- a/Logic/Basemap.js +++ /dev/null @@ -1,70 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Basemap = void 0; -var leaflet_1 = require("leaflet"); -var UIEventSource_1 = require("../UI/UIEventSource"); -// Contains all setup and baselayers for Leaflet stuff -var Basemap = /** @class */ (function () { - function Basemap(leafletElementId, location, extraAttribution) { - this.LastClickLocation = new UIEventSource_1.UIEventSource(undefined); - this.aivLucht2013Layer = leaflet_1.default.tileLayer.wms('https://geoservices.informatievlaanderen.be/raadpleegdiensten/OGW/wms?s', { - layers: "OGWRGB13_15VL", - attribution: "Luchtfoto's van © AIV Vlaanderen (2013-2015) | " - }); - this.aivLuchtLatestLayer = leaflet_1.default.tileLayer("https://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&" + - "LAYER=omwrgbmrvl&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={z}&tileRow={y}&tileCol={x}", { - // omwrgbmrvl - attribution: 'Luchtfoto\'s van © AIV Vlaanderen (Laatste) © AGIV', - maxZoom: 20, - minZoom: 1, - wmts: true - }); - this.osmLayer = leaflet_1.default.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", { - attribution: '', - maxZoom: 19, - minZoom: 1 - }); - this.osmBeLayer = leaflet_1.default.tileLayer("https://tile.osm.be/osmbe/{z}/{x}/{y}.png", { - attribution: 'Tile hosting courtesy of Geo6', - maxZoom: 18, - minZoom: 1 - }); - this.grbLayer = leaflet_1.default.tileLayer("https://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=grb_bsk&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={z}&tileCol={x}&tileRow={y}", { - attribution: 'Achtergrond Grootschalig ReferentieBestand(GRB) © AGIV', - maxZoom: 20, - minZoom: 1, - wmts: true - }); - this.baseLayers = { - "Luchtfoto Vlaanderen (recentste door AIV)": this.aivLuchtLatestLayer, - "Luchtfoto Vlaanderen (2013-2015, door AIV)": this.aivLucht2013Layer, - "Kaart van OpenStreetMap": this.osmLayer, - "Kaart Grootschalig ReferentieBestand Vlaanderen (GRB) door AIV": this.grbLayer - }; - this.map = leaflet_1.default.map(leafletElementId, { - center: [location.data.lat, location.data.lon], - zoom: location.data.zoom, - layers: [this.osmLayer], - }); - this.map.attributionControl.setPrefix(extraAttribution.Render() + " | OpenStreetMap"); - this.Location = location; - var layerControl = leaflet_1.default.control.layers(this.baseLayers, null, { - position: 'bottomright', - hideSingleBase: true - }); - layerControl.addTo(this.map); - this.map.zoomControl.setPosition("bottomright"); - var self = this; - this.map.on("moveend", function () { - location.data.zoom = self.map.getZoom(); - location.data.lat = self.map.getCenter().lat; - location.data.lon = self.map.getCenter().lng; - location.ping(); - }); - this.map.on("click", function (e) { - self.LastClickLocation.setData({ lat: e.latlng.lat, lon: e.latlng.lng }); - }); - } - return Basemap; -}()); -exports.Basemap = Basemap; diff --git a/Logic/Changes.js b/Logic/Changes.js deleted file mode 100644 index 12edb7e..0000000 --- a/Logic/Changes.js +++ /dev/null @@ -1,222 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Changes = void 0; -var OsmObject_1 = require("./OsmObject"); -var UIEventSource_1 = require("../UI/UIEventSource"); -var TagsFilter_1 = require("./TagsFilter"); -var Changes = /** @class */ (function () { - function Changes(changesetComment, login, allElements) { - this._pendingChanges = []; // Gets reset on uploadAll - this.newElements = []; // Gets reset on uploadAll - this.pendingChangesES = new UIEventSource_1.UIEventSource(this._pendingChanges.length); - this.isSaving = new UIEventSource_1.UIEventSource(false); - this._changesetComment = changesetComment; - this.login = login; - this._allElements = allElements; - } - Changes.prototype.addTag = function (elementId, tagsFilter) { - if (tagsFilter instanceof TagsFilter_1.Tag) { - var tag = tagsFilter; - this.addChange(elementId, tag.key, tag.value); - return; - } - if (tagsFilter instanceof TagsFilter_1.And) { - var and = tagsFilter; - for (var _i = 0, _a = and.and; _i < _a.length; _i++) { - var tag = _a[_i]; - this.addTag(elementId, tag); - } - return; - } - console.log("Unsupported tagsfilter element to addTag", tagsFilter); - throw "Unsupported tagsFilter element"; - }; - /** - * Adds a change to the pending changes - * @param elementId - * @param key - * @param value - */ - Changes.prototype.addChange = function (elementId, key, value) { - console.log("Received change", key, value); - if (key === undefined || key === null) { - console.log("Invalid key"); - return; - } - if (value === undefined || value === null) { - console.log("Invalid value for ", key); - return; - } - var eventSource = this._allElements.getElement(elementId); - eventSource.data[key] = value; - eventSource.ping(); - // We get the id from the event source, as that ID might be rewritten - this._pendingChanges.push({ elementId: eventSource.data.id, key: key, value: value }); - this.pendingChangesES.setData(this._pendingChanges.length); - }; - /** - * Create a new node element at the given lat/long. - * An internal OsmObject is created to upload later on, a geojson represention is returned. - * Note that the geojson version shares the tags (properties) by pointer, but has _no_ id in properties - */ - Changes.prototype.createElement = function (basicTags, lat, lon) { - var osmNode = new OsmObject_1.OsmNode(Changes._nextId); - this.newElements.push(osmNode); - Changes._nextId--; - var id = "node/" + osmNode.id; - osmNode.lat = lat; - osmNode.lon = lon; - var properties = { id: id }; - var geojson = { - "type": "Feature", - "properties": properties, - "id": id, - "geometry": { - "type": "Point", - "coordinates": [ - lon, - lat - ] - } - }; - this._allElements.addOrGetElement(geojson); - // The basictags are COPIED, the id is included in the properties - // The tags are not yet written into the OsmObject, but this is applied onto a - for (var _i = 0, basicTags_1 = basicTags; _i < basicTags_1.length; _i++) { - var kv = basicTags_1[_i]; - this.addChange(id, kv.key, kv.value); // We use the call, to trigger all the other machinery (including updating the geojson itsel - properties[kv.key] = kv.value; - } - return geojson; - }; - Changes.prototype.uploadAll = function (optionalContinuation) { - if (optionalContinuation === void 0) { optionalContinuation = undefined; } - var self = this; - this.isSaving.setData(true); - var optionalContinuationWrapped = function () { - self.isSaving.setData(false); - if (optionalContinuation) { - optionalContinuation(); - } - }; - var pending = this._pendingChanges; - this._pendingChanges = []; - this.pendingChangesES.setData(this._pendingChanges.length); - var newElements = this.newElements; - this.newElements = []; - var knownElements = {}; // maps string --> OsmObject - function DownloadAndContinue(neededIds, continuation) { - // local function which downloads all the objects one by one - // this is one big loop, running one download, then rerunning the entire function - if (neededIds.length == 0) { - continuation(); - return; - } - var neededId = neededIds.pop(); - if (neededId in knownElements) { - DownloadAndContinue(neededIds, continuation); - return; - } - console.log("Downloading ", neededId); - OsmObject_1.OsmObject.DownloadObject(neededId, function (element) { - knownElements[neededId] = element; // assign the element for later, continue downloading the next element - DownloadAndContinue(neededIds, continuation); - }); - } - var neededIds = []; - for (var _i = 0, pending_1 = pending; _i < pending_1.length; _i++) { - var change = pending_1[_i]; - var id = change.elementId; - if (parseFloat(id.split("/")[1]) < 0) { - console.log("Detected a new element! Exciting!"); - } - else { - neededIds.push(id); - } - } - DownloadAndContinue(neededIds, function () { - // Here, inside the continuation, we know that all 'neededIds' are loaded in 'knownElements' - // We apply the changes on them - for (var _i = 0, pending_2 = pending; _i < pending_2.length; _i++) { - var change = pending_2[_i]; - if (parseInt(change.elementId.split("/")[1]) < 0) { - // This is a new element - we should apply this on one of the new elements - for (var _a = 0, newElements_1 = newElements; _a < newElements_1.length; _a++) { - var newElement = newElements_1[_a]; - if (newElement.type + "/" + newElement.id === change.elementId) { - newElement.addTag(change.key, change.value); - } - } - } - else { - console.log(knownElements, change.elementId); - knownElements[change.elementId].addTag(change.key, change.value); - // note: addTag will flag changes with 'element.changed' internally - } - } - // Small sanity check for duplicate information - var changedElements = []; - for (var elementId in knownElements) { - var element = knownElements[elementId]; - if (element.changed) { - changedElements.push(element); - } - } - if (changedElements.length == 0 && newElements.length == 0) { - console.log("No changes in any object"); - return; - } - var handleMapping = function (idMapping) { - for (var oldId in idMapping) { - var newId = idMapping[oldId]; - var element = self._allElements.getElement(oldId); - element.data.id = newId; - self._allElements.addElementById(newId, element); - element.ping(); - } - }; - console.log("Beginning upload..."); - // At last, we build the changeset and upload - self.login.UploadChangeset(self._changesetComment, function (csId) { - var modifications = ""; - for (var _i = 0, changedElements_1 = changedElements; _i < changedElements_1.length; _i++) { - var element = changedElements_1[_i]; - if (!element.changed) { - continue; - } - modifications += element.ChangesetXML(csId) + "\n"; - } - var creations = ""; - for (var _a = 0, newElements_2 = newElements; _a < newElements_2.length; _a++) { - var newElement = newElements_2[_a]; - creations += newElement.ChangesetXML(csId); - } - var changes = ""; - if (creations.length > 0) { - changes += - "" + - creations + - ""; - } - if (modifications.length > 0) { - changes += - "" + - modifications + - ""; - } - changes += ""; - return changes; - }, handleMapping, optionalContinuationWrapped); - }); - }; - Changes.prototype.asQuestions = function (qs) { - var ls = []; - for (var i in qs) { - ls.push(new Question(this, qs[i])); - } - return ls; - }; - Changes._nextId = -1; // New assined ID's are negative - return Changes; -}()); -exports.Changes = Changes; diff --git a/Logic/ElementStorage.js b/Logic/ElementStorage.js deleted file mode 100644 index d8517a8..0000000 --- a/Logic/ElementStorage.js +++ /dev/null @@ -1,51 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ElementStorage = void 0; -/** - * Keeps track of a dictionary 'elementID' -> element - */ -var UIEventSource_1 = require("../UI/UIEventSource"); -var ElementStorage = /** @class */ (function () { - function ElementStorage() { - this._elements = []; - } - ElementStorage.prototype.addElementById = function (id, eventSource) { - this._elements[id] = eventSource; - }; - ElementStorage.prototype.addElement = function (element) { - var eventSource = new UIEventSource_1.UIEventSource(element.properties); - this._elements[element.properties.id] = eventSource; - return eventSource; - }; - ElementStorage.prototype.addOrGetElement = function (element) { - var elementId = element.properties.id; - if (elementId in this._elements) { - var es = this._elements[elementId]; - var keptKeys = es.data; - // The element already exists - // We add all the new keys to the old keys - for (var k in element.properties) { - var v = element.properties[k]; - if (keptKeys[k] !== v) { - keptKeys[k] = v; - es.ping(); - } - } - return es; - } - else { - return this.addElement(element); - } - }; - ElementStorage.prototype.getElement = function (elementId) { - if (elementId in this._elements) { - return this._elements[elementId]; - } - console.log("Can not find eventsource with id ", elementId); - }; - ElementStorage.prototype.removeId = function (oldId) { - delete this._elements[oldId]; - }; - return ElementStorage; -}()); -exports.ElementStorage = ElementStorage; diff --git a/Logic/FilteredLayer.js b/Logic/FilteredLayer.js deleted file mode 100644 index ec11e51..0000000 --- a/Logic/FilteredLayer.js +++ /dev/null @@ -1,173 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.FilteredLayer = void 0; -var TagsFilter_1 = require("./TagsFilter"); -var UIEventSource_1 = require("../UI/UIEventSource"); -var leaflet_1 = require("leaflet"); -var GeoOperations_1 = require("./GeoOperations"); -/*** - * A filtered layer is a layer which offers a 'set-data' function - * It is initialized with a tagfilter. - * - * When geojson-data is given to 'setData', all the geojson matching the filter, is rendered on this layer. - * If it is not rendered, it is returned in a 'leftOver'-geojson; which can be consumed by the next layer. - * - * This also makes sure that no objects are rendered twice if they are applicable on two layers - */ -var FilteredLayer = /** @class */ (function () { - function FilteredLayer(name, map, storage, changes, filters, maxAllowedOverlap, style, selectedElement, showOnPopup) { - this.isDisplayed = new UIEventSource_1.UIEventSource(true); - /** List of new elements, geojson features - */ - this._newElements = []; - this._selectedElement = selectedElement; - this._showOnPopup = showOnPopup; - if (style === undefined) { - style = function () { - return {}; - }; - } - this.name = name; - this._map = map; - this.filters = filters; - this._style = style; - this._storage = storage; - this._maxAllowedOverlap = maxAllowedOverlap; - var self = this; - this.isDisplayed.addCallback(function (isDisplayed) { - if (self._geolayer !== undefined && self._geolayer !== null) { - if (isDisplayed) { - self._geolayer.addTo(self._map.map); - } - else { - self._map.map.removeLayer(self._geolayer); - } - } - }); - } - /** - * The main function to load data into this layer. - * The data that is NOT used by this layer, is returned as a geojson object; the other data is rendered - */ - FilteredLayer.prototype.SetApplicableData = function (geojson) { - var leftoverFeatures = []; - var selfFeatures = []; - for (var _i = 0, _a = geojson.features; _i < _a.length; _i++) { - var feature = _a[_i]; - // feature.properties contains all the properties - var tags = TagsFilter_1.TagUtils.proprtiesToKV(feature.properties); - if (this.filters.matches(tags)) { - selfFeatures.push(feature); - } - else { - leftoverFeatures.push(feature); - } - } - this.RenderLayer({ - type: "FeatureCollection", - features: selfFeatures - }); - var notShadowed = []; - for (var _b = 0, leftoverFeatures_1 = leftoverFeatures; _b < leftoverFeatures_1.length; _b++) { - var feature = leftoverFeatures_1[_b]; - if (this._maxAllowedOverlap !== undefined && this._maxAllowedOverlap > 0) { - if (GeoOperations_1.GeoOperations.featureIsContainedInAny(feature, selfFeatures, this._maxAllowedOverlap)) { - // This feature is filtered away - continue; - } - } - notShadowed.push(feature); - } - return { - type: "FeatureCollection", - features: notShadowed - }; - }; - FilteredLayer.prototype.AddNewElement = function (element) { - this._newElements.push(element); - console.log("Element added"); - this.RenderLayer(this._dataFromOverpass); // Update the layer - }; - FilteredLayer.prototype.RenderLayer = function (data) { - var self = this; - if (this._geolayer !== undefined && this._geolayer !== null) { - this._map.map.removeLayer(this._geolayer); - } - this._dataFromOverpass = data; - var fusedFeatures = []; - var idsFromOverpass = []; - for (var _i = 0, _a = data.features; _i < _a.length; _i++) { - var feature = _a[_i]; - idsFromOverpass.push(feature.properties.id); - fusedFeatures.push(feature); - } - for (var _b = 0, _c = this._newElements; _b < _c.length; _b++) { - var feature = _c[_b]; - if (idsFromOverpass.indexOf(feature.properties.id) < 0) { - // This element is not yet uploaded or not yet visible in overpass - // We include it in the layer - fusedFeatures.push(feature); - } - } - // We use a new, fused dataset - data = { - type: "FeatureCollection", - features: fusedFeatures - }; - // The data is split in two parts: the poinst and the rest - // The points get a special treatment in order to render them properly - // Note that some features might get a point representation as well - this._geolayer = leaflet_1.default.geoJSON(data, { - style: function (feature) { - return self._style(feature.properties); - }, - pointToLayer: function (feature, latLng) { - var style = self._style(feature.properties); - var marker; - if (style.icon === undefined) { - marker = leaflet_1.default.circle(latLng, { - radius: 25, - color: style.color - }); - } - else { - marker = leaflet_1.default.marker(latLng, { - icon: style.icon - }); - } - return marker; - }, - onEachFeature: function (feature, layer) { - var eventSource = self._storage.addOrGetElement(feature); - eventSource.addCallback(function () { - if (layer.setIcon) { - layer.setIcon(self._style(feature.properties).icon); - } - else { - console.log("UPdating", layer); - self._geolayer.setStyle(function (feature) { - return self._style(feature.properties); - }); - } - }); - layer.on("click", function (e) { - console.log("Selected ", feature); - self._selectedElement.setData(feature.properties); - var uiElement = self._showOnPopup(eventSource); - var popup = leaflet_1.default.popup() - .setContent(uiElement.Render()) - .setLatLng(e.latlng) - .openOn(self._map.map); - uiElement.Update(); - uiElement.Activate(); - leaflet_1.default.DomEvent.stop(e); // Marks the event as consumed - }); - } - }); - if (this.isDisplayed.data) { - this._geolayer.addTo(this._map.map); - } - }; - return FilteredLayer; -}()); -exports.FilteredLayer = FilteredLayer; diff --git a/Logic/GeoLocationHandler.js b/Logic/GeoLocationHandler.js deleted file mode 100644 index 75c23d4..0000000 --- a/Logic/GeoLocationHandler.js +++ /dev/null @@ -1,117 +0,0 @@ -"use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GeoLocationHandler = void 0; -var UIEventSource_1 = require("../UI/UIEventSource"); -var UIElement_1 = require("../UI/UIElement"); -var leaflet_1 = require("leaflet"); -var Helpers_1 = require("../Helpers"); -var GeoLocationHandler = /** @class */ (function (_super) { - __extends(GeoLocationHandler, _super); - function GeoLocationHandler(map) { - var _this = _super.call(this, undefined) || this; - _this.currentLocation = new UIEventSource_1.UIEventSource(undefined); - _this._isActive = new UIEventSource_1.UIEventSource(false); - _this._permission = new UIEventSource_1.UIEventSource(""); - _this._map = map; - _this.ListenTo(_this.currentLocation); - _this.ListenTo(_this._isActive); - _this.ListenTo(_this._permission); - var self = _this; - function onAccuratePositionProgress(e) { - console.log(e.accuracy); - console.log(e.latlng); - self.currentLocation.setData({ latlng: e.latlng, accuracy: e.accuracy }); - } - function onAccuratePositionFound(e) { - console.log(e.accuracy); - console.log(e.latlng); - self.currentLocation.setData({ latlng: e.latlng, accuracy: e.accuracy }); - } - function onAccuratePositionError(e) { - console.log("onerror", e.message); - } - map.map.on('accuratepositionprogress', onAccuratePositionProgress); - map.map.on('accuratepositionfound', onAccuratePositionFound); - map.map.on('accuratepositionerror', onAccuratePositionError); - var icon = leaflet_1.default.icon({ - iconUrl: './assets/crosshair-blue.svg', - iconSize: [40, 40], - iconAnchor: [20, 20], - }); - _this.currentLocation.addCallback(function (location) { - var newMarker = leaflet_1.default.marker(location.latlng, { icon: icon }); - newMarker.addTo(map.map); - if (self._marker !== undefined) { - map.map.removeLayer(self._marker); - } - self._marker = newMarker; - }); - navigator.permissions.query({ name: 'geolocation' }) - .then(function (status) { - console.log("Geolocation is already", status); - if (status.state === "granted") { - self.StartGeolocating(); - } - self._permission.setData(status.state); - status.onchange = function () { - self._permission.setData(status.state); - }; - }); - _this.HideOnEmpty(true); - return _this; - } - GeoLocationHandler.prototype.InnerRender = function () { - if (this.currentLocation.data) { - return "locate me"; - } - if (this._isActive.data) { - return "locate me"; - } - return "locate me"; - }; - GeoLocationHandler.prototype.StartGeolocating = function () { - var self = this; - if (self._permission.data === "denied") { - return ""; - } - if (self.currentLocation.data !== undefined) { - self._map.map.flyTo(self.currentLocation.data.latlng, 18); - } - console.log("Searching location using GPS"); - self._map.map.findAccuratePosition({ - maxWait: 10000, - desiredAccuracy: 50 // defaults to 20 - }); - if (!self._isActive.data) { - self._isActive.setData(true); - Helpers_1.Helpers.DoEvery(60000, function () { - self._map.map.findAccuratePosition({ - maxWait: 10000, - desiredAccuracy: 50 // defaults to 20 - }); - }); - } - }; - GeoLocationHandler.prototype.InnerUpdate = function (htmlElement) { - _super.prototype.InnerUpdate.call(this, htmlElement); - var self = this; - htmlElement.onclick = function () { - self.StartGeolocating(); - }; - }; - return GeoLocationHandler; -}(UIElement_1.UIElement)); -exports.GeoLocationHandler = GeoLocationHandler; diff --git a/Logic/GeoOperations.js b/Logic/GeoOperations.js deleted file mode 100644 index f3d1f4e..0000000 --- a/Logic/GeoOperations.js +++ /dev/null @@ -1,185 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GeoOperations = void 0; -var turf = require("turf"); -var GeoOperations = /** @class */ (function () { - function GeoOperations() { - } - GeoOperations.surfaceAreaInSqMeters = function (feature) { - return turf.area(feature); - }; - GeoOperations.featureIsContainedInAny = function (feature, shouldNotContain, maxOverlapPercentage) { - // Returns 'false' if no problematic intersection is found - if (feature.geometry.type === "Point") { - var coor = feature.geometry.coordinates; - for (var _i = 0, shouldNotContain_1 = shouldNotContain; _i < shouldNotContain_1.length; _i++) { - var shouldNotContainElement = shouldNotContain_1[_i]; - var shouldNotContainBBox = BBox.get(shouldNotContainElement); - var featureBBox = BBox.get(feature); - if (!featureBBox.overlapsWith(shouldNotContainBBox)) { - continue; - } - if (this.inside(coor, shouldNotContainElement)) { - return true; - } - } - return false; - } - if (feature.geometry.type === "Polygon" || feature.geometry.type === "MultiPolygon") { - var poly = feature; - var featureBBox = BBox.get(feature); - var featureSurface = GeoOperations.surfaceAreaInSqMeters(poly); - for (var _a = 0, shouldNotContain_2 = shouldNotContain; _a < shouldNotContain_2.length; _a++) { - var shouldNotContainElement = shouldNotContain_2[_a]; - var shouldNotContainBBox = BBox.get(shouldNotContainElement); - var overlaps = featureBBox.overlapsWith(shouldNotContainBBox); - if (!overlaps) { - continue; - } - // Calculate the surface area of the intersection - // If it is too big, refuse - try { - var intersection = turf.intersect(poly, shouldNotContainElement); - if (intersection == null) { - continue; - } - var intersectionSize = turf.area(intersection); - var ratio = intersectionSize / featureSurface; - if (ratio * 100 >= maxOverlapPercentage) { - console.log("Refused", poly.id, " due to ", shouldNotContainElement.id, "intersection ratio is ", ratio, "which is bigger then the target ratio of ", (maxOverlapPercentage / 100)); - return true; - } - } - catch (exception) { - console.log("EXCEPTION CAUGHT WHILE INTERSECTING: ", exception); - // We assume that this failed due to an intersection - return true; - } - } - return false; // No problematic intersections found - } - return false; - }; - /** - * Simple check: that every point of the polygon is inside the container - * @param polygon - * @param container - */ - GeoOperations.isPolygonInside = function (polygon, container) { - for (var _i = 0, _a = polygon.geometry.coordinates[0]; _i < _a.length; _i++) { - var coor = _a[_i]; - if (!GeoOperations.inside(coor, container)) { - return false; - } - } - return true; - }; - /** - * Simple check: one point of the polygon is inside the container - * @param polygon - * @param container - */ - GeoOperations.isPolygonTouching = function (polygon, container) { - for (var _i = 0, _a = polygon.geometry.coordinates[0]; _i < _a.length; _i++) { - var coor = _a[_i]; - if (GeoOperations.inside(coor, container)) { - return true; - } - } - return false; - }; - GeoOperations.inside = function (pointCoordinate, feature) { - // ray-casting algorithm based on - // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html - if (feature.geometry.type === "Point") { - return false; - } - var x = pointCoordinate[0]; - var y = pointCoordinate[1]; - var poly = feature.geometry.coordinates[0]; - var inside = false; - for (var i = 0, j = poly.length - 1; i < poly.length; j = i++) { - var coori = poly[i]; - var coorj = poly[j]; - var xi = coori[0]; - var yi = coori[1]; - var xj = coorj[0]; - var yj = coorj[1]; - var intersect = ((yi > y) != (yj > y)) - && (x < (xj - xi) * (y - yi) / (yj - yi) + xi); - if (intersect) { - inside = !inside; - } - } - return inside; - }; - ; - return GeoOperations; -}()); -exports.GeoOperations = GeoOperations; -var BBox = /** @class */ (function () { - function BBox(coordinates) { - this.maxLat = Number.MIN_VALUE; - this.maxLon = Number.MIN_VALUE; - this.minLat = Number.MAX_VALUE; - this.minLon = Number.MAX_VALUE; - for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) { - var coordinate = coordinates_1[_i]; - this.maxLon = Math.max(this.maxLon, coordinate[0]); - this.maxLat = Math.max(this.maxLat, coordinate[1]); - this.minLon = Math.min(this.minLon, coordinate[0]); - this.minLat = Math.min(this.minLat, coordinate[1]); - } - this.check(); - } - BBox.prototype.check = function () { - if (isNaN(this.maxLon) || isNaN(this.maxLat) || isNaN(this.minLon) || isNaN(this.minLat)) { - console.log(this); - throw "BBOX has NAN"; - } - }; - BBox.prototype.overlapsWith = function (other) { - this.check(); - other.check(); - if (this.maxLon < other.minLon) { - return false; - } - if (this.maxLat < other.minLat) { - return false; - } - if (this.minLon > other.maxLon) { - return false; - } - if (this.minLat > other.maxLat) { - return false; - } - return true; - }; - BBox.get = function (feature) { - if (feature.bbox === undefined) { - if (feature.geometry.type === "MultiPolygon") { - var coordinates = []; - for (var _i = 0, _a = feature.geometry.coordinates; _i < _a.length; _i++) { - var coorlist = _a[_i]; - coordinates = coordinates.concat(coorlist[0]); - } - feature.bbox = new BBox(coordinates); - } - else if (feature.geometry.type === "Polygon") { - feature.bbox = new BBox(feature.geometry.coordinates[0]); - } - else if (feature.geometry.type === "LineString") { - feature.bbox = new BBox(feature.geometry.coordinates); - } - else if (feature.geometry.type === "Point") { - // Point - feature.bbox = new BBox([feature.geometry.coordinates]); - } - else { - throw "Cannot calculate bbox, unknown type " + feature.geometry.type; - } - } - return feature.bbox; - }; - return BBox; -}()); diff --git a/Logic/Geocoding.js b/Logic/Geocoding.js deleted file mode 100644 index afde3b4..0000000 --- a/Logic/Geocoding.js +++ /dev/null @@ -1,22 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Geocoding = void 0; -var $ = require("jquery"); -var Geocoding = /** @class */ (function () { - function Geocoding() { - } - Geocoding.Search = function (query, basemap, handleResult, onFail) { - var b = basemap.map.getBounds(); - console.log(b); - $.getJSON(Geocoding.host + "format=json&limit=1&viewbox=" + - (b.getEast() + "," + b.getNorth() + "," + b.getWest() + "," + b.getSouth()) + - "&accept-language=nl&q=" + query, function (data) { - handleResult(data); - }).fail(function () { - onFail(); - }); - }; - Geocoding.host = "https://nominatim.openstreetmap.org/search?"; - return Geocoding; -}()); -exports.Geocoding = Geocoding; diff --git a/Logic/ImageSearcher.js b/Logic/ImageSearcher.js deleted file mode 100644 index e107489..0000000 --- a/Logic/ImageSearcher.js +++ /dev/null @@ -1,185 +0,0 @@ -"use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ImageSearcher = void 0; -var UIEventSource_1 = require("../UI/UIEventSource"); -var Wikimedia_1 = require("./Wikimedia"); -var WikimediaImage_1 = require("../UI/Image/WikimediaImage"); -var SimpleImageElement_1 = require("../UI/Image/SimpleImageElement"); -var ImgurImage_1 = require("../UI/Image/ImgurImage"); -/** - * There are multiple way to fetch images for an object - * 1) There is an image tag - * 2) There is an image tag, the image tag contains multiple ';'-seperated URLS - * 3) there are multiple image tags, e.g. 'image', 'image:0', 'image:1', and 'image_0', 'image_1' - however, these are pretty rare so we are gonna ignore them - * 4) There is a wikimedia_commons-tag, which either has a 'File': or a 'category:' containing images - * 5) There is a wikidata-tag, and the wikidata item either has an 'image' attribute or has 'a link to a wikimedia commons category' - * 6) There is a wikipedia article, from which we can deduct the wikidata item - * - * For some images, author and license should be shown - */ -/** - * Class which search for all the possible locations for images and which builds a list of UI-elements for it. - * Note that this list is embedded into an UIEVentSource, ready to put it into a carousel - */ -var ImageSearcher = /** @class */ (function (_super) { - __extends(ImageSearcher, _super); - function ImageSearcher(tags, changes) { - var _this = _super.call(this, []) || this; - _this._wdItem = new UIEventSource_1.UIEventSource(""); - _this._commons = new UIEventSource_1.UIEventSource(""); - _this._activated = false; - _this._deletedImages = new UIEventSource_1.UIEventSource([]); - _this._tags = tags; - _this._changes = changes; - var self = _this; - _this._wdItem.addCallback(function () { - // Load the wikidata item, then detect usage on 'commons' - var wikidataId = self._wdItem.data; - // @ts-ignore - if (wikidataId.startsWith("Q")) { - wikidataId = wikidataId.substr(1); - } - Wikimedia_1.Wikimedia.GetWikiData(parseInt(wikidataId), function (wd) { - self.AddImage(wd.image); - Wikimedia_1.Wikimedia.GetCategoryFiles(wd.commonsWiki, function (images) { - for (var _i = 0, _a = images.images; _i < _a.length; _i++) { - var image = _a[_i]; - // @ts-ignore - if (image.startsWith("File:")) { - self.AddImage(image); - } - } - }); - }); - }); - _this._commons.addCallback(function () { - var commons = self._commons.data; - // @ts-ignore - if (commons.startsWith("Category:")) { - Wikimedia_1.Wikimedia.GetCategoryFiles(commons, function (images) { - for (var _i = 0, _a = images.images; _i < _a.length; _i++) { - var image = _a[_i]; - // @ts-ignore - if (image.startsWith("File:")) { - self.AddImage(image); - } - } - }); - } - else { // @ts-ignore - if (commons.startsWith("File:")) { - self.AddImage(commons); - } - } - }); - return _this; - } - ImageSearcher.prototype.AddImage = function (url) { - if (url === undefined || url === null || url === "") { - return; - } - for (var _i = 0, _a = this.data; _i < _a.length; _i++) { - var el = _a[_i]; - if (el === url) { - return; - } - } - this.data.push(url); - this.ping(); - }; - ImageSearcher.prototype.ImageKey = function (url) { - var tgs = this._tags.data; - for (var key in tgs) { - if (tgs[key] === url) { - return key; - } - } - return undefined; - }; - ImageSearcher.prototype.IsDeletable = function (url) { - return this.ImageKey(url) !== undefined; - }; - ImageSearcher.prototype.Delete = function (url) { - var key = this.ImageKey(url); - if (key === undefined) { - return; - } - console.log("Deleting image...", key, " --> ", url); - this._changes.addChange(this._tags.data.id, key, ""); - this._deletedImages.data.push(url); - this._deletedImages.ping(); - }; - ImageSearcher.prototype.Activate = function () { - if (this._activated) { - return; - } - this._activated = true; - this.LoadImages(); - var self = this; - this._tags.addCallback(function () { return self.LoadImages(); }); - }; - ImageSearcher.prototype.LoadImages = function () { - if (!this._activated) { - return; - } - var imageTag = this._tags.data.image; - if (imageTag !== undefined) { - var bareImages = imageTag.split(";"); - for (var _i = 0, bareImages_1 = bareImages; _i < bareImages_1.length; _i++) { - var bareImage = bareImages_1[_i]; - this.AddImage(bareImage); - } - } - for (var key in this._tags.data) { - // @ts-ignore - if (key.startsWith("image:")) { - var url = this._tags.data[key]; - this.AddImage(url); - } - } - var wdItem = this._tags.data.wikidata; - if (wdItem !== undefined) { - this._wdItem.setData(wdItem); - } - var commons = this._tags.data.wikimedia_commons; - if (commons !== undefined) { - this._commons.setData(commons); - } - }; - /*** - * Creates either a 'simpleimage' or a 'wikimediaimage' based on the string - * @param url - * @constructor - */ - ImageSearcher.CreateImageElement = function (url) { - // @ts-ignore - if (url.startsWith("File:")) { - return new WikimediaImage_1.WikimediaImage(url); - } - else if (url.startsWith("https://commons.wikimedia.org/wiki/")) { - var commons = url.substr("https://commons.wikimedia.org/wiki/".length); - return new WikimediaImage_1.WikimediaImage(commons); - } - else if (url.startsWith("https://i.imgur.com/")) { - return new ImgurImage_1.ImgurImage(url); - } - else { - return new SimpleImageElement_1.SimpleImageElement(new UIEventSource_1.UIEventSource(url)); - } - }; - return ImageSearcher; -}(UIEventSource_1.UIEventSource)); -exports.ImageSearcher = ImageSearcher; diff --git a/Logic/Imgur.js b/Logic/Imgur.js deleted file mode 100644 index 3577753..0000000 --- a/Logic/Imgur.js +++ /dev/null @@ -1,90 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Imgur = void 0; -var jquery_1 = require("jquery"); -var Wikimedia_1 = require("./Wikimedia"); -var Imgur = /** @class */ (function () { - function Imgur() { - } - Imgur.uploadMultiple = function (title, description, blobs, handleSuccessfullUpload, allDone, offset) { - if (offset === void 0) { offset = 0; } - if (blobs.length == offset) { - allDone(); - return; - } - var blob = blobs.item(offset); - var self = this; - this.uploadImage(title, description, blob, function (imageUrl) { - handleSuccessfullUpload(imageUrl); - self.uploadMultiple(title, description, blobs, handleSuccessfullUpload, allDone, offset + 1); - }); - }; - Imgur.getDescriptionOfImage = function (url, handleDescription) { - var hash = url.substr("https://i.imgur.com/".length).split(".jpg")[0]; - var apiUrl = 'https://api.imgur.com/3/image/' + hash; - var apiKey = '7070e7167f0a25a'; - var settings = { - async: true, - crossDomain: true, - processData: false, - contentType: false, - type: 'GET', - url: apiUrl, - headers: { - Authorization: 'Client-ID ' + apiKey, - Accept: 'application/json', - }, - }; - jquery_1.default.ajax(settings).done(function (response) { - var descr = response.data.description; - var data = {}; - for (var _i = 0, _a = descr.split("\n"); _i < _a.length; _i++) { - var tag = _a[_i]; - var kv = tag.split(":"); - var k = kv[0]; - var v = kv[1].replace("\r", ""); - data[k] = v; - } - console.log(data); - var licenseInfo = new Wikimedia_1.LicenseInfo(); - licenseInfo.licenseShortName = data.license; - licenseInfo.artist = data.author; - handleDescription(licenseInfo); - }).fail(function (reason) { - console.log("Getting metadata from to IMGUR failed", reason); - }); - }; - Imgur.uploadImage = function (title, description, blob, handleSuccessfullUpload) { - var apiUrl = 'https://api.imgur.com/3/image'; - var apiKey = '7070e7167f0a25a'; - var settings = { - async: true, - crossDomain: true, - processData: false, - contentType: false, - type: 'POST', - url: apiUrl, - headers: { - Authorization: 'Client-ID ' + apiKey, - Accept: 'application/json', - }, - mimeType: 'multipart/form-data', - }; - var formData = new FormData(); - formData.append('image', blob); - formData.append("title", title); - formData.append("description", description); - // @ts-ignore - settings.data = formData; - // Response contains stringified JSON - // Image URL available at response.data.link - jquery_1.default.ajax(settings).done(function (response) { - response = JSON.parse(response); - handleSuccessfullUpload(response.data.link); - }).fail(function (reason) { - console.log("Uploading to IMGUR failed", reason); - }); - }; - return Imgur; -}()); -exports.Imgur = Imgur; diff --git a/Logic/LayerUpdater.js b/Logic/LayerUpdater.js deleted file mode 100644 index 583cf31..0000000 --- a/Logic/LayerUpdater.js +++ /dev/null @@ -1,99 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.LayerUpdater = void 0; -var Overpass_1 = require("./Overpass"); -var TagsFilter_1 = require("./TagsFilter"); -var UIEventSource_1 = require("../UI/UIEventSource"); -var LayerUpdater = /** @class */ (function () { - /** - * The most important layer should go first, as that one gets first pick for the questions - * @param map - * @param minzoom - * @param layers - */ - function LayerUpdater(map, minzoom, layers) { - this.runningQuery = new UIEventSource_1.UIEventSource(false); - this._map = map; - this._layers = layers; - this._minzoom = minzoom; - var filters = []; - for (var _i = 0, layers_1 = layers; _i < layers_1.length; _i++) { - var layer = layers_1[_i]; - filters.push(layer.filters); - } - this._overpass = new Overpass_1.Overpass(new TagsFilter_1.Or(filters)); - var self = this; - map.Location.addCallback(function () { - self.update(); - }); - } - LayerUpdater.prototype.handleData = function (geojson) { - this.runningQuery.setData(false); - for (var _i = 0, _a = this._layers; _i < _a.length; _i++) { - var layer = _a[_i]; - geojson = layer.SetApplicableData(geojson); - } - if (geojson.features.length > 0) { - console.log("Got some leftovers: ", geojson); - } - }; - LayerUpdater.prototype.handleFail = function (reason) { - console.log("QUERY FAILED", reason); - console.log("Retrying in 1s"); - this.previousBounds = undefined; - var self = this; - window.setTimeout(function () { self.update(); }, 1000); - }; - LayerUpdater.prototype.update = function () { - if (this.IsInBounds()) { - return; - } - console.log("Zoom level: ", this._map.map.getZoom(), "Least needed zoom:", this._minzoom); - if (this._map.map.getZoom() < this._minzoom || this._map.Location.data.zoom < this._minzoom) { - console.log("Not running query: zoom not sufficient"); - return; - } - if (this.runningQuery.data) { - console.log("Still running a query, skip"); - } - var bbox = this.buildBboxFor(); - this.runningQuery.setData(true); - var self = this; - this._overpass.queryGeoJson(bbox, function (data) { - self.handleData(data); - }, function (reason) { - self.handleFail(reason); - }); - }; - LayerUpdater.prototype.buildBboxFor = function () { - var b = this._map.map.getBounds(); - var diff = 0.07; - var n = b.getNorth() + diff; - var e = b.getEast() + diff; - var s = b.getSouth() - diff; - var w = b.getWest() - diff; - this.previousBounds = { north: n, east: e, south: s, west: w }; - return "[bbox:" + s + "," + w + "," + n + "," + e + "]"; - }; - LayerUpdater.prototype.IsInBounds = function () { - if (this.previousBounds === undefined) { - return false; - } - var b = this._map.map.getBounds(); - if (b.getSouth() < this.previousBounds.south) { - return false; - } - if (b.getNorth() > this.previousBounds.north) { - return false; - } - if (b.getEast() > this.previousBounds.east) { - return false; - } - if (b.getWest() < this.previousBounds.west) { - return false; - } - return true; - }; - return LayerUpdater; -}()); -exports.LayerUpdater = LayerUpdater; diff --git a/Logic/OsmConnection.js b/Logic/OsmConnection.js deleted file mode 100644 index f56f9cf..0000000 --- a/Logic/OsmConnection.js +++ /dev/null @@ -1,256 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.OsmConnection = exports.UserDetails = void 0; -// @ts-ignore -var osm_auth_1 = require("osm-auth"); -var UIEventSource_1 = require("../UI/UIEventSource"); -var UserDetails = /** @class */ (function () { - function UserDetails() { - this.loggedIn = false; - this.name = "Not logged in"; - this.csCount = 0; - this.unreadMessages = 0; - this.totalMessages = 0; - } - return UserDetails; -}()); -exports.UserDetails = UserDetails; -var OsmConnection = /** @class */ (function () { - function OsmConnection(dryRun) { - this.auth = new osm_auth_1.default({ - oauth_consumer_key: 'hivV7ec2o49Two8g9h8Is1VIiVOgxQ1iYexCbvem', - oauth_secret: 'wDBRTCem0vxD7txrg1y6p5r8nvmz8tAhET7zDASI', - auto: true // show a login form if the user is not authenticated and - // you try to do a call - }); - this.preferences = new UIEventSource_1.UIEventSource({}); - this.preferenceSources = {}; - this.userDetails = new UIEventSource_1.UIEventSource(new UserDetails()); - this.userDetails.data.osmConnection = this; - this.userDetails.data.dryRun = dryRun; - this._dryRun = dryRun; - if (this.auth.authenticated()) { - this.AttemptLogin(); // Also updates the user badge - } - else { - console.log("Not authenticated"); - } - if (dryRun) { - console.log("DRYRUN ENABLED"); - } - } - OsmConnection.prototype.LogOut = function () { - this.auth.logout(); - this.userDetails.data.loggedIn = false; - this.userDetails.ping(); - console.log("Logged out"); - }; - OsmConnection.prototype.AttemptLogin = function () { - var self = this; - this.auth.xhr({ - method: 'GET', - path: '/api/0.6/user/details' - }, function (err, details) { - var _a; - if (err != null) { - console.log(err); - self.auth.logout(); - self.userDetails.data.loggedIn = false; - self.userDetails.ping(); - } - if (details == null) { - return; - } - self.UpdatePreferences(); - // details is an XML DOM of user details - var userInfo = details.getElementsByTagName("user")[0]; - // let moreDetails = new DOMParser().parseFromString(userInfo.innerHTML, "text/xml"); - var data = self.userDetails.data; - data.loggedIn = true; - console.log("Login completed, userinfo is ", userInfo); - data.name = userInfo.getAttribute('display_name'); - data.csCount = userInfo.getElementsByTagName("changesets")[0].getAttribute("count"); - data.img = undefined; - var imgEl = userInfo.getElementsByTagName("img"); - if (imgEl !== undefined && imgEl[0] !== undefined) { - data.img = imgEl[0].getAttribute("href"); - } - data.img = (_a = data.img) !== null && _a !== void 0 ? _a : "./assets/osm-logo.svg"; - var homeEl = userInfo.getElementsByTagName("home"); - if (homeEl !== undefined && homeEl[0] !== undefined) { - var lat = parseFloat(homeEl[0].getAttribute("lat")); - var lon = parseFloat(homeEl[0].getAttribute("lon")); - data.home = { lat: lat, lon: lon }; - } - var messages = userInfo.getElementsByTagName("messages")[0].getElementsByTagName("received")[0]; - data.unreadMessages = parseInt(messages.getAttribute("unread")); - data.totalMessages = parseInt(messages.getAttribute("count")); - self.userDetails.ping(); - }); - }; - /** - * All elements with class 'activate-osm-authentication' are loaded and get an 'onclick' to authenticate - */ - OsmConnection.prototype.registerActivateOsmAUthenticationClass = function () { - var self = this; - var authElements = document.getElementsByClassName("activate-osm-authentication"); - for (var i = 0; i < authElements.length; i++) { - var element = authElements.item(i); - // @ts-ignore - element.onclick = function () { - self.AttemptLogin(); - }; - } - }; - OsmConnection.prototype.GetPreference = function (key) { - var _this = this; - if (this.preferenceSources[key] !== undefined) { - return this.preferenceSources[key]; - } - if (this.userDetails.data.loggedIn) { - this.UpdatePreferences(); - } - var pref = new UIEventSource_1.UIEventSource(this.preferences.data[key]); - pref.addCallback(function (v) { - _this.SetPreference(key, v); - }); - this.preferences.addCallback(function (prefs) { - if (prefs[key] !== undefined) { - pref.setData(prefs[key]); - } - }); - this.preferenceSources[key] = pref; - return pref; - }; - OsmConnection.prototype.UpdatePreferences = function () { - var self = this; - this.auth.xhr({ - method: 'GET', - path: '/api/0.6/user/preferences' - }, function (error, value) { - if (error) { - console.log("Could not load preferences", error); - return; - } - var prefs = value.getElementsByTagName("preference"); - for (var i = 0; i < prefs.length; i++) { - var pref = prefs[i]; - var k = pref.getAttribute("k"); - var v = pref.getAttribute("v"); - self.preferences.data[k] = v; - } - self.preferences.ping(); - }); - }; - OsmConnection.prototype.SetPreference = function (k, v) { - if (!this.userDetails.data.loggedIn) { - console.log("Not saving preference: user not logged in"); - return; - } - if (this.preferences.data[k] === v) { - console.log("Not updating preference", k, " to ", v, "not changed"); - return; - } - console.log("Updating preference", k, " to ", v); - this.preferences.data[k] = v; - this.preferences.ping(); - this.auth.xhr({ - method: 'PUT', - path: '/api/0.6/user/preferences/' + k, - options: { header: { 'Content-Type': 'text/plain' } }, - content: v - }, function (error, result) { - if (error) { - console.log("Could not set preference", error); - return; - } - console.log("Preference written!", result == "" ? "OK" : result); - }); - }; - OsmConnection.parseUploadChangesetResponse = function (response) { - var nodes = response.getElementsByTagName("node"); - var mapping = {}; - // @ts-ignore - for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) { - var node = nodes_1[_i]; - var oldId = parseInt(node.attributes.old_id.value); - var newId = parseInt(node.attributes.new_id.value); - if (oldId !== undefined && newId !== undefined && - !isNaN(oldId) && !isNaN(newId)) { - mapping["node/" + oldId] = "node/" + newId; - } - } - return mapping; - }; - OsmConnection.prototype.UploadChangeset = function (comment, generateChangeXML, handleMapping, continuation) { - if (this._dryRun) { - console.log("NOT UPLOADING as dryrun is true"); - var changesetXML = generateChangeXML("123456"); - console.log(changesetXML); - continuation(); - return; - } - var self = this; - this.OpenChangeset(comment, function (csId) { - var changesetXML = generateChangeXML(csId); - self.AddChange(csId, changesetXML, function (csId, mapping) { - self.CloseChangeset(csId, continuation); - handleMapping(mapping); - }); - }); - this.userDetails.data.csCount++; - this.userDetails.ping(); - }; - OsmConnection.prototype.OpenChangeset = function (comment, continuation) { - this.auth.xhr({ - method: 'PUT', - path: '/api/0.6/changeset/create', - options: { header: { 'Content-Type': 'text/xml' } }, - content: '' + - '' + - '' + - '' - }, function (err, response) { - if (response === undefined) { - console.log("err", err); - return; - } - else { - continuation(response); - } - }); - }; - OsmConnection.prototype.AddChange = function (changesetId, changesetXML, continuation) { - this.auth.xhr({ - method: 'POST', - options: { header: { 'Content-Type': 'text/xml' } }, - path: '/api/0.6/changeset/' + changesetId + '/upload', - content: changesetXML - }, function (err, response) { - if (response == null) { - console.log("err", err); - return; - } - var mapping = OsmConnection.parseUploadChangesetResponse(response); - console.log("Uplaoded changeset ", changesetId); - continuation(changesetId, mapping); - }); - }; - OsmConnection.prototype.CloseChangeset = function (changesetId, continuation) { - console.log("closing"); - this.auth.xhr({ - method: 'PUT', - path: '/api/0.6/changeset/' + changesetId + '/close', - }, function (err, response) { - if (response == null) { - console.log("err", err); - } - console.log("Closed changeset ", changesetId); - if (continuation !== undefined) { - continuation(); - } - }); - }; - return OsmConnection; -}()); -exports.OsmConnection = OsmConnection; diff --git a/Logic/OsmImageUploadHandler.js b/Logic/OsmImageUploadHandler.js deleted file mode 100644 index 0af13f5..0000000 --- a/Logic/OsmImageUploadHandler.js +++ /dev/null @@ -1,56 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.OsmImageUploadHandler = void 0; -var ImageUploadFlow_1 = require("../UI/ImageUploadFlow"); -var OsmImageUploadHandler = /** @class */ (function () { - function OsmImageUploadHandler(tags, userdetails, preferedLicense, changeHandler, slideShow) { - this._slideShow = slideShow; // To move the slideshow (if any) to the last, just added element - if (tags === undefined || userdetails === undefined || changeHandler === undefined) { - throw "Something is undefined"; - } - this._tags = tags; - this._changeHandler = changeHandler; - this._userdetails = userdetails; - this._preferedLicense = preferedLicense; - } - OsmImageUploadHandler.prototype.generateOptions = function (license) { - var _a; - var tags = this._tags.data; - var self = this; - var title = (_a = tags.name) !== null && _a !== void 0 ? _a : "Unknown area"; - var description = [ - "author:" + this._userdetails.data.name, - "license:" + license, - "wikidata:" + tags.wikidata, - "osmid:" + tags.id, - "name:" + tags.name - ].join("\n"); - var changes = this._changeHandler; - return { - title: title, - description: description, - handleURL: function (url) { - var freeIndex = 0; - while (tags["image:" + freeIndex] !== undefined) { - freeIndex++; - } - console.log("Adding image:" + freeIndex, url); - changes.addChange(tags.id, "image:" + freeIndex, url); - self._slideShow.MoveTo(-1); // set the last (thus newly added) image) to view - }, - allDone: function () { - changes.uploadAll(function () { - console.log("Writing changes..."); - }); - } - }; - }; - OsmImageUploadHandler.prototype.getUI = function () { - var self = this; - return new ImageUploadFlow_1.ImageUploadFlow(this._userdetails, this._preferedLicense, function (license) { - return self.generateOptions(license); - }); - }; - return OsmImageUploadHandler; -}()); -exports.OsmImageUploadHandler = OsmImageUploadHandler; diff --git a/Logic/OsmObject.js b/Logic/OsmObject.js deleted file mode 100644 index e9d4948..0000000 --- a/Logic/OsmObject.js +++ /dev/null @@ -1,160 +0,0 @@ -"use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.OsmRelation = exports.OsmWay = exports.OsmNode = exports.OsmObject = void 0; -var $ = require("jquery"); -var OsmObject = /** @class */ (function () { - function OsmObject(type, id) { - this.tags = {}; - this.changed = false; - this.id = id; - this.type = type; - } - OsmObject.DownloadObject = function (id, continuation) { - var splitted = id.split("/"); - var type = splitted[0]; - var idN = splitted[1]; - switch (type) { - case ("node"): - return new OsmNode(idN).Download(continuation); - case ("way"): - return new OsmWay(idN).Download(continuation); - case ("relation"): - return new OsmRelation(idN).Download(continuation); - } - }; - /** - * Replaces all '"' (double quotes) by '"' - * Bugfix where names containing '"' were not uploaded, such as '"Het Zwin" nature reserve' - * @param string - * @constructor - */ - OsmObject.prototype.Escape = function (string) { - while (string.indexOf('"') >= 0) { - string = string.replace('"', '"'); - } - return string; - }; - /** - * Generates the changeset-XML for tags - * @constructor - */ - OsmObject.prototype.TagsXML = function () { - var tags = ""; - for (var key in this.tags) { - var v = this.tags[key]; - if (v !== "") { - tags += ' \n'; - } - } - return tags; - }; - OsmObject.prototype.Download = function (continuation) { - var self = this; - $.getJSON("https://www.openstreetmap.org/api/0.6/" + this.type + "/" + this.id, function (data) { - var element = data.elements[0]; - self.tags = element.tags; - self.version = element.version; - self.SaveExtraData(element); - continuation(self); - }); - return this; - }; - OsmObject.prototype.addTag = function (k, v) { - if (k in this.tags) { - var oldV = this.tags[k]; - if (oldV == v) { - return; - } - console.log("WARNING: overwriting ", oldV, " with ", v, " for key ", k); - } - this.tags[k] = v; - this.changed = true; - }; - OsmObject.prototype.VersionXML = function () { - if (this.version === undefined) { - return ""; - } - return 'version="' + this.version + '"'; - }; - return OsmObject; -}()); -exports.OsmObject = OsmObject; -var OsmNode = /** @class */ (function (_super) { - __extends(OsmNode, _super); - function OsmNode(id) { - return _super.call(this, "node", id) || this; - } - OsmNode.prototype.ChangesetXML = function (changesetId) { - var tags = this.TagsXML(); - var change = ' \n' + - tags + - ' \n'; - return change; - }; - OsmNode.prototype.SaveExtraData = function (element) { - this.lat = element.lat; - this.lon = element.lon; - }; - return OsmNode; -}(OsmObject)); -exports.OsmNode = OsmNode; -var OsmWay = /** @class */ (function (_super) { - __extends(OsmWay, _super); - function OsmWay(id) { - return _super.call(this, "way", id) || this; - } - OsmWay.prototype.ChangesetXML = function (changesetId) { - var tags = this.TagsXML(); - var nds = ""; - for (var node in this.nodes) { - nds += ' \n'; - } - var change = ' \n' + - nds + - tags + - ' \n'; - return change; - }; - OsmWay.prototype.SaveExtraData = function (element) { - this.nodes = element.nodes; - }; - return OsmWay; -}(OsmObject)); -exports.OsmWay = OsmWay; -var OsmRelation = /** @class */ (function (_super) { - __extends(OsmRelation, _super); - function OsmRelation(id) { - return _super.call(this, "relation", id) || this; - } - OsmRelation.prototype.ChangesetXML = function (changesetId) { - var members = ""; - for (var memberI in this.members) { - var member = this.members[memberI]; - members += ' \n'; - } - var tags = this.TagsXML(); - var change = ' \n' + - members + - tags + - ' \n'; - return change; - }; - OsmRelation.prototype.SaveExtraData = function (element) { - this.members = element.members; - }; - return OsmRelation; -}(OsmObject)); -exports.OsmRelation = OsmRelation; diff --git a/Logic/Overpass.js b/Logic/Overpass.js deleted file mode 100644 index 0a0881c..0000000 --- a/Logic/Overpass.js +++ /dev/null @@ -1,47 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Overpass = void 0; -var OsmToGeoJson = require("osmtogeojson"); -var $ = require("jquery"); -/** - * Interfaces overpass to get all the latest data - */ -var Overpass = /** @class */ (function () { - function Overpass(filter) { - this._filter = filter; - } - Overpass.prototype.buildQuery = function (bbox) { - var filters = this._filter.asOverpass(); - var filter = ""; - for (var _i = 0, filters_1 = filters; _i < filters_1.length; _i++) { - var filterOr = filters_1[_i]; - filter += 'nwr' + filterOr + ';'; - } - var query = '[out:json][timeout:25]' + bbox + ';(' + filter + ');out body;>;out skel qt;'; - console.log(query); - return "https://overpass-api.de/api/interpreter?data=" + encodeURIComponent(query); - }; - Overpass.prototype.queryGeoJson = function (bbox, continuation, onFail) { - var query = this.buildQuery(bbox); - if (Overpass.testUrl !== null) { - console.log("Using testing URL"); - query = Overpass.testUrl; - } - $.getJSON(query, function (json, status) { - if (status !== "success") { - console.log("Query failed"); - onFail(status); - } - if (json.elements === [] && json.remarks.indexOf("runtime error") > 0) { - console.log("Timeout or other runtime error"); - return; - } - // @ts-ignore - var geojson = OsmToGeoJson.default(json); - continuation(geojson); - }).fail(onFail); - }; - Overpass.testUrl = null; - return Overpass; -}()); -exports.Overpass = Overpass; diff --git a/Logic/Overpass.ts b/Logic/Overpass.ts index 28efa0b..f9eafaf 100644 --- a/Logic/Overpass.ts +++ b/Logic/Overpass.ts @@ -32,7 +32,7 @@ export class Overpass { queryGeoJson(bbox: string, continuation: ((any) => void), onFail: ((reason) => void)): void { let query = this.buildQuery(bbox); - + if(Overpass.testUrl !== null){ console.log("Using testing URL") query = Overpass.testUrl; @@ -44,7 +44,7 @@ export class Overpass { console.log("Query failed") onFail(status); } - + if(json.elements === [] && json.remarks.indexOf("runtime error") > 0){ console.log("Timeout or other runtime error"); return; diff --git a/Logic/StrayClickHandler.js b/Logic/StrayClickHandler.js deleted file mode 100644 index d93fb09..0000000 --- a/Logic/StrayClickHandler.js +++ /dev/null @@ -1,42 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.StrayClickHandler = void 0; -var leaflet_1 = require("leaflet"); -/** - * The stray-click-hanlders adds a marker to the map if no feature was clicked. - * Shows the given uiToShow-element in the messagebox - */ -var StrayClickHandler = /** @class */ (function () { - function StrayClickHandler(basemap, selectElement, leftMessage, uiToShow) { - var _this = this; - this._basemap = basemap; - this._leftMessage = leftMessage; - this._uiToShow = uiToShow; - var self = this; - var map = basemap.map; - basemap.LastClickLocation.addCallback(function (lastClick) { - selectElement.setData(undefined); - if (self._lastMarker !== undefined) { - map.removeLayer(self._lastMarker); - } - self._lastMarker = leaflet_1.default.marker([lastClick.lat, lastClick.lon]); - var uiElement = uiToShow(); - var popup = leaflet_1.default.popup().setContent(uiElement.Render()); - uiElement.Activate(); - uiElement.Update(); - self._lastMarker.addTo(map); - self._lastMarker.bindPopup(popup).openPopup(); - self._lastMarker.on("click", function () { - leftMessage.setData(self._uiToShow); - }); - }); - selectElement.addCallback(function () { - if (self._lastMarker !== undefined) { - map.removeLayer(self._lastMarker); - _this._lastMarker = undefined; - } - }); - } - return StrayClickHandler; -}()); -exports.StrayClickHandler = StrayClickHandler; diff --git a/Logic/TagsFilter.js b/Logic/TagsFilter.js deleted file mode 100644 index 5c6aac1..0000000 --- a/Logic/TagsFilter.js +++ /dev/null @@ -1,240 +0,0 @@ -"use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TagUtils = exports.Not = exports.And = exports.Or = exports.Tag = exports.Regex = exports.TagsFilter = void 0; -var TagsFilter = /** @class */ (function () { - function TagsFilter() { - } - TagsFilter.prototype.matchesProperties = function (properties) { - return this.matches(TagUtils.proprtiesToKV(properties)); - }; - return TagsFilter; -}()); -exports.TagsFilter = TagsFilter; -var Regex = /** @class */ (function (_super) { - __extends(Regex, _super); - function Regex(k, r) { - var _this = _super.call(this) || this; - _this._k = k; - _this._r = r; - return _this; - } - Regex.prototype.asOverpass = function () { - return ["['" + this._k + "'~'" + this._r + "']"]; - }; - Regex.prototype.matches = function (tags) { - var _a; - if (!(tags instanceof Array)) { - throw "You used 'matches' on something that is not a list. Did you mean to use 'matchesProperties'?"; - } - for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) { - var tag = tags_1[_i]; - if (tag.k === this._k) { - if (tag.v === "") { - // This tag has been removed - return false; - } - if (this._r === "*") { - // Any is allowed - return true; - } - var matchCount = (_a = tag.v.match(this._r)) === null || _a === void 0 ? void 0 : _a.length; - return (matchCount !== null && matchCount !== void 0 ? matchCount : 0) > 0; - } - } - return false; - }; - Regex.prototype.substituteValues = function (tags) { - throw "Substituting values is not supported on regex tags"; - }; - return Regex; -}(TagsFilter)); -exports.Regex = Regex; -var Tag = /** @class */ (function (_super) { - __extends(Tag, _super); - function Tag(key, value) { - var _this = _super.call(this) || this; - _this.key = key; - _this.value = value; - return _this; - } - Tag.prototype.matches = function (tags) { - for (var _i = 0, tags_2 = tags; _i < tags_2.length; _i++) { - var tag = tags_2[_i]; - if (tag.k === this.key) { - if (tag.v === "") { - // This tag has been removed - return this.value === ""; - } - if (this.value === "*") { - // Any is allowed - return true; - } - return this.value === tag.v; - } - } - if (this.value === "") { - return true; - } - return false; - }; - Tag.prototype.asOverpass = function () { - if (this.value === "*") { - return ['["' + this.key + '"]']; - } - if (this.value === "") { - // NOT having this key - return ['[!"' + this.key + '"]']; - } - return ['["' + this.key + '"="' + this.value + '"]']; - }; - Tag.prototype.substituteValues = function (tags) { - return new Tag(this.key, TagUtils.ApplyTemplate(this.value, tags)); - }; - return Tag; -}(TagsFilter)); -exports.Tag = Tag; -var Or = /** @class */ (function (_super) { - __extends(Or, _super); - function Or(or) { - var _this = _super.call(this) || this; - _this.or = or; - return _this; - } - Or.prototype.matches = function (tags) { - for (var _i = 0, _a = this.or; _i < _a.length; _i++) { - var tagsFilter = _a[_i]; - if (tagsFilter.matches(tags)) { - return true; - } - } - return false; - }; - Or.prototype.asOverpass = function () { - var choices = []; - for (var _i = 0, _a = this.or; _i < _a.length; _i++) { - var tagsFilter = _a[_i]; - var subChoices = tagsFilter.asOverpass(); - for (var _b = 0, subChoices_1 = subChoices; _b < subChoices_1.length; _b++) { - var subChoice = subChoices_1[_b]; - choices.push(subChoice); - } - } - return choices; - }; - Or.prototype.substituteValues = function (tags) { - var newChoices = []; - for (var _i = 0, _a = this.or; _i < _a.length; _i++) { - var c = _a[_i]; - newChoices.push(c.substituteValues(tags)); - } - return new Or(newChoices); - }; - return Or; -}(TagsFilter)); -exports.Or = Or; -var And = /** @class */ (function (_super) { - __extends(And, _super); - function And(and) { - var _this = _super.call(this) || this; - _this.and = and; - return _this; - } - And.prototype.matches = function (tags) { - for (var _i = 0, _a = this.and; _i < _a.length; _i++) { - var tagsFilter = _a[_i]; - if (!tagsFilter.matches(tags)) { - return false; - } - } - return true; - }; - And.prototype.combine = function (filter, choices) { - var values = []; - for (var _i = 0, choices_1 = choices; _i < choices_1.length; _i++) { - var or = choices_1[_i]; - values.push(filter + or); - } - return values; - }; - And.prototype.asOverpass = function () { - var allChoices = null; - for (var _i = 0, _a = this.and; _i < _a.length; _i++) { - var andElement = _a[_i]; - var andElementFilter = andElement.asOverpass(); - if (allChoices === null) { - allChoices = andElementFilter; - continue; - } - var newChoices = []; - for (var _b = 0, allChoices_1 = allChoices; _b < allChoices_1.length; _b++) { - var choice = allChoices_1[_b]; - newChoices.push(this.combine(choice, andElementFilter)); - } - allChoices = newChoices; - } - return allChoices; - }; - And.prototype.substituteValues = function (tags) { - var newChoices = []; - for (var _i = 0, _a = this.and; _i < _a.length; _i++) { - var c = _a[_i]; - newChoices.push(c.substituteValues(tags)); - } - return new And(newChoices); - }; - return And; -}(TagsFilter)); -exports.And = And; -var Not = /** @class */ (function (_super) { - __extends(Not, _super); - function Not(not) { - var _this = _super.call(this) || this; - _this.not = not; - return _this; - } - Not.prototype.asOverpass = function () { - throw "Not supported yet"; - }; - Not.prototype.matches = function (tags) { - return !this.not.matches(tags); - }; - Not.prototype.substituteValues = function (tags) { - return new Not(this.not.substituteValues(tags)); - }; - return Not; -}(TagsFilter)); -exports.Not = Not; -var TagUtils = /** @class */ (function () { - function TagUtils() { - } - TagUtils.proprtiesToKV = function (properties) { - var result = []; - for (var k in properties) { - result.push({ k: k, v: properties[k] }); - } - return result; - }; - TagUtils.ApplyTemplate = function (template, tags) { - for (var k in tags) { - while (template.indexOf("{" + k + "}") >= 0) { - template = template.replace("{" + k + "}", tags[k]); - } - } - return template; - }; - return TagUtils; -}()); -exports.TagUtils = TagUtils; diff --git a/Logic/Wikimedia.js b/Logic/Wikimedia.js deleted file mode 100644 index b9f880f..0000000 --- a/Logic/Wikimedia.js +++ /dev/null @@ -1,135 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.LicenseInfo = exports.ImagesInCategory = exports.Wikidata = exports.Wikimedia = void 0; -var $ = require("jquery"); -/** - * This module provides endpoints for wikipedia/wikimedia and others - */ -var Wikimedia = /** @class */ (function () { - function Wikimedia() { - } - Wikimedia.ImageNameToUrl = function (filename, width, height) { - if (width === void 0) { width = 500; } - if (height === void 0) { height = 200; } - filename = encodeURIComponent(filename); - return "https://commons.wikimedia.org/wiki/Special:FilePath/" + filename + "?width=" + width + "&height=" + height; - }; - Wikimedia.LicenseData = function (filename, handle) { - if (filename in this.knownLicenses) { - return this.knownLicenses[filename]; - } - if (filename === "") { - return; - } - var url = "https://en.wikipedia.org/w/" + - "api.php?action=query&prop=imageinfo&iiprop=extmetadata&" + - "titles=" + filename + - "&format=json&origin=*"; - $.getJSON(url, function (data, status) { - var _a, _b, _c, _d, _e, _f, _g, _h; - var licenseInfo = new LicenseInfo(); - var license = data.query.pages[-1].imageinfo[0].extmetadata; - licenseInfo.artist = (_a = license.Artist) === null || _a === void 0 ? void 0 : _a.value; - licenseInfo.license = (_b = license.License) === null || _b === void 0 ? void 0 : _b.value; - licenseInfo.copyrighted = (_c = license.Copyrighted) === null || _c === void 0 ? void 0 : _c.value; - licenseInfo.attributionRequired = (_d = license.AttributionRequired) === null || _d === void 0 ? void 0 : _d.value; - licenseInfo.usageTerms = (_e = license.UsageTerms) === null || _e === void 0 ? void 0 : _e.value; - licenseInfo.licenseShortName = (_f = license.LicenseShortName) === null || _f === void 0 ? void 0 : _f.value; - licenseInfo.credit = (_g = license.Credit) === null || _g === void 0 ? void 0 : _g.value; - licenseInfo.description = (_h = license.ImageDescription) === null || _h === void 0 ? void 0 : _h.value; - Wikimedia.knownLicenses[filename] = licenseInfo; - handle(licenseInfo); - }); - }; - Wikimedia.GetCategoryFiles = function (categoryName, handleCategory, alreadyLoaded, continueParameter) { - var _this = this; - if (alreadyLoaded === void 0) { alreadyLoaded = 0; } - if (continueParameter === void 0) { continueParameter = undefined; } - if (categoryName === undefined || categoryName === null || categoryName === "") { - return; - } - // @ts-ignore - if (!categoryName.startsWith("Category:")) { - categoryName = "Category:" + categoryName; - } - var url = "https://commons.wikimedia.org/w/api.php?" + - "action=query&list=categorymembers&format=json&" + - "&origin=*" + - "&cmtitle=" + encodeURIComponent(categoryName); - if (continueParameter !== undefined) { - url = url + "&" + continueParameter.k + "=" + continueParameter.param; - } - $.getJSON(url, function (response) { - var _a; - var imageOverview = new ImagesInCategory(); - var members = (_a = response.query) === null || _a === void 0 ? void 0 : _a.categorymembers; - if (members === undefined) { - members = []; - } - for (var _i = 0, members_1 = members; _i < members_1.length; _i++) { - var member = members_1[_i]; - imageOverview.images.push(member.title); - } - if (response.continue === undefined || alreadyLoaded > 30) { - handleCategory(imageOverview); - } - else { - console.log("Recursive load for ", categoryName); - _this.GetCategoryFiles(categoryName, function (recursiveImages) { - for (var _i = 0, _a = imageOverview.images; _i < _a.length; _i++) { - var image = _a[_i]; - recursiveImages.images.push(image); - } - handleCategory(recursiveImages); - }, alreadyLoaded + 10, { k: "cmcontinue", param: response.continue.cmcontinue }); - } - }); - }; - Wikimedia.GetWikiData = function (id, handleWikidata) { - var url = "https://www.wikidata.org/wiki/Special:EntityData/Q" + id + ".json"; - $.getJSON(url, function (response) { - var _a, _b, _c, _d; - var entity = response.entities["Q" + id]; - var commons = entity.sitelinks.commonswiki; - var wd = new Wikidata(); - wd.commonsWiki = commons === null || commons === void 0 ? void 0 : commons.title; - // P18 is the claim 'depicted in this image' - var image = (_d = (_c = (_b = (_a = entity.claims.P18) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.mainsnak) === null || _c === void 0 ? void 0 : _c.datavalue) === null || _d === void 0 ? void 0 : _d.value; - if (image) { - wd.image = "File:" + image; - } - handleWikidata(wd); - }); - }; - Wikimedia.knownLicenses = {}; - return Wikimedia; -}()); -exports.Wikimedia = Wikimedia; -var Wikidata = /** @class */ (function () { - function Wikidata() { - } - return Wikidata; -}()); -exports.Wikidata = Wikidata; -var ImagesInCategory = /** @class */ (function () { - function ImagesInCategory() { - // Filenames of relevant images - this.images = []; - } - return ImagesInCategory; -}()); -exports.ImagesInCategory = ImagesInCategory; -var LicenseInfo = /** @class */ (function () { - function LicenseInfo() { - this.artist = ""; - this.license = ""; - this.licenseShortName = ""; - this.usageTerms = ""; - this.attributionRequired = false; - this.copyrighted = false; - this.credit = ""; - this.description = ""; - } - return LicenseInfo; -}()); -exports.LicenseInfo = LicenseInfo;