Skip to content

Commit 2a826c3

Browse files
committed
Add trim(), split_unit() and split_string() Lua helper functions
1 parent 639a7d1 commit 2a826c3

2 files changed

Lines changed: 126 additions & 1 deletion

File tree

src/init.lua

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ function osm2pgsql.has_suffix(str, suffix)
2121
if suffix == '' then
2222
return true
2323
end
24-
return str:sub(- suffix:len()) == suffix
24+
return str:sub(- #suffix) == suffix
2525
end
2626

2727
function osm2pgsql.define_node_table(_name, _columns, _options)
@@ -116,6 +116,40 @@ function osm2pgsql.make_clean_tags_func(keys)
116116
end
117117
end
118118

119+
-- from http://lua-users.org/wiki/StringTrim
120+
function osm2pgsql.trim(str)
121+
local from = str:match("^%s*()")
122+
return from > #str and "" or str:match(".*%S", from)
123+
end
124+
125+
function osm2pgsql.split_unit(str, default_unit)
126+
if str == nil then
127+
return nil
128+
end
129+
130+
local val, unit = string.match(str, "^(-?[0-9.]+) ?(%a*)$")
131+
if val == nil then
132+
return nil
133+
end
134+
135+
if unit == '' then
136+
unit = default_unit
137+
end
138+
139+
val = tonumber(val)
140+
141+
return val, unit
142+
end
143+
144+
function osm2pgsql.split_string(str, separator)
145+
local pattern = '([^' .. (separator or ';') .. ']+)'
146+
local result = {}
147+
for w in string.gmatch(str, pattern) do
148+
result[#result + 1] = osm2pgsql.trim(w)
149+
end
150+
return result
151+
end
152+
119153
-- This will be the metatable for the OSM objects given to the process callback
120154
-- functions.
121155
local inner_metatable = {

tests/lua/tests.lua

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,97 @@ do
9898
assert(num == 3)
9999
end
100100

101+
-- trim
102+
assert(osm2pgsql.trim('') == '')
103+
assert(osm2pgsql.trim(' ') == '')
104+
assert(osm2pgsql.trim(' ') == '')
105+
assert(osm2pgsql.trim('a') == 'a')
106+
assert(osm2pgsql.trim(' a') == 'a')
107+
assert(osm2pgsql.trim('a ') == 'a')
108+
assert(osm2pgsql.trim(' a ') == 'a')
109+
assert(osm2pgsql.trim(' a ') == 'a')
110+
assert(osm2pgsql.trim(' ab cd ') == 'ab cd')
111+
assert(osm2pgsql.trim(' \t\r\n\f\va\000b \r\t\n\f\v') == 'a\000b')
112+
113+
-- split_unit
114+
115+
v, u = o.split_unit('20m', '')
116+
assert(v == 20 and u == 'm')
117+
118+
v, u = o.split_unit('20 m')
119+
assert(v == 20 and u == 'm')
120+
121+
v, u = o.split_unit('20ft', '')
122+
assert(v == 20 and u == 'ft')
123+
124+
v, u = o.split_unit('23.4 ft', '')
125+
assert(v == 23.4 and u == 'ft')
126+
127+
v, u = o.split_unit('20 ft', 'm')
128+
assert(v == 20 and u == 'ft')
129+
130+
v, u = o.split_unit('20km', 'm')
131+
assert(v == 20 and u == 'km')
132+
133+
v, u = o.split_unit('20')
134+
assert(v == 20 and u == nil)
135+
136+
v, u = o.split_unit('20', 'm')
137+
assert(v == 20 and u == 'm')
138+
139+
v, u = o.split_unit('0', 'm')
140+
assert(v == 0 and u == 'm')
141+
142+
v, u = o.split_unit('-20000', 'leagues')
143+
assert(v == -20000 and u == 'leagues')
144+
145+
v, u = o.split_unit('20xx20', '')
146+
assert(v == nil)
147+
148+
v, u = o.split_unit('20-20', '')
149+
assert(v == nil)
150+
151+
v, u = o.split_unit('20xx20', 'foo')
152+
assert(v == nil)
153+
154+
v, u = o.split_unit('abc', 'def')
155+
assert(v == nil)
156+
157+
v, u = o.split_unit(nil)
158+
assert(v == nil and u == nil)
159+
160+
v, u = o.split_unit(nil, 'foo')
161+
assert(v == nil and u == nil)
162+
163+
-- split_string
164+
165+
r = o.split_string('ab c;d;e f;ghi')
166+
assert(#r == 4)
167+
assert(r[1] == 'ab c')
168+
assert(r[2] == 'd')
169+
assert(r[3] == 'e f')
170+
assert(r[4] == 'ghi')
171+
172+
r = o.split_string('ab c;d ; e f; ghi')
173+
assert(#r == 4)
174+
assert(r[1] == 'ab c')
175+
assert(r[2] == 'd')
176+
assert(r[3] == 'e f')
177+
assert(r[4] == 'ghi')
178+
179+
r = o.split_string('ab c ')
180+
assert(#r == 1)
181+
assert(r[1] == 'ab c')
182+
183+
r = o.split_string('')
184+
assert(#r == 0)
185+
186+
r = o.split_string('ab c;d , e f, ghi', ',')
187+
assert(#r == 3)
188+
assert(r[1] == 'ab c;d')
189+
assert(r[2] == 'e f')
190+
assert(r[3] == 'ghi')
191+
101192
-- ---------------------------------------------------------------------------
102193

103194
print("All tests successful")

0 commit comments

Comments
 (0)