]> git.openstreetmap.org Git - nominatim-ui.git/blobdiff - src/lib/helpers.js
Search page: Set HTML page title for structured searches, too
[nominatim-ui.git] / src / lib / helpers.js
index e55cbf0ab2a7adbf851ceee4bab701cb1b68d936..0099d83779e04623607dc1f10a1ff305c7dac234 100644 (file)
@@ -1,21 +1,6 @@
-module.exports.formatOSMType = formatOSMType;
-module.exports.formatShortOSMType = formatShortOSMType;
-module.exports.osmLink = osmLink;
-module.exports.formatLabel = formatLabel;
-module.exports.detailsURL = detailsURL;
-module.exports.wikipediaLink = wikipediaLink;
-module.exports.coverageType = coverageType;
-module.exports.isAdminBoundary = isAdminBoundary;
-module.exports.formatAddressRank = formatAddressRank;
-module.exports.formatPlaceType = formatPlaceType;
-module.exports.formatAdminLevel = formatAdminLevel;
-module.exports.formatDistance = formatDistance;
-module.exports.formatKeywordToken = formatKeywordToken;
-module.exports.zoomLevels = zoomLevels;
-
-const escapeHtml = require('escape-html');
-
-function formatOSMType(sType, bExcludeExternal) {
+import escapeHtml from 'escape-html';
+
+export function formatOSMType(sType, bExcludeExternal) {
   if (sType === 'N') return 'node';
   if (sType === 'W') return 'way';
   if (sType === 'R') return 'relation';
   if (sType === 'N') return 'node';
   if (sType === 'W') return 'way';
   if (sType === 'R') return 'relation';
@@ -28,14 +13,16 @@ function formatOSMType(sType, bExcludeExternal) {
   return '';
 }
 
   return '';
 }
 
-function formatShortOSMType(sType) {
-  if (sType === 'node') return 'N';
-  if (sType === 'way') return 'W';
-  if (sType === 'relation') return 'R';
-  return '';
+// https://www.openstreetmap.org/relation/123 => ['R', 123]
+// w123 => ['W', 123]
+export function identifyLinkInQuery(query) {
+  if (!query) return undefined;
+  const m = query.match(/\/(relation|way|node)\/(-?\d+)/) || query.match(/^([nwr])(-?\d+)$/i);
+  if (!m) return undefined;
+  return [m[1][0].toUpperCase(), Number(m[2])];
 }
 
 }
 
-function osmLink(aPlace) {
+export function osmLink(aPlace) {
   if (!aPlace.osm_type) return '';
   var sOSMType = formatOSMType(aPlace.osm_type, false);
   if (!sOSMType) return '';
   if (!aPlace.osm_type) return '';
   var sOSMType = formatOSMType(aPlace.osm_type, false);
   if (!sOSMType) return '';
@@ -43,15 +30,15 @@ function osmLink(aPlace) {
   return '<a href="https://www.openstreetmap.org/' + sOSMType + '/' + aPlace.osm_id + '">' + sOSMType + ' ' + aPlace.osm_id + '</a>';
 }
 
   return '<a href="https://www.openstreetmap.org/' + sOSMType + '/' + aPlace.osm_id + '">' + sOSMType + ' ' + aPlace.osm_id + '</a>';
 }
 
-function formatLabel(aPlace) {
+export function formatLabel(aPlace) {
   if (aPlace.label) return aPlace.label;
 
   function capitalize(s) {
     return s && s[0].toUpperCase() + s.slice(1);
   }
 
   if (aPlace.label) return aPlace.label;
 
   function capitalize(s) {
     return s && s[0].toUpperCase() + s.slice(1);
   }
 
-  if (aPlace.type && aPlace.type === 'yes' && aPlace.class) {
-    return capitalize(aPlace.class.replace(/_/g, ' '));
+  if (aPlace.type && aPlace.type === 'yes' && aPlace.category) {
+    return capitalize(aPlace.category.replace(/_/g, ' '));
   }
   if (aPlace.type) {
     return capitalize(aPlace.type.replace(/_/g, ' '));
   }
   if (aPlace.type) {
     return capitalize(aPlace.type.replace(/_/g, ' '));
@@ -59,27 +46,8 @@ function formatLabel(aPlace) {
   return '';
 }
 
   return '';
 }
 
-// 'details.html?osmtype=R&osmid=2181874&class=boundary'
-function detailsURL(aFeature) {
-  if (!aFeature) return '';
-
-  var sOSMType = aFeature.osm_type;
-  if (sOSMType && sOSMType.length !== 1) {
-    sOSMType = formatShortOSMType(aFeature.osm_type, false); // node => N
-  }
-  if (!sOSMType) return '';
-
-  var sURL = 'details.html?osmtype=' + sOSMType + '&osmid=' + aFeature.osm_id;
-  if (aFeature.class) {
-    sURL = sURL + '&class=' + encodeURIComponent(aFeature.class);
-  } else if (aFeature.category) {
-    sURL = sURL + '&class=' + encodeURIComponent(aFeature.category);
-  }
-  return sURL;
-}
-
 /* en:London_Borough_of_Redbridge => https://en.wikipedia.org/wiki/London_Borough_of_Redbridge */
 /* en:London_Borough_of_Redbridge => https://en.wikipedia.org/wiki/London_Borough_of_Redbridge */
-function wikipediaLink(aPlace) {
+export function wikipediaLink(aPlace) {
   if (!aPlace.calculated_wikipedia) return '';
 
   var parts = aPlace.calculated_wikipedia.split(':', 2);
   if (!aPlace.calculated_wikipedia) return '';
 
   var parts = aPlace.calculated_wikipedia.split(':', 2);
@@ -91,15 +59,15 @@ function wikipediaLink(aPlace) {
   return '<a href="https://' + sLanguage + '.wikipedia.org/wiki/' + sArticle + '" target="_blank">' + sTitle + '</a>';
 }
 
   return '<a href="https://' + sLanguage + '.wikipedia.org/wiki/' + sArticle + '" target="_blank">' + sTitle + '</a>';
 }
 
-function coverageType(aPlace) {
+export function coverageType(aPlace) {
   return (aPlace.isarea ? 'Polygon' : 'Point');
 }
 
   return (aPlace.isarea ? 'Polygon' : 'Point');
 }
 
-function isAdminBoundary(aPlace) {
+export function isAdminBoundary(aPlace) {
   return aPlace.category === 'boundary' && aPlace.type === 'administrative';
 }
 
   return aPlace.category === 'boundary' && aPlace.type === 'administrative';
 }
 
-function formatAddressRank(iRank) {
+export function formatAddressRank(iRank) {
   if (iRank < 4) return 'other';
   if (iRank < 6) return 'country';
   if (iRank < 8) return 'region';
   if (iRank < 4) return 'other';
   if (iRank < 6) return 'country';
   if (iRank < 8) return 'region';
@@ -118,7 +86,7 @@ function formatAddressRank(iRank) {
   return 'other';
 }
 
   return 'other';
 }
 
-function formatPlaceType(aPlace) {
+export function formatPlaceType(aPlace) {
   var sOut = aPlace.class + ':' + aPlace.type;
   if (aPlace.type && aPlace.type === 'administrative' && aPlace.place_type) {
     sOut = sOut + ' (' + aPlace.place_type + ')';
   var sOut = aPlace.class + ':' + aPlace.type;
   if (aPlace.type && aPlace.type === 'administrative' && aPlace.place_type) {
     sOut = sOut + ' (' + aPlace.place_type + ')';
@@ -127,11 +95,11 @@ function formatPlaceType(aPlace) {
 }
 
 // Any over 15 are invalid data in OSM anyway
 }
 
 // Any over 15 are invalid data in OSM anyway
-function formatAdminLevel(iLevel) {
-  return (iLevel < 15 ? iLevel : '');
+export function formatAdminLevel(iLevel) {
+  return (iLevel && iLevel < 15 ? iLevel : '');
 }
 
 }
 
-function formatDistance(fDistance, bInMeters) {
+export function formatDistance(fDistance, bInMeters) {
   if (bInMeters) {
     if (fDistance < 1) return '0';
     var sFormatted = (fDistance >= 1000)
   if (bInMeters) {
     if (fDistance < 1) return '0';
     var sFormatted = (fDistance >= 1000)
@@ -150,11 +118,11 @@ function formatDistance(fDistance, bInMeters) {
 }
 
 // mark partial tokens (those starting with a space) with a star for readability
 }
 
 // mark partial tokens (those starting with a space) with a star for readability
-function formatKeywordToken(sToken) {
+export function formatKeywordToken(sToken) {
   return (sToken[0] === ' ' ? '*' : '') + escapeHtml(sToken);
 }
 
   return (sToken[0] === ' ' ? '*' : '') + escapeHtml(sToken);
 }
 
-function zoomLevels() {
+export function zoomLevels() {
   const aZoomLevels = [
     /*  0 */ 'Continent / Sea',
     /*  1 */ '',
   const aZoomLevels = [
     /*  0 */ 'Continent / Sea',
     /*  1 */ '',
@@ -168,16 +136,13 @@ function zoomLevels() {
     /*  9 */ '',
     /* 10 */ 'City',
     /* 11 */ '',
     /*  9 */ '',
     /* 10 */ 'City',
     /* 11 */ '',
-    /* 12 */ 'Town / Village',
-    /* 13 */ '',
-    /* 14 */ 'Suburb',
-    /* 15 */ '',
-    /* 16 */ 'Street',
-    /* 17 */ '',
-    /* 18 */ 'Building',
-    /* 19 */ '',
-    /* 20 */ '',
-    /* 21 */ ''
+    /* 12 */ 'Town / Borough',
+    /* 13 */ 'Village / Suburb',
+    /* 14 */ 'Neighbourhood',
+    /* 15 */ 'Locality',
+    /* 16 */ 'Major Street',
+    /* 17 */ 'Minor Street',
+    /* 18 */ 'Building'
   ];
   return aZoomLevels;
 }
   ];
   return aZoomLevels;
 }