File multiplenames.diff of Package osml10n

diff --git a/lua_osml10/osml10n/get_country_name.lua b/lua_osml10/osml10n/get_country_name.lua
index 54db9aa..1ec0f6e 100644
--- a/lua_osml10/osml10n/get_country_name.lua
+++ b/lua_osml10/osml10n/get_country_name.lua
@@ -1,9 +1,54 @@
 local osml10n = {}
 
+-- Returns the Levenshtein distance between the two given strings
+function string.levenshtein(str1, str2)
+  local len1 = string.len(str1)
+  local len2 = string.len(str2)
+  local matrix = {}
+  local cost = 0
+
+  -- quick cut-offs to save time
+  if (len1 == 0) then
+    return len2
+  elseif (len2 == 0) then
+    return len1
+  elseif (str1 == str2) then
+    return 0
+  end
+
+  -- initialise the base matrix values
+  for i = 0, len1, 1 do
+    matrix[i] = {}
+    matrix[i][0] = i
+  end
+  for j = 0, len2, 1 do
+    matrix[0][j] = j
+  end
+
+  -- actual Levenshtein algorithm
+  for i = 1, len1, 1 do
+    for j = 1, len2, 1 do
+      if (str1:byte(i) == str2:byte(j)) then
+        cost = 0
+      else
+        cost = 1
+      end
+        matrix[i][j] = math.min(matrix[i-1][j] + 1, matrix[i][j-1] + 1, matrix[i-1][j-1] + cost)
+      end
+  end
+
+  -- return the last value - this is the Levenshtein distance
+  return matrix[len1][len2]
+end
+
 function osml10n.get_country_name(tags, targetlang, append)
   local count = 0
-  names = {}
-  -- append name in target language
+  local ldistmin = 1
+  local ldistall
+  local ldist
+  local names = {}
+
+  -- append name in target language (does nothing if tags["name:" .. targetlang] is nil)
   if (append ~= true) then
     table.insert(names,tags["name:" .. targetlang])
   end
@@ -12,15 +57,26 @@ function osml10n.get_country_name(tags, targetlang, append)
   -- generate an array of all official country names
   languages = langs[string.lower(tags["ISO3166-1:alpha2"])]
   for k,v in pairs(languages) do
-    if (tags["name:" .. v] ~= tags["name:" .. targetlang]) then
-      table.insert(names,tags["name:" .. v])
+    if ((tags["name:" .. v] ~= nil) and (tags["name:" .. v] ~= tags["name:" .. targetlang])) then
+      -- make sure that ldistall is always bigger than ldistmin by default
+      ldistall=ldistmin + 1
+      for _,name in ipairs(names) do
+        ldist=string.levenshtein(name,tags["name:" .. v])
+        if (ldistall > ldist) then
+          ldistall=ldist;
+        end
+      end
+      if (ldistall > ldistmin) then
+        dbgprint("appending " .. tags["name:" .. v])
+        table.insert(names,tags["name:" .. v])
+      else
+        dbgprint("ignoring  " .. tags["name:" .. v])
+      end
       count = count + 1
     end
   end
-  if count == 0 then
-    table.insert(names,"")
-  end
   if append then
+    -- does nothing if tags["name:" .. targetlang] is nil
     table.insert(names,tags["name:" .. targetlang])
   end
   
diff --git a/lua_osml10/osml10n/get_localized_name_from_tags.lua b/lua_osml10/osml10n/get_localized_name_from_tags.lua
index 97b02ed..e29aa8f 100644
--- a/lua_osml10/osml10n/get_localized_name_from_tags.lua
+++ b/lua_osml10/osml10n/get_localized_name_from_tags.lua
@@ -139,15 +139,13 @@ function osml10n.gen_combined_names(local_tag, tags, localized_name_last, is_str
   end
   unacc_local = unaccent.unaccent(local_name)
   found = false;
-  pos = string.find(unacc,unacc_local:gsub("%W", "%%%1"))
-
-  -- replace lua magic characters,
-  local escaped_unacc_local = string.gsub(unacc_local, '[.]', '::')
-  escaped_unacc_local = string.gsub(escaped_unacc_local, '[][()%%+*?^$]', '@')
 
+  -- unacc_local may contain lua magic characters so we need to escape them for string.find
+  local escaped_unacc_local = unacc_local:gsub("%W", "%%%1")
+  
   -- ignore localized_name_last option if localized_name_last is specified but our localized
   -- name is on position 1 in generic name tag.
-  pos=string.find(' ' .. unacc .. ' ', '[][%s()-,;:/]' .. escaped_unacc_local .. '[][%s()-,;:/]')
+  pos=string.find(' ' .. unacc .. ' ', '[][%s()%-,;:/]' .. escaped_unacc_local .. '[][%s()%-,;:/]')
   if ((pos == 1) and localized_name_last)then
     dbgprint("forcing localized_name_last=false")
     localized_name_last=false
diff --git a/lua_osml10/tests/runtests.lua b/lua_osml10/tests/runtests.lua
index 3d6c92f..8d59a5c 100755
--- a/lua_osml10/tests/runtests.lua
+++ b/lua_osml10/tests/runtests.lua
@@ -114,9 +114,16 @@ checkoutput(osml10n.contains_cyrillic,"contains_cyrillic",true,"улица Во
 print("")
 checkoutput(osml10n.list2string,"list2string","Indien|भारत|India",{ "Indien", "भारत", "India" },'|')
 print("")
-checkoutput(osml10n.get_country_name,"get_country_name",{ "Indien", "भारत", "India" } , {["ISO3166-1:alpha2"]= "IN", ["name:de"] = "Indien", ["name:hi"] = "भारत", ["name:en"] = "India"}, "de")
-checkoutput(osml10n.get_country_name,"get_country_name",{ "भारत", "India", "Indien" } , {["ISO3166-1:alpha2"]= "IN", ["name:de"] = "Indien", ["name:hi"] = "भारत", ["name:en"] = "India"}, "de", true)
+checkoutput(osml10n.get_country_name,"get_country_name",{ "Indien", "भारत", "India" },{["ISO3166-1:alpha2"]= "IN", ["name:de"] = "Indien", ["name:hi"] = "भारत", ["name:en"] = "India"}, "de")
+checkoutput(osml10n.get_country_name,"get_country_name",{ "भारत", "India", "Indien" },{["ISO3166-1:alpha2"]= "IN", ["name:de"] = "Indien", ["name:hi"] = "भारत", ["name:en"] = "India"}, "de", true)
 checkoutput(osml10n.get_country_name,"get_country_name",{ "India", "भारत" } , {["ISO3166-1:alpha2"]= "IN", ["name:de"] = "Indien", ["name:hi"] = "भारत", ["name:en"] = "India"}, "en")
+checkoutput(osml10n.get_country_name,"get_country_name",{ "Tansania" } , {["ISO3166-1:alpha2"]= "TZ", ["name:de"] = "Tansania", ["name:sw"] = "Tanzania", ["name:en"] = "Tanzania"}, "de")
+checkoutput(osml10n.get_country_name,"get_country_name",{ "Zuid-Afrikaansche Republiek", "iNingizimu Afrika", "uMzantsi Afrika", "Südafrika" } , {["ISO3166-1:alpha2"]= "ZA",["name:de"] = "Südafrika",["name:af"] = "Zuid-Afrikaansche Republiek",["name:zu"] = "iNingizimu Afrika",["name:xh"] = "uMzantsi Afrika"}, "de", true)
+-- San Marion Problem: Main language is "it" but name:it is not tagged
+checkoutput(osml10n.get_country_name,"get_country_name",{ "San Marino" },{["ISO3166-1:alpha2"]= "SM", ["name:de"] = "San Marino", ["name"] = "San Marino"}, "de")
+-- Name in target language not set
+checkoutput(osml10n.get_country_name,"get_country_name",{ "Andorra" },{["ISO3166-1:alpha2"]= "AD", ["name:ca"] = "Andorra"}, "de", false)
+
 print("")
 
 local scriptdir = debug.getinfo(1).source:match("@?(.*/)")
@@ -171,6 +178,14 @@ checkoutput(osml10n.get_placename_from_tags,"get_placename_from_tags", "‪Мо
 checkoutput(osml10n.get_placename_from_tags,"get_placename_from_tags","‪Moskau|Москва́‬",'',{ ["name"] = "Москва́", ["name:de"] = "Moskau", ["name:en"] = "Moscow" },false, '|','de')
 checkoutput(osml10n.get_placename_from_tags,"get_placename_from_tags","London",'',{ ["name"] = "London", ["name:de"] = "London", ["name:en"] = "London" },false, '|','de')
 
+-- name:de and name are different -> output both
+checkoutput(osml10n.get_placename_from_tags,"get_placename_from_tags","‪Lissabon|Lisboa‬",'',
+{ ["name"] = "Lisboa", ["name:de"] = "Lissabon" }, false, '|','de')
+
+-- name:de is the same as name and contains a lua magic pattern
+checkoutput(osml10n.get_placename_from_tags,"get_placename_from_tags","Porto-Novo",'',
+{ ["name"] = "Porto-Novo", ["name:de"] = "Porto-Novo" }, false, '|','de')
+
 -- in lua rewriute default is 'en' for language
 checkoutput(osml10n.get_placename_from_tags,"get_placename_from_tags", "‪Cairo|القاهرة‬",'', { ["name"] = "القاهرة", ["name:de"] = "Kairo", ["int_name"] = "Cairo", ["name:en"] = "Cairo" },false, '|')
 
openSUSE Build Service is sponsored by