Changes between Version 193 and Version 268 of Help/Styles/MapCSSImplementation


Ignore:
Timestamp:
(multiple changes)
Author:
(multiple changes)
Comment:
(multiple changes)

Legend:

Unmodified
Added
Removed
Modified
  • Help/Styles/MapCSSImplementation

    v193 v268  
    11[[TranslatedPages]]
    2 [[PageOutline(1-10,Table of Contents)]]
    3 This page documents details on JOSM's [osmwiki:MapCSS/0.2 MapCSS] implementation. This is used for the following features in JOSM:
     2[[PageOutline(2-10,Table of Contents)]]
     3= MapCSS Implementation=
     4JOSM's implementation of [osmwiki:MapCSS/0.2 MapCSS] is used for the features:
    45
    56* [wikitr:/Styles Mappaint styles]
    67* [wikitr:/Rules Validator rules], see [wikitr:/Help/Validator/MapCSSTagChecker MapCSS tag checker] for the special part for rules only.
    78* [wikitr:/Help/Action/Search Search dialog]
     9
     10Consider 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.
    811
    912== General Structure ==
     
    1821    set: class;
    1922    set: .class;
     23    /* note that validator rules do not use the colon after set */
    2024}
    2125}}}
     
    3741}}}
    3842
    39 == Selectors ==
    40 ''Selectors'' denote the filter expressions of a MapCSS rule. The rule is only applied to a map object, if its selectors match
    41 with the object.
    42 
    43 Selectors in MapCSS are different from standard CSS for the web. MapCSS only supports a subset of the standard CSS selectors, but
    44 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
     47Selectors 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.
    4548
    4649Some basic examples:
     
    6568
    6669=== Type selector ===
    67 
    6870{{{#!th valign=top
    6971'''Selector'''
     
    8183|-------------------------------------------------------------------------------
    8284{{{#!td align=center  valign=top
    83 {{{node}}}, {{{way}}}, {{{relation}}}
     85`node`, `way`, `relation`
    8486}}}
    8587{{{#!td align=left  valign=top   
     
    8890|-------------------------------------------------------------------------------
    8991{{{#!td align=center  valign=top
    90 {{{area}}}
     92`area`
    9193}}}
    9294{{{#!td align=left  valign=top   
     
    98100way[natural=beach], relation[type=multipolygon][natural=beach] {...}
    99101}}}
    100 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.
     102Note 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.
    101103}}}
    102104|-------------------------------------------------------------------------------
    103105{{{#!td align=center  valign=top
    104 {{{meta}}}
     106`meta`
    105107}}}
    106108{{{#!td align=left  valign=top   
    107 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.
     109The `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.
    108110{{{
    109111#!mapcss
     
    121123|-------------------------------------------------------------------------------
    122124{{{#!td align=center  valign=top
    123 {{{canvas}}}
     125`canvas`
    124126}}}
    125127{{{#!td align=left  valign=top   
     
    147149|-
    148150{{{#!td align=center
    149 {{{fill-color}}}
     151`fill-color`
    150152}}}
    151153{{{#!td
     
    156158}}}
    157159{{{#!td align=center
    158 {{{black}}}
     160`black`
    159161}}}
    160162|-
    161163{{{#!td align=center
    162 {{{default-points}}}
     164`default-points`
    163165}}}
    164166{{{#!td
     
    169171}}}
    170172{{{#!td align=center
    171 {{{true}}}
     173`true`
    172174}}}
    173175|-
    174176{{{#!td align=center
    175 {{{default-lines}}}
     177`default-lines`
    176178}}}
    177179{{{#!td
     
    182184}}}
    183185{{{#!td align=center
    184 {{{true}}}
     186`true`
    185187}}}
    186188}}}
     
    205207* The functions ''prop()'' and ''is_prop_set()'' are only supported on the right side of the > sign.
    206208* The functions ''parent_tag'' and ''parent_tags'' (see below) can be used to access tags from the parent(s).
    207 * 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]] may be specified in this case.
    208 
     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.
    209210
    210211=== Parent selector ===
     
    225226
    226227=== Condition selector ===
    227 Selectors can include a set of conditions. If any of these conditions evaluates to false, the selector doesn't match and the style
    228 rule isn't applied.
    229 
    230 An '''attribute condition''' specifies a condition on a tag of an OSM object.
     228Selectors 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
     230An '''attribute condition''' specifies a condition on a tag of an OSM object.
    231231
    232232[=#condition_selector_operators]
     233{{{#!th valign=top
     234'''Operator'''
     235}}}
     236{{{#!th valign=top
     237'''Description'''
     238}}}
     239{{{#!th valign=top
     240'''Example'''
     241}}}
     242|-------------------------------------------------------------------------------
     243{{{#!td align=center valign=top
     244`=`
     245}}}
     246{{{#!td align=left valign=top
     247Exact match of the value.
     248}}}
     249{{{#!td align=left valign=top
     250{{{
     251#!mapcss
     252way[highway=residential]                    /* is case sensitive, i.e. does NOT match e.g. highway=Residential or Highway=residential   */
     253node[name="My name"]                        /* use quotes if key or value includes spaces                                               */
     254node["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
     259`!=`
     260}}}
     261{{{#!td align=left valign=top
     262Value not equal
     263}}}
     264{{{#!td align=left valign=top
     265{{{
     266#!mapcss
     267way[highway!=residential]
     268node[name!="My name"]
     269node["name:pl"!="Królewiec"]
     270}}}
     271}}}
     272|-------------------------------------------------------------------------------
     273{{{#!td align=center valign=top
     274`<`, `>`, `<=`, `>=`
     275}}}
     276{{{#!td align=left valign=top
     277Comparison for numeric values.
     278
     279}}}
     280{{{#!td align=left valign=top
     281{{{
     282#!mapcss
     283node[population >= 50000]                   /* population greater than or equal to 50000 */
     284node[ele = 3000]                            /* elevation with exactly 3000 meters        */
     285}}}
     286}}}
     287|-------------------------------------------------------------------------------
     288{{{#!td align=center valign=top
     289`^=`
     290}}}
     291{{{#!td align=left valign=top
     292Prefix match
     293}}}
     294{{{#!td align=left valign=top
     295{{{
     296#!mapcss
     297node[name ^= "myprefix"]                    /* value starts with 'myprefix' */
     298}}}
     299}}}
     300|-------------------------------------------------------------------------------
     301{{{#!td align=center valign=top
     302`$=`
     303}}}
     304{{{#!td align=left valign=top
     305Postfix match
     306}}}
     307{{{#!td align=left valign=top
     308{{{
     309#!mapcss
     310node[name $= "mypostfix"]                   /* value ends with 'mypostfix' */
     311}}}
     312}}}
     313|-----------------------------------------------
     314{{{#!td align=center valign=top
     315`*=`
     316}}}
     317{{{#!td align=left valign=top
     318Substring match
     319}}}
     320{{{#!td align=left valign=top
     321{{{
     322#!mapcss
     323node[name *= "my substring"]                 /* value contains the substring 'my substring' */
     324}}}
     325}}}
     326|-------------------------------------------------------------------------------
     327{{{#!td align=center valign=top
     328`~=`
     329}}}
     330{{{#!td align=left valign=top
     331List membership
     332}}}
     333{{{#!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
     342`=~`
     343}}}
     344{{{#!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
     349{{{
     350#!mapcss
     351*[name=~/^My_pattern.*/]                    /* the value of the tag 'name' matches with the regular expression '^My_pattern.*' */
     352                                            /* Note, that reqular expressions have to be enclosed in /.../                     */
     353}}}
     354Case-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
     363`!~` (since r6455)
     364}}}
     365{{{#!td align=left valign=top
     366negated [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
     370{{{
     371#!mapcss
     372*[surface!~/paved|unpaved/]
     373}}}
     374}}}
     375|-------------------------------------------------------------------------------
     376{{{#!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
     380element of
     381
     382Matches 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] {
     388  throwWarning: tr("{0} inside {1}", "amenity=parking", "amenity=parking");
     389}
     390}}}
     391Finds 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
     398Subset of or Equal To
     399
     400Synonym 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
     416Superset of or Equal To
     417
     418Matches 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
     423area[amenity=parking] ⊇ *[amenity=parking]
     424}}}
     425finds 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
     432Neither a Subset of nor Equal To
     433
     434Matches 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}}}
     441finds 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
     448Neither a Superset of nor Equal To
     449
     450Matches 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
     455area[landuse=residential] ⊉ *[building]
     456}}}
     457finds 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
     464crossing
     465}}}
     466{{{#!td align=left valign=top
     467{{{
     468#!mapcss
     469area:closed:areaStyle ⧉ area:closed:areaStyle {
     470  throwOther: tr("Overlapping Areas");
     471}
     472}}}
     473takes `layer` tag into account if set (since r12986)
     474}}}
     475
     476Since 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`.
     477
     478In addition, you can test whether a tag is present or not:
     479
     480{{{#!th valign=top
     481'''Condition'''
     482}}}
     483{{{#!th valign=top
     484'''Example'''
     485}}}
     486|-------------------------------------------------------------------------------
     487{{{#!td align=left  valign=top
     488Presence of tag
     489}}}
     490{{{#!td align=left  valign=top   
     491{{{
     492#!mapcss
     493way[highway]                     /* matches any way with a tag 'highway' (is case sensitive)                                              */
     494way["name:fr"]                   /* use quotes if the tag name includes special caracters (white space, colons, unicode characters, etc.) */
     495}}}
     496}}}
     497|-------------------------------------------------------------------------------
     498{{{#!td align=left  valign=top
     499Absence of tag
     500}}}
     501{{{#!td align=left  valign=top   
     502{{{
     503#!mapcss
     504way[!highway]                     /* matches any way which does not have a tag 'highway' (is case sensitive)                               */
     505way[!"name:fr"]                   /* use quotes if the tag name includes special caracters (white space, colons, unicode characters, etc.) */
     506}}}
     507}}}
     508|-------------------------------------------------------------------------------
     509{{{#!td align=left  valign=top
     510Presence 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)
     511}}}
     512{{{#!td align=left  valign=top   
     513{{{
     514#!mapcss
     515way[/^addr:/]                     /* matches any `addr:*` key */
     516}}}
     517}}}
     518|-------------------------------------------------------------------------------
     519{{{#!td align=left  valign=top
     520Absence of tag by Regular expression match
     521}}}
     522{{{#!td align=left  valign=top   
     523{{{
     524#!mapcss
     525way[!/^addr:/]                    /* matches any way which does not have a tag 'addr:*' */
     526}}}
     527}}}
     528
     529You can test whether the value of a tag is logical truth value. The value is evaluated to true, if it is either
     530"yes", "true", or "1". All other values are evaluated to false.
     531
     532{{{#!th valign=top
     533'''Condition'''
     534}}}
     535{{{#!th valign=top
     536'''Example'''
     537}}}
     538|-------------------------------------------------------------------------------
     539{{{#!td align=left  valign=top
     540Testing for truth value
     541}}}
     542{{{#!td align=left  valign=top   
     543{{{
     544#!mapcss
     545way[oneway?]                   /* matches any way with a truth value in the tag 'oneway' */
     546}}}
     547}}}
     548|-------------------------------------------------------------------------------
     549{{{#!td align=left  valign=top
     550Testing for false value (since r6513)
     551}}}
     552{{{#!td align=left  valign=top   
     553{{{
     554#!mapcss
     555way[oneway?!]                  /* matches any way with a false value in the tag 'oneway' */
     556}}}
     557}}}
     558
     559=== Territory selector === #Territoryselector
     560You 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 …                             */
     565node[inside("FR")]                    /* … inside of France (includes the overseas territories) */
     566node[inside("FX")]                    /* … inside of Metropolitan France (i.e. only the
     567                                         mainland part with its near islands including Corse)   */
     568node[inside("EU")]                    /* … inside of the European Union                         */
     569node[inside("FR,DE")]                 /* … inside of France __OR__ inside of Germany            */
     570node[inside("US-FL")]                 /* … inside of the US state Florida                       */
     571
     572node[outside("FR")]                   /* … outside of France                                    */
     573node[outside("FR,DE")]                /* … outside of France __AND__ outside of Germany         */
     574node[inside("US")][outside("US-FL")]  /* … inside of the USA except the state Florida           */
     575}}}
     576
     577=== Link selector ===#LinkSelector
     578In a child selector, you can formulate conditions on the link between a parent and a child object.
     579
     580If the parent is a relation, you can formulate conditions for the ''role'' a member objects has in this relation.
     581{{{
     582#!mapcss
     583relation[type=route] >[role="link"] way {  /* matches any way which is a member of route relation with role 'link' */
     584   color: blue;
     585}
     586}}}
     587
    233588{{{#!th valign=top
    234589'''Operator'''
     
    245600}}}
    246601{{{#!td align=left  valign=top   
    247 Exact match of the value.
    248 }}}
    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:ru"="Калининград"]               /* use quotes if key or value includes special characters like colons or unicode characters */
    255 }}}
    256 }}}
    257 |-------------------------------------------------------------------------------
    258 {{{#!td align=center  valign=top
    259 `!=`
    260 }}}
    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:ru"!="Калининград"]
    270 }}}
    271 }}}
    272 |-------------------------------------------------------------------------------
    273 {{{#!td align=center  valign=top
    274 `<`, `>`, `<=`, `>=`
    275 }}}
    276 {{{#!td align=left  valign=top   
    277 Comparision for numeric values.
    278 
    279 }}}
    280 {{{#!td align=left  valign=top   
    281 {{{
    282 #!mapcss
    283 node[population >= 50000]                   /* population greater than or equal to 50000 */
    284 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   
    292 Prefix match
    293 }}}
    294 {{{#!td align=left  valign=top   
    295 {{{
    296 #!mapcss
    297 node[name ^= "myprefix"]                    /* value starts with 'myprefix' */
    298 }}}
    299 }}}
    300 |-------------------------------------------------------------------------------
    301 {{{#!td align=center  valign=top
    302 `$=`
    303 }}}
    304 {{{#!td align=left  valign=top   
    305 Postfix match
    306 }}}
    307 {{{#!td align=left  valign=top   
    308 {{{
    309 #!mapcss
    310 node[name $= "mypostfix"]                   /* value ends with 'mypostfix' */
    311 }}}
    312 }}}
    313 |-----------------------------------------------
    314 {{{#!td align=center  valign=top
    315 `*=`
    316 }}}
    317 {{{#!td align=left  valign=top   
    318 Substring match
    319 }}}
    320 {{{#!td align=left  valign=top   
    321 {{{
    322 #!mapcss
    323 node[name *= "my substring"]                 /* value contains the substring 'my substring' */
    324 }}}
    325 }}}
    326 |-------------------------------------------------------------------------------
    327 {{{#!td align=center  valign=top
    328 `~=`
    329 }}}
    330 {{{#!td align=left  valign=top   
    331 List membership
    332 }}}
    333 {{{#!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
    342 `=~`
    343 }}}
    344 {{{#!td align=left  valign=top   
    345 [https://download.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#sum Regular expression] match
    346 
    347 }}}
    348 {{{#!td align=left  valign=top   
    349 {{{
    350 #!mapcss
    351 *[name=~/^My_pattern.*/]                    /* the value of the tag 'name' matches with the regular expression '^My_pattern.*' */
    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/javase/7/docs/api/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
    363 `!~` (since r6455)
    364 }}}
    365 {{{#!td align=left  valign=top   
    366 negated [https://download.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#sum Regular expression] match
    367 
    368 }}}
    369 {{{#!td align=left  valign=top   
    370 {{{
    371 #!mapcss
    372 *[surface!~/paved|unpaved/]
    373 }}}
    374 }}}
    375 |-------------------------------------------------------------------------------
    376 {{{#!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   
    380 element of
    381 
    382 Matches when an object matches the right selector(s) contains at least one element which match the left selector(s).
    383 
    384 }}}
    385 {{{#!td align=left  valign=top   
    386 {{{
    387 #!mapcss
    388 *[amenity=parking] ∈ area[amenity=parking] {
    389   throwWarning: tr("{0} inside {1}", "amenity=parking", "amenity=parking");
    390 }
    391 }}}
    392 Finds areas with `amenity=parking` that contain at least one node or area with `amenity=parking`.
    393 Since r15064 this rule produces one warning for each element on the left when there are multiple matches.
    394 }}}
    395 |-------------------------------------------------------------------------------
    396 {{{#!td align=center  valign=top
    397 `⊆` ([https://www.fileformat.info/info/unicode/char/2286/index.htm U+2286], since r15102)
    398 }}}
    399 {{{#!td align=left  valign=top   
    400 Subset of or Equal To
    401 
    402 Synonym for `∈`.
    403 }}}
    404 {{{#!td align=left  valign=top   
    405 {{{
    406 #!mapcss
    407 *[amenity=parking] ⊆ area[amenity=parking] {
    408   throwWarning: tr("{0} inside {1}", "amenity=parking", "amenity=parking");
    409 }
    410 }}}
    411 
    412 }}}
    413 |-------------------------------------------------------------------------------
    414 {{{#!td align=center  valign=top
    415 `⊇` ([https://www.fileformat.info/info/unicode/char/2287/index.htm U+2287], since r15102)
    416 }}}
    417 {{{#!td align=left  valign=top   
    418 Superset of or Equal To
    419 
    420 Matches when an object matches the right selector(s) and is contained in one or more elements which match the left selectors.
    421 
    422 }}}
    423 {{{#!td align=left  valign=top   
    424 {{{
    425 #!mapcss
    426 area[amenity=parking] ⊇ *amenity=parking]
    427 }}}
    428 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.
    429 
    430 }}}
    431 |-------------------------------------------------------------------------------
    432 {{{#!td align=center  valign=top
    433 `⊈` ([https://www.fileformat.info/info/unicode/char/2288/index.htm U+2288], since r15102)
    434 }}}
    435 {{{#!td align=left  valign=top   
    436 Neither a Subset of nor Equal To
    437 
    438 Matches when an object matches the right selector(s) and does not contain any element which matches the left selectors.
    439 
    440 }}}
    441 {{{#!td align=left  valign=top   
    442 {{{
    443 #!mapcss
    444 *[highway=street_lamp] ⊈ area:closed2[amenity=parking][lit=yes]
    445 }}}
    446 finds areas amenity=parking that have lit=yes but don't contain a lamp.
    447 Always add `:closed2` to avoid false positives as unclosed areas never contain something.
    448 }}}
    449 |-------------------------------------------------------------------------------
    450 {{{#!td align=center  valign=top
    451 `⊉` ([https://www.fileformat.info/info/unicode/char/2289/index.htm U+2289], since r15102)
    452 }}}
    453 {{{#!td align=left  valign=top   
    454 Neither a Superset of nor Equal To
    455 
    456 Matches when an object matches the right selector(s) and is not contained in any area which matches the left selectors.
    457 
    458 }}}
    459 {{{#!td align=left  valign=top   
    460 {{{
    461 #!mapcss
    462 area[landuse=residential] ⊉ *[building]
    463 }}}
    464 finds buildings which are not inside any landuse=residential area. Note that this operator is likely to produce false positives
    465 when you have `landuse=residential`areas which don't match `:closed2`.
    466 }}}
    467 |-------------------------------------------------------------------------------
    468 {{{#!td align=center  valign=top
    469 `⧉` ([https://www.fileformat.info/info/unicode/char/29c9/index.htm U+29C9], since r6613)
    470 }}}
    471 {{{#!td align=left  valign=top   
    472 crossing
    473 
    474 }}}
    475 {{{#!td align=left  valign=top   
    476 {{{
    477 #!mapcss
    478 area:closed:areaStyle ⧉ area:closed:areaStyle {
    479   throwOther: tr("Overlapping Areas");
    480 }
    481 }}}
    482 takes `layer` tag into account if set (since r12986)
    483 }}}
    484 
    485 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`.
    486 
    487 In addition, you can test whether a tag is present or not:
    488 
    489 {{{#!th valign=top
    490 '''Condition'''
    491 }}}
    492 {{{#!th valign=top
    493 '''Example'''
    494 }}}
    495 |-------------------------------------------------------------------------------
    496 {{{#!td align=left  valign=top
    497 Presence of tag
    498 }}}
    499 {{{#!td align=left  valign=top   
    500 {{{
    501 #!mapcss
    502 way[highway]                     /* matches any way with a tag 'highway' (is case sensitive)                                              */
    503 way["name:fr"]                   /* use quotes if the tag name includes special caracters (white space, colons, unicode characters, etc.) */
    504 }}}
    505 }}}
    506 |-------------------------------------------------------------------------------
    507 {{{#!td align=left  valign=top
    508 Absence of tag
    509 }}}
    510 {{{#!td align=left  valign=top   
    511 {{{
    512 #!mapcss
    513 way[!highway]                     /* matches any way which does not have a tag 'highway' (is case sensitive)                               */
    514 way[!"name:fr"]                   /* use quotes if the tag name includes special caracters (white space, colons, unicode characters, etc.) */
    515 }}}
    516 }}}
    517 |-------------------------------------------------------------------------------
    518 {{{#!td align=left  valign=top
    519 Presence of tag by [https://download.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#sum Regular expression] match (since r6547)
    520 }}}
    521 {{{#!td align=left  valign=top   
    522 {{{
    523 #!mapcss
    524 way[/^addr:/]                     /* matches any `addr:*` key */
    525 }}}
    526 }}}
    527 |-------------------------------------------------------------------------------
    528 {{{#!td align=left  valign=top
    529 Absence of tag by Regular expression match
    530 }}}
    531 {{{#!td align=left  valign=top   
    532 {{{
    533 #!mapcss
    534 way[!/^addr:/]                    /* matches any way which does not have a tag 'addr:*' */
    535 }}}
    536 }}}
    537 
    538 You can test whether the value of a tag is logical truth value. The value is evaluated to true, if it is either
    539 "yes", "true", or "1". All other values are evaluated to false.
    540 
    541 {{{#!th valign=top
    542 '''Condition'''
    543 }}}
    544 {{{#!th valign=top
    545 '''Example'''
    546 }}}
    547 |-------------------------------------------------------------------------------
    548 {{{#!td align=left  valign=top
    549 Testing for truth value
    550 }}}
    551 {{{#!td align=left  valign=top   
    552 {{{
    553 #!mapcss
    554 way[oneway?]                  /* matches any way with a truth value in the tag 'oneway'  */
    555 }}}
    556 }}}
    557 |-------------------------------------------------------------------------------
    558 {{{#!td align=left  valign=top
    559 Testing for false value (since r6513)
    560 }}}
    561 {{{#!td align=left  valign=top   
    562 {{{
    563 #!mapcss
    564 way[oneway?!]                  /* matches any way with a false value in the tag 'oneway'  */
    565 }}}
    566 }}}
    567 
    568 === Territory selector ===
    569 
    570 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]. See #10387 for main implementation of this feature.
    571 
    572 {{{
    573 #!mapcss
    574 node[inside("FR")]                    /* matches any node located inside of France (this includes all the overseas territories)                                     */
    575 node[inside("FX")]                    /* matches any node located inside of Metropolitan France (i.e. only the mainland part with its near islands including Corse) */
    576 node[inside("EU")]                    /* matches any node located inside of the European Union                                                                      */
    577 node[inside("FR,DE")]                 /* matches any node located inside of France __OR__ inside of Germany                                                         */
    578 node[inside("US-FL")]                 /* matches any node located inside of the US state Florida                                                                    */
    579 
    580 node[outside("FR")]                   /* matches any node located outside of France                                                                                 */
    581 node[outside("FR,DE")]                /* matches any node located outside of France __AND__ outside of Germany                                                      */
    582 node[inside("US")][outside("US-FL")]  /* matches any node located inside of the USA except the state Florida                                                        */
    583 }}}
    584 
    585 === Link selector ===
    586 In a child selector, you can formulate conditions on the link between a parent and a child object.
    587 
    588 If the parent is a relation, you can formulate conditions for the ''role'' a member objects has in this relation.
    589 {{{
    590 #!mapcss
    591 relation[type=route] >[role="link"] way {  /* matches any way which is a member of route relation with role 'link' */
    592    color: blue;
    593 }
    594 }}}
    595 
    596 {{{#!th valign=top
    597 '''Operator'''
    598 }}}
    599 {{{#!th valign=top
    600 '''Description'''
    601 }}}
    602 {{{#!th valign=top
    603 '''Example'''
    604 }}}
    605 |-------------------------------------------------------------------------------
    606 {{{#!td align=center  valign=top
    607 `=`
    608 }}}
    609 {{{#!td align=left  valign=top   
    610 Exact match of the role name. The name name {{{role}}} is compulsory in this context.
     602Exact match of the role name. The name `role` is compulsory in this context.
    611603}}}
    612604{{{#!td align=left  valign=top   
     
    618610}}}
    619611
    620 The operators {{{!=, ^=, $=, *=, and ~=}}} are supported too. Please refer to [#condition_selector_operators condition selector operators].
    621 
    622 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
    623 object in a relation. Positive numbers count from first to last element, negative numbers (since r8236) count from last to first element.
     612The operators `!=`, `^=`, `$=`, `*=` and `~=` are supported too. Please refer to [#condition_selector_operators condition selector operators].
     613
     614Nodes 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.
    624615
    625616{{{
     
    639630}}}
    640631
    641 
    642632=== Zoom selector ===
    643 You can decorate a type selector with a '''zoom selector'''. The zoom selector restricts the range of zoom levels
    644 at which the respective MapCSS rule is applied.
    645 
    646 {{{#!th align=center valign=top
    647 '''Example'''
    648 }}}
    649 {{{#!th align=center valign=top
    650 '''Description'''
    651 }}}
    652 |-------------------------------------------------------------------------------
    653 || {{{way|z12 {...} }}} || At zoom level 12 ||
    654 || {{{way|z13-15 {...} }}} || From 13 to 15 ||
    655 || {{{way|z16- {...} }}} || 16 and above ||
    656 || {{{way|z-12 {...} }}} || 12 and below ||
    657 || {{{way {...} }}} || any zoom level ||
     633You 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 ||
    658640
    659641The 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''.
    660642
    661 
    662 === Pseudo Classes ===
     643=== Pseudo Classes ===#PseudoClasses
    663644See [/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.
    664645
    665 ||= Class =||= Description =||
    666 || {{{:closed}}} || true for ways where the first node is the same as the last and for any (completely downloaded) multipolygon relation ||
    667 || {{{:closed2}}} || same as above, but this one ignores if a multipolygon is downloaded completely (since r9099) ||
    668 || {{{:completely_downloaded}}} || true for a relation whose members are all downloaded (since r9099) ||
    669 || {{{:new}}} || all new objects ||
    670 || {{{:connection}}} || true for nodes that are used by more than one way ||
    671 || {{{:unconnected}}} || true for nodes that are not used by any way (since r6687) ||
    672 || {{{: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)
    673 || {{{: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 ||
    674 || {{{:clockwise}}} || Whether the way is closed and oriented clockwise, or non-closed and the 1st, 2nd and last node are in clockwise order. ||
    675 || {{{:anticlockwise}}} || Whether the way is closed and oriented anticlockwise, or non-closed and the 1st, 2nd and last node are in anticlockwise order. ||
    676 || {{{:unclosed_multipolygon}}} || true for fully loaded unclosed multipolygon relations (since r8252) ||
    677 || {{{:open_end}}} || to select end nodes of unclosed multipolygon relations with `relation:unclosed_multipolygon >:open_end node` (since r8252) ||
    678 || {{{:in-downloaded-area}}} || true if an object is within source area and false if in the hatched area (since r8495). ||
    679 || {{{:selected}}} || true if an object is selected in the editor (since r9341). ||
    680 || {{{:modified}}} || changed objects (since r7193). ||
    681 You can also negate pseudo classes. E.g. {{{!:new}}} for all old objects.
     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). ||
     664You can also negate pseudo classes. E.g. `!:new` for all old objects.
    682665
    683666=== Layer Identifier ===
    684 
    685667Layers can be used to create more than one style for a single object. Here is an example:
    686668{{{
     
    710692}
    711693}}}
    712 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).
     694This 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).
    713695
    714696The name for the layer can be any identifier.
    715697
    716 If you omit the layer in the selector, this is the same as using {{{::default}}}.
     698If you omit the layer in the selector, this is the same as using `::default`.
    717699
    718700One more example:
     
    737719[[Image(multiple_icons_and_texts.png,link=)]]
    738720
    739 In addition, you can use the * layer to override and initialize all layers.[[br]]
     721In addition, you can use the * layer to override and initialize all layers. \\
    740722It overrides all existing subparts, so
    741723
     
    744726way::A { a; }
    745727way::B { b; }
    746 way::* { c; }
     728way::* { c; }  /* overrides all existing subparts */
    747729}}}
    748730is equivalent to
     
    751733way::A { a; }
    752734way::B { b; }
    753 way::A { c; }
    754 way::B { c; }
     735way::A { c; } /* overrides a with c all existing subparts */
     736way::B { c; } /* overrides b with c all existing subparts */
    755737}}}
    756738And it initializes new subparts. In other words:
     
    778760way::A { a; b; }
    779761}}}
    780 
    781762
    782763=== Grouping ===
     
    819800way.path { text:auto; text-color: green; text-position: line; text-offset: 5; }
    820801}}}
    821 You can also negate classes. E.g. {{{way!.path}}} for all ways, which are not part of the class ''.path''.
    822 
    823 
    824 == @supports rule for conditional processing [''since r8087''] ==
    825 @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:
     802You 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 ===
     805If you want to use layer and classes together, please note that you have to identify the class via is_prop_set.
     806
     807{{{#!mapcss
     808node[railway=signal] { set sgnl; }
     809
     810/* it doesn't work */
     811node.sgnl::layer_signal_icon  { z-index: 1000; ... icon: icon/signal-icon.svg; ... }
     812node.sgnl::layer_signal_text  { z-index: 1010; ... text: concat("Name of signal: ", tag("ref")); ..... )
     813
     814/* use instead: is_prop_set("...", "default") */
     815node[is_prop_set("sgnl", "default")]::layer_signal_icon  { z-index: 1000; ... icon: icon/signal-icon.svg; ... }
     816node[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:
    826821{{{
    827822#!mapcss
     
    872867}}}
    873868{{{#!td
    874 Only include {{{@supports}}} section when the current version of JOSM is greater than or equal to the specified number.
     869Only include `@supports` section when the current version of JOSM is greater than or equal to the specified number.
    875870}}}
    876871|-
     
    879874}}}
    880875{{{#!td
    881 Only include {{{@supports}}} section when the current version of JOSM is lower than or equal to the specified number.
     876Only include `@supports` section when the current version of JOSM is lower than or equal to the specified number.
    882877}}}
    883878|-
     
    886881}}}
    887882{{{#!td
    888 Only include {{{@supports}}} section when the name of the editor / renderer matches the given string. In JOSM, the only accepted value is {{{josm}}}.
    889 }}}
    890 
    891 Conditions can be combined with {{{and}}}:
     883Only include `@supports` section when the name of the editor / renderer matches the given string. In JOSM, the only accepted value is `josm`.
     884}}}
     885
     886Conditions can be combined with `and`:
    892887
    893888{{{
     
    898893}}}
    899894
    900 Other logical operators like {{{or}}} and {{{not}}} can also be used. Parentheses are needed if you want to combine different logical operators:
     895Other logical operators like `or` and `not` can also be used. Parentheses are needed if you want to combine different logical operators:
    901896
    902897{{{
     
    917912}}}
    918913
     914
    919915== Style settings ==
    920 
    921916[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:
    922917* `boolean` (since r7450)
     
    926921
    927922=== Settings of type `boolean` ===
    928 
    929923Create a setting of type `boolean`:
    930924{{{
     
    947941
    948942=== Settings of type `double` ===
    949 
    950943Create a setting of type `double`:
    951944{{{
     
    967960
    968961=== Settings of type `string` ===
    969 
    970962Create a setting of type `string`:
    971963{{{
     
    987979
    988980=== Settings of type `color` ===
    989 
    990 Create a setting of type `color`. The `default` color can be any color as understood under https://josm.openstreetmap.de/wiki/Help/Styles/MapCSSImplementation#Propertyvaluesexplanations:
     981Create a setting of type `color`. The `default` color can be any color as understood under [wikitr:/Help/Styles/MapCSSImplementation#Propertyvaluesexplanations Property values explanations]:
    991982{{{
    992983#!mapcss
     
    1007998
    1008999=== Grouping settings ===
    1009 
    10101000Similar settings can be grouped together by defining ''settings groups'' (since r15289):
    10111001
     
    10321022}}}
    10331023
    1034 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: wiki:/Styles/MapWithAI.
     1024Settings 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
    10351026
    10361027== Properties ==#Properties
    1037 
    10381028=== General properties ===
    10391029
    10401030||=  '''Key''' =||= '''Description''' =||= '''Value Format''' =||= '''Default Value''' =||
    1041 || {{{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  ||
    1042 || {{{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 ||
    1043 || {{{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  ||
    1044 || {{{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 ||
     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 ||
    10451035
    10461036Note 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)
    10471037
    1048 
    10491038=== Icon and symbol styles ===
    10501039
    10511040||=  '''Key''' =||= '''Description''' =||= '''Value Format''' =||= '''Default Value''' =||
    1052 || {{{icon-image}}} || The icon at node position. See also [wikitr:/Help/Styles/Images Images]. || ''Image'' ||  -  ||
    1053 || {{{icon-opacity}}} || Opacity of the icon image || ''Opacity'' ||  1.0  ||
    1054 || {{{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'' ||  -  ||
    1055 || {{{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'' ||  -  ||
    10561045|| `icon-offset-x` || Shift the icon in horizontal direction (positive values to the right) (since r8085) || ''Number'' ||  0  ||
    10571046|| `icon-offset-y` || Shift the icon in vertical direction (positive values downwards) (since r8085) || ''Number'' ||  0  ||
    1058 || `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`. ||  -  ||
    1059 || `icon-position` || Define the position of the icon for areas. Same as `text-position` (since r11730). || {{{center}}}, {{{inside}}}, {{{line}}} ||  {{{center}}}  ||
    1060 || {{{symbol-shape}}} || Display a symbol at the position of the node || {{{square}}}, {{{circle}}}, {{{triangle}}}, {{{pentagon}}}, {{{hexagon}}}, {{{heptagon}}}, {{{octagon}}}, {{{nonagon}}}, {{{decagon}}} ||  -  ||
    1061 || {{{symbol-size}}} || Size of the symbol || ''Number'', can be relative ("+4") ||  10  ||
    1062 || {{{symbol-stroke-width}}} || outline stroke width || ''Width'' || 1.0 if {{{symbol-stroke-color}}} is set ||
    1063 || {{{symbol-stroke-color}}} || line color || ''Color'' || {{{#FFC800}}} if {{{symbol-stroke-width}}} is set ||
    1064 || {{{symbol-stroke-opacity}}} || line opacity || ''Opacity'' ||  1.0  ||
    1065 || {{{symbol-fill-color}}} || fill color for the shape || ''Color'' || {{{blue}}}, unless either {{{symbol-stroke-width}}} or {{{symbol-stroke-color}}} is set ||
    1066 || {{{symbol-fill-opacity}}} || fill opacity || ''Opacity'' ||  1.0  ||
    1067 || {{{text-...}}}, {{{font-...}}} ||||||  general text & font properties  ||
    1068 || {{{text-anchor-horizontal}}} || horizontal text label placement || {{{left}}}, {{{center}}}, {{{right}}} ||  {{{right}}}  ||
    1069 || {{{text-anchor-vertical}}} || vertical text label placement || {{{above}}}, {{{top}}}, {{{center}}}, {{{bottom}}}, {{{below}}} ||  {{{bottom}}}  ||
    1070 || {{{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`); See also the functions `degree_to_radians`, `cardinal_to_radians`. (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.) ||  -  ||
    1071 
    1072 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.
    1073 
    1074 
    1075 
    1076 
    1077 
    1078 === 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
     1058Do 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
    10791061||=  '''Key''' =||= '''Description''' =||= '''Value Format''' =||= '''Default Value''' =||
    1080 || {{{width}}} || Line width || ''Width'' ||  -  ||
    1081 || {{{color}}} || Line color || ''Color'' ||  value of {{{fill-color}}} or (if unset) JOSM's default untagged color ({{{#808080}}}) ||
    1082 || {{{opacity}}} || How transparent the line is. || ''Opacity'' ||  1.0  ||
    1083 || {{{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 ||  -  ||
    1084 || {{{dashes-offset}}} || shift the dash pattern by a certain amount || ''Number'' (>= 0) ||  0  ||
    1085 || {{{dashes-background-color}}} || The color to use in between the dashes (optional) || ''Color'' ||  -  ||
    1086 || {{{dashes-background-opacity}}} || Opacity value for the dashes background || ''Opacity'' ||  value of {{{opacity}}}  ||
    1087 || {{{linecap}}} || Shape at the end of the line (see [https://www.w3.org/TR/SVG/painting.html#StrokeLinecapProperty here]) || {{{none}}}, {{{round}}}, {{{square}}} ||  {{{none}}}  ||
    1088 || {{{linejoin}}} || Shape at the line corners || {{{round}}}, {{{miter}}}, {{{bevel}}} ||  {{{round}}}  ||
    1089 || {{{miterlimit}}}                                   || Applies for {{{linejoin: miter}}}. Sets the maximum overshoot when line segments meet at a very small angle || ''Number'' (>= 1.0) ||  10.0  ||
    1090 || {{{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  ||
    1091 || {{{text-position}}} || set to {{{line}}}, if text should be drawn along the line || {{{line}}}, {{{center}}} ||  -  ||
    1092 || {{{text-...}}}, {{{font-...}}} ||||||  general text & font properties  ||
     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  ||
    10931075|| `repeat-image` || repeated image along a line ''(since r5801)'' || ''Image'' ||  -  ||
    10941076|| `repeat-image-width` || Width of the image (optional, see `icon-width`) ''(since r5811)'' || ''Number'' ||  -  ||
    10951077|| `repeat-image-height` || Height of the image (optional) ''(since r5811)'' || ''Number'' ||  -  ||
    1096 || `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`  ||
     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`  ||
    10971079|| `repeat-image-offset` || Offset from the line ''(since r5801)'' || ''Number'' ||  0  ||
    10981080|| `repeat-image-spacing` || Spacing between repeated images ''(since r5801)'' || ''Number'' ||  0  ||
     
    11001082|| `repeat-image-opacity` || Opacity of the repeated image ''(since r16700)'' || ''Number'' ||  1.0  ||
    11011083
    1102 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.
     1084All 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.
    11031085||=  '''Key''' =||= '''Description''' =||= '''Value Format''' =||= '''Default Value''' =||
    1104 || {{{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) ||  -  ||
    1105 || {{{casing-color}}} || Casing color || ''Color'' ||  value of {{{fill-color}}} or (if unset) JOSM's default untagged color ({{{#808080}}}) ||
    1106 || {{{casing-opacity}}} || How transparent the casing is. || ''Opacity'' ||  1.0  ||
    1107 || {{{casing-}}}... || ... || ... ||  ...  ||
    1108 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.
    1109 
    1110 === Area styles ===
    1111 ||=  '''Key''' =||= '''Description''' =||= '''Value Format''' =||= '''Default Value''' =||
    1112 || {{{fill-color}}} || Color in which to fill the area. Until 11700, the alpha component was set to 50 to create a transparency effect. || ''Color'' ||  -  ||
    1113 || {{{fill-image}}} || Image pattern || ''Image'' ||  -  ||
    1114 || {{{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'' ||  -  ||
    1115 || {{{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'' ||  -  ||
    1116 || {{{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)  ||
    1117 || {{{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}}} ||  -  ||
    1118 || {{{text-...}}}, {{{font-...}}} ||||||  general text & font properties  ||
    1119 Required properties to create an Area style: {{{fill-color}}} or {{{fill-image}}}
    1120 
     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-`... || ... || ... ||  ...  ||
     1090Similar 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  ||
     1101Required properties to create an Area style: `fill-color` or `fill-image`
    11211102
    11221103=== Text & Font properties ===
     
    11351116|-------------------------------------------------------------------------------
    11361117{{{#!td align=left  valign=top
    1137 {{{text}}}  
     1118`text` 
    11381119}}}
    11391120{{{#!td align=left  valign=top
    1140 How to find the label text. No label is displayed, unless this instruction is present.
     1121How to find the label text.\\No label is displayed, unless this instruction is present.
    11411122}}}
    11421123{{{#!td align=left  valign=top
    1143 {{{auto}}}
    1144    Derive the text automatically. The default name tags are: "{{{name:}}}"+''<LANG>'', "{{{name}}}", "{{{int_name}}}", "{{{ref}}}", "{{{operator}}}", "{{{brand}}}" and "{{{addr:housenumber}}}".
    1145 
    1146    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.)
    11471128
    11481129''String''
    1149    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.
    11501131
    11511132''Expressions''
    11521133  You can enter an expression to compute the text to be displayed. Examples:
    1153   * {{{eval("this is a static text")}}} - renderes a static text
    1154   * {{{eval(concat(tag("first"), "-", tag("second")))}}} - displays the concatenated tags "first" and "second"
    1155 
    1156 {{{""}}}
     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`""`
    11571138   To delete a previous set text.
    11581139}}}
     
    11611142}}}
    11621143|-------------------------------------------------------------------------------
    1163 || {{{text-color}}} || the text color || ''Color'' ||  {{{white}}} for lines and nodes, {{{#c0c0c0}}} for areas (JOSM "{{{text}}}" and "{{{areatext}}}" color preferences) ||
    1164 || {{{text-opacity}}} || how transparent the text is || ''Opacity'' ||  1.0  ||
    1165 || {{{text-offset-x}}} || shift the text horizontally, (not supported for text along line) || ''Number'' ||  0  ||
    1166 || {{{text-offset-y}}} (can also be written as {{{text-offset}}})  || shift the text vertically, positive values shift the text in upwards direction  || ''Number'' ||  0  ||
    1167 || {{{text-halo-radius}}} || size of text background border (to make text visible on background with a similar color) || ''Number'' ||  -  ||
    1168 || {{{text-halo-color}}} || color of the text halo || ''Color'' ||  complement of the text color  ||
    1169 || {{{text-halo-opacity}}} || transparency for the text halo || ''Opacity'' ||  1.0  ||
    1170 || {{{font-family}}} || font family || ''String'' ||  "Droid Sans"[[br]](JOSM preference "mappaint.font")  ||
    1171 || {{{font-size}}} || font size || ''Number'' ||  8[[br]](JOSM preference "mappaint.fontsize")  ||
    1172 || {{{font-weight}}} || bold or not || {{{bold}}}, {{{normal}}} ||  {{{normal}}}  ||
    1173 || {{{font-style}}} || italic or not || {{{italic}}}, {{{normal}}} ||  {{{normal}}}  ||
     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`  ||
    11741159
    11751160=== User defined properties ===
     
    11771162* In [wikitr:/Rules Validator rules] they must be prefixed by a `-`, e.g.: `-osmoseItemClassLevel: "1210/1/1";`
    11781163
    1179 === Property values explanations ===
     1164=== Property values explanations === #Propertyvaluesexplanations
    11801165'' '''Width''' ''
    11811166 - 14.0 (any positive number)
    1182  - {{{default}}} (use JOSM's default line width, which is 2, but can be configured)
    1183  - {{{thinnest}}} (draws the line as thin as possible)
    1184  - +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.
    11851170
    11861171'' '''Image''' ''
     
    11891174'' '''Color''' ''
    11901175 * named color as found in [https://www.w3.org/TR/css3-color/#svg-color this] list
    1191  * html style: '''{{{#RRGGBB}}}''', '''{{{#RGB}}}''', '''{{{#RRGGBBAA}}}'''
    1192  * '''{{{rgb(/*r*/, /*g*/, /*b*/)}}}''' - rgb value with arguments from 0.0 to 1.0
    1193  * '''{{{rgba(/*r*/, /*g*/, /*b*/, /*alpha*/)}}}''' - rgb value with alpha
    1194  * '''{{{hsb_color(/*hue*/, /*saturation*/, /*brightness*/)}}}''' - color from HSB color space
     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
    11951181
    11961182'' '''Opacity''' ''
     
    11981184
    11991185'' '''String''' ''
    1200  * 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.)
    12011187
    12021188'' '''Number''' ''
     
    12041190 * has a special meaning if you put a "+" sign in front (relative width)
    12051191
    1206 == Eval expressions ==
    1207 
    1208 
     1192
     1193== Eval expressions ==#Evalexpressions
    12091194See [/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.
    12101195
     
    12161201  comparison operators
    12171202 asin, atan, atan2, ceil, cos, cosh, exp, floor, log, max, min, mod (since r17759), random, round, signum, sin, sinh, sqrt, tan, tanh::
    1218   the usual meaning, [https://download.oracle.com/javase/8/docs/api/java/lang/Math.html details]
     1203  the usual meaning, [https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Math.html details]
    12191204 cond(b, fst, snd)::
    12201205 b ? fst : snd::
    12211206  if ('''b''') then '''fst''' else '''snd'''
    12221207 list(a, b, ...)::
    1223   create list of values, e.g. for the {{{dashes}}} property
     1208  create list of values, e.g. for the `dashes` property
    12241209 get(lst, n)::
    12251210  get the ''n''th element of the list ''lst'' (counting starts at 0) [''since r5699'']
     
    12271212  splits string ''str'' at occurrences of the separator string ''sep'', returns a list [''since r5699'']
    12281213 prop(''p_name'')::
    1229   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"`)
    12301215 prop(''p_name'', ''layer_name'')::
    12311216  property from the layer ''layer_name''
     
    12611246  assemble the strings to one
    12621247 join(''sep'', ''str1'', ''str2'', ...)::
    1263   join strings, whith ''sep'' as separator [''since r6737'']
     1248  join strings, with ''sep'' as separator [''since r6737'']
    12641249 join_list(''sep'', ''list_name'')::
    12651250   joins the elements of the list ''list_name'' to one string separated by the separator ''sep'' [''since r8775'']
     
    12891274  return the substring of ''str'', starting at index ''idx'' (0-indexed) [''since r6534'']
    12901275 substring(str, start, end)::
    1291   return the substring of ''str'', starting at index ''start'' (inclusive) up to ''end'' (exclusive) (0-indexed) [''since r6534'']
     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'']
    12921277 replace(string, old, new)::
    12931278   Replaces any occurrence of the substring ''old'' within the string ''string'' with the text ''new''
     
    13111296  [https://en.wikipedia.org/wiki/Percent-encoding percent-decode] a string. [''since r11756'']
    13121297 XML_encode(str)::
    1313   escape special characters in xml. E.g. {{{<}}} becomes {{{&lt;}}}, other special characters: {{{>}}}, {{{"}}}, {{{'}}}, {{{&}}}, {{{\n}}}, {{{\t}}} and {{{\r}}} [''since r6809'']
     1298  escape special characters in xml. E.g. `<` becomes `&lt;`, other special characters: `>`, `"`, `'`, `&`, `\n`, `\t` and `\r` [''since r6809'']
    13141299 CRC32_checksum(''str'')::
    13151300  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'']
    13161303 is_right_hand_traffic()::
    13171304  Check if there is left-hand or right-hand traffic at the current location. [''since r7193'']
     
    13231310  prints a string representation of `o` to the command line, followed by a new line (for debugging) [''since r7237'']
    13241311 JOSM_pref(''key'', ''default'')::
    1325   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 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.]
     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.]
    13261313 setting()::
    13271314  to use a [wikitr:/Help/Styles/MapCSSImplementation#Stylesettings style setting] [''since r7450'']
     
    13371324  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'']
    13381325 is_similar(''str1'', ''str2'')::
    1339   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'']
     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'']
    13401327 gpx_distance()::
    13411328  returns the lowest distance between the OSM object and a GPX point [''since r14802'']
     
    13441331 sort(''str1'', ''str2'', ''str3'', ''...'')::
    13451332  sorts an array of strings [''since r15279'']
    1346  sort_list()::
     1333 sort_list(''list_name'')::
    13471334  sorts a list of strings [''since r15279'']
    13481335 tag_regex(''regex'')::
    1349   returns a list of values that match the regex [''since r15317'']
     1336  returns a list containing the values of keys that match the regex [''since r15317'']
    13501337 to_boolean(''str'')::
    13511338  returns the string argument as a boolean [''since r16110'']
     
    13641351 uniq(''str1'', ''str2'', ''str3'', ''...'')::
    13651352  returns a list of strings that only have unique values from an array of strings [''since r15323'']
    1366  uniq_list()::
    1367   returns a list of strings that only have unique values from a list of strings [''since r15353'']
     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'']
    13681363
    13691364=== Examples ===
    1370 
    13711365* circle symbol for house number with size depending of the number of digits
    13721366{{{
     
    14261420}}}
    14271421
     1422* casing on inside of area
     1423{{{
     1424#!mapcss
     1425area[building]:clockwise {
     1426    right-casing-width: 10;
     1427}
     1428area[building]:anticlockwise {
     1429    left-casing-width: 10;
     1430}
     1431/* or */
     1432area[building][is_clockwise()] {
     1433    right-casing-width: 10;
     1434}
     1435area[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
     1443way[/(?i)^name$/ =~ /(?i)^Main Street$/] {
     1444}
     1445}}}
     1446
    14281447
    14291448== Compatibility notes ==
    14301449=== MapCSS 0.2 ===
    1431 
    14321450==== Grammar ====
    1433 
    1434  * {{{way[oneway=yes]}}} does not have any magic, you can use {{{way[oneway?]}}} instead
    1435  * no {{{@import}}}
    1436  * 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.
    14371454
    14381455==== Properties ====
    14391456At the moment, JOSM does ''not'' support the following properties:
    14401457 line: ::
    1441   {{{image}}}
     1458  `image`
    14421459 label: ::
    1443   {{{font-variant, text-decoration, text-transform, max-width}}}
     1460  `font-variant, text-decoration, text-transform, max-width`
    14441461 shield: ::
    14451462  not supported
    14461463
    14471464=== Halcyon (Potlatch 2) ===
    1448 
    14491465 * Text label is placed in the center of the icon. For compatibility with Halcyon put
    14501466{{{
     
    14541470 at the beginning of your style sheet.
    14551471 * standard z-index in Halcyon is 5, but it is 0 in JOSM
    1456  * '''{{{image: circle;}}}''' corresponds to '''{{{symbol-shape: circle;}}}'''
     1472 * '''`image: circle;`''' corresponds to '''`symbol-shape: circle;`'''
    14571473
    14581474=== Kothic ===
    1459 
    14601475 * Kothic has support for eval, which probably differs from JOSM's eval.
    14611476 * Kothic understands units, whereas JOSM always calculates in pixel.
    1462  * The extrusion features are not available in JOSM
     1477 * The extrusion features are not available in JOSM.
    14631478
    14641479=== Ceyx ===
    1465 
    1466  * seems to have {{{[tunnel=1]}}} instead of {{{[tunnel=yes]}}} (Halcyon) or {{{[tunnel?]}}} (JOSM)
    1467 
    1468 == Media queries [''since r6970'']  (deprecated) ==
     1480 * seems to have `[tunnel=1]` instead of `[tunnel=yes]` (Halcyon) or `[tunnel?]` (JOSM)
     1481
     1482
     1483== Media queries (deprecated) ==
    14691484
    14701485{{{#!td style="background-color: #faa"
    14711486Note: media queries are deprecated. You should use @supports rules instead (see above).
    14721487}}}
    1473 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:
     1488Media 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:
    14741489{{{
    14751490#!mapcss
     
    15061521}}}
    15071522{{{#!td
    1508 Only include {{{@media}}} section when the current version of JOSM is greater than or equal to the specified number.
     1523Only include `@media` section when the current version of JOSM is greater than or equal to the specified number.
    15091524}}}
    15101525|-
     
    15131528}}}
    15141529{{{#!td
    1515 Only include {{{@media}}} section when the current version of JOSM is lower than or equal to the specified number.
     1530Only include `@media` section when the current version of JOSM is lower than or equal to the specified number.
    15161531}}}
    15171532|-
     
    15201535}}}
    15211536{{{#!td
    1522 Only include {{{@media}}} section when the name of the editor / renderer matches the given string. In JOSM, the only accepted value is {{{josm}}}.
    1523 }}}
    1524 
    1525 Conditions can be combined with {{{and}}}:
     1537Only include `@media` section when the name of the editor / renderer matches the given string. In JOSM, the only accepted value is `josm`.
     1538}}}
     1539
     1540Conditions can be combined with `and`:
    15261541
    15271542{{{
     
    15531568
    15541569{{{#!comment
    1555 There is also the {{{not}}} keyword (see the linked css doc for details).
     1570There is also the `not` keyword (see the linked css doc for details).
    15561571This is implemented, but probably not very useful. Feel free to add documentation.
    15571572}}}