meta { title: "Road shields"; icon: "https://commons.wikimedia.org/w/index.php?title=Special:Redirect/file/Japanese_National_Route_Sign_Blank.svg"; version: "0.4.0"; description: "Render road shields adjacent their respective ways."; author: "mayhaps-perchance"; link: "https://github.com/mayhaps-perchance/josm-road-shields"; min-josm-version: "17759"; /* tentative */ } setting::mp_rs_dpi_scale { type: double; label: tr("DPI scale factor"); default: 1; } setting::mp_rs_icon_size_min { type: double; label: tr("Minimum icon size"); default: 24; } setting::mp_rs_icon_size_max { type: double; label: tr("Maximum icon size"); default: 128; } setting::mp_rs_freq_way { type: double; label: tr("Way badge frequency"); default: 1; } relation[route=road][network] > way { set mp_rs; } *|z30[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: 8192; } *|z29[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: 4096; } *|z28[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: 2048; } *|z27[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: 1024; } *|z26[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: 512; } *|z25[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: 256; } *|z24[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: 128; } *|z23[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: 64; } *|z22[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: 32; } *|z21[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: 16; } *|z20[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: 8; } *|z19[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: 4; } *|z18[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: 2; } *|z17[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: 1; } *|z16[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: .5; } *|z15[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: .25; } *|z14[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: .125; } *|z13[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: .0625; } *|z12[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: .03125; } *|z11[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: .015625; } *|z10[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: .0078125; } *|z09[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: .00390625; } *|z08[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: .001953125; } *|z07[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: .0009765625; } *|z06[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: .00048828125; } *|z05[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: .000244140625; } *|z04[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: .0001220703125; } *|z03[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: .00006103515625; } *|z02[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: .000030517578125; } *|z01[is_prop_set(mp_rs, default)]::mp_rs_const { zoom-factor: .0000152587890625; } way[is_prop_set(mp_rs, default)]::mp_rs_const { _image_url_base: "https://wiki.openstreetmap.org/w/index.php?title=Special:Redirect/file/"; _dim_min: setting(mp_rs_icon_size_min)/setting(mp_rs_dpi_scale); _dim_max: setting(mp_rs_icon_size_max)/setting(mp_rs_dpi_scale); _dim_tentative: waylength()*prop(zoom-factor); _dim: min(prop(_dim_tentative)/6, prop("_dim_max")); } /* TODO: Wait until JOSM devs add for loops FFS */ relation[route=road][network] >[role*=""] way::mp_rs_badge0 { _last: concat(parent_tag(network), parent_tag(ref)); major-z-index: 5; repeat-image-width: prop(_dim, mp_rs_const); repeat-image-spacing: waylength()*prop(zoom-factor, mp_rs_const)*2; repeat-image-opacity: mod(index() - 1, max(1, round(setting(mp_rs_freq_way)))) == 0 && prop(_dim, mp_rs_const) >= prop(_dim_min, mp_rs_const) ? 1 : 0; repeat-image: any(parent_tag(symbol), concat(prop(_image_url_base, mp_rs_const), "MUTCD_W18-1.svg")); } relation[route=road][network] >[!regexp_test(prop(_last, mp_rs_badge0), concat(parent_tag(network), parent_tag(ref)))][role*=""] way::mp_rs_badge1 { _last: concat(prop(_last, mp_rs_badge0), "|", parent_tag(network), parent_tag(ref)); major-z-index: 5; repeat-image-width: prop(_dim, mp_rs_const); repeat-image-spacing: waylength()*prop(zoom-factor, mp_rs_const)*2; repeat-image-opacity: mod(index() - 1, max(1, round(setting(mp_rs_freq_way)))) == 0 && prop(_dim, mp_rs_const) >= prop(_dim_min, mp_rs_const) ? 1 : 0; repeat-image: any(parent_tag(symbol), concat(prop(_image_url_base, mp_rs_const), "MUTCD_W18-1.svg")); repeat-image-phase: -prop(_dim, mp_rs_const); } relation[route=road][network] >[!regexp_test(prop(_last, mp_rs_badge1), concat(parent_tag(network), parent_tag(ref)))][role*=""] way::mp_rs_badge2 { _last: concat(prop(_last, mp_rs_badge1), "|", parent_tag(network), parent_tag(ref)); major-z-index: 5; repeat-image-width: prop(_dim, mp_rs_const); repeat-image-spacing: waylength()*prop(zoom-factor, mp_rs_const)*2; repeat-image-opacity: mod(index() - 1, max(1, round(setting(mp_rs_freq_way)))) == 0 && prop(_dim, mp_rs_const) >= prop(_dim_min, mp_rs_const) ? 1 : 0; repeat-image: any(parent_tag(symbol), concat(prop(_image_url_base, mp_rs_const), "MUTCD_W18-1.svg")); repeat-image-phase: -prop(_dim, mp_rs_const)*2; } relation[route=road][network] >[!regexp_test(prop(_last, mp_rs_badge2), concat(parent_tag(network), parent_tag(ref)))][role*=""] way::mp_rs_badge3 { _last: concat(prop(_last, mp_rs_badge2), "|", parent_tag(network), parent_tag(ref)); major-z-index: 5; repeat-image-width: prop(_dim, mp_rs_const); repeat-image-spacing: waylength()*prop(zoom-factor, mp_rs_const)*2; repeat-image-opacity: mod(index() - 1, max(1, round(setting(mp_rs_freq_way)))) == 0 && prop(_dim, mp_rs_const) >= prop(_dim_min, mp_rs_const) ? 1 : 0; repeat-image: any(parent_tag(symbol), concat(prop(_image_url_base, mp_rs_const), "MUTCD_W18-1.svg")); repeat-image-phase: -prop(_dim, mp_rs_const)*3; } relation[route=road][network] >[!regexp_test(prop(_last, mp_rs_badge3), concat(parent_tag(network), parent_tag(ref)))][role*=""] way::mp_rs_badge4 { _last: concat(prop(_last, mp_rs_badge3), "|", parent_tag(network), parent_tag(ref)); major-z-index: 5; repeat-image-width: prop(_dim, mp_rs_const); repeat-image-spacing: waylength()*prop(zoom-factor, mp_rs_const)*2; repeat-image-opacity: mod(index() - 1, max(1, round(setting(mp_rs_freq_way)))) == 0 && prop(_dim, mp_rs_const) >= prop(_dim_min, mp_rs_const) ? 1 : 0; repeat-image: any(parent_tag(symbol), concat(prop(_image_url_base, mp_rs_const), "MUTCD_W18-1.svg")); repeat-image-phase: -prop(_dim, mp_rs_const)*4; } relation[route=road][network] >[!regexp_test(prop(_last, mp_rs_badge4), concat(parent_tag(network), parent_tag(ref)))][role*=""] way::mp_rs_badge5 { _last: concat(prop(_last, mp_rs_badge4), "|", parent_tag(network), parent_tag(ref)); major-z-index: 5; repeat-image-width: prop(_dim, mp_rs_const); repeat-image-spacing: waylength()*prop(zoom-factor, mp_rs_const)*2; repeat-image-opacity: mod(index() - 1, max(1, round(setting(mp_rs_freq_way)))) == 0 && prop(_dim, mp_rs_const) >= prop(_dim_min, mp_rs_const) ? 1 : 0; repeat-image: any(parent_tag(symbol), concat(prop(_image_url_base, mp_rs_const), "MUTCD_W18-1.svg")); repeat-image-phase: -prop(_dim, mp_rs_const)*5; } relation[route=road][network] >[role*=""] way::mp_rs_badge0_mod { _last: concat(parent_tag(network), parent_tag(ref)); major-z-index: 5; repeat-image-width: prop(_dim, mp_rs_const); repeat-image-spacing: waylength()*prop(zoom-factor, mp_rs_const)*2; repeat-image-opacity: mod(index() - 1, max(1, round(setting(mp_rs_freq_way)))) == 0 && prop(_dim_tentative, mp_rs_const) >= prop(_dim_min, mp_rs_const) ? 1 : 0; repeat-image: any(parent_tag("symbol:modifier"), "data:image/svg+xml,"); repeat-image-offset: prop(_dim, mp_rs_const)/4; } relation[route=road][network] >[!regexp_test(prop(_last, mp_rs_badge0), concat(parent_tag(network), parent_tag(ref)))][role*=""] way::mp_rs_badge1_mod { _last: concat(prop(_last, mp_rs_badge0), "|", parent_tag(network), parent_tag(ref)); major-z-index: 5; repeat-image-width: prop(_dim, mp_rs_const); repeat-image-spacing: waylength()*prop(zoom-factor, mp_rs_const)*2; repeat-image-opacity: mod(index() - 1, max(1, round(setting(mp_rs_freq_way)))) == 0 && prop(_dim_tentative, mp_rs_const) >= prop(_dim_min, mp_rs_const) ? 1 : 0; repeat-image: any(parent_tag("symbol:modifier"), "data:image/svg+xml,"); repeat-image-offset: prop(_dim, mp_rs_const)/4; repeat-image-phase: -prop(_dim, mp_rs_const); } relation[route=road][network] >[!regexp_test(prop(_last, mp_rs_badge1), concat(parent_tag(network), parent_tag(ref)))][role*=""] way::mp_rs_badge2_mod { _last: concat(prop(_last, mp_rs_badge1), "|", parent_tag(network), parent_tag(ref)); major-z-index: 5; repeat-image-width: prop(_dim, mp_rs_const); repeat-image-spacing: waylength()*prop(zoom-factor, mp_rs_const)*2; repeat-image-opacity: mod(index() - 1, max(1, round(setting(mp_rs_freq_way)))) == 0 && prop(_dim_tentative, mp_rs_const) >= prop(_dim_min, mp_rs_const) ? 1 : 0; repeat-image: any(parent_tag("symbol:modifier"), "data:image/svg+xml,"); repeat-image-offset: prop(_dim, mp_rs_const)/4; repeat-image-phase: -prop(_dim, mp_rs_const)*2; } relation[route=road][network] >[!regexp_test(prop(_last, mp_rs_badge2), concat(parent_tag(network), parent_tag(ref)))][role*=""] way::mp_rs_badge3_mod { _last: concat(prop(_last, mp_rs_badge2), "|", parent_tag(network), parent_tag(ref)); major-z-index: 5; repeat-image-width: prop(_dim, mp_rs_const); repeat-image-spacing: waylength()*prop(zoom-factor, mp_rs_const)*2; repeat-image-opacity: mod(index() - 1, max(1, round(setting(mp_rs_freq_way)))) == 0 && prop(_dim_tentative, mp_rs_const) >= prop(_dim_min, mp_rs_const) ? 1 : 0; repeat-image: any(parent_tag("symbol:modifier"), "data:image/svg+xml,"); repeat-image-offset: prop(_dim, mp_rs_const)/4; repeat-image-phase: -prop(_dim, mp_rs_const)*3; } relation[route=road][network] >[!regexp_test(prop(_last, mp_rs_badge3), concat(parent_tag(network), parent_tag(ref)))][role*=""] way::mp_rs_badge4_mod { _last: concat(prop(_last, mp_rs_badge3), "|", parent_tag(network), parent_tag(ref)); major-z-index: 5; repeat-image-width: prop(_dim, mp_rs_const); repeat-image-spacing: waylength()*prop(zoom-factor, mp_rs_const)*2; repeat-image-opacity: mod(index() - 1, max(1, round(setting(mp_rs_freq_way)))) == 0 && prop(_dim_tentative, mp_rs_const) >= prop(_dim_min, mp_rs_const) ? 1 : 0; repeat-image: any(parent_tag("symbol:modifier"), "data:image/svg+xml,"); repeat-image-offset: prop(_dim, mp_rs_const)/4; repeat-image-phase: -prop(_dim, mp_rs_const)*4; } relation[route=road][network] >[!regexp_test(prop(_last, mp_rs_badge4), concat(parent_tag(network), parent_tag(ref)))][role*=""] way::mp_rs_badge5_mod { _last: concat(prop(_last, mp_rs_badge4), "|", parent_tag(network), parent_tag(ref)); major-z-index: 5; repeat-image-width: prop(_dim, mp_rs_const); repeat-image-spacing: waylength()*prop(zoom-factor, mp_rs_const)*2; repeat-image-opacity: mod(index() - 1, max(1, round(setting(mp_rs_freq_way)))) == 0 && prop(_dim_tentative, mp_rs_const) >= prop(_dim_min, mp_rs_const) ? 1 : 0; repeat-image: any(parent_tag("symbol:modifier"), "data:image/svg+xml,"); repeat-image-offset: prop(_dim, mp_rs_const)/4; repeat-image-phase: -prop(_dim, mp_rs_const)*5; }