Jump to content
 







Main menu
   


Navigation  



Main page
Contents
Current events
Random article
About Wikipedia
Contact us
Donate
 




Contribute  



Help
Learn to edit
Community portal
Recent changes
Upload file
 








Search  

































Create account

Log in
 









Create account
 Log in
 




Pages for logged out editors learn more  



Contributions
Talk
 



















Contents

   



(Top)
 


1 Usage  





2 Parameters  














Module:Shindo






فارسی
Hrvatski
Bahasa Indonesia
 

Edit links
 









Module
Talk
 

















Read
View source
View history
 








Tools
   


Actions  



Read
View source
View history
 




General  



What links here
Related changes
Upload file
Special pages
Permanent link
Page information
Get shortened URL
Download QR code
Wikidata item
 




Print/export  



Download as PDF
Printable version
 
















Appearance
   

 





Permanently protected module

From Wikipedia, the free encyclopedia
 


This is the Shindo module. Named after the Japanese term used for classifying earthquakes , this template provides utility for seismic intensity scales.

Seismic intensity data generated on Module:Shindo/data. Messages on Module:Shindo/messages.

Usage

  1. {{#invoke:Shindo|color}} returns styling for a given seismic intensity on a scale.
  2. {{#invoke:Shindo|formatInWikitable}} returns styled text for a given seismic intensity on a scale, best suited for a wikitable.
  3. {{#invoke:Shindo|formatTag}} returns styled text for a given seismic intensity on a scale, as an HTML tag.
  4. {{#invoke:Shindo|format}} returns styled text for a given seismic intensity on a scale, as an HTML tag or table, depending on whether the parameter "format" is "wikitable".
  5. {{#invoke:Shindo|convert}} will convert a given peak ground acceleration into a seismic intensity.
  6. {{#invoke:Shindo|scale}} returns styled text for a specific scale, while shifting all the numbered arguments left, useful for invoking within templates that give specific scales.

Parameters

local p = {}
local getArgs = require("Module:Arguments").getArgs
local data = mw.loadData("Module:Shindo/data")
local messages = mw.loadData("Module:Shindo/messages")
local makeInvokeFunc = require("Module:MakeInvokeFunc")(p)
local message = require("Module:Message")(messages)
local yn = require("Module:Yesno")

local function getValueOfColor(tbl)
 return (tbl[1] + tbl[2] + tbl[3]) / 3 / 255
end

local function rgbColor(tbl)
 return tbl[1] .. (tbl[2] and ", " .. tbl[2] .. (tbl[3] and ", " .. tbl[3] or "") or "")
end

local function averageColor(tbl)
 local colors = {}
 for k,v in pairs(tbl) do
  colors[k] = v
 end
 local avg = {0, 0, 0}
 for _,color in pairs(colors) do
  avg[1] = avg[1] + color[1]
  avg[2] = avg[2] + color[2]
  avg[3] = avg[3] + color[3]
 end
 avg[1] = math.ceil(avg[1] / #colors) - avg[1] / #colors > 0.5 and math.floor(avg[1] / #colors) or math.ceil(avg[1] / #colors)
 avg[2] = math.ceil(avg[2] / #colors) - avg[2] / #colors > 0.5 and math.floor(avg[2] / #colors) or math.ceil(avg[2] / #colors)
 avg[3] = math.ceil(avg[3] / #colors) - avg[3] / #colors > 0.5 and math.floor(avg[3] / #colors) or math.ceil(avg[3] / #colors)
 return avg
end

local function listIntensitiesFromScale(scale, intensities, labelScale, scale2)
 local out = ''
 if yn(labelScale) then
  out = out .. data[scale].short .. ' '
 end
 local categoriesAreSame = true
 local category = ""
 for k,v in pairs(intensities) do
  if data[scale].ranks[v] == nil then error(message("invalidIntensity", {v, scale})) end
  out = out .. data[scale].ranks[v].label
  if k ~= #intensities then
   if #intensities == 2 then
    out = out .. '–'
   else
    out = out .. '/'
   end
  end
  if category == "" and categoriesAreSame then
   category = data[scale].ranks[v].category or ""
  end
  categoriesAreSame = categoriesAreSame and category ~= "" and (data[scale].ranks[v].category and data[scale].ranks[v].category == category or false)
 end
 if categoriesAreSame and category ~= "" and not scale2 then
  out = out .. " (''" .. category .. "'')"
 end
 return out
end

p._color = function(args)
 local scale = string.lower(args.scale or args[1] or error(message("noScaleShortCode")))
 local intensity = string.upper(args.intensity or args[2] or error(message("noIntensity")))
 if data[scale] == nil then error(message("invalidScale", {scale})) end
 if data[scale].ranks[intensity] == nil then error(message("invalidIntensity", {intensity, scale})) end
 local order = data[scale].ranks[intensity].order
 local color = data[scale].colors[order]
 local colorIntensity = getValueOfColor(color)
 return 'background-color:rgb(' .. rgbColor(color) .. '); color:' .. (colorIntensity < 0.5 and "white" or "black") .. ";"
end

p._formatInWikitable = function(args)
 local scale = string.lower(args.scale or args[1] or error(message("noScaleShortCode")))
 local link = args.link ~= nil and args.link or true
 local labelScale = args.labelScale ~= nil and args.labelScale or true
 local doColor = args.color ~= nil and args.color or true
 local intensity = string.upper(args.intensity or args[2] or error(message("noIntensity")))
 local intensities = mw.text.split(intensity, "/") or { intensity }
 if data[scale] == nil then error(message("invalidScale", {scale})) end
 local colors = {}
 for k,v in pairs(intensities) do
  local order = data[scale].ranks[v].order
  colors[k] = data[scale].colors[order]
 end
 local color = averageColor(colors)
 local colorIntensity = getValueOfColor(color)
 local out = ""
 if yn(args.header or false) then
  out = out .. "! " 
 else
  out = out .. "| "
 end
 out = out .. (args.tagProps ~= nil and args.tagProps or "")
 if (yn(doColor)) then
  out = out .. 'style="background-color:rgba(' .. rgbColor(color) .. '); color:' .. (colorIntensity < 0.5 and "white" or "black") .. ';' .. (args.style or "") .. '" | '
 elseif (args.style) then
  out = out .. 'style="' .. (args.style or "") .. '" | '
 end
 if yn(link) then
  out = out .. '[[' .. data[scale].name .. "#" .. data[scale].id_prefix .. data[scale].ranks[intensity].id .. "|"
 end
 if yn(doColor) then
  out = out .. '<span style=\"color:' .. (colorIntensity < 0.5 and "white" or "black") .. ';">'
 end
 out = out .. listIntensitiesFromScale(scale, intensities, labelScale, false)
 if yn(doColor) then
  out = out .. '</span>'
 end
 if yn(link) then
  out = out .. "]]"
 end
 return out
end

p._formatTag = function(args)
 local scale = string.lower(args.scale or args[1] or error(message("noScaleShortCode")))
 local scale2 = args.scale2 or args[3] or nil
 if scale2 ~= nil then scale2 = string.lower(scale2) end
 local link = args.link ~= nil and args.link or true
 local labelScale = args.labelScale ~= nil and args.labelScale or true
 local doColor = args.color ~= nil and args.color or true
 local intensity = string.upper(args.intensity or args[2] or error(message("noIntensity")))
 local intensities = mw.text.split(intensity, "/") or { intensity }
 local intensity2 = args.intensity2 or args[4] or (scale2 and error(message("noIntensity"))) or nil
 local intensities2 = {}
 if intensity2 ~= nil then
  intensity2 = string.upper(intensity2)
  intensities2 = mw.text.split(intensity2, "/") or { intensity2 }
 end
 if data[scale] == nil then error(message("invalidScale", {scale})) end
 if scale2 and data[scale2] == nil then error(message("invalidScale", {scale2})) end
 local colors = {}
 for k,v in pairs(intensities) do
  local order = data[scale].ranks[v].order
  colors[k] = data[scale].colors[order]
 end
 local color = averageColor(colors)
 local colorIntensity = getValueOfColor(color)
 local out = ''
 if yn(doColor) then
  out = out .. '<' .. (args.tag or "span") .. ' style="background-color:rgba(' .. rgbColor(color) .. '); padding:4px; color:' .. (colorIntensity < 0.5 and "white" or "black") ..  '; '
 elseif args.style then
  out = out .. '<' .. (args.tag or "span") .. ' style="'
 else
  out = out .. '<' .. (args.tag or "span")
 end
 if args.style then
  out = out .. args.style
  out = out .. '" '
 elseif yn(doColor) then
  out = out .. '" '
 end
 out = out .. (args.tagProps ~= nil and args.tagProps or "")
 out = out .. ">"
 if yn(link) then
  out = out .. '[[' .. data[scale].name .. "#" .. data[scale].id_prefix .. data[scale].ranks[intensities[1]].id .. "|"
 end
 if yn(doColor) then
  out = out .. '<span style=\"color:' .. (colorIntensity < 0.5 and "white" or "black") .. ';">'
 end
 out = out .. listIntensitiesFromScale(scale, intensities, labelScale, scale2)
 if yn(doColor) then
  out = out .. '</span>'
 end
 if yn(link) then
  out = out .. "]]"
 end
 if (scale2) then
  out = out .. " ("
  if yn(link) then
   out = out .. '[[' .. data[scale2].name .. "#" .. data[scale2].id_prefix .. data[scale2].ranks[intensities2[1]].id .. "|"
  end
  if yn(doColor) then
   out = out .. '<span style=\"color:' .. (colorIntensity < 0.5 and "white" or "black") .. ';">'
  end
  out = out .. listIntensitiesFromScale(scale2, intensities2, true, true)
  if yn(doColor) then
   out = out .. '</span>'
  end
  if yn(link) then
   out = out .. "]]"
  end
  out = out .. ")"
 end
 out = out .. '</'  .. (args.tag or "span") .. '>'
 return mw.getCurrentFrame():preprocess(out)
end

p._format = function(args)
 if args["format"] == "wikitable" then
  return p.formatInWikitable(args)
 else
  return p.formatTag(args)
 end
end

p._getScaleName = function(args)
 local scale = string.lower(args.scale or args[1] or error(message("noScaleShortCode")))
 if data[scale] == nil then error(message("invalidScale", {scale})) end
 local out = ''
 if yn(args.link or true) then
  out = out .. '[[' .. data[scale].name .. '|'
 end
 out = out .. data[scale].name
 if yn(args.link or true) then
  out = out .. ']]'
 end
 return out
end

-- uses binary search to convert a peak ground acceleration to a seismic intensity
function convert(pga, ranks, ranksSorted, left, right)
 left = left ~= nil and left or 0
 right = right ~= nil and right or #ranksSorted
 index = math.floor((left + right) / 2)
 local lower = ranks[ranksSorted[index + 1]].pga
 local upper = ranksSorted[index + 2] and ranks[ranksSorted[index + 2]].pga or math.huge
 if (pga >= upper) then
  return convert(pga, ranks, ranksSorted, index, right)
 elseif (pga < lower) then
  return convert(pga, ranks, ranksSorted, left, index)
 else
  return ranksSorted[index + 1]
 end
end

p._convert = function(args)
 local scale = string.lower(args.scale or args[1] or error(message("noScaleShortCode")))
 if data[scale] == nil then error(message("invalidScale", {scale})) end
 local ranksSorted = {}
 for k,v in ipairs(data["mmi"].ranksSorted) do ranksSorted[k] = v end
 return convert(tonumber(args.pga or args[2]), data[scale].ranks, ranksSorted)
end

p.convert1 = convert --debugging

p._list = function(args)
 local out = mw.html.create('ul')
 for k,v in pairs(data) do
  local list = out:tag('li')
  list:wikitext('<code>' .. k .. '</code>: [[' .. v.name .. '|' .. v.name .. ']]')
  local tb = list:tag('table'):addClass("wikitable")
  tb
   :tag("tr")
    :tag("th"):wikitext("Seismic intensity"):done()
    :tag("th"):wikitext("Display"):done()
   :done()
  for l,w in pairs(v.order) do
   tb:tag('tr'):wikitext('<td><code>' .. w .. '</code></td> ' .. p.format({k, w, tag = "td"})):done()
  end
  list:done()
 end
 out:allDone()
 return tostring(out)
end

-- make each scale invokable
for k,v in pairs(data) do
 if p["_" .. k] ~= nil then error(message("scaleNameInvalid", k)) end
 p["_" .. k] = function(args)
  args["scale"] = k
  args["intensity"] = args["intensity"] or args[1] or nil
  args["scale2"] = args["scale2"] or args[2] or nil
  args["intensity2"] = args["intensity2"] or args[3] or nil
  if args["format"] == "wikitable" then
   return p.formatInWikitable(args)
  else
   return p.formatTag(args)
  end
 end
end

-- make all functions that begin with _ invokable
local q = mw.clone(p)
for k,v in pairs(q) do
 if mw.ustring.sub(k, 1, 1) == "_" then
  p[mw.ustring.sub(k, 2, #k)] = makeInvokeFunc(k)
 end
end

return p

Retrieved from "https://en.wikipedia.org/w/index.php?title=Module:Shindo&oldid=1223271401"

Category: 
Modules in alpha
Hidden category: 
Wikipedia semi-protected modules
 



This page was last edited on 11 May 2024, at 00:07 (UTC).

Text is available under the Creative Commons Attribution-ShareAlike License 4.0; additional terms may apply. By using this site, you agree to the Terms of Use and Privacy Policy. Wikipedia® is a registered trademark of the Wikimedia Foundation, Inc., a non-profit organization.



Privacy policy

About Wikipedia

Disclaimers

Contact Wikipedia

Code of Conduct

Developers

Statistics

Cookie statement

Mobile view



Wikimedia Foundation
Powered by MediaWiki