Changes between Version 120 and Version 268 of Help/Styles/MapCSSImplementation
- Timestamp:
- (multiple changes)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Help/Styles/MapCSSImplementation
v120 v268 1 1 [[TranslatedPages]] 2 [[PageOutline(1-10,Table of Contents)]] 3 This page documents details on JOSM's [osmwiki:MapCSS/0.2 MapCSS] implementation. 4 5 == Where it is used in JOSM == 6 * [Help/Action/Search Search dialogue] 7 * [wiki:Help/Dialog/TagsMembership Tags/Membership window] - used to filter visible tags 8 * [wiki:Help/Dialog/RelationList Relations window] - used to filter visible relations 9 * [[Extend JOSM#Customstylesandpublication]] 10 * [[Extend JOSM#Customtagcheckerrules]] 11 12 TODO: possibly more 2 [[PageOutline(2-10,Table of Contents)]] 3 = MapCSS Implementation= 4 JOSM's implementation of [osmwiki:MapCSS/0.2 MapCSS] is used for the features: 5 6 * [wikitr:/Styles Mappaint styles] 7 * [wikitr:/Rules Validator rules], see [wikitr:/Help/Validator/MapCSSTagChecker MapCSS tag checker] for the special part for rules only. 8 * [wikitr:/Help/Action/Search Search dialog] 9 10 Consider installing the [https://marketplace.visualstudio.com/items?itemName=whammo.mapcss-syntax MapCSS Syntax Highlighter] in VS Code to add visual highlighting for MapCSS paint and validator syntax. 13 11 14 12 == General Structure == … … 23 21 set: class; 24 22 set: .class; 23 /* note that validator rules do not use the colon after set */ 25 24 } 26 25 }}} … … 42 41 }}} 43 42 44 == Selectors == 45 ''Selectors'' denote the filter expressions of a MapCSS rule. The rule is only applied to a map object, if its selectors match 46 with the object. 47 48 Selectors in MapCSS are different from standard CSS for the web. MapCSS only supports a subset of the standard CSS selectors, but 49 extends them with additional selectors required for OSM data. 43 44 == Selectors == #Selectors 45 ''Selectors'' denote the filter expressions of a MapCSS rule. The rule is only applied to a map object, if its selectors match with the object. 46 47 Selectors in MapCSS are different from standard CSS for the web. MapCSS only supports a subset of the standard CSS selectors, but extends them with additional selectors required for OSM data. 50 48 51 49 Some basic examples: … … 55 53 way[highway=residential] { /* the styles */} 56 54 57 /* applied to new, closed ways on layer 1, provided they have the tag amenity=parking and access= public, and provided55 /* applied to new, closed ways on layer 1, provided they have the tag amenity=parking and access=customers, and provided 58 56 * the zoom level is between 11 and 14 59 57 */ 60 way|z11-14[amenity=parking][access= public]:closed:new::layer_1 {...}61 62 63 area[amenity=parking][access= public], area[amenity=parking][!access] {...}58 way|z11-14[amenity=parking][access=customers]:closed:new::layer_1 {...} 59 60 61 area[amenity=parking][access=customers], area[amenity=parking][!access] {...} 64 62 relation[type=route][route=foot] > way::relation_underlay {..} 65 63 }}} … … 70 68 71 69 === Type selector === 72 73 {{{#!th align=left valign=top 70 {{{#!th valign=top 74 71 '''Selector''' 75 72 }}} 76 {{{#!th align=leftvalign=top73 {{{#!th valign=top 77 74 '''Description''' 78 75 }}} 79 76 |------------------------------------------------------------------------------- 80 {{{#!td align= leftvalign=top77 {{{#!td align=center valign=top 81 78 * 82 79 }}} … … 85 82 }}} 86 83 |------------------------------------------------------------------------------- 87 {{{#!td align= leftvalign=top88 {{{node}}}, {{{way}}}, {{{relation}}}84 {{{#!td align=center valign=top 85 `node`, `way`, `relation` 89 86 }}} 90 87 {{{#!td align=left valign=top … … 92 89 }}} 93 90 |------------------------------------------------------------------------------- 94 {{{#!td align= leftvalign=top95 {{{area}}} 91 {{{#!td align=center valign=top 92 `area` 96 93 }}} 97 94 {{{#!td align=left valign=top … … 103 100 way[natural=beach], relation[type=multipolygon][natural=beach] {...} 104 101 }}} 105 Note that {{{area}}}selects unclosed ways as well, so it may be useful to add the{{{:closed}}}pseudo class. The JOSM Validator will give a warning for unclosed ways that have an area style.106 }}} 107 |------------------------------------------------------------------------------- 108 {{{#!td align= leftvalign=top109 {{{meta}}} 102 Note that `area` selects unclosed ways as well, so it may be useful to add the `:closed` pseudo class. The JOSM Validator will give a warning for unclosed ways that have an area style. 103 }}} 104 |------------------------------------------------------------------------------- 105 {{{#!td align=center valign=top 106 `meta` 110 107 }}} 111 108 {{{#!td align=left valign=top 112 The {{{meta}}}selector starts a special rule that should stand at the beginning of the file. It gives some general information on the style sheet. All software that supports MapCSS should be able to parse this sections without errors, so do not use exotic syntax extensions in this part.109 The `meta` selector starts a special rule that should stand at the beginning of the file. It gives some general information on the style sheet. All software that supports MapCSS should be able to parse this sections without errors, so do not use exotic syntax extensions in this part. 113 110 {{{ 114 111 #!mapcss 115 112 meta { 116 113 title: "Parking lanes"; /* title shown in the menu */ 117 icon: " images/logo.png";/* small icon shown in the menu next to the title */114 icon: "logo_16x16x8.png"; /* small icon shown in the menu next to the title */ 118 115 version: "1.2"; /* the version of the style */ 119 116 description: "..."; /* one or two sentences of describing the style */ 120 117 author: "..."; /* the author(s) of the style */ 121 link: "http://..."; /* URL to the web page of the style */118 link: "https://..."; /* URL to the web page of the style */ 122 119 min-josm-version: 6789; /* the minimum JOSM version where this style works */ 123 120 } … … 125 122 }}} 126 123 |------------------------------------------------------------------------------- 127 {{{#!td align= leftvalign=top128 {{{canvas}}} 124 {{{#!td align=center valign=top 125 `canvas` 129 126 }}} 130 127 {{{#!td align=left valign=top … … 151 148 }}} 152 149 |- 153 {{{#!td 154 {{{fill-color}}}150 {{{#!td align=center 151 `fill-color` 155 152 }}} 156 153 {{{#!td 157 154 Specifies the overall fill/background color (`background-color` is deprecated since r7110). 158 155 }}} 159 {{{#!td 156 {{{#!td align=center 160 157 ''Color'' 161 158 }}} 162 159 {{{#!td align=center 163 {{{black}}} 160 `black` 164 161 }}} 165 162 |- 166 {{{#!td 167 {{{default-points}}}163 {{{#!td align=center 164 `default-points` 168 165 }}} 169 166 {{{#!td 170 167 Whether default point style should be added to nodes where no style applies. 171 168 }}} 172 {{{#!td 169 {{{#!td align=center 173 170 ''Boolean'' 174 171 }}} 175 172 {{{#!td align=center 176 {{{true}}} 173 `true` 177 174 }}} 178 175 |- 179 {{{#!td 180 {{{default-lines}}}176 {{{#!td align=center 177 `default-lines` 181 178 }}} 182 179 {{{#!td 183 180 Whether default line style should be added to ways where no style applies. 184 181 }}} 185 {{{#!td 182 {{{#!td align=center 186 183 ''Boolean'' 187 184 }}} 188 185 {{{#!td align=center 189 {{{true}}} 186 `true` 190 187 }}} 191 188 }}} 192 189 193 190 === Child selector === 194 If a node is part of a way, we say that it is a ''child'' of this way. Similarly, if a node, a way, or a relation is a member 195 of a relation, we say, that it is a ''child'' of this relation. 191 If a node is part of a way, we say that it is a ''child'' of this way. Similarly, if a node, a way, or a relation is a member of a relation, we say, that it is a ''child'' of this relation. 196 192 197 193 In MapCSS you can use a '''child selector''' which matches only if both the parent and the child object match. … … 211 207 * The functions ''prop()'' and ''is_prop_set()'' are only supported on the right side of the > sign. 212 208 * The functions ''parent_tag'' and ''parent_tags'' (see below) can be used to access tags from the parent(s). 213 * For compatibility with the MapCSS 0.2 standard, `relation[type=route][route=foot] way {/*...*/}`, without the greather-than-sign `>` is supported, too. However, no [[#Linkselector]] may be specified in this case. 214 209 * For compatibility with the MapCSS 0.2 standard, `relation[type=route][route=foot] way {/*...*/}`, without the greater-than-sign `>` is supported, too. However, no [#LinkSelector Link selector] may be specified in this case. 215 210 216 211 === Parent selector === 217 In addition to child selectors, JOSMs supports the the notion of a '''parent selector'''. Note, that parent selectors are a 218 JOSM-specific extension of MapCSS not present in other MapCSS implementations. 219 220 Similar to a child selector, a parent selector only matches if both the parent and the child object match. In contrast to 221 to the child selector, the character < is used. 222 223 In contrast to the child selector, the parent object will be "selected". In other words, the properties in the {{{{...}}}}-Declaration Block apply to the object on the right hand side of the "<" sign. 212 In addition to child selectors, JOSM supports the notion of a '''parent selector'''. Note, that parent selectors are a JOSM-specific extension of MapCSS not present in other MapCSS implementations. 213 214 Similar to a child selector, a parent selector only matches if both the parent and the child object match. In contrast to the child selector, the character < is used. 215 216 In contrast to the child selector, the parent object will be "selected". In other words, the properties in the `{{{...}}}`-Declaration Block apply to the object on the right hand side of the "<" sign. 224 217 225 218 Example: … … 233 226 234 227 === Condition selector === 235 Selectors can include a set of conditions. If any of these conditions evaluates to false, the selector doesn't match and the style 236 rule isn't applied. 237 238 An '''attribute condition''' specifies a condition on a tag of an OSM object. 228 Selectors can include a set of conditions. If any of these conditions evaluates to false, the selector doesn't match and the style rule isn't applied. 229 230 An '''attribute condition''' specifies a condition on a tag of an OSM object. 239 231 240 232 [=#condition_selector_operators] 241 {{{#!th align=leftvalign=top233 {{{#!th valign=top 242 234 '''Operator''' 243 235 }}} 244 {{{#!th align=leftvalign=top236 {{{#!th valign=top 245 237 '''Description''' 246 238 }}} 247 {{{#!th align=leftvalign=top239 {{{#!th valign=top 248 240 '''Example''' 249 241 }}} 250 242 |------------------------------------------------------------------------------- 251 {{{#!td align= leftvalign=top243 {{{#!td align=center valign=top 252 244 `=` 253 245 }}} 254 {{{#!td align=left valign=top246 {{{#!td align=left valign=top 255 247 Exact match of the value. 256 248 }}} 257 {{{#!td align=left valign=top 258 {{{ 259 #!mapcss 260 way[highway=residential] /* without quotes always case insensitive */ 261 node[name="My name"] /* use quotes for if value includes spaces or if case sensitive matching is important */ 262 node["MY_Special_TAG"="another value"] /* use quotes for tag names if case sensitive matching is required */ 263 node["ÖPVN"=tram] /* use quotes for tag keys with special characters */ 264 /* note that these are not common in OSM at the moment */ 265 }}} 266 }}} 267 |------------------------------------------------------------------------------- 268 {{{#!td align=left valign=top 249 {{{#!td align=left valign=top 250 {{{ 251 #!mapcss 252 way[highway=residential] /* is case sensitive, i.e. does NOT match e.g. highway=Residential or Highway=residential */ 253 node[name="My name"] /* use quotes if key or value includes spaces */ 254 node["name:pl"="Królewiec"] /* use quotes if key or value includes special characters like colons or unicode characters */ 255 }}} 256 }}} 257 |------------------------------------------------------------------------------- 258 {{{#!td align=center valign=top 269 259 `!=` 270 260 }}} 271 {{{#!td align=left valign=top 272 Value not equal 273 }}} 274 {{{#!td align=left valign=top 275 {{{ 276 #!mapcss 277 way[highway!=residential] /* without quotes always case insensitive */ 278 node[name!="My name"] /* use quotes if value includes spaces or if case sensitive matching is important */ 279 node["MY_Special_TAG"!="another value"] /* use quotes for tag names if case sensitive matching is required */ 280 node["name:fr"!="mon nome"] /* use quotes for tag names with special characters like colons*/ 281 }}} 282 }}} 283 |------------------------------------------------------------------------------- 284 {{{#!td align=left valign=top 261 {{{#!td align=left valign=top 262 Value not equal 263 }}} 264 {{{#!td align=left valign=top 265 {{{ 266 #!mapcss 267 way[highway!=residential] 268 node[name!="My name"] 269 node["name:pl"!="Królewiec"] 270 }}} 271 }}} 272 |------------------------------------------------------------------------------- 273 {{{#!td align=center valign=top 285 274 `<`, `>`, `<=`, `>=` 286 275 }}} 287 {{{#!td align=left valign=top288 Comparis ion for numeric values.289 290 }}} 291 {{{#!td align=left valign=top276 {{{#!td align=left valign=top 277 Comparison for numeric values. 278 279 }}} 280 {{{#!td align=left valign=top 292 281 {{{ 293 282 #!mapcss 294 283 node[population >= 50000] /* population greater than or equal to 50000 */ 295 node[ele = 3000] /* elevation with exactly 3000 meters */ 296 }}} 297 }}} 298 |------------------------------------------------------------------------------- 299 {{{#!td align= leftvalign=top300 {{{^=}}} 301 }}} 302 {{{#!td align=left valign=top284 node[ele = 3000] /* elevation with exactly 3000 meters */ 285 }}} 286 }}} 287 |------------------------------------------------------------------------------- 288 {{{#!td align=center valign=top 289 `^=` 290 }}} 291 {{{#!td align=left valign=top 303 292 Prefix match 304 293 }}} 305 {{{#!td align=left valign=top294 {{{#!td align=left valign=top 306 295 {{{ 307 296 #!mapcss … … 310 299 }}} 311 300 |------------------------------------------------------------------------------- 312 {{{#!td align= leftvalign=top301 {{{#!td align=center valign=top 313 302 `$=` 314 303 }}} 315 {{{#!td align=left valign=top304 {{{#!td align=left valign=top 316 305 Postfix match 317 306 }}} 318 {{{#!td align=left valign=top307 {{{#!td align=left valign=top 319 308 {{{ 320 309 #!mapcss … … 323 312 }}} 324 313 |----------------------------------------------- 325 {{{#!td align= leftvalign=top314 {{{#!td align=center valign=top 326 315 `*=` 327 316 }}} 328 {{{#!td align=left valign=top317 {{{#!td align=left valign=top 329 318 Substring match 330 319 }}} 331 {{{#!td align=left valign=top320 {{{#!td align=left valign=top 332 321 {{{ 333 322 #!mapcss … … 336 325 }}} 337 326 |------------------------------------------------------------------------------- 338 {{{#!td align= leftvalign=top327 {{{#!td align=center valign=top 339 328 `~=` 340 329 }}} 341 {{{#!td align=left valign=top330 {{{#!td align=left valign=top 342 331 List membership 343 332 }}} 344 {{{#!td align=left valign=top345 {{{ 346 #!mapcss 347 *[vending~=stamps] /* the tag value for the tag 'vending' consists of a list of ;-separated values */348 /* and one of these values is 'stamps' */349 }}} 350 }}} 351 |------------------------------------------------------------------------------- 352 {{{#!td align= leftvalign=top333 {{{#!td align=left valign=top 334 {{{ 335 #!mapcss 336 *[vending~=stamps] /* the tag value for the tag 'vending' consists of a list of ;-separated values */ 337 /* and one of these values is 'stamps' */ 338 }}} 339 }}} 340 |------------------------------------------------------------------------------- 341 {{{#!td align=center valign=top 353 342 `=~` 354 343 }}} 355 {{{#!td align=left valign=top356 [http ://download.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#sum Regular expression] match357 358 }}} 359 {{{#!td align=left valign=top344 {{{#!td align=left valign=top 345 [https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html#sum Regular expression] match 346 347 }}} 348 {{{#!td align=left valign=top 360 349 {{{ 361 350 #!mapcss 362 351 *[name=~/^My_pattern.*/] /* the value of the tag 'name' matches with the regular expression '^My_pattern.*' */ 363 /* Note, that reqular expressions have to be enclosed in /.../ */ 364 }}} 365 Case-insensitive matching can be enabled via the embedded flag expression `(?i)` (see [http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#CASE_INSENSITIVE Pattern.CASE_INSENSITIVE]). 366 {{{ 367 #!mapcss 368 *[name =~ /^(?U)(\p{Lower})+$/] /* name consists of only lower case unicode characters */ 369 }}} 370 }}} 371 |------------------------------------------------------------------------------- 372 {{{#!td align=left valign=top 352 /* Note, that reqular expressions have to be enclosed in /.../ */ 353 }}} 354 Case-insensitive matching can be enabled via the embedded flag expression `(?i)` (see [https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html#CASE_INSENSITIVE Pattern.CASE_INSENSITIVE]). 355 {{{ 356 #!mapcss 357 *[name =~ /^(?i)(parking)$/] /* matches parking, Parking, PARKING, PaRkInG,... */ 358 *[name =~ /^(?U)(\p{Lower})+$/] /* name consists of only lower case unicode characters */ 359 }}} 360 }}} 361 |------------------------------------------------------------------------------- 362 {{{#!td align=center valign=top 373 363 `!~` (since r6455) 374 364 }}} 375 {{{#!td align=left valign=top376 negated [http ://download.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#sum Regular expression] match377 378 }}} 379 {{{#!td align=left valign=top365 {{{#!td align=left valign=top 366 negated [https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html#sum Regular expression] match 367 368 }}} 369 {{{#!td align=left valign=top 380 370 {{{ 381 371 #!mapcss … … 384 374 }}} 385 375 |------------------------------------------------------------------------------- 386 {{{#!td align= leftvalign=top387 `∈` ([http://www.fileformat.info/info/unicode/char/2208/index.htm U+2208], since r6609) 388 }}} 389 {{{#!td align=left valign=top376 {{{#!td align=center valign=top 377 `∈` ([https://www.fileformat.info/info/unicode/char/2208/index.htm U+2208], since r6609) 378 }}} 379 {{{#!td align=left valign=top 390 380 element of 391 381 392 }}} 393 {{{#!td align=left valign=top 394 {{{ 395 #!mapcss 396 node[amenity=parking] ∈ *[amenity=parking] { 382 Matches when an object matches the right selector(s) contains at least one element which match the left selector(s). 383 }}} 384 {{{#!td align=left valign=top 385 {{{ 386 #!mapcss 387 *[amenity=parking] ∈ area[amenity=parking] { 397 388 throwWarning: tr("{0} inside {1}", "amenity=parking", "amenity=parking"); 398 389 } 399 390 }}} 400 }}} 401 |------------------------------------------------------------------------------- 402 {{{#!td align=left valign=top 403 `⧉` ([http://www.fileformat.info/info/unicode/char/29c9/index.htm U+29C9], since r6613) 404 }}} 405 {{{#!td align=left valign=top 391 Finds areas with `amenity=parking` that contain at least one node or area with `amenity=parking`. Since r15064 this rule produces one warning for each element on the left when there are multiple matches. 392 }}} 393 |------------------------------------------------------------------------------- 394 {{{#!td align=center valign=top 395 `⊆` ([https://www.fileformat.info/info/unicode/char/2286/index.htm U+2286], since r15102) 396 }}} 397 {{{#!td align=left valign=top 398 Subset of or Equal To 399 400 Synonym for `∈`. 401 }}} 402 {{{#!td align=left valign=top 403 {{{ 404 #!mapcss 405 *[amenity=parking] ⊆ area[amenity=parking] { 406 throwWarning: tr("{0} inside {1}", "amenity=parking", "amenity=parking"); 407 } 408 }}} 409 410 }}} 411 |------------------------------------------------------------------------------- 412 {{{#!td align=center valign=top 413 `⊇` ([https://www.fileformat.info/info/unicode/char/2287/index.htm U+2287], since r15102) 414 }}} 415 {{{#!td align=left valign=top 416 Superset of or Equal To 417 418 Matches when an object matches the right selector(s) and is contained in one or more elements which match the left selectors. 419 }}} 420 {{{#!td align=left valign=top 421 {{{ 422 #!mapcss 423 area[amenity=parking] ⊇ *[amenity=parking] 424 }}} 425 finds nodes or areas with `amenity=parking` inside areas with `amenity=parking`. Slower than `⊆` and thus not useful in validator rules, but can be useful in the search dialog. 426 }}} 427 |------------------------------------------------------------------------------- 428 {{{#!td align=center valign=top 429 `⊈` ([https://www.fileformat.info/info/unicode/char/2288/index.htm U+2288], since r15102) 430 }}} 431 {{{#!td align=left valign=top 432 Neither a Subset of nor Equal To 433 434 Matches when an object matches the right selector(s) and does not contain any element which matches the left selectors. 435 }}} 436 {{{#!td align=left valign=top 437 {{{ 438 #!mapcss 439 *[highway=street_lamp] ⊈ area:closed2[amenity=parking][lit=yes] 440 }}} 441 finds areas amenity=parking that have lit=yes but don't contain a lamp. Always add `:closed2` to avoid false positives as unclosed areas never contain something. 442 }}} 443 |------------------------------------------------------------------------------- 444 {{{#!td align=center valign=top 445 `⊉` ([https://www.fileformat.info/info/unicode/char/2289/index.htm U+2289], since r15102) 446 }}} 447 {{{#!td align=left valign=top 448 Neither a Superset of nor Equal To 449 450 Matches when an object matches the right selector(s) and is not contained in any area which matches the left selectors. 451 }}} 452 {{{#!td align=left valign=top 453 {{{ 454 #!mapcss 455 area[landuse=residential] ⊉ *[building] 456 }}} 457 finds buildings which are not inside any landuse=residential area. Note that this operator is likely to produce false positives when you have `landuse=residential`areas which don't match `:closed2`. 458 }}} 459 |------------------------------------------------------------------------------- 460 {{{#!td align=center valign=top 461 `⧉` ([https://www.fileformat.info/info/unicode/char/29c9/index.htm U+29C9], since r6613) 462 }}} 463 {{{#!td align=left valign=top 406 464 crossing 407 408 }}} 409 {{{#!td align=left valign=top 465 }}} 466 {{{#!td align=left valign=top 410 467 {{{ 411 468 #!mapcss … … 414 471 } 415 472 }}} 416 }}} 417 418 Since r6554, it is possible to prefix the "value" (i.e., expression after the operator) with a `*` in order to "de-reference" it (i.e., obtain consider it as another key and obtain its value). Thus, `[key1 = *key2]` compares the value of `key1` with the value of `key2`, and `[key =~ */pattern/]` considers the value of the key `pattern` as a regular expression and matches it against the value of `key`. 473 takes `layer` tag into account if set (since r12986) 474 }}} 475 476 Since r6554, it is possible to prefix the "value" (i.e., expression after the operator) with a `*` in order to "de-reference" it (i.e., obtain consider it as another key and obtain its value). Thus, `[key1 = *key2]` or `[key1=*key2]` compares the value of `key1` with the value of `key2`, and `[key =~ */pattern/]` considers the value of the key `pattern` as a regular expression and matches it against the value of `key`. 419 477 420 478 In addition, you can test whether a tag is present or not: 421 479 422 {{{#!th align=leftvalign=top480 {{{#!th valign=top 423 481 '''Condition''' 424 482 }}} 425 {{{#!th align=leftvalign=top483 {{{#!th valign=top 426 484 '''Example''' 427 485 }}} … … 433 491 {{{ 434 492 #!mapcss 435 way[highway] /* matches any way with a tag 'highway' */ 436 way["VALSOU"] /* use quotes if case sensitive matching is required */ 437 way["name:fr"] /* use quotes if the tag name includes special caracters (white space, colons, etc.) */ 493 way[highway] /* matches any way with a tag 'highway' (is case sensitive) */ 494 way["name:fr"] /* use quotes if the tag name includes special caracters (white space, colons, unicode characters, etc.) */ 438 495 }}} 439 496 }}} … … 445 502 {{{ 446 503 #!mapcss 447 way[!highway] /* matches any way which does not have a tag 'highway' */ 448 way[!"VALSOU"] /* use quotes if case sensitive matching is required */ 449 way[!"name:fr"] /* use quotes if the tag name includes special caracters (white space, colons, etc.) */ 504 way[!highway] /* matches any way which does not have a tag 'highway' (is case sensitive) */ 505 way[!"name:fr"] /* use quotes if the tag name includes special caracters (white space, colons, unicode characters, etc.) */ 450 506 }}} 451 507 }}} 452 508 |------------------------------------------------------------------------------- 453 509 {{{#!td align=left valign=top 454 Presence of tag by [http ://download.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#sum Regular expression] match (since r6547)510 Presence of tag by [https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html#sum Regular expression] match (since r6547) 455 511 }}} 456 512 {{{#!td align=left valign=top … … 471 527 }}} 472 528 473 You can test whether the thevalue of a tag is logical truth value. The value is evaluated to true, if it is either529 You can test whether the value of a tag is logical truth value. The value is evaluated to true, if it is either 474 530 "yes", "true", or "1". All other values are evaluated to false. 475 531 476 {{{#!th align=leftvalign=top532 {{{#!th valign=top 477 533 '''Condition''' 478 534 }}} 479 {{{#!th align=leftvalign=top535 {{{#!th valign=top 480 536 '''Example''' 481 537 }}} … … 487 543 {{{ 488 544 #!mapcss 489 way[oneway?] /* matches any way with a truth value in the tag 'oneway' */545 way[oneway?] /* matches any way with a truth value in the tag 'oneway' */ 490 546 }}} 491 547 }}} … … 497 553 {{{ 498 554 #!mapcss 499 way[oneway?!] /* matches any way with a false value in the tag 'oneway' */ 500 }}} 501 }}} 502 503 === Link selector === 555 way[oneway?!] /* matches any way with a false value in the tag 'oneway' */ 556 }}} 557 }}} 558 559 === Territory selector === #Territoryselector 560 You can test whether an object is located inside or outside of a specific territory. JOSM has an internal database for this. The [source:/trunk/resources/data/boundaries.osm territories file] can be downloaded and opened in JOSM to investigate it [attachment:boundaries.png (screenshot preview)]. It contains borders of all countries of the world. Due to performance reasons the borders are simplified. They can be refined for special cases on request. The territories are "tagged" with their [https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 ISO_3166-1_alpha-2 codes]. USA, Canada, China, India and Australia have additional boundaries for their subdivisions. See the following examples on how to use the territory selectors. Territory selectors are less useful in mappaint styles and can be very resource heavy there. However they are much more useful for [wikitr:/Help/Validator/MapCSSTagChecker mapcss based validator rules]. To select territories with left-hand-traffic or right-hand-traffic, there is a simpler way, see [#PseudoClasses Pseudo Classes]. See #10387 for main implementation of this feature. 561 562 {{{ 563 #!mapcss 564 /* matches any node located … */ 565 node[inside("FR")] /* … inside of France (includes the overseas territories) */ 566 node[inside("FX")] /* … inside of Metropolitan France (i.e. only the 567 mainland part with its near islands including Corse) */ 568 node[inside("EU")] /* … inside of the European Union */ 569 node[inside("FR,DE")] /* … inside of France __OR__ inside of Germany */ 570 node[inside("US-FL")] /* … inside of the US state Florida */ 571 572 node[outside("FR")] /* … outside of France */ 573 node[outside("FR,DE")] /* … outside of France __AND__ outside of Germany */ 574 node[inside("US")][outside("US-FL")] /* … inside of the USA except the state Florida */ 575 }}} 576 577 === Link selector ===#LinkSelector 504 578 In a child selector, you can formulate conditions on the link between a parent and a child object. 505 579 … … 512 586 }}} 513 587 514 {{{#!th align=leftvalign=top588 {{{#!th valign=top 515 589 '''Operator''' 516 590 }}} 517 {{{#!th align=leftvalign=top591 {{{#!th valign=top 518 592 '''Description''' 519 593 }}} 520 {{{#!th align=leftvalign=top594 {{{#!th valign=top 521 595 '''Example''' 522 596 }}} 523 597 |------------------------------------------------------------------------------- 524 {{{#!td align= leftvalign=top598 {{{#!td align=center valign=top 525 599 `=` 526 600 }}} 527 601 {{{#!td align=left valign=top 528 Exact match of the role name. The name name {{{role}}}is compulsory in this context.602 Exact match of the role name. The name `role` is compulsory in this context. 529 603 }}} 530 604 {{{#!td align=left valign=top 531 605 {{{ 532 606 #!mapcss 533 relation >[role=residential] way /* without quotes always case insensitive */ 534 relation >[role="My name"] way /* use quotes for if the role value includes spaces or if case sensitive matching is important */ 535 }}} 536 }}} 537 538 The operators {{{!=, ^=, $=, *=, and ~=}}} are supported too. Please refer to [#condition_selector_operators condition selector operators]. 539 540 Nodes in ways and members in relations are ordered. You can formulate conditions on the position of a node in a way or a member 541 object in a relation. Positive numbers count from first to last element, negative numbers (since r8236) count from last to first element. 607 relation >[role=residential] way 608 relation >[role="My name"] way /* use quotes if the role value includes spaces or other special characters */ 609 }}} 610 }}} 611 612 The operators `!=`, `^=`, `$=`, `*=` and `~=` are supported too. Please refer to [#condition_selector_operators condition selector operators]. 613 614 Nodes in ways and members in relations are ordered. You can formulate conditions on the position of a node in a way or a member object in a relation. Positive numbers count from first to last element, negative numbers (since r8236) count from last to first element. 542 615 543 616 {{{ … … 557 630 }}} 558 631 559 560 632 === Zoom selector === 561 You can decorate a type selector with a '''zoom selector'''. The zoom selector restricts the range of zoom levels 562 at which the respective MapCSS rule is applied. 563 564 {{{#!th align=left valign=top 565 '''Example''' 566 }}} 567 {{{#!th align=left valign=top 568 '''Description''' 569 }}} 570 |------------------------------------------------------------------------------- 571 || {{{way|z12 {...} }}} || At zoom level 12 || 572 || {{{way|z13-15 {...} }}} || From 13 to 15 || 573 || {{{way|z16- {...} }}} || 16 and above || 574 || {{{way|z-12 {...} }}} || 12 and below || 575 || {{{way {...} }}} || any zoom level || 633 You can decorate a type selector with a '''zoom selector'''. The zoom selector restricts the range of zoom levels at which the respective MapCSS rule is applied. 634 ||= '''Example 1''' =||= '''Example 2''' =||= '''Example 3''' =||= '''Description''' =|| 635 || `way|z12 {...}` || `node|z12 {...}` || `node|z12[...] {...}` || At zoom level 12 || 636 || `way|z13-15 {...}` || `node|z13-15 {...}` || `way|z13-15[...] {...}` ||From 13 to 15 || 637 || `way|z16- {...}` || `node|z16- {...}` || `node|z16-[...] {...}` || 16 and above || 638 || `way|z-12 {...}` || `node|z-12 {...}` || `node|z-12[...] {...}` || 12 and below || 639 || `way {...}` || `node{...}` || `way[...] {...}` || any zoom level || 576 640 577 641 The precise definition of scale ranges for each zoom level may change in the future. By rule of thumb you can expect to be approximately at zoom level ''n'' when imagery displays slippymap tiles of level ''n''. 578 642 579 580 === Pseudo Classes === 581 See [https://josm.openstreetmap.de/doc/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.PseudoClasses.html Javadoc] for the up-to-date list of pseudo classes supported by JOSM's MapCSS implementation. 582 583 || {{{:closed}}} || true for ways where the first node is the same as the last and for any (completely downloaded) multipolygon relation || 584 || {{{:closed2}}} || same as above, but this one ignores if a mulipolygon is downloaded completely (since r9099) || 585 || {{{:completely_downloaded}}} || true for a relation whose members are all downloaded (since r9099) || 586 || {{{:new}}} || all new objects || 587 || {{{:connection}}} || true for nodes that are used by more than one way || 588 || {{{:unconnected}}} || true for nodes that are not used by any way (since r6687) || 589 || {{{:tagged}}} || What JOSM considers tagged, i.e. an object that with a tag key other than the following: {{{source*, source_ref, note, comment, converted_by, created_by, watch*, fixme, FIXME, description, attribution}}} (version r4008; in this list, {{{*}}} is a glob) 590 || {{{:righthandtraffic}}} || true if there is right-hand traffic at the current location (since r7193); see [[left-right-hand-traffic]] for screenshot of areas || 591 || {{{:clockwise}}} || Whether the way is closed and oriented clockwise, or non-closed and the 1st, 2nd and last node are in clockwise order. || 592 || {{{:anticlockwise}}} || Whether the way is closed and oriented anticlockwise, or non-closed and the 1st, 2nd and last node are in anticlockwise order. || 593 || {{{:unclosed_multipolygon}}} || true for fully loaded unclosed multipolygon relations (since r8252) || 594 || {{{:open_end}}} || to select end nodes of unclosed multipolygon relations with `relation:unclosed_multipolygon >:open_end node` (since r8252) || 595 || {{{:in-downloaded-area}}} || true if an object is within source area and false if in the hatched area (since r8495). || 596 || {{{:selected}}} || true if an object is selected in the editor (since r9341). || 597 || {{{:modified}}} || changed objects (since r7193). || 598 You can also negate pseudo classes. E.g. {{{!:new}}} for all old objects. 643 === Pseudo Classes ===#PseudoClasses 644 See [/doc/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionFactory.PseudoClasses.html Javadoc] for the up-to-date list of pseudo classes supported by JOSM's MapCSS implementation. 645 646 ||= '''Class''' =||= '''Description''' =|| 647 || `:closed` || true for ways where the first node is the same as the last and for any (completely downloaded) multipolygon relation || 648 || `:closed2` || same as above, but this one ignores if a multipolygon is downloaded completely (since r9099) || 649 || `:completely_downloaded` || true for a relation whose members are all downloaded (since r9099) || 650 || `:new` || all new objects || 651 || `:connection` || true for nodes that are used by more than one way || 652 || `:unconnected` || true for nodes that are not used by any way (since r6687) || 653 || `:tagged` || What JOSM considers tagged, i.e. an object that with a tag key other than the following: `source*`, `source_ref`, `note`, `comment`, `converted_by`, `created_by`, `watch*`, `fixme`, `FIXME`, `description`, `attribution` (version r4008; in this list, `*` is a glob) 654 || `:area-style` || true if the object has an area style || 655 || `:righthandtraffic` || true if there is right-hand traffic at the current location (since r7193); see [wikitr:/left-right-hand-traffic left-right-hand-traffic] for screenshot of areas || 656 || `:clockwise` || Whether the way is closed and oriented clockwise, or non-closed and the 1st, 2nd and last node are in clockwise order. || 657 || `:anticlockwise` || Whether the way is closed and oriented anticlockwise, or non-closed and the 1st, 2nd and last node are in anticlockwise order. || 658 || `:unclosed_multipolygon` || true for fully loaded unclosed multipolygon relations (since r8252) || 659 || `:open_end` || to select end nodes of unclosed multipolygon relations with `relation:unclosed_multipolygon >:open_end node` (since r8252) || 660 || `:in-downloaded-area` || true if an object is within source area and false if in the hatched area (since r8495). || 661 || `:selected` || true if an object is selected in the editor (since r9341). || 662 || `:highlighted` || true if the object is highlighted || 663 || `:modified` || changed and new objects (since r7193). || 664 You can also negate pseudo classes. E.g. `!:new` for all old objects. 599 665 600 666 === Layer Identifier === 601 602 667 Layers can be used to create more than one style for a single object. Here is an example: 603 668 {{{ … … 613 678 } 614 679 615 way[access][access!= public]::non_public_access_layer {680 way[access][access!=yes]::non_public_access_layer { 616 681 width: +2; 617 682 color:red; … … 627 692 } 628 693 }}} 629 This draws all secondary and tertiary roads in yellow and orange respectively. Any road with an access tag other than public will get an extra line style below ('''{{{object-z-index:-1.0;}}}''') the main line. If that part of the street happens to be a bridge, it will also get a half transparent blue overlay. The relative width value ('''{{{width: +2;}}}''') refers to the width on the default layer (2 or 3 in this case).694 This draws all secondary and tertiary roads in yellow and orange respectively. Any road with an access tag other than yes will get an extra line style below ('''`object-z-index:-1.0;`''') the main line. If that part of the street happens to be a bridge, it will also get a half transparent blue overlay. The relative width value ('''`width: +2;`''') refers to the width on the default layer (2 or 3 in this case). 630 695 631 696 The name for the layer can be any identifier. 632 697 633 default:: 634 If you omit the layer in the selector, this is the same as using {{{::default}}}. 635 *:: 636 In addition, you can use the * layer to override and initialize all layers.[[br]] 637 It overrides all existing subparts, so 698 If you omit the layer in the selector, this is the same as using `::default`. 699 700 One more example: 701 {{{ 702 #!mapcss 703 node[amenity=parking] { 704 icon-image: "presets/vehicle/parking/parking.svg"; /* displays the josm internal parking icon in the default layer */ 705 text: ref; /* displays the value of the key ref as text in the default layer */ 706 } 707 708 node[amenity=parking][fee=yes]::fee { 709 icon-image: "presets/money/exchange.svg"; /* displays the josm internal exchange icon in the fee layer */ 710 icon-offset-x: 14; /* shift the icon */ 711 icon-offset-y: -12; /* shift the icon */ 712 text: charge; /* displays the value of the key charge as text in the fee layer */ 713 text-offset-x: 16; /* shift the text */ 714 text-offset-y: 17; /* shift the text */ 715 } 716 }}} 717 The result looks this way: 718 719 [[Image(multiple_icons_and_texts.png,link=)]] 720 721 In addition, you can use the * layer to override and initialize all layers. \\ 722 It overrides all existing subparts, so 723 638 724 {{{ 639 725 #!mapcss 640 726 way::A { a; } 641 727 way::B { b; } 642 way::* { c; } 643 }}} 644 is equivalent to728 way::* { c; } /* overrides all existing subparts */ 729 }}} 730 is equivalent to 645 731 {{{ 646 732 #!mapcss 647 733 way::A { a; } 648 734 way::B { b; } 649 way::A { c; } 650 way::B { c; } 651 }}} 652 And it initializes new subparts. In other words:735 way::A { c; } /* overrides a with c all existing subparts */ 736 way::B { c; } /* overrides b with c all existing subparts */ 737 }}} 738 And it initializes new subparts. In other words: 653 739 {{{ 654 740 #!mapcss … … 656 742 way::A { b; } 657 743 }}} 658 is equivalent to744 is equivalent to 659 745 {{{ 660 746 #!mapcss … … 663 749 way::A { b; } 664 750 }}} 665 which is in turn the same as751 which is in turn the same as 666 752 {{{ 667 753 #!mapcss … … 669 755 way::A { b; } 670 756 }}} 671 or757 or 672 758 {{{ 673 759 #!mapcss … … 675 761 }}} 676 762 677 678 763 === Grouping === 679 680 764 Rules with common declaration block can be grouped into one: 681 765 {{{ … … 716 800 way.path { text:auto; text-color: green; text-position: line; text-offset: 5; } 717 801 }}} 718 You can also negate classes. E.g. {{{way!.path}}} for all ways, which are not part of the class ''.path''. 719 720 == @supports rule for conditional processing [''since 8087''] == 721 722 @supports rules are used to skip a section of the style under certain conditions. Typically you want to use a feature which is introduced in a newer version of JOSM, but like to have a fall back style for users of older JOSM clients. Example: 802 You can also negate classes. E.g. `way!.path` for all ways, which are not part of the class ''.path''. 803 804 === Classes and Layer together === 805 If you want to use layer and classes together, please note that you have to identify the class via is_prop_set. 806 807 {{{#!mapcss 808 node[railway=signal] { set sgnl; } 809 810 /* it doesn't work */ 811 node.sgnl::layer_signal_icon { z-index: 1000; ... icon: icon/signal-icon.svg; ... } 812 node.sgnl::layer_signal_text { z-index: 1010; ... text: concat("Name of signal: ", tag("ref")); ..... ) 813 814 /* use instead: is_prop_set("...", "default") */ 815 node[is_prop_set("sgnl", "default")]::layer_signal_icon { z-index: 1000; ... icon: icon/signal-icon.svg; ... } 816 node[is_prop_set("sgnl", "default")]::layer_signal_text { z-index: 1010; ... text: concat("Name of signal: ", tag("ref")); ..... ) 817 }}} 818 819 === @supports Conditional Processing === 820 @supports rules are used to skip a section of the style under certain conditions. Typically you want to use a feature which is introduced in a newer version of JOSM, but like to have a fall back style for users of older JOSM clients. This feature came with r8087. Example: 723 821 {{{ 724 822 #!mapcss … … 749 847 }}} 750 848 751 The syntax closely matches the official [http ://dev.w3.org/csswg/css-conditional/ css syntax]. The following conditions are supported:849 The syntax closely matches the official [https://drafts.csswg.org/css-conditional/ css syntax]. The following conditions are supported: 752 850 753 851 {{{#!th … … 769 867 }}} 770 868 {{{#!td 771 Only include {{{@supports}}}section when the current version of JOSM is greater than or equal to the specified number.869 Only include `@supports` section when the current version of JOSM is greater than or equal to the specified number. 772 870 }}} 773 871 |- … … 776 874 }}} 777 875 {{{#!td 778 Only include {{{@supports}}}section when the current version of JOSM is lower than or equal to the specified number.876 Only include `@supports` section when the current version of JOSM is lower than or equal to the specified number. 779 877 }}} 780 878 |- … … 783 881 }}} 784 882 {{{#!td 785 Only include {{{@supports}}}section when the name of the editor / renderer matches the given string. In JOSM, the only accepted value is{{{josm}}}.786 }}} 787 788 Conditions can be combined with {{{and}}}:883 Only include `@supports` section when the name of the editor / renderer matches the given string. In JOSM, the only accepted value is `josm`. 884 }}} 885 886 Conditions can be combined with `and`: 789 887 790 888 {{{ … … 795 893 }}} 796 894 797 Other logical operators like {{{or}}} and {{{not}}}can also be used. Parentheses are needed if you want to combine different logical operators:895 Other logical operators like `or` and `not` can also be used. Parentheses are needed if you want to combine different logical operators: 798 896 799 897 {{{ … … 804 902 }}} 805 903 806 Since @supports rules are only supported in JOSM 8087 and later, you should also specify this as minimum JOSM version in the meta selector: 904 Since @supports rules are only supported in JOSM r8087 and later, you should also specify this as minimum JOSM version in the meta selector: 807 905 808 906 {{{ … … 814 912 }}} 815 913 914 816 915 == Style settings == 817 818 [[Help/Dialog/MapPaint/StyleSettings|Styles settings]] are used to provide the user settings to customize a mappaint style. The user can use them in the MapPaint dialog. Style settings are availible since r7450. The internal style provides style settings since r7454. Note that there are plans to extend the implementation of style settings (currently there are only boolean values supported), so the mapcss syntax for style settings could change in the future (see #10435). 819 820 create a setting: 916 [wikitr:/Help/Dialog/MapPaint/StyleSettings Styles settings] are used to provide the user settings to customize a mappaint style. The user can use them in the [wikitr:/Help/Dialog/MapPaint MapPaint dialog]. The following `type` of settings are available: 917 * `boolean` (since r7450) 918 * `double` (since r15731, see #10435) 919 * `string` (since r15731, see #10435) 920 * `color` (since r16843, see #10435) 921 922 === Settings of type `boolean` === 923 Create a setting of type `boolean`: 821 924 {{{ 822 925 #!mapcss … … 827 930 } 828 931 }}} 829 use a setting: 932 933 Use a setting of type `boolean`: 830 934 {{{ 831 935 #!mapcss … … 836 940 }}} 837 941 838 == Properties == 839 942 === Settings of type `double` === 943 Create a setting of type `double`: 944 {{{ 945 #!mapcss 946 setting::place_font_size { 947 type: double; 948 label: tr("Set place name font size..."); 949 default: 11; 950 } 951 }}} 952 953 Use a setting of type `double`: 954 {{{ 955 #!mapcss 956 node.place, way.place, area.place { 957 font-size: setting("place_font_size"); 958 } 959 }}} 960 961 === Settings of type `string` === 962 Create a setting of type `string`: 963 {{{ 964 #!mapcss 965 setting::textdisplay { 966 type: string; 967 label: tr("key used for displaying"); 968 default: "name"; /* examples for usage: alt_name, old_name, addr:housename, ref, operator, ... */ 969 } 970 }}} 971 972 Use a setting of type `string`: 973 {{{ 974 #!mapcss 975 way { 976 text: tag(setting("textdisplay")); 977 } 978 }}} 979 980 === Settings of type `color` === 981 Create a setting of type `color`. The `default` color can be any color as understood under [wikitr:/Help/Styles/MapCSSImplementation#Propertyvaluesexplanations Property values explanations]: 982 {{{ 983 #!mapcss 984 setting::colordisplay { 985 type: color; 986 label: tr("key used for displaying"); 987 default: colorDisplayCustomPref#FF00FF; 988 } 989 }}} 990 991 Use a setting of type `color`: 992 {{{ 993 #!mapcss 994 way { 995 color: setting("colordisplay"); 996 } 997 }}} 998 999 === Grouping settings === 1000 Similar settings can be grouped together by defining ''settings groups'' (since r15289): 1001 1002 {{{ 1003 #!mapcss 1004 settings::my_group { 1005 label: tr("my wonderful group"); 1006 icon: "my_beautiful_icon"; 1007 } 1008 }}} 1009 1010 Label is mandatory, icon is optional. 1011 1012 Once a setting group is defined, it can be referenced from all settings belonging to it: 1013 1014 {{{ 1015 #!mapcss 1016 setting::hide_icons { 1017 type: boolean; 1018 label: tr("Hide icons at low zoom"); 1019 default: true; 1020 group: "my_group"; 1021 } 1022 }}} 1023 1024 Settings groups are displayed as sub-menus from the style settings menu. If at least two settings belong to a group, a special "Toggle all settings" menu item allows to quickly switch on/off all settings from this group at once. Usage example: [wikitr:/Styles/MapWithAI MapWithAI]. 1025 1026 1027 == Properties ==#Properties 840 1028 === General properties === 841 1029 842 1030 ||= '''Key''' =||= '''Description''' =||= '''Value Format''' =||= '''Default Value''' =|| 843 || {{{z-index}}}|| Specify the order the objects are drawn: The objects with higher z-index are drawn on top of objects with lower z-index || ''Number'' (can be negative) || 0 ||844 || {{{major-z-index}}}|| Similar to{{{z-index}}}, but it has higher priority than{{{z-index}}}. So if one object has a higher{{{major-z-index}}}than the other, it is drawn on top. If the{{{major-z-index}}} is the same, {{{z-index}}}decides. || ''Number'' (can be negative) ||Depends on style element: area: 1, casing: 2, left-/right-casing: 2.1, line-pattern: 2.9, line: 3, point: 4, default-point: 4.1, line-text: 4.9, point-text: 5||845 || {{{object-z-index}}}|| Similar to{{{z-index}}}, but has lower priority. Controls the painting order for overlapping objects. E.g. for two crossing ways with text: Use{{{z-index}}} or {{{major-z-index}}}if you first want to draw the two lines and then the two captions. Use{{{object-z-index}}}if one of the ways should be completely on top of the other. || ''Number'' (can be negative) || 0 ||846 || {{{modifier}}}|| Better control, whether a default line / node symbol is generated by JOSM. This happens when there is no proper style ({{{modifier=false}}}) found on any layer. ||{{{false}}} or {{{true}}} || {{{false}}} for the default layer and {{{true}}}for any other layer ||847 848 1031 || `z-index` || Specify the order the objects are drawn: The objects with higher z-index are drawn on top of objects with lower z-index || ''Number'' (can be negative) || 0 || 1032 || `major-z-index` || Similar to `z-index`, but it has higher priority than `z-index`. So if one object has a higher `major-z-index` than the other, it is drawn on top. If the `major-z-index` is the same, `z-index` decides. || ''Number'' (can be negative) || Depends on style element: area: 1, casing: 2, left-/right-casing: 2.1, line-pattern: 2.9, line: 3, point: 4, default-point: 4.1, line-text: 4.9, point-text: 5 || 1033 || `object-z-index` || Similar to `z-index`, but has lower priority. Controls the painting order for overlapping objects. E.g. for two crossing ways with text: Use `z-index` or `major-z-index` if you first want to draw the two lines and then the two captions. Use `object-z-index` if one of the ways should be completely on top of the other. || ''Number'' (can be negative) || 0 || 1034 || `modifier` || Better control, whether a default line / node symbol is generated by JOSM. This happens when there is no proper style (`modifier=false`) found on any layer. || `false` or `true` || `false` for the default layer and `true` for any other layer || 1035 1036 Note that due to performance reasons the values for the three z-indexes are limited to 24 bit float values with max. 5 decimal digits. Currently the internal mappaint style uses values with max. 2 digits before and after the decimal separator. To avoid problems use values of z-indexes between -99.999 and +99.999. (See also #14485) 849 1037 850 1038 === Icon and symbol styles === 851 1039 852 1040 ||= '''Key''' =||= '''Description''' =||= '''Value Format''' =||= '''Default Value''' =|| 853 || {{{icon-image}}}|| The icon at node position || ''Image'' || - ||854 || {{{icon-opacity}}}|| Opacity of the icon image || ''Opacity'' || 1.0 ||855 || {{{icon-width}}}|| Width of the icon. If only one of the properties{{{icon-width}}} and {{{icon-height}}}is given, the image will be scaled proportionally. The icon will keep the original size, if neither{{{icon-width}}} nor {{{icon-height}}}is set. || ''Number'' || - ||856 || {{{icon-height}}}|| Height of the icon. (See{{{icon-width}}}) || ''Number'' || - ||1041 || `icon-image` || The icon at node position. See also [wikitr:/Help/Styles/Images Images]. || ''Image'' || - || 1042 || `icon-opacity` || Opacity of the icon image || ''Opacity'' || 1.0 || 1043 || `icon-width` || Width of the icon. If only one of the properties `icon-width` and `icon-height` is given, the image will be scaled proportionally. The icon will keep the original size, if neither `icon-width` nor `icon-height` is set. || ''Number'' || - || 1044 || `icon-height` || Height of the icon. (See `icon-width`) || ''Number'' || - || 857 1045 || `icon-offset-x` || Shift the icon in horizontal direction (positive values to the right) (since r8085) || ''Number'' || 0 || 858 1046 || `icon-offset-y` || Shift the icon in vertical direction (positive values downwards) (since r8085) || ''Number'' || 0 || 859 || `icon-rotation` || Rotate the icon clockwise or anti clockwise (negative value)(since r8260) || `[rad]`, `[rad]rad`, `[deg]°`, `[deg]deg`, `[grad]grad`, `[turn]turn` ([https://developer.mozilla.org/en/docs/Web/CSS/angle definition]) or a cardinal direction (e.g. `northeast` or `sw`); See also the functions `degree_to_radians`, `cardinal_to_radians`. || - || 860 || {{{symbol-shape}}} || Display a symbol at the position of the node || {{{square}}}, {{{circle}}}, {{{triangle}}}, {{{pentagon}}}, {{{hexagon}}}, {{{heptagon}}}, {{{octagon}}}, {{{nonagon}}}, {{{decagon}}} || - || 861 || {{{symbol-size}}} || Size of the symbol || ''Number'', can be relative ("+4") || 10 || 862 || {{{symbol-stroke-width}}} || outline stroke width || ''Width'' || 1.0 if {{{symbol-stroke-color}}} is set || 863 || {{{symbol-stroke-color}}} || line color || ''Color'' || {{{#FFC800}}} if {{{symbol-stroke-width}}} is set || 864 || {{{symbol-stroke-opacity}}} || line opacity || ''Opacity'' || 1.0 || 865 || {{{symbol-fill-color}}} || fill color for the shape || ''Color'' || {{{blue}}}, unless either {{{symbol-stroke-width}}} or {{{symbol-stroke-color}}} is set || 866 || {{{symbol-fill-opacity}}} || fill opacity || ''Opacity'' || 1.0 || 867 || {{{text-...}}}, {{{font-...}}} |||||| general text & font properties || 868 || {{{text-anchor-horizontal}}} || horizontal text label placement || {{{left}}}, {{{center}}}, {{{right}}} || {{{right}}} || 869 || {{{text-anchor-vertical}}} || vertical text label placement || {{{above}}}, {{{top}}}, {{{center}}}, {{{bottom}}}, {{{below}}} || {{{bottom}}} || 870 871 Do not rely on the default values for {{{symbol-...}}} properties (except for {{{opacity}}}). They are intended for "quick & dirty" style sheets and should be set to an explicit value. 872 873 874 875 876 877 === Line styles === 1047 || `icon-rotation` || Rotate the icon clockwise or anti clockwise (negative value)(since r8260) || `[rad]`, `[rad]rad`, `[deg]°`, `[deg]deg`, `[grad]grad`, `[turn]turn` ([https://developer.mozilla.org/en/docs/Web/CSS/angle definition]) \\ or a cardinal direction (e.g. `northeast` or `sw`); \\ or `way` to rotate the icon in the direction of the parent way. \\ See also the functions `degree_to_radians`, `cardinal_to_radians`. \\Since version 18678 function parent_way_angle() is an alternativ to way: e.g. {{{ way > node[...]::layer_x { ... icon-rotation: parent_way_angle(); ... } }}} || - || 1048 || `icon-position` || Define the position of the icon for areas. Same as `text-position` (since r11730). || `center`, `inside`, `line` || `center` || 1049 || `symbol-shape` || Display a symbol at the position of the node || `square`, `circle`, `triangle`, `pentagon`, `hexagon`, `heptagon`, `octagon`, `nonagon`, `decagon` || - || 1050 || `symbol-size` || Size of the symbol || ''Number'', can be relative ("+4") || 10 || 1051 || `symbol-stroke-width` || outline stroke width || ''Width'' || 1.0 if `symbol-stroke-color` is set || 1052 || `symbol-stroke-color` || line color || ''Color'' || `#FFC800` if `symbol-stroke-width` is set || 1053 || `symbol-stroke-opacity` || line opacity || ''Opacity'' || 1.0 || 1054 || `symbol-fill-color` || fill color for the shape || ''Color'' || `blue`, unless either `symbol-stroke-width` or `symbol-stroke-color` is set || 1055 || `symbol-fill-opacity` || fill opacity || ''Opacity'' || 1.0 || 1056 || `text-...`, `font-...` |||||| see general '''Text & Font properties''' || 1057 1058 Do not rely on the default values for `symbol-...` properties (except for `opacity`). They are intended for "quick & dirty" style sheets and should be set to an explicit value. 1059 1060 === Line styles ===#LineStyles 878 1061 ||= '''Key''' =||= '''Description''' =||= '''Value Format''' =||= '''Default Value''' =|| 879 || {{{width}}} || Line width || ''Width'' || - || 880 || {{{color}}} || Line color || ''Color'' || value of {{{fill-color}}} or (if unset) JOSM's default untagged color ({{{#808080}}}) || 881 || {{{opacity}}} || How transparent the line is. || ''Opacity'' || 1.0 || 882 || {{{dashes}}} || An array of alternating on/off lengths || list of numbers, e.g. [[br]]> 15, 5 [[br]][[br]]may be written as expression: [[br]] > {{{list(3, 4, 5, 6)}}} [[br]][[br]]or the keyword {{{none}}}[[br]]to turn dashes off || - || 883 || {{{dashes-offset}}} || shift the dash pattern by a certain amount || ''Number'' (>= 0) || 0 || 884 || {{{dashes-background-color}}} || The color to use in between the dashes (optional) || ''Color'' || - || 885 || {{{dashes-background-opacity}}} || Opacity value for the dashes background || ''Opacity'' || value of {{{opacity}}} || 886 || {{{linecap}}} || Shape at the end of the line (see [http://www.w3.org/TR/SVG/painting.html#StrokeLinecapProperty here]) || {{{none}}}, {{{round}}}, {{{square}}} || {{{none}}} || 887 || {{{linejoin}}} || Shape at the line corners || {{{round}}}, {{{miter}}}, {{{bevel}}} || {{{round}}} || 888 || {{{miterlimit}}} || Applies for {{{linejoin: miter}}}. Sets the maximum overshoot when line segments meet at a very small angle || ''Number'' (>= 1.0) || 10.0 || 889 || {{{offset}}} || Move line to the left or right (when looking in way direction). This could be used to draw multiple lanes for one way or mark left and right side of a way differently. || ''Number'' (positive value moves line to the left, negative to the right) || 0 || 890 || {{{text-position}}} || set to {{{line}}}, if text should be drawn along the line || {{{line}}}, {{{center}}} || - || 891 || {{{text-...}}}, {{{font-...}}} |||||| general text & font properties || 892 || `repeat-image` || repeated image along a line ''[since 5801]'' || ''Image'' || - || 893 || `repeat-image-width` || Width of the image (optional, see `icon-width`) ''[since 5811]'' || ''Number'' || - || 894 || `repeat-image-height` || Height of the image (optional) ''[since 5811]'' || ''Number'' || - || 895 || `repeat-image-align` || Alignment of the image. Top-, bottom edge or the (horizontal) center line of the image will be along the line ''[since 5801]'' || `top`, `center`, `bottom` || `center` || 896 || `repeat-image-offset` || Offset from the line ''[since 5801]'' || ''Number'' || 0 || 897 || `repeat-image-spacing` || Spacing between repeated images ''[since 5801]'' || ''Number'' || 0 || 898 || `repeat-image-phase` || Initial spacing at the beginning of the line ''[since 5812]'' || ''Number'' || 0 || 899 900 All these properties (except for {{{text-...}}} and {{{font-...}}}) exist also with the {{{casing-}}} prefix. The casing is a second independent line element, that is drawn below the normal line and can be used to draw a thin frame around the line in another color. 1062 || `width` || Line width || ''Width'' || - || 1063 || `color` || Line color || ''Color'' || value of `fill-color` or\\(if unset) JOSM's default \\untagged color (`#808080`) || 1064 || `opacity` || How transparent the line is. || ''Opacity'' || 1.0 || 1065 || `dashes` || An array of alternating on/off lengths || list of numbers, e.g. \\> 15, 5 \\ \\may be written as expression: \\ > `list(3, 4, 5, 6)` \\ \\or the keyword `none` \\to turn dashes off || - || 1066 || `dashes-offset` || shift the dash pattern by a certain amount || ''Number'' (>= 0) || 0 || 1067 || `dashes-background-color` || The color to use in between the dashes (optional) || ''Color'' || - || 1068 || `dashes-background-opacity` || Opacity value for the dashes background || ''Opacity'' || value of `opacity` || 1069 || `linecap` || Shape at the end of the line (see [https://www.w3.org/TR/SVG/painting.html#StrokeLinecapProperty here]) || `none`, `round`, `square` || `none` || 1070 || `linejoin` || Shape at the line corners || `round`, `miter`, `bevel` || `round` || 1071 || `miterlimit` || Applies for `linejoin: miter`. \\Sets the maximum overshoot when line segments meet at a very small angle || ''Number'' (>= 1.0) || 10.0 || 1072 || `offset` || Move line to the left or right (when looking in way direction). \\This could be used to draw multiple lanes for one way or mark left and right side of a way differently. || ''Number'' (positive value moves line to the left,\\negative to the right) || 0 || 1073 || `text-position` || set to `line`, if text should be drawn along the line || `line`, `center` || - || 1074 || `text-...`,\\`font-...` |||||| see general '''Text & Font properties || 1075 || `repeat-image` || repeated image along a line ''(since r5801)'' || ''Image'' || - || 1076 || `repeat-image-width` || Width of the image (optional, see `icon-width`) ''(since r5811)'' || ''Number'' || - || 1077 || `repeat-image-height` || Height of the image (optional) ''(since r5811)'' || ''Number'' || - || 1078 || `repeat-image-align` || Alignment of the image.\\Top-, bottom edge or the (horizontal) center line of the image will be along the line ''(since r5801)'' || `top`, `center`, `bottom` || `center` || 1079 || `repeat-image-offset` || Offset from the line ''(since r5801)'' || ''Number'' || 0 || 1080 || `repeat-image-spacing` || Spacing between repeated images ''(since r5801)'' || ''Number'' || 0 || 1081 || `repeat-image-phase` || Initial spacing at the beginning of the line ''(since r5812)'' || ''Number'' || 0 || 1082 || `repeat-image-opacity` || Opacity of the repeated image ''(since r16700)'' || ''Number'' || 1.0 || 1083 1084 All these properties (except for `text-...` and `font-...`) exist also with the `casing-` prefix. The casing is a second independent line element, that is drawn below the normal line and can be used to draw a thin frame around the line in another color. 901 1085 ||= '''Key''' =||= '''Description''' =||= '''Value Format''' =||= '''Default Value''' =|| 902 || {{{casing-width}}}|| Width of the border on both sides of the main line. In JOSM < 5214: Total width of the casing || ''Width'' (revers to{{{width}}}if relative width is specified) || - ||903 || {{{casing-color}}}|| Casing color || ''Color'' || value of{{{fill-color}}}or (if unset) JOSM's default untagged color ({{{#808080}}}) ||904 || {{{casing-opacity}}}|| How transparent the casing is. || ''Opacity'' || 1.0 ||905 || {{{casing-}}}... || ... || ... || ... ||906 Similar to {{{casing-}}}, there is also the{{{left-casing-}}} and {{{right-casing-}}}prefix. It draws additional lines to the left and to the right of the main line.907 908 === Area styles === 909 ||= '''Key''' =||= '''Description''' =||= '''Value Format''' =||= '''Default Value''' =||910 || {{{fill-color}}}|| Color in which to fill the area || ''Color'' || - ||911 || {{{fill-image}}}|| Image pattern || ''Image'' || - ||912 || {{{fill-extent}}} || Set this property, to draw only the outline of the area. The number specifies, how far to fill from the border of the area towards the center. (If unset, the area will be filled completely) ''[since 9008]'' || ''Number'' || - ||913 || {{{fill-opacity}}} || How transparent the fill is; applies to both color and image || ''Opacity'' || 1.0||914 || {{{text-position}}} || set to {{{center}}}, if text should be drawn in the center of the area || {{{line}}}, {{{center}}} || -||915 || {{{text-...}}}, {{{font-...}}} |||||| general text & font properties||916 Requiredpropertiesto create an Area style: {{{fill-color}}} or {{{fill-image}}}917 1086 || `casing-width` || Width of the border on both sides of the main line. \\In JOSM < 5214: Total width of the casing || ''Width'' (revers to `width` if relative width is specified) || - || 1087 || `casing-color` || Casing color || ''Color'' || value of `fill-color` or (if unset) \\JOSM's default untagged color (`#808080`) || 1088 || `casing-opacity` || How transparent the casing is. || ''Opacity'' || 1.0 || 1089 || `casing-`... || ... || ... || ... || 1090 Similar to `casing-`, there is also the `left-casing-` and `right-casing-` prefix. It draws additional lines to the left and to the right of the main line. 1091 1092 === Area styles ===#AreaStyles 1093 ||= '''Key''' =||= '''Description''' =||= '''Value Format''' =||= '''Default Value''' =|| 1094 || `fill-color` || Color in which to fill the area. Until 11700, the alpha component was set to 50 to create a transparency effect. || ''Color'' || - || 1095 || `fill-image` || Image pattern || ''Image'' || - || 1096 || `fill-extent` || Set this property, to draw only the outline of the area. The number specifies, how far to fill from the border of the area towards the center. (If unset, the area will be filled completely) ''(since r9008)'' || ''Number'' || - || 1097 || `fill-extent-threshold` || Set this property, to draw full area when the given percentage of coverage is reached. Can be greater than 100% as the covered area is estimated as **perimeter * extent**. || ''Number'' || - || 1098 || `fill-opacity` || How transparent the fill is; applies to both color and image || ''Opacity'' || 0.2 ''(since r11700, 1.0 before that)'' \\(can be changed with the `mappaint.fillalpha` and \\`mappaint.fill-image-alpha` preferences) || 1099 || `text-position` || set to `center`, if text should be drawn in the center of the area. Set to `inside` to place the text completely inside the area. ''(since r11722)'' || `line`, `center`, `inside` || - || 1100 || `text-...`, `font-...` |||||| see general text & font properties || 1101 Required properties to create an Area style: `fill-color` or `fill-image` 918 1102 919 1103 === Text & Font properties === 920 {{{#!th align=leftvalign=top1104 {{{#!th valign=top 921 1105 '''Key''' 922 1106 }}} 923 {{{#!th align=leftvalign=top1107 {{{#!th valign=top 924 1108 '''Description''' 925 1109 }}} 926 {{{#!th align=leftvalign=top1110 {{{#!th valign=top 927 1111 '''Value Format''' 928 1112 }}} 929 {{{#!th align=leftvalign=top1113 {{{#!th valign=top 930 1114 '''Default Value''' 931 1115 }}} 932 1116 |------------------------------------------------------------------------------- 933 1117 {{{#!td align=left valign=top 934 {{{text}}} 1118 `text` 935 1119 }}} 936 1120 {{{#!td align=left valign=top 937 How to find the label text. No label is displayed, unless this instruction is present.1121 How to find the label text.\\No label is displayed, unless this instruction is present. 938 1122 }}} 939 1123 {{{#!td align=left valign=top 940 {{{auto}}} 941 Derive the text automatically. The default name tags are: "{{{name:}}}"+''<LANG>'',"{{{name}}}", "{{{int_name}}}", "{{{ref}}}", "{{{operator}}}", "{{{brand}}}" and "{{{addr:housenumber}}}".942 943 Configure a list of tag names in the preference "{{{mappaint.nameOrder}}}" in order to change this list. (After changing the list, a restart of JOSM is required.)1124 `auto` 1125 Derive the text automatically. The default name tags are: "`name:`"+''<LANG>'', \\"`name`", "`int_name`", "`ref`", "`operator`", "`brand`" and "`addr:housenumber`". 1126 1127 Configure a list of tag names in the preference "`mappaint.nameOrder`" in order \\ to change this list. (After changing the list, a restart of JOSM is required.) 944 1128 945 1129 ''String'' 946 Denotes the key of the tag whose value is used as text.1130 Denotes the key of the tag whose value is used as text. 947 1131 948 1132 ''Expressions'' 949 1133 You can enter an expression to compute the text to be displayed. Examples: 950 * {{{eval("this is a static text")}}}- renderes a static text951 * {{{eval(concat(tag("first"), "-", tag("second")))}}}- displays the concatenated tags "first" and "second"952 953 {{{""}}} 1134 * `eval("this is a static text")` - renderes a static text 1135 * `eval(concat(tag("first"), "-", tag("second")))` - displays \\ the concatenated tags "first" and "second" 1136 1137 `""` 954 1138 To delete a previous set text. 955 1139 }}} … … 958 1142 }}} 959 1143 |------------------------------------------------------------------------------- 960 || {{{text-color}}} || the text color || ''Color'' || {{{white}}} for lines and nodes, {{{#c0c0c0}}} for areas (JOSM "{{{text}}}" and "{{{areatext}}}" color preferences) || 961 || {{{text-opacity}}} || how transparent the text is || ''Opacity'' || 1.0 || 962 || {{{text-offset-x}}} || shift the text horizontally, (not supported for text along line) || ''Number'' || 0 || 963 || {{{text-offset-y}}} (can also be written as {{{text-offset}}}) || shift the text vertically, positive values shift the text in upwards direction || ''Number'' || 0 || 964 || {{{text-halo-radius}}} || size of text background border (to make text visible on background with a similar color) || ''Number'' || - || 965 || {{{text-halo-color}}} || color of the text halo || ''Color'' || complement of the text color || 966 || {{{text-halo-opacity}}} || transparency for the text halo || ''Opacity'' || 1.0 || 967 || {{{font-family}}} || font family || ''String'' || "Helvetica"[[br]](JOSM preference "mappaint.font") || 968 || {{{font-size}}} || font size || ''Number'' || 8[[br]](JOSM preference "mappaint.fontsize") || 969 || {{{font-weight}}} || bold or not || {{{bold}}}, {{{normal}}} || {{{normal}}} || 970 || {{{font-style}}} || italic or not || {{{italic}}}, {{{normal}}} || {{{normal}}} || 971 1144 || `text-color` || the text color || ''Color'' || `white` for lines and nodes,\\`#c0c0c0` for areas \\(JOSM "`text`" and "`areatext`"\\color preferences) || 1145 || `text-opacity` || how transparent the text is || ''Opacity'' || 1.0 || 1146 || `text-offset-x` || shift the text horizontally, \\(not supported for text along line) || ''Number'' || 0 || 1147 || `text-offset-y`\\(can also be written as\\`text-offset`) || shift the text vertically, positive values shift the text in upwards direction || ''Number'' || 0 || 1148 || `text-halo-radius` || size of text background border \\(to make text visible on background \\with a similar color) || ''Number'' || - || 1149 || `text-halo-color` || color of the text halo || ''Color'' || complement of the text color || 1150 || `text-halo-opacity` || transparency for the text halo || ''Opacity'' || 1.0 || 1151 || `text-anchor-horizontal` || horizontal text label placement || `left`, `center`, `right` || `right` || 1152 || `text-anchor-vertical` || vertical text label placement || `above`, `top`, `center`, `bottom`, `below` || `bottom` || 1153 || `text-rotation` || Rotate the text clockwise or anti clockwise (negative value)\\(since r16253) || `[rad]`, `[rad]rad`, `[deg]°`, `[deg]deg`, `[grad]grad`, `[turn]turn` \\([https://developer.mozilla.org/en/docs/Web/CSS/angle definition]) or a cardinal direction (e.g. `northeast` or `sw`); \\ or `way` to rotate the text in the direction of the parent way. \\See also the functions `degree_to_radians`, `cardinal_to_radians`. \\Since version 18678 function parent_way_angle() is an alternativ to way: e.g. {{{ way > node[...]::layer_x { ... text-rotation: parent_way_angle(); ... } }}} \\(Note that the direction means where the upper edge of the text faces.\\That means with the default direction of north the text flows to east\\(with a left to right language). \\So if you want to flow it to e.g. south you need to set east.) || - || 1154 || `text-position` |||||| see [#AreaStyles Area styles] and [#LineStyles Line styles] || 1155 || `font-family` || font family || ''String'' || "Droid Sans" \\(JOSM preference "`mappaint.font`") || 1156 || `font-size` || font size || ''Number'' || 8 \\(JOSM preference "`mappaint.fontsize`") || 1157 || `font-weight` || bold or not || `bold`, `normal` || `normal` || 1158 || `font-style` || italic or not || `italic`, `normal` || `normal` || 1159 1160 === User defined properties === 1161 * In [wikitr:/Styles Mappaint styles] you can define any custom property, e.g.: `crc: CRC32_checksum(tag(name))/429496.7296;` 1162 * In [wikitr:/Rules Validator rules] they must be prefixed by a `-`, e.g.: `-osmoseItemClassLevel: "1210/1/1";` 1163 1164 === Property values explanations === #Propertyvaluesexplanations 972 1165 '' '''Width''' '' 973 1166 - 14.0 (any positive number) 974 - {{{default}}}(use JOSM's default line width, which is 2, but can be configured)975 - {{{thinnest}}}(draws the line as thin as possible)976 - +3 (with plus sign in front) adds the amount to the width on the default layer. This applies only for styles that are not on the default layer, e.g. highlights. Another way to write this would be {{{prop("width","default")+3}}}. For {{{casing-width}}}, this refers to the {{{width}}}value on the same layer.1167 - `default` (use JOSM's default line width, which is 2, but can be configured) 1168 - `thinnest` (draws the line as thin as possible) 1169 - +3 (with plus sign in front) adds the amount to the width on the default layer. This applies only for styles that are not on the default layer, e.g. highlights. Another way to write this would be `prop("width","default")+3`. For `casing-width`, this refers to the `width` value on the same layer. 977 1170 978 1171 '' '''Image''' '' 979 See [wiki :Help/Styles/Images].1172 See [wikitr:/Help/Styles/Images]. 980 1173 981 1174 '' '''Color''' '' 982 * named color as found in [http://www.w3.org/TR/css3-color/#svg-color this] list 983 * html style: '''{{{#RRGGBB}}}''', '''{{{#RGB}}}''', '''{{{#RRGGBBAA}}}''' 984 * '''{{{rgb(/*r*/, /*g*/, /*b*/)}}}''' - rgb value with arguments from 0.0 to 1.0 985 * '''{{{rgba(/*r*/, /*g*/, /*b*/, /*alpha*/)}}}''' - rgb value with alpha 986 * '''{{{hsb_color(/*hue*/, /*saturation*/, /*brightness*/)}}}''' - color from HSB color space 1175 * named color as found in [https://www.w3.org/TR/css3-color/#svg-color this] list 1176 * html style: '''`#RRGGBB`''', '''`#RGB`''', '''`#RRGGBBAA`''' 1177 * '''`rgb(/*r*/, /*g*/, /*b*/)`''' - rgb value with arguments from 0.0 to 1.0 1178 * '''`rgba(/*r*/, /*g*/, /*b*/, /*alpha*/)`''' - rgb value with alpha 1179 * '''`hsb_color(/*hue*/, /*saturation*/, /*brightness*/)`''' - color from HSB color space 1180 * if the color is prefixed with a name and #, e.g. `color: highway_track#6e541c;` it will appear in the [wikitr:/Help/Preferences/ColorPreference Color Preference] and end users can adjust the color there themself 987 1181 988 1182 '' '''Opacity''' '' … … 990 1184 991 1185 '' '''String''' '' 992 * any character sequence, in quotes, e.g. {{{"images/fill.png"}}}. If the string is an identifier, quotes are optional. (Quote and backslash sign can be escaped.)1186 * any character sequence, in quotes, e.g. `"images/fill.png"`. If the string is an identifier, quotes are optional. (Quote and backslash sign can be escaped.) 993 1187 994 1188 '' '''Number''' '' … … 996 1190 * has a special meaning if you put a "+" sign in front (relative width) 997 1191 998 == Eval expressions == 999 1000 1001 See [/doc/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.Functions.html#method_summary Javadoc of Functions] for the up-to-date list of functions supported by JOSM's MapCSS implementation. 1192 1193 == Eval expressions ==#Evalexpressions 1194 See [/doc/org/openstreetmap/josm/gui/mappaint/mapcss/Functions.html#method_summary Javadoc of Functions] for the up-to-date list of functions supported by JOSM's MapCSS implementation. 1002 1195 1003 1196 +, -, *, /:: … … 1005 1198 ||, &&, !:: 1006 1199 boolean operations 1007 <, >, <=, >=, ==:: 1200 <, >, <=, >=, ==, !=:: 1008 1201 comparison operators 1009 asin, atan, atan2, ceil, cos, cosh, exp, floor, log, max, min, random, round, signum, sin, sinh, sqrt, tan, tanh:: 1010 the usual meaning, [http ://download.oracle.com/javase/7/docs/api/java/lang/Math.html details]1202 asin, atan, atan2, ceil, cos, cosh, exp, floor, log, max, min, mod (since r17759), random, round, signum, sin, sinh, sqrt, tan, tanh:: 1203 the usual meaning, [https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Math.html details] 1011 1204 cond(b, fst, snd):: 1012 1205 b ? fst : snd:: 1013 1206 if ('''b''') then '''fst''' else '''snd''' 1014 1207 list(a, b, ...):: 1015 create list of values, e.g. for the {{{dashes}}}property1208 create list of values, e.g. for the `dashes` property 1016 1209 get(lst, n):: 1017 get the ''n''th element of the list ''lst'' (counting starts at 0) [''since 5699''] 1210 get the ''n''th element of the list ''lst'' (counting starts at 0) [''since r5699''] 1018 1211 split(sep, str):: 1019 splits string ''str'' at occurrences of the separator string ''sep'', returns a list [''since 5699''] 1212 splits string ''str'' at occurrences of the separator string ''sep'', returns a list [''since r5699''] 1020 1213 prop(''p_name''):: 1021 value of the property ''p_name'' of the current layer, e.g. prop( {{{"width"}}})1214 value of the property ''p_name'' of the current layer, e.g. prop(`"width"`) 1022 1215 prop(''p_name'', ''layer_name''):: 1023 1216 property from the layer ''layer_name'' … … 1031 1224 get the value of the key ''key_name'' from the object's parent 1032 1225 parent_tags(''key_name''):: 1033 returns all parent's values for the key ''key_name'' as a list ordered by a natural ordering [''since 8775''] 1226 returns all parent's values for the key ''key_name'' as a list ordered by a natural ordering [''since r8775''] 1034 1227 has_tag_key(''key_name''):: 1035 1228 true, if the object has a tag with the given key … … 1037 1230 create color value (arguments from 0.0 to 1.0) 1038 1231 hsb_color(''h'', ''s'', ''b''):: 1039 create color from hue, saturation and brightness (arguments from 0.0 to 1.0) [''since 6899''] 1232 create color from hue, saturation and brightness (arguments from 0.0 to 1.0) [''since r6899''] 1040 1233 red(''clr''), green(''clr''), blue(''clr''):: 1041 1234 get value of color channels in rgb color model 1042 1235 alpha(''clr''):: 1043 get the alpha value of the given color [''since 6749''] 1236 get the alpha value of the given color [''since r6749''] 1044 1237 length(''str''):: 1045 1238 length of a string 1046 1239 count(''lst''):: 1047 length of a list, i.e., counts its elements [''since 7162''] 1240 length of a list, i.e., counts its elements [''since r7162''] 1048 1241 length(''lst''):: 1049 length of a list [''since 5699''] – deprecated ''since 7162'' 1242 length of a list ([''since r5699''] – deprecated ''since r7162'' 1050 1243 any(obj1, obj2, ...):: 1051 returns the first object which is not null (formerly coalesce, [''since 7164'']) 1244 returns the first object which is not null (formerly coalesce, [''since r7164'']) 1052 1245 concat(''str1'', ''str2'', ...):: 1053 1246 assemble the strings to one 1054 1247 join(''sep'', ''str1'', ''str2'', ...):: 1055 join strings, w hith ''sep'' as separator [''since 6737'']1248 join strings, with ''sep'' as separator [''since r6737''] 1056 1249 join_list(''sep'', ''list_name''):: 1057 joins the elements of the list ''list_name'' to one string separated by the separator ''sep'' [''since 8775''] 1250 joins the elements of the list ''list_name'' to one string separated by the separator ''sep'' [''since r8775''] 1251 upper(''str''):: 1252 converts string to upper case [''since r11756''] 1253 lower(''str''):: 1254 converts string to lower case [''since r11756''] 1255 title(''str''):: 1256 converts string to title case [''since r17613''] (`"i am FINE"` → `"I Am Fine"`) 1257 trim(''str''):: 1258 remove leading and trailing whitespace from string [''since r11756''] 1259 trim_list(''list_name''):: 1260 remove leading and trailing whitespace from a list of strings, will remove entries that are empty afterwards [''since r15591''] 1058 1261 JOSM_search("..."):: 1059 1262 true, if JOSM search applies to the object 1060 1263 tr(str, arg0, arg1, ...):: 1061 translate from English to the current language (only for strings in the JOSM user interface) [''since 6506''] 1264 translate from English to the current language (only for strings in the JOSM user interface) [''since r6506''] 1062 1265 regexp_test(regexp, string):: 1063 test if ''string'' matches pattern ''regexp'' [''since 5699''] 1266 test if ''string'' matches pattern ''regexp'' [''since r5699''] 1064 1267 regexp_test(regexp, string, flags):: 1065 test if ''string'' matches pattern ''regexp''; flags is a string that may contain "i" (case insensitive), "m" (multiline) and "s" ("dot all") [''since 5699''] 1268 test if ''string'' matches pattern ''regexp''; flags is a string that may contain "i" (case insensitive), "m" (multiline) and "s" ("dot all") [''since r5699''] 1066 1269 regexp_match(regexp, string):: 1067 Tries to match ''string'' against pattern ''regexp''. Returns a list of capture groups in case of success. The first element (index 0) is the complete match (i.e. ''string''). Further elements correspond to the bracketed parts of the regular expression. [''since 5701''] 1270 Tries to match ''string'' against pattern ''regexp''. Returns a list of capture groups in case of success. The first element (index 0) is the complete match (i.e. ''string''). Further elements correspond to the bracketed parts of the regular expression. [''since r5701''] 1068 1271 regexp_match(regexp, string, flags):: 1069 Tries to match ''string'' against pattern ''regexp''. Returns a list of capture groups in case of success. The first element (index 0) is the complete match (i.e. ''string''). Further elements correspond to the bracketed parts of the regular expression. Flags is a string that may contain "i" (case insensitive), "m" (multiline) and "s" ("dot all") [''since 5701''] 1272 Tries to match ''string'' against pattern ''regexp''. Returns a list of capture groups in case of success. The first element (index 0) is the complete match (i.e. ''string''). Further elements correspond to the bracketed parts of the regular expression. Flags is a string that may contain "i" (case insensitive), "m" (multiline) and "s" ("dot all") [''since r5701''] 1070 1273 substring(str, idx):: 1071 return the substring of ''str'', starting at index ''idx'' (0-indexed) [''since 6534''] 1274 return the substring of ''str'', starting at index ''idx'' (0-indexed) [''since r6534''] 1072 1275 substring(str, start, end):: 1073 return the substring of ''str'', starting at index ''start'' (inclusive) up to ''end'' (exclusive) (0-indexed) [''since 6534'']1276 return the substring of ''str'', starting at index ''start'' (inclusive) up to ''end'' (exclusive) (0-indexed) [''since r6534''], a negative end index counts from the string end [''since r19259''] 1074 1277 replace(string, old, new):: 1075 1278 Replaces any occurrence of the substring ''old'' within the string ''string'' with the text ''new'' 1076 1279 osm_id():: 1077 returns the OSM id of the current object [''since 5699''] 1280 returns the OSM id of the current object [''since r5699''] 1281 osm_user_name():: 1282 returns the OSM user name who last touched the current object [''since r15246''] 1283 osm_user_id():: 1284 returns the OSM user id who last touched the current object [''since r15246''] 1285 osm_version():: 1286 returns the OSM version number of the current object [''since r15246''] 1287 osm_changeset_id():: 1288 returns the id of the changeset the current object was last uploaded to [''since r15246''] 1289 osm_timestamp():: 1290 returns the time of last modification to the current object, as timestamp [''since r15246''] 1291 parent_osm_id():: 1292 returns the OSM id of the object's parent (matched by child selector) [''since r13094''] 1078 1293 URL_encode(str):: 1079 [https://en.wikipedia.org/wiki/Percent-encoding percent-encode] a string. May be useful for data URLs [''since 6805''] 1294 [https://en.wikipedia.org/wiki/Percent-encoding percent-encode] a string. May be useful for data URLs [''since r6805''] 1295 URL_decode(str):: 1296 [https://en.wikipedia.org/wiki/Percent-encoding percent-decode] a string. [''since r11756''] 1080 1297 XML_encode(str):: 1081 escape special characters in xml. E.g. {{{<}}}becomes{{{<}}}, other special characters:{{{>}}}, {{{"}}}, {{{'}}}, {{{&}}}, {{{\n}}}, {{{\t}}} and {{{\r}}}[''since 6809'']1298 escape special characters in xml. E.g. `<` becomes `<`, other special characters: `>`, `"`, `'`, `&`, `\n`, `\t` and `\r` [''since r6809''] 1082 1299 CRC32_checksum(''str''):: 1083 calculate the CRC32 checksum of a string (result is an integer from 0 to 2^32^-1) [''since 6908''] 1084 is_right_hand_traffic() [''since 7193'']:: 1085 Check if there is left-hand or right-hand traffic at the current location. 1086 number_of_tags() [''since 7237'']:: 1087 returns the number of tags for the current OSM object 1088 print(o) [''since 7237'']:: 1089 prints a string representation of `o` to the command line (for debugging) 1090 println(o) [''since 7237'']:: 1091 prints a string representation of `o` to the command line, followed by a new line (for debugging) 1092 JOSM_pref(''key'', ''default'') [''since 7238, with restrictions since 3856'']:: 1093 Get value from the JOSM advanced preferences. This way you can offer certain options to the user and make the style customizable. It works with strings, numbers, colors and boolean values. [[br]][This function exists since version 3856, but with some restrictions. `JOSM_pref` always returns a string, but in version 7237 and earlier, the automatic conversion of string to boolean and color was not working. You can use the following workarounds for boolean values and color in version 7237 and earlier: `cond(JOSM_pref("myprefkey", "true")="true", "X", "O")` and `html2color(JOSM_pref("mycolor", "#FF345611"))`. These explicit conversions should be no longer necessary in version 7238 and later. Automatic conversion to a number works in any version.] 1094 setting() [''since 7450'']:: 1095 to use a [[Help/Styles/MapCSSImplementation#Stylesettings|style setting]] 1096 degree_to_radians() [''since 8260'']:: 1097 returns a in degree given direction in radians 1098 cardinal_to_radians() [''since 8260'']:: 1099 returns a cardinal direction in radians 1100 waylength() [''since 8253'']:: 1101 returns the length of the way in metres 1102 areasize() [''since 8253'']:: 1103 returns the area of a closed way in square meters 1104 1105 1300 calculate the CRC32 checksum of a string (result is an integer from 0 to 2^32^-1) [''since r6908''] 1301 siunit_length(''str''):: 1302 convert length units to meter (fault tolerant, ignoring white space) [''since r19089''] 1303 is_right_hand_traffic():: 1304 Check if there is left-hand or right-hand traffic at the current location. [''since r7193''] 1305 number_of_tags():: 1306 returns the number of tags for the current OSM object [''since r7237''] 1307 print(o):: 1308 prints a string representation of `o` to the command line (for debugging) [''since r7237''] 1309 println(o):: 1310 prints a string representation of `o` to the command line, followed by a new line (for debugging) [''since r7237''] 1311 JOSM_pref(''key'', ''default''):: 1312 Get value from the JOSM advanced preferences. This way you can offer certain options to the user and make the style customizable. It works with strings, numbers, colors and boolean values. \\[This function exists since version r3856, but with some restrictions. `JOSM_pref` always returns a string, but in version r7237 and earlier, the automatic conversion of string to boolean and color was not working. You can use the following workarounds for boolean values and color in version r7237 and earlier: `cond(JOSM_pref("myprefkey", "true")="true", "X", "O")` and `html2color(JOSM_pref("mycolor", "#FF345611"))`. These explicit conversions should be no longer necessary in version r7238 and later. Automatic conversion to a number works in any version. Furthermore, in version r16590, can be used to set color properties. So `* { set_color: JOSM_pref("pref", #000000); }` will create a color property now.] 1313 setting():: 1314 to use a [wikitr:/Help/Styles/MapCSSImplementation#Stylesettings style setting] [''since r7450''] 1315 degree_to_radians():: 1316 returns a in degree given direction in radians [''since r8260''] 1317 cardinal_to_radians():: 1318 returns a cardinal direction in radians [''since r8260''] 1319 waylength():: 1320 returns the length of the way in metres [''since r8253''] 1321 areasize():: 1322 returns the area of a closed way in square meters [''since r8253''] 1323 at(lat,lon):: 1324 returns true if the object centroid lies at given ''lat''/''lon'' coordinates, e.g. to check for nodes at "null island" `node[at(0.0,0.0)]` [''since r12514''] 1325 is_similar(''str1'', ''str2''):: 1326 returns true if the two strings are similar, but not identical, i.e., have a Levenshtein distance of 1 or 2. Example: `way[highway][name][is_similar(tag(name), "Main Street")]` checks for streets with a possible typo in the name (e.g. Main Streeg). [''since r14371''] 1327 gpx_distance():: 1328 returns the lowest distance between the OSM object and a GPX point [''since r14802''] 1329 count_roles():: 1330 returns the number of primitives in a relation with the specified roles [''since r15275''] 1331 sort(''str1'', ''str2'', ''str3'', ''...''):: 1332 sorts an array of strings [''since r15279''] 1333 sort_list(''list_name''):: 1334 sorts a list of strings [''since r15279''] 1335 tag_regex(''regex''):: 1336 returns a list containing the values of keys that match the regex [''since r15317''] 1337 to_boolean(''str''):: 1338 returns the string argument as a boolean [''since r16110''] 1339 to_byte(''str''):: 1340 returns the string argument as a byte [''since r16110''] 1341 to_short(''str''):: 1342 returns the string argument as a short [''since r16110''] 1343 to_int(''str''):: 1344 returns the string argument as a int [''since r16110''] 1345 to_long(''str''):: 1346 returns the string argument as a long [''since r16110''] 1347 to_float(''str''):: 1348 returns the string argument as a float [''since r16110''] 1349 to_double(''str''):: 1350 returns the string argument as a double [''since r16110''] 1351 uniq(''str1'', ''str2'', ''str3'', ''...''):: 1352 returns a list of strings that only have unique values from an array of strings [''since r15323''] 1353 uniq_list(''list_name''):: 1354 returns a list of strings that only have unique values from a list of strings [''since r15323''] 1355 parent_way_angle():: 1356 returns the angle of the parent way as a double in rad [''since r18664''] (see: text-rotation or icon-rotation) 1357 convert_primitive_to_string(''PrimitiveId''):: 1358 returns the primitive id as a string [''since r18829''] 1359 convert_primitives_to_string(''PrimitiveId'', ''PrimitiveId'', ''...''):: 1360 returns a list of primitive ids converted to strings [''since r18829''] 1361 parent_osm_primitives(''optional key'', ''optional value''):: 1362 returns a list of primitive ids which match the key and value (if present) [''since r18829''] 1106 1363 1107 1364 === Examples === 1108 1109 1365 * circle symbol for house number with size depending of the number of digits 1110 1366 {{{ … … 1164 1420 }}} 1165 1421 1422 * casing on inside of area 1423 {{{ 1424 #!mapcss 1425 area[building]:clockwise { 1426 right-casing-width: 10; 1427 } 1428 area[building]:anticlockwise { 1429 left-casing-width: 10; 1430 } 1431 /* or */ 1432 area[building][is_clockwise()] { 1433 right-casing-width: 10; 1434 } 1435 area[building][is_anticlockwise()] { 1436 left-casing-width: 10; 1437 } 1438 }}} 1439 1440 * case insensitive selector. This matches: `Name=Main Street`, but also `naMe=MAIN STREET` 1441 {{{ 1442 #!mapcss 1443 way[/(?i)^name$/ =~ /(?i)^Main Street$/] { 1444 } 1445 }}} 1446 1166 1447 1167 1448 == Compatibility notes == 1168 1449 === MapCSS 0.2 === 1169 1170 1450 ==== Grammar ==== 1171 1172 * {{{way[oneway=yes]}}} does not have any magic, you can use {{{way[oneway?]}}} instead 1173 * no {{{@import}}} 1174 * JOSM does not require {{{eval(...)}}} to be wrapped around expressions, but for compatibility with other MapCSS implementations you should write it out. 1451 * `way[oneway=yes]` does not have any magic, you can use `way[oneway?]` instead 1452 * no `@import` 1453 * JOSM does not require `eval(...)` to be wrapped around expressions, but for compatibility with other MapCSS implementations you should write it out. 1175 1454 1176 1455 ==== Properties ==== 1177 1456 At the moment, JOSM does ''not'' support the following properties: 1178 1457 line: :: 1179 {{{image}}}1458 `image` 1180 1459 label: :: 1181 {{{font-variant, text-decoration, text-transform, max-width}}}1460 `font-variant, text-decoration, text-transform, max-width` 1182 1461 shield: :: 1183 1462 not supported 1184 1463 1185 1464 === Halcyon (Potlatch 2) === 1186 1187 1465 * Text label is placed in the center of the icon. For compatibility with Halcyon put 1188 1466 {{{ … … 1192 1470 at the beginning of your style sheet. 1193 1471 * standard z-index in Halcyon is 5, but it is 0 in JOSM 1194 * ''' {{{image: circle;}}}''' corresponds to '''{{{symbol-shape: circle;}}}'''1472 * '''`image: circle;`''' corresponds to '''`symbol-shape: circle;`''' 1195 1473 1196 1474 === Kothic === 1197 1198 1475 * Kothic has support for eval, which probably differs from JOSM's eval. 1199 1476 * Kothic understands units, whereas JOSM always calculates in pixel. 1200 * The extrusion features are not available in JOSM 1477 * The extrusion features are not available in JOSM. 1201 1478 1202 1479 === Ceyx === 1203 1204 * seems to have {{{[tunnel=1]}}} instead of {{{[tunnel=yes]}}} (Halcyon) or {{{[tunnel?]}}} (JOSM) 1205 1206 == Media queries [''since 6970''](deprecated) ==1480 * seems to have `[tunnel=1]` instead of `[tunnel=yes]` (Halcyon) or `[tunnel?]` (JOSM) 1481 1482 1483 == Media queries (deprecated) == 1207 1484 1208 1485 {{{#!td style="background-color: #faa" 1209 1486 Note: media queries are deprecated. You should use @supports rules instead (see above). 1210 1487 }}} 1211 Media queries are used to skip a section of the style under certain conditions. Typically you want to use a feature which is introduced in a newer version of JOSM, but like to have a fall back style for users of older JOSM clients. Example: 1488 Media queries are used to skip a section of the style under certain conditions. Typically you want to use a feature which is introduced in a newer version of JOSM, but like to have a fall back style for users of older JOSM clients. This feature came with r6970. Example: 1212 1489 {{{ 1213 1490 #!mapcss … … 1231 1508 }}} 1232 1509 1233 The syntax closely matches the official [http://www.w3.org/TR/css3-mediaqueries/#syntax css syntax]. The following conditions are supported: 1510 The syntax closely matches the official [https://www.w3.org/TR/css3-mediaqueries/#syntax css syntax]. The following conditions are supported: 1234 1511 1235 1512 {{{#!th … … 1244 1521 }}} 1245 1522 {{{#!td 1246 Only include {{{@media}}}section when the current version of JOSM is greater than or equal to the specified number.1523 Only include `@media` section when the current version of JOSM is greater than or equal to the specified number. 1247 1524 }}} 1248 1525 |- … … 1251 1528 }}} 1252 1529 {{{#!td 1253 Only include {{{@media}}}section when the current version of JOSM is lower than or equal to the specified number.1530 Only include `@media` section when the current version of JOSM is lower than or equal to the specified number. 1254 1531 }}} 1255 1532 |- … … 1258 1535 }}} 1259 1536 {{{#!td 1260 Only include {{{@media}}}section when the name of the editor / renderer matches the given string. In JOSM, the only accepted value is{{{josm}}}.1261 }}} 1262 1263 Conditions can be combined with {{{and}}}:1537 Only include `@media` section when the name of the editor / renderer matches the given string. In JOSM, the only accepted value is `josm`. 1538 }}} 1539 1540 Conditions can be combined with `and`: 1264 1541 1265 1542 {{{ … … 1291 1568 1292 1569 {{{#!comment 1293 There is also the {{{not}}}keyword (see the linked css doc for details).1570 There is also the `not` keyword (see the linked css doc for details). 1294 1571 This is implemented, but probably not very useful. Feel free to add documentation. 1295 1572 }}}
