logo separator

[mkgmap-dev] Phone number normalisation with style functions

From Colin Smale colin.smale at xs4all.nl on Sat Aug 24 11:55:21 BST 2013


Following a discussion on talk-gb about ways of formatting a phone
number I decided to see how far I could get with the current style
functions in mkgmap. I was very pleasantly surprised! The recent
additions of subst with a regex and the part function have allowed me to
get an almost perfect result with the countries I have looked at. I
thought I would share my experiences in case others also find it useful.

The goal is to normalise all POI phone numbers to international format
so starting with a + followed by the country code etc. without any
punctuation or extraneous information. I put the following code in
"inc/phone" and used the include function to invoke that from
"inc/address", instead of the existing two lines which derive

========== start of script 

# reformat phone numbers 

# get the number to use
phone=* | contact:phone=* | addr:phone=* {set cs:phone='${phone}' |
'${contact:phone}' | '${addr:phone}'} 

# only use the first number if there is a list
cs:phone=* {set cs:phone='${cs:phone|part:}'} 

# country-specific rules
cs:phone=* & (mkgmap:country=GBR | mkgmap:country=IMN)
cs:phone=* & mkgmap:country=LUX
{set cs:phone='${cs:phone|subst:^00~>+}'}
cs:phone=* & mkgmap:country=IRL
{set cs:phone='${cs:phone|subst:^00~>+|subst:[-
cs:phone=* & mkgmap:country=NLD
{set cs:phone='${cs:phone|subst:^00~>+|subst:[-
cs:phone=* & mkgmap:country=BEL
{set cs:phone='${cs:phone|subst:^00~>+|subst:[-
cs:phone=* & mkgmap:country=FRA
{set cs:phone='${cs:phone|subst:^00~>+|subst:^0~>+33}'}
cs:phone=* & mkgmap:country=DEU
{set cs:phone='${cs:phone|subst:^00~>+|subst:[-

# lose all non-digits (except for +)
cs:phone=* {set cs:phone='${cs:phone|subst:[^0-9+]~>}'} 

# wrap up
cs:phone=* {echo '(${mkgmap:country}) Phone number ${phone} reformatted
to ${cs:phone}' }
cs:phone=* {add mkgmap:phone='${cs:phone}'; set phone='${cs:phone}';
delete contact:phone; delete addr:phone;} 

========== end of script 

A couple of things I missed: 

1) the ability to do variable substitution within the old/new parameters
to subst, e.g. subst:${old}~>${new} 

2) the ability to use backreferences to parts of the pattern, e.g.
subst:(abc)def~>{1} to delete occurrences of "def" when they are
preceded by "abc" 

If these functions were to exist, many of the country-specific stuff
could actually be collapsed into one or two rules, with variables for
the country code and the trunk prefix (usually a 0 in Europe). 

Best regards, 


-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.mkgmap.org.uk/pipermail/mkgmap-dev/attachments/20130824/b05c3061/attachment.html 

More information about the mkgmap-dev mailing list