meta { title: "Road shields"; icon: "https://commons.wikimedia.org/w/index.php?title=Special:Redirect/file/Japanese_National_Route_Sign_Blank.svg"; version: "0.2"; 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::rs_dpi_scale { type: double; label: tr("DPI scale factor"); default: 1; } setting::rs_icon_size_min { type: double; label: tr("Minimum icon size"); default: 24; } setting::rs_icon_size_max { type: double; label: tr("Maximum icon size"); default: 128; } setting::rs_freq_way { type: double; label: tr("Way badge frequency"); default: 1; } relation[route=road][network] > way { set rs; } way|z26[is_prop_set(rs, default)]::* {ppm: 519.168; } way|z25[is_prop_set(rs, default)]::* {ppm: 259.584; } way|z24[is_prop_set(rs, default)]::* {ppm: 129.792; } way|z23[is_prop_set(rs, default)]::* {ppm: 64.896; } way|z22[is_prop_set(rs, default)]::* {ppm: 32.448; } way|z21[is_prop_set(rs, default)]::* {ppm: 16.224; } way|z20[is_prop_set(rs, default)]::* {ppm: 8.112; } way|z19[is_prop_set(rs, default)]::* {ppm: 4.056; } way|z18[is_prop_set(rs, default)]::* {ppm: 2.028; } way|z17[is_prop_set(rs, default)]::* {ppm: 1.014; } way|z16[is_prop_set(rs, default)]::* {ppm: 0.507; } way|z15[is_prop_set(rs, default)]::* {ppm: 0.2535; } way|z14[is_prop_set(rs, default)]::* {ppm: 0.12675; } way|z13[is_prop_set(rs, default)]::* {ppm: 0.063375; } way|z12[is_prop_set(rs, default)]::* {ppm: 0.0316875; } way|z11[is_prop_set(rs, default)]::* {ppm: 0.01584375; } way|z10[is_prop_set(rs, default)]::* {ppm: 0.007921875; } way|z09[is_prop_set(rs, default)]::* {ppm: 0.0039609375; } way|z08[is_prop_set(rs, default)]::* {ppm: 0.00198046875; } way|z07[is_prop_set(rs, default)]::* {ppm: 0.000990234375; } way[is_prop_set(rs, default)]::rs_const { _image_url_base: "https://wiki.openstreetmap.org/w/index.php?title=Special:Redirect/file/"; } way|z8-[is_prop_set(rs, default)]::* { _dim_min: setting("rs_icon_size_min")/setting("rs_dpi_scale"); _dim_max: setting("rs_icon_size_max")/setting("rs_dpi_scale"); _dim: min(waylength()*prop("ppm")/6, prop("_dim_max")); repeat-image-width: prop("_dim"); repeat-image-offset: -prop("_dim")/2; repeat-image-spacing: waylength()*prop("ppm")*2; repeat-image-opacity: mod(index() - 1, max(1, round(setting("rs_freq_way")))) == 0 && prop("_dim") >= prop("_dim_min") ? 1 : 0; } /* TODO: Wait until JOSM devs add for loops FFS */ relation[route=road][network] >[role*=""] way::rs_badge0 { _last: concat(parent_tag(network), parent_tag(ref)); repeat-image: any(parent_tag(symbol), concat(prop(_image_url_base, rs_const), "MUTCD_W18-1.svg")); } relation[route=road][network] >[!regexp_test(prop(_last, rs_badge0), concat(parent_tag(network), parent_tag(ref)))][role*=""] way::rs_badge1 { _last: concat(prop(_last, rs_badge0), "|", parent_tag(network), parent_tag(ref)); repeat-image: any(parent_tag(symbol), concat(prop(_image_url_base, rs_const), "MUTCD_W18-1.svg")); repeat-image-phase: -prop("_dim"); } relation[route=road][network] >[!regexp_test(prop(_last, rs_badge1), concat(parent_tag(network), parent_tag(ref)))][role*=""] way::rs_badge2 { _last: concat(prop(_last, rs_badge1), "|", parent_tag(network), parent_tag(ref)); repeat-image: any(parent_tag(symbol), concat(prop(_image_url_base, rs_const), "MUTCD_W18-1.svg")); repeat-image-phase: -prop("_dim")*2; } relation[route=road][network] >[!regexp_test(prop(_last, rs_badge2), concat(parent_tag(network), parent_tag(ref)))][role*=""] way::rs_badge3 { _last: concat(prop(_last, rs_badge2), "|", parent_tag(network), parent_tag(ref)); repeat-image: any(parent_tag(symbol), concat(prop(_image_url_base, rs_const), "MUTCD_W18-1.svg")); repeat-image-phase: -prop("_dim")*3; } relation[route=road][network] >[!regexp_test(prop(_last, rs_badge3), concat(parent_tag(network), parent_tag(ref)))][role*=""] way::rs_badge4 { _last: concat(prop(_last, rs_badge3), "|", parent_tag(network), parent_tag(ref)); repeat-image: any(parent_tag(symbol), concat(prop(_image_url_base, rs_const), "MUTCD_W18-1.svg")); repeat-image-phase: -prop("_dim")*4; } relation[route=road][network] >[!regexp_test(prop(_last, rs_badge4), concat(parent_tag(network), parent_tag(ref)))][role*=""] way::rs_badge5 { _last: concat(prop(_last, rs_badge4), "|", parent_tag(network), parent_tag(ref)); repeat-image: any(parent_tag(symbol), concat(prop(_image_url_base, rs_const), "MUTCD_W18-1.svg")); repeat-image-phase: -prop("_dim")*5; } relation[route=road][network] >[role*=""] way::rs_badge0_mod { _last: concat(parent_tag(network), parent_tag(ref)); repeat-image: any(parent_tag("symbol:modifier"), "data:image/svg+xml,"); repeat-image-offset: prop("_dim")/4; } relation[route=road][network] >[!regexp_test(prop(_last, rs_badge0), concat(parent_tag(network), parent_tag(ref)))][role*=""] way::rs_badge1_mod { _last: concat(prop(_last, rs_badge0), "|", parent_tag(network), parent_tag(ref)); repeat-image: any(parent_tag("symbol:modifier"), "data:image/svg+xml,"); repeat-image-offset: prop("_dim")/4; repeat-image-phase: -prop("_dim"); } relation[route=road][network] >[!regexp_test(prop(_last, rs_badge1), concat(parent_tag(network), parent_tag(ref)))][role*=""] way::rs_badge2_mod { _last: concat(prop(_last, rs_badge1), "|", parent_tag(network), parent_tag(ref)); repeat-image: any(parent_tag("symbol:modifier"), "data:image/svg+xml,"); repeat-image-offset: prop("_dim")/4; repeat-image-phase: -prop("_dim")*2; } relation[route=road][network] >[!regexp_test(prop(_last, rs_badge2), concat(parent_tag(network), parent_tag(ref)))][role*=""] way::rs_badge3_mod { _last: concat(prop(_last, rs_badge2), "|", parent_tag(network), parent_tag(ref)); repeat-image: any(parent_tag("symbol:modifier"), "data:image/svg+xml,"); repeat-image-offset: prop("_dim")/4; repeat-image-phase: -prop("_dim")*3; } relation[route=road][network] >[!regexp_test(prop(_last, rs_badge3), concat(parent_tag(network), parent_tag(ref)))][role*=""] way::rs_badge4_mod { _last: concat(prop(_last, rs_badge3), "|", parent_tag(network), parent_tag(ref)); repeat-image: any(parent_tag("symbol:modifier"), "data:image/svg+xml,"); repeat-image-offset: prop("_dim")/4; repeat-image-phase: -prop("_dim")*4; } relation[route=road][network] >[!regexp_test(prop(_last, rs_badge4), concat(parent_tag(network), parent_tag(ref)))][role*=""] way::rs_badge5_mod { _last: concat(prop(_last, rs_badge4), "|", parent_tag(network), parent_tag(ref)); repeat-image: any(parent_tag("symbol:modifier"), "data:image/svg+xml,"); repeat-image-offset: prop("_dim")/4; repeat-image-phase: -prop("_dim")*5; }