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;
}