Index: trunk/taginfoextract.groovy
===================================================================
--- trunk/taginfoextract.groovy	(revision 7544)
+++ trunk/taginfoextract.groovy	(revision 7544)
@@ -0,0 +1,200 @@
+// License: GPL. For details, see LICENSE file.
+/**
+ * Extracts tag information for the taginfo project.
+ *
+ * Run from the base directory of a JOSM checkout:
+ *
+ * groovy -cp dist/josm-custom.jar taginfoextract.groovy
+ */
+
+import java.io.BufferedReader
+import java.util.ArrayList
+
+import org.openstreetmap.josm.Main
+import org.openstreetmap.josm.data.coor.LatLon
+import org.openstreetmap.josm.data.osm.Node
+import org.openstreetmap.josm.data.projection.Projections
+import org.openstreetmap.josm.data.Version
+import org.openstreetmap.josm.gui.mappaint.Cascade
+import org.openstreetmap.josm.gui.mappaint.Environment
+import org.openstreetmap.josm.gui.mappaint.mapcss.Condition.SimpleKeyValueCondition
+import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource
+import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.MapCSSParser
+import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.GeneralSelector
+import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.IconReference
+import org.openstreetmap.josm.gui.mappaint.MultiCascade
+import org.openstreetmap.josm.io.CachedFile
+
+basedir = "."
+
+def cli = new CliBuilder(usage:'taginfoextract.groovy [options] [inputfile]',
+    header:"Options:",
+    footer:"[inputfile]  the file to process (optional, default is 'resource://styles/standard/elemstyles.mapcss')")
+cli.o(args:1, argName: "file", "output file, - prints to stdout (default: -)")
+cli._(longOpt:'svnrev', args:1, argName:"revision", "corresponding revision of the repository http://svn.openstreetmap.org/ (optional, current revision is fetched from the web if not given)")
+cli.h(longOpt:'help', "show this help")
+options = cli.parse(args)
+
+if (options.h) {
+    cli.usage()
+    System.exit(0)
+}
+if (options.arguments().size() > 1) {
+    System.err.println "Error: More than one input file given!"
+    cli.usage()
+    System.exit(-1)
+}
+if (options.svnrev) {
+    assert Integer.parseInt(options.svnrev) > 0
+}
+
+Main.initApplicationPreferences()
+Main.pref.enableSaveOnPut(false)
+Main.setProjection(Projections.getProjectionByCode("EPSG:3857"))
+
+josm_svn_revsion = Version.getInstance().getVersion()
+assert josm_svn_revsion != Version.JOSM_UNKNOWN_VERSION
+
+cached_svnrev = null
+/**
+ * Get revision for the repository http://svn.openstreetmap.org.
+ */
+def osm_svn_revision() {
+    if (cached_svnrev != null) return cached_svnrev
+    if (options.svnrev) {
+        cached_svnrev = Integer.parseInt(options.svnrev)
+        return cached_svnrev
+    }
+    //xml = "svn info --xml http://svn.openstreetmap.org/applications/share/map-icons/classic.small".execute().text
+    xml = ("svn info --xml ${basedir}/images/styles/standard/").execute().text 
+	
+	def svninfo = new XmlParser().parseText(xml)
+	def rev = svninfo.entry.'@revision'[0]
+	cached_svnrev = Integer.parseInt(rev)
+	assert cached_svnrev > 0
+	return cached_svnrev
+}
+
+/**
+ * Determine full image url (can refer to JOSM or OSM repository).
+ */
+def find_image_url(path) {
+    def f = new File("${basedir}/images/styles/standard/${path}")
+    if (f.exists()) {
+        def rev = osm_svn_revision()
+        return "http://trac.openstreetmap.org/export/${rev}/subversion/applications/share/map-icons/classic.small/${path}"
+    }
+    f = new File("${basedir}/images/${path}")
+    if (f.exists()) {
+        return "https://josm.openstreetmap.de/export/${josm_svn_revsion}/josm/trunk/images/${path}"
+    }
+    assert false, "Cannot find image url for ${path}"
+}
+
+def input_file
+if (options.arguments().size() == 0) {
+    input_file = "resource://styles/standard/elemstyles.mapcss"
+} else {
+    input_file = options.arguments()[0]
+}
+
+
+def file = new CachedFile(input_file)
+def stream = file.getInputStream()
+def parser = new MapCSSParser(stream, "UTF-8", MapCSSParser.LexicalState.DEFAULT)
+def style_source = new MapCSSStyleSource("")
+style_source.url = ""
+parser.sheet(style_source)
+
+def tags = [] as Set
+
+for (rule in style_source.rules) {
+    def selector = rule.selector
+    if (selector instanceof GeneralSelector) {
+        def conditions = selector.getConditions()
+        for (cond in conditions) {
+            if (cond instanceof SimpleKeyValueCondition) {
+                if (selector.base == "node") {
+                    tags.add([cond.k, cond.v])
+                }
+            }
+        }
+    }
+}
+
+output_file = null
+if (options.o && options.o != "-") {
+    output_file = new FileWriter(options.o)
+}
+
+def output(x) {
+    if (output_file != null) {
+        output_file.write(x)
+    } else {
+        print x
+    }
+}
+
+datetime = new Date().format("yyyyMMdd'T'hhmmssZ")
+
+output """{
+  "data_format": 1,
+  "data_url": "FIXME",
+  "data_updated": "${datetime}",
+  "project": {
+    "name": "JOSM main mappaint style",
+    "description": "Tags supported by the main mappaint style in the OSM editor JOSM",
+    "project_url": "http://josm.openstreetmap.de/",
+    "icon_url": "http://josm.openstreetmap.de/export/7543/josm/trunk/images/logo_16x16x8.png",
+    "contact_name": "JOSM developer team",
+    "contact_email": "josm-dev@openstreetmap.org"
+  },
+  "tags": [
+"""
+
+sep = ""
+for (tag in tags) {
+    def k = tag[0]
+    def v = tag[1]
+    def osm = new Node(new LatLon(0,0))
+    osm.put(k, v)
+    def mc = new MultiCascade()
+    
+    def env = new Environment(osm, mc, null, style_source)
+    for (def r in style_source.rules) {
+        env.clearSelectorMatchingInformation()
+        env.layer = r.selector.getSubpart()
+        if (r.selector.matches(env)) {
+            // ignore selector range
+            if (env.layer == null) {
+                env.layer = "default"
+            }
+            r.execute(env)
+        }
+    }
+    def c = mc.getCascade("default")
+    def image = c.get("icon-image")
+    if (image) {
+        if (!(image instanceof IconReference)) continue
+        def image_url = find_image_url(image.iconName)
+
+        output """${sep}    {
+                 |      "key": "${k}",
+                 |      "value": "${v}",
+                 |      "object_types": ["node"],
+                 |      "icon_url": "${image_url}"
+                 |    }""".stripMargin()
+    sep = ",\n"
+    }
+}
+output """
+  ]
+}
+"""
+
+if (output_file != null) {
+    output_file.close()
+}
+
+System.exit(0)
+
