Module:LegalStatus
From altered.wiki
More actions
Documentation for this module may be created at Module:LegalStatus/doc
-- Module:LegalStatus
-- Renders a color-coded legal status table + choropleth map for substance articles.
-- Usage in articles:
-- {{#invoke:LegalStatus|render | de=grey | de_note=NpSG grey area | ru=unscheduled }}
local p = {}
-- Maps lowercase ISO 3166-1 alpha-2 param name โ { display name, flag emoji, GeoJSON ISO key }
-- The GeoJSON ISO key matches what geojson_to_lua.py writes into Module:CountryGeoJSON.
local COUNTRIES = {
af = { "Afghanistan", "๐ฆ๐ซ", "AF" },
al = { "Albania", "๐ฆ๐ฑ", "AL" },
dz = { "Algeria", "๐ฉ๐ฟ", "DZ" },
ad = { "Andorra", "๐ฆ๐ฉ", "AD" },
ao = { "Angola", "๐ฆ๐ด", "AO" },
ar = { "Argentina", "๐ฆ๐ท", "AR" },
am = { "Armenia", "๐ฆ๐ฒ", "AM" },
au = { "Australia", "๐ฆ๐บ", "AU" },
at = { "Austria", "๐ฆ๐น", "AT" },
az = { "Azerbaijan", "๐ฆ๐ฟ", "AZ" },
bs = { "Bahamas", "๐ง๐ธ", "BS" },
bh = { "Bahrain", "๐ง๐ญ", "BH" },
bd = { "Bangladesh", "๐ง๐ฉ", "BD" },
bb = { "Barbados", "๐ง๐ง", "BB" },
by = { "Belarus", "๐ง๐พ", "BY" },
be = { "Belgium", "๐ง๐ช", "BE" },
bz = { "Belize", "๐ง๐ฟ", "BZ" },
bj = { "Benin", "๐ง๐ฏ", "BJ" },
bt = { "Bhutan", "๐ง๐น", "BT" },
bo = { "Bolivia", "๐ง๐ด", "BO" },
ba = { "Bosnia and Herzegovina", "๐ง๐ฆ", "BA" },
bw = { "Botswana", "๐ง๐ผ", "BW" },
br = { "Brazil", "๐ง๐ท", "BR" },
bn = { "Brunei", "๐ง๐ณ", "BN" },
bg = { "Bulgaria", "๐ง๐ฌ", "BG" },
bf = { "Burkina Faso", "๐ง๐ซ", "BF" },
bi = { "Burundi", "๐ง๐ฎ", "BI" },
cv = { "Cabo Verde", "๐จ๐ป", "CV" },
kh = { "Cambodia", "๐ฐ๐ญ", "KH" },
cm = { "Cameroon", "๐จ๐ฒ", "CM" },
ca = { "Canada", "๐จ๐ฆ", "CA" },
cf = { "Central African Republic","๐จ๐ซ","CF" },
td = { "Chad", "๐น๐ฉ", "TD" },
cl = { "Chile", "๐จ๐ฑ", "CL" },
cn = { "China", "๐จ๐ณ", "CN" },
co = { "Colombia", "๐จ๐ด", "CO" },
km = { "Comoros", "๐ฐ๐ฒ", "KM" },
cg = { "Republic of the Congo", "๐จ๐ฌ", "CG" },
cd = { "DR Congo", "๐จ๐ฉ", "CD" },
cr = { "Costa Rica", "๐จ๐ท", "CR" },
hr = { "Croatia", "๐ญ๐ท", "HR" },
cu = { "Cuba", "๐จ๐บ", "CU" },
cy = { "Cyprus", "๐จ๐พ", "CY" },
cz = { "Czech Republic", "๐จ๐ฟ", "CZ" },
dk = { "Denmark", "๐ฉ๐ฐ", "DK" },
dj = { "Djibouti", "๐ฉ๐ฏ", "DJ" },
["do"] = { "Dominican Republic", "๐ฉ๐ด", "DO" },
ec = { "Ecuador", "๐ช๐จ", "EC" },
eg = { "Egypt", "๐ช๐ฌ", "EG" },
sv = { "El Salvador", "๐ธ๐ป", "SV" },
gq = { "Equatorial Guinea", "๐ฌ๐ถ", "GQ" },
er = { "Eritrea", "๐ช๐ท", "ER" },
ee = { "Estonia", "๐ช๐ช", "EE" },
sz = { "Eswatini", "๐ธ๐ฟ", "SZ" },
et = { "Ethiopia", "๐ช๐น", "ET" },
fj = { "Fiji", "๐ซ๐ฏ", "FJ" },
fi = { "Finland", "๐ซ๐ฎ", "FI" },
fr = { "France", "๐ซ๐ท", "FR" },
ga = { "Gabon", "๐ฌ๐ฆ", "GA" },
gm = { "Gambia", "๐ฌ๐ฒ", "GM" },
ge = { "Georgia", "๐ฌ๐ช", "GE" },
de = { "Germany", "๐ฉ๐ช", "DE" },
gh = { "Ghana", "๐ฌ๐ญ", "GH" },
gr = { "Greece", "๐ฌ๐ท", "GR" },
gd = { "Grenada", "๐ฌ๐ฉ", "GD" },
gt = { "Guatemala", "๐ฌ๐น", "GT" },
gn = { "Guinea", "๐ฌ๐ณ", "GN" },
gw = { "Guinea-Bissau", "๐ฌ๐ผ", "GW" },
gy = { "Guyana", "๐ฌ๐พ", "GY" },
ht = { "Haiti", "๐ญ๐น", "HT" },
hn = { "Honduras", "๐ญ๐ณ", "HN" },
hu = { "Hungary", "๐ญ๐บ", "HU" },
is = { "Iceland", "๐ฎ๐ธ", "IS" },
["in"] = { "India", "๐ฎ๐ณ", "IN" },
id = { "Indonesia", "๐ฎ๐ฉ", "ID" },
ir = { "Iran", "๐ฎ๐ท", "IR" },
iq = { "Iraq", "๐ฎ๐ถ", "IQ" },
ie = { "Ireland", "๐ฎ๐ช", "IE" },
il = { "Israel", "๐ฎ๐ฑ", "IL" },
it = { "Italy", "๐ฎ๐น", "IT" },
jm = { "Jamaica", "๐ฏ๐ฒ", "JM" },
jp = { "Japan", "๐ฏ๐ต", "JP" },
jo = { "Jordan", "๐ฏ๐ด", "JO" },
kz = { "Kazakhstan", "๐ฐ๐ฟ", "KZ" },
ke = { "Kenya", "๐ฐ๐ช", "KE" },
ki = { "Kiribati", "๐ฐ๐ฎ", "KI" },
kp = { "North Korea", "๐ฐ๐ต", "KP" },
kr = { "South Korea", "๐ฐ๐ท", "KR" },
kw = { "Kuwait", "๐ฐ๐ผ", "KW" },
kg = { "Kyrgyzstan", "๐ฐ๐ฌ", "KG" },
la = { "Laos", "๐ฑ๐ฆ", "LA" },
lv = { "Latvia", "๐ฑ๐ป", "LV" },
lb = { "Lebanon", "๐ฑ๐ง", "LB" },
ls = { "Lesotho", "๐ฑ๐ธ", "LS" },
lr = { "Liberia", "๐ฑ๐ท", "LR" },
ly = { "Libya", "๐ฑ๐พ", "LY" },
li = { "Liechtenstein", "๐ฑ๐ฎ", "LI" },
lt = { "Lithuania", "๐ฑ๐น", "LT" },
lu = { "Luxembourg", "๐ฑ๐บ", "LU" },
mg = { "Madagascar", "๐ฒ๐ฌ", "MG" },
mw = { "Malawi", "๐ฒ๐ผ", "MW" },
my = { "Malaysia", "๐ฒ๐พ", "MY" },
mv = { "Maldives", "๐ฒ๐ป", "MV" },
ml = { "Mali", "๐ฒ๐ฑ", "ML" },
mt = { "Malta", "๐ฒ๐น", "MT" },
mr = { "Mauritania", "๐ฒ๐ท", "MR" },
mu = { "Mauritius", "๐ฒ๐บ", "MU" },
mx = { "Mexico", "๐ฒ๐ฝ", "MX" },
fm = { "Micronesia", "๐ซ๐ฒ", "FM" },
md = { "Moldova", "๐ฒ๐ฉ", "MD" },
mc = { "Monaco", "๐ฒ๐จ", "MC" },
mn = { "Mongolia", "๐ฒ๐ณ", "MN" },
me = { "Montenegro", "๐ฒ๐ช", "ME" },
ma = { "Morocco", "๐ฒ๐ฆ", "MA" },
mz = { "Mozambique", "๐ฒ๐ฟ", "MZ" },
mm = { "Myanmar", "๐ฒ๐ฒ", "MM" },
na = { "Namibia", "๐ณ๐ฆ", "NA" },
nr = { "Nauru", "๐ณ๐ท", "NR" },
np = { "Nepal", "๐ณ๐ต", "NP" },
nl = { "Netherlands", "๐ณ๐ฑ", "NL" },
nz = { "New Zealand", "๐ณ๐ฟ", "NZ" },
ni = { "Nicaragua", "๐ณ๐ฎ", "NI" },
ne = { "Niger", "๐ณ๐ช", "NE" },
ng = { "Nigeria", "๐ณ๐ฌ", "NG" },
mk = { "North Macedonia", "๐ฒ๐ฐ", "MK" },
no = { "Norway", "๐ณ๐ด", "NO" },
om = { "Oman", "๐ด๐ฒ", "OM" },
pk = { "Pakistan", "๐ต๐ฐ", "PK" },
pw = { "Palau", "๐ต๐ผ", "PW" },
pa = { "Panama", "๐ต๐ฆ", "PA" },
pg = { "Papua New Guinea", "๐ต๐ฌ", "PG" },
py = { "Paraguay", "๐ต๐พ", "PY" },
pe = { "Peru", "๐ต๐ช", "PE" },
ph = { "Philippines", "๐ต๐ญ", "PH" },
pl = { "Poland", "๐ต๐ฑ", "PL" },
pt = { "Portugal", "๐ต๐น", "PT" },
qa = { "Qatar", "๐ถ๐ฆ", "QA" },
ro = { "Romania", "๐ท๐ด", "RO" },
ru = { "Russia", "๐ท๐บ", "RU" },
rw = { "Rwanda", "๐ท๐ผ", "RW" },
kn = { "Saint Kitts and Nevis", "๐ฐ๐ณ", "KN" },
lc = { "Saint Lucia", "๐ฑ๐จ", "LC" },
vc = { "Saint Vincent", "๐ป๐จ", "VC" },
ws = { "Samoa", "๐ผ๐ธ", "WS" },
sm = { "San Marino", "๐ธ๐ฒ", "SM" },
st = { "Sรฃo Tomรฉ and Prรญncipe", "๐ธ๐น", "ST" },
sa = { "Saudi Arabia", "๐ธ๐ฆ", "SA" },
sn = { "Senegal", "๐ธ๐ณ", "SN" },
rs = { "Serbia", "๐ท๐ธ", "RS" },
sc = { "Seychelles", "๐ธ๐จ", "SC" },
sl = { "Sierra Leone", "๐ธ๐ฑ", "SL" },
sg = { "Singapore", "๐ธ๐ฌ", "SG" },
sk = { "Slovakia", "๐ธ๐ฐ", "SK" },
si = { "Slovenia", "๐ธ๐ฎ", "SI" },
sb = { "Solomon Islands", "๐ธ๐ง", "SB" },
so = { "Somalia", "๐ธ๐ด", "SO" },
za = { "South Africa", "๐ฟ๐ฆ", "ZA" },
ss = { "South Sudan", "๐ธ๐ธ", "SS" },
es = { "Spain", "๐ช๐ธ", "ES" },
lk = { "Sri Lanka", "๐ฑ๐ฐ", "LK" },
sd = { "Sudan", "๐ธ๐ฉ", "SD" },
sr = { "Suriname", "๐ธ๐ท", "SR" },
se = { "Sweden", "๐ธ๐ช", "SE" },
ch = { "Switzerland", "๐จ๐ญ", "CH" },
sy = { "Syria", "๐ธ๐พ", "SY" },
tw = { "Taiwan", "๐น๐ผ", "TW" },
tj = { "Tajikistan", "๐น๐ฏ", "TJ" },
tz = { "Tanzania", "๐น๐ฟ", "TZ" },
th = { "Thailand", "๐น๐ญ", "TH" },
tl = { "Timor-Leste", "๐น๐ฑ", "TL" },
tg = { "Togo", "๐น๐ฌ", "TG" },
to = { "Tonga", "๐น๐ด", "TO" },
tt = { "Trinidad and Tobago", "๐น๐น", "TT" },
tn = { "Tunisia", "๐น๐ณ", "TN" },
tr = { "Turkey", "๐น๐ท", "TR" },
tm = { "Turkmenistan", "๐น๐ฒ", "TM" },
tv = { "Tuvalu", "๐น๐ป", "TV" },
ug = { "Uganda", "๐บ๐ฌ", "UG" },
ua = { "Ukraine", "๐บ๐ฆ", "UA" },
ae = { "United Arab Emirates", "๐ฆ๐ช", "AE" },
uk = { "United Kingdom", "๐ฌ๐ง", "GB" },
us = { "United States", "๐บ๐ธ", "US" },
uy = { "Uruguay", "๐บ๐พ", "UY" },
uz = { "Uzbekistan", "๐บ๐ฟ", "UZ" },
vu = { "Vanuatu", "๐ป๐บ", "VU" },
ve = { "Venezuela", "๐ป๐ช", "VE" },
vn = { "Vietnam", "๐ป๐ณ", "VN" },
ye = { "Yemen", "๐พ๐ช", "YE" },
zm = { "Zambia", "๐ฟ๐ฒ", "ZM" },
zw = { "Zimbabwe", "๐ฟ๐ผ", "ZW" },
}
local STATUS_LABEL = {
unscheduled = "Unscheduled",
scheduled = "Scheduled",
grey = "Grey area",
prescription = "Prescription only",
unknown = "Unknown",
}
local STATUS_CSS = {
unscheduled = "unscheduled",
scheduled = "scheduled",
grey = "grey",
prescription = "prescription",
unknown = "unknown",
}
-- Fill colors match the CSS badge palette (common-css.css)
local STATUS_FILL = {
unscheduled = "#28a745",
scheduled = "#dc3545",
grey = "#e6a817",
prescription = "#0d6efd",
unknown = "#adb5bd",
}
local function parseArgs(args)
local result = {}
for k, v in pairs(args) do
k = mw.text.trim(tostring(k))
v = mw.text.trim(tostring(v))
if COUNTRIES[k] and v ~= "" and not k:find("_note$") then
table.insert(result, {
code = k,
status = v,
note = mw.text.trim(args[k .. "_note"] or ""),
meta = COUNTRIES[k],
})
end
end
table.sort(result, function(a, b) return a.meta[1] < b.meta[1] end)
return result
end
local function buildTable(countries)
local t = mw.html.create("table"):addClass("legal-status-table")
for _, c in ipairs(countries) do
local label = STATUS_LABEL[c.status] or "Unknown"
local css = STATUS_CSS[c.status] or "unknown"
local tr = t:tag("tr")
tr:tag("td"):addClass("legal-status-table__country")
:wikitext(c.meta[2] .. "\u{00A0}" .. c.meta[1])
tr:tag("td")
:wikitext('<span class="legal-status-badge legal-status-badge--' .. css .. '">'
.. label .. '</span>')
tr:tag("td"):addClass("legal-status-table__note"):wikitext(c.note)
end
return tostring(t)
end
local function buildMap(frame, countries)
local ok, geoData = pcall(mw.loadData, "Module:CountryGeoJSON")
if not ok then
-- Map is optional; table still renders without it
return ""
end
local features = {}
for _, c in ipairs(countries) do
local iso = c.meta[3]
local geo = geoData[iso]
if geo then
table.insert(features, {
type = "Feature",
properties = {
["fill"] = STATUS_FILL[c.status] or STATUS_FILL.unknown,
["fill-opacity"] = 0.65,
["stroke"] = "#444444",
["stroke-width"] = 1,
["stroke-opacity"] = 0.6,
title = c.meta[1],
description = STATUS_LABEL[c.status] or "Unknown",
},
geometry = {
type = geo.t,
coordinates = geo.c,
},
})
end
end
if #features == 0 then return "" end
local geojson = mw.text.jsonEncode({
type = "FeatureCollection",
features = features,
})
local mapHtml = frame:callParserFunction("#display_map", {
geojson = geojson,
width = "100%",
height = "260",
zoom = "1",
})
return mapHtml
end
function p.render(frame)
local args = frame.args
local countries = parseArgs(args)
if #countries == 0 then return "" end
local mapHtml = buildMap(frame, countries)
local tableHtml = buildTable(countries)
return mapHtml .. "\n" .. tableHtml
end
return p