I'm back on track with the scripting plugin. I created a Jython script that helps to find probable spelling errors in street names. It's quite specific in that it supports the bilingual status of Brussels.
#!/bin/jython > # > # Spell checking.py - Helps to locate probable spell errors > # > from javax.swing import JOptionPane > from org.openstreetmap.josm import Main > import org.openstreetmap.josm.command as Command > import org.openstreetmap.josm.data.osm.Node as Node > import org.openstreetmap.josm.data.osm.Way as Way > import org.openstreetmap.josm.data.osm.TagCollection as TagCollection > import org.openstreetmap.josm.data.osm.DataSet as DataSet > > corrections = {'fr': [('Dr. ', 'Docteur '),('R. ', 'Rue '), ('Av. ', > 'Avenue '), ('Bd. ', 'Boulevard '), > ('Sq.', 'Square'), ('Pl.', 'Place'), > (' De ', ' de '), (' Le ', ' le '), (' La ', ' la '), > (' Du ', ' du '), (' Des ', ' des '), (' Les ', ' les '), > (' Au ', ' au '),(' Aux ', ' aux '),('À', 'à'),(' Den > ',' den '), (" Sur ", " sur "), > (" D'"," d'"), (" L'"," l'"), ("' ","'"), > ("Ecole ","École "), ("Eglise", "Église"), > ("Chateau", "Château"), ("Cable", "Câble"), ("General", "Général")], > 'nl': [(" Voor ", " voor "), (" Op ", " op "), (" Pour ", " > pour "), (" Naar ", " naar "), (" Ter ", " ter "), (" En ", " en "), (" Van > ", " van "), > ("'T ", "'t "), ("'S ", "'s "), ("-Ter-", "-ter-"), > (" Het ", " het "), > (" Straat", "straat"), (" Weg", "weg"), (" Laan", > "laan"), (" Steenweg", "steenweg"), > (" Baan", "baan"), ("Oudebaan", "Oude Baan"), > ("Grotebaan", "Grote Baan"), > ("de Lijn", "De Lijn")]} > > commandsList = [] > streetnames = {} > > def getMapView(): > if Main.main and Main.main.map: > return Main.main.map.mapView > else: > return None > > def myOwnCapitalize(word): > # JOptionPane.showMessageDialog(Main.parent, word.decode('utf-8')) > if word: > return word[0].upper() + word[1:] > else: > return u"" > > mv = getMapView() > > if mv and mv.editLayer and mv.editLayer.data: > selectedNodes = mv.editLayer.data.getSelectedNodes() > selectedWays = mv.editLayer.data.getWays() > selectedRelations = mv.editLayer.data.getSelectedRelations() > > if not(selectedNodes or selectedWays or selectedRelations): > JOptionPane.showMessageDialog(Main.parent, "Please select > something") > else: > for way in selectedWays: > for isoLang in ['nl', 'fr', '']: > correctedName = result = u'' > if isoLang: > nameColonIso = 'name:' + isoLang > else: > nameColonIso = 'name' > if way.hasKey(nameColonIso): > name=str(way.get(nameColonIso).encode('utf-8')) > if name in streetnames: > if streetnames[name] == 'ignore': > continue > else: > correctedName = streetnames[name] > else: > Main.main.getCurrentDataSet().setSelected(way) > # dummy = mv.editLayer.data.getSelected() > # > mv.zoomTo(Main.main.getEditLayer().data.getSelected()) > # JOptionPane.showMessageDialog(Main.parent, > name.decode('utf-8')) > for subname in name.split(";"): > for word in subname.split(" "): > if word: > if "-" in word and len(word)>1: > dashes = word.split("-") > > correctedName += > myOwnCapitalize(dashes[0]) > for dash in dashes[1:]: > # if dash[0] == ' ': > # correctedName += u"-" + > myOwnCapitalize(dash[1:]) > # else: > correctedName += u"-" + > myOwnCapitalize(dash.strip()) > elif "'" in word and not("." in word): > apo=word.split("'") > if apo[0]: correctedName += > myOwnCapitalize(apo[0]) > correctedName += "'" > if apo[1]: correctedName += > myOwnCapitalize(apo[1]) > elif "." in word or len(word)>1 and > word[1]==word[1].upper() or len(word)>2 and word[2]==word[2].upper(): > correctedName += word > else: > correctedName += > myOwnCapitalize(word) > correctedName += ' ' > correctedName = correctedName.strip() + ';' > if correctedName and correctedName[-1] == ';': > correctedName = correctedName[0:-1] > for lang in corrections: > if isoLang and isoLang != lang: > continue > elif not(isoLang) and way.hasKey('name:fr') and > way.hasKey('name:nl'): > correctedName = > str(way.get('name:fr').encode('utf-8')) + ' - ' + > str(way.get('name:nl').encode('utf-8')) > else: > for wrongspelling, correction in > corrections[lang]: > correctedName = > correctedName.replace(wrongspelling, correction) > correctedName = correctedName.strip() > if name != correctedName: > try: > result = > JOptionPane.showInputDialog(Main.parent, > "Previous name: " + > name.decode('utf-8'), > 'Change spelling?', > JOptionPane.QUESTION_MESSAGE, > None, > None, > correctedName.decode('utf-8')) > except UnicodeDecodeError: > pass > if result: result = result.strip(' -') > print > print nameColonIso > print name > print result > if not(result): > streetnames[name] = 'ignore' > elif result.lower() == u'stop': > break > else: > streetnames[name] = result > newWay = Way(way) > newWay.put(nameColonIso, result) > commandsList.append(Command.ChangeCommand(way, > newWay)) > if commandsList: > > Main.main.undoRedo.add(Command.SequenceCommand("Spelling " + nameColonIso + > ' ' + result, commandsList)) > commandsList = [] > if result and result.lower() == u'stop': > break > What is important to note is that we found how to find (selected) elements, select elements and we also found a way to modify their tags and most importantly how to add the modifications to the undoRedo buffer. What I need to do now is to have a different type of dialog box, with custom buttons and edit fields. I want to be able to display name tags and all their translations at once. What I also would need, is a way to determine if a way is within a given closedway/multipolygon. This is necessary, because within Brussels the names are supposed to be bilingual, whereas in Flanders they are supposed to be in Dutch, occasionally accompanied by a name:fr tag. Is it possible to do that in JOSM? Cheers; and thanks for this great tool that is JOSM! Polyglot _______________________________________________ josm-dev mailing list josm-dev@openstreetmap.org http://lists.openstreetmap.org/listinfo/josm-dev