[mkgmap-dev] Enhance PartFilter.java to return last parts of a value list
From Enrico Liboni eliboni at gmail.com on Thu Aug 8 22:04:05 BST 2013
Folks, I added some more tweaks to the PartFilter class, beside being able to use negative numbers to take a part from the tail of the value list, it is now possible to use the "<" or ">" operator (in addition to ":") in order to return a concatenation of all the parts before or after a certain part. The default behavior is not changed and this come at the expense of just 2 logical "IF" more when no operators are specified. Attached the class. Example, if the value is "Aa#Bb#Cc#Dd#Ee" part:#:1 returns Aa part:#:-1 returns Ee part:#:-2 returns Dd part:#>1 returns Bb#Cc#Dd#Ee# part:#<5 returns Aa#Bb#Cc#Dd# part:#<-1 returns Aa#Bb#Cc#Dd# This can be expecially useful in some circumstances to overcome the limitation that does not allow to use expressions within expressions, i.e.: {set foo:bar='${name|part: :1}}' } // take the first word in name {set name='${name|subst:${foo:bar}}' } // remove it - this would not work wont' work but now: {set name='${name|part: >1}}' } // returns all the words after the first one will do the job. Some more elaborated things like: // Via Wolfgang Amadeus Mozart -> Mozart, Via Wolfgang Amadeus {set new:name='${name|part: :-1}}, ${name|part: <-1}}' } // a_word [Dd]e [Ee]l anything-> a_word, anything [Dd]e [Ee]l // Calle De el Gato Loco-> Gato Loco, Calle De el highway=* & name ~ '.*\s[Dd]e [Ee]l .*' {set new:name='${name|part: >3}}, ${name|part: <4}}' } On Wed, Aug 7, 2013 at 1:06 AM, Enrico Liboni <eliboni at gmail.com> wrote: > It might be useful to be able to get the last part of a value list but the > current implementation of PartFilter does not allow this, i.e. you can get > the 1st, 2nd, 3rd and so on but you can't get the last, the one before the > last and so on. > > The change is trivial, in doFilter replace: > > if (temp.length >= partnumber) > return temp[partnumber-1].trim(); > with: > if (temp.length >= Math.abs(partnumber) ) { > if (partnumber > 0) { > return temp[partnumber-1].trim(); > } else { > return temp[temp.length+partnumber].trim(); > } > } > > attached the new class which I compiled, plugged in r2661 and works as > expected. > > This could be useful for example, emh..., when adding a rule like: > > highway=* { set street:name='${name|part: :-1}, ${name}'} > street:name=* {set name='${street:name}'} > > so that the most meaningful part of a street name in some countries > appears at the beginning of the name thus facilitating the address search ;) > > Let me know if you believe this is useful and if you prefer a patch. > > Enrico > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.mkgmap.org.uk/pipermail/mkgmap-dev/attachments/20130808/0bc01e0b/attachment.html -------------- next part -------------- A non-text attachment was scrubbed... Name: PartFilter.java Type: application/octet-stream Size: 3493 bytes Desc: not available Url : http://lists.mkgmap.org.uk/pipermail/mkgmap-dev/attachments/20130808/0bc01e0b/attachment.obj
- Previous message: [mkgmap-dev] Enhance PartFilter.java to return last parts of a value list
- Next message: [mkgmap-dev] Use int_name only for index
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the mkgmap-dev mailing list