Module:MOS modes: Difference between revisions
No edit summary |
ArrowHead294 (talk | contribs) mNo edit summary |
||
(59 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local mos = require("Module:MOS") | |||
local rat = require("Module:Rational") | |||
local tamnams = require("Module:TAMNAMS") | |||
local tip = require("Module:Template input parse") | |||
local utils = require("Module:Utils") | |||
local yesno = require("Module:Yesno") | |||
-- | -- TODO: | ||
-- - Add ability to autocollapse on large mos pages (say, more than 12 modes) | |||
-- | -- "Main" function | ||
-- | -- To be called by wrapper | ||
function p._mos_modes(input_mos, mode_names, headers, entries, is_collapsed) | |||
local is_collapsed = is_collapsed == true | |||
local input_mos = input_mos or mos.new(5,2) | |||
local mode_names = mode_names or {} | |||
local | local headers = headers or {} | ||
local | local entries = entries or {} | ||
-- Get | -- Get UDPs and CPOs | ||
local udps = tamnams.mos_mode_udps(input_mos) | |||
local | local cpos = tamnams.mos_mode_cpos(input_mos) | ||
-- Get the mos's modes | -- Get the mos's modes | ||
local mos_modes = | local mos_modes = mos.modes_by_brightness(input_mos) | ||
-- | -- Check whether to add mode names | ||
local add_mode_names = #mode_names == #mos_modes | |||
local | |||
-- | -- Check whether the number of headers times the number of modes equals the | ||
-- | -- number of entries. Supplementary info can only be added if this condition | ||
-- is | -- is met. Limited to 3 columns of supplementary info. | ||
local add_columns = #headers > 0 and #entries > 0 | local add_columns = #headers > 0 and #entries > 0 | ||
if add_columns then | if add_columns then | ||
add_columns = add_columns and #mos_modes * #headers == #entries | add_columns = add_columns and #mos_modes * #headers == #entries and #headers <= 3 | ||
end | end | ||
-- | -- Table caption | ||
local | local scale_sig = mos.as_string(input_mos) | ||
-- | -- Start of table | ||
if | local result = "{| class=\"wikitable sortable center-2 center-3 mw-collapsible" .. (is_collapsed and " mw-collapsed\"\n" or "\"\n") | ||
result = result .. "! Mode names | .. "|+ style=\"font-size: 105%; white-space: nowrap;\" | " .. string.format("Modes of %s\n", scale_sig) | ||
.. "|-\n" | |||
-- Table headers | |||
result = result | |||
.. "! [[UDP]]" | |||
.. " !! Cyclic<br />order" | |||
.. " !! Step<br />pattern" | |||
-- Add header for mode names, if provided. | |||
if add_mode_names then | |||
result = result .. " !! class=\"unsortable\" | Mode names" | |||
end | end | ||
-- Add | -- Add column headers for supplementary info, if provided. | ||
if add_columns then | if add_columns then | ||
for i = 1, #headers do | for i = 1, #headers do | ||
result = result .. "! " | result = result .. string.format(" !! class=\"unsortable\" | %s", headers[i]) | ||
end | end | ||
end | end | ||
result = result .. "\n" | |||
-- Enter each row | -- Enter each row | ||
for i = 1, #mos_modes do | for i = 1, #mos_modes do | ||
result = result .. "|-\n" | result = result .. "|-\n" | ||
-- Add the UDP, | -- Add the UDP, brightness order, and the mode's step pattern | ||
result = result .. string.format("| %s || %s || %s", | |||
udps[i], cpos[i], mos_modes[i]) | |||
result = result .. "|" | |||
-- Add the mode's name, if given | -- Add the mode's name, if given | ||
if | if add_mode_names then | ||
result = result .. "|" | result = result .. string.format(" || %s", mode_names[i]) | ||
end | end | ||
Line 142: | Line 82: | ||
if add_columns then | if add_columns then | ||
for j = 1, #headers do | for j = 1, #headers do | ||
result = result .. "|" | local index = (i - 1) * #headers + j | ||
result = result .. string.format(" || %s", entries[index]) | |||
end | end | ||
end | end | ||
result = result .. "\n" | |||
end | end | ||
result = result .. "|}" | result = result .. "|}" | ||
return result | |||
end | |||
-- Wrapper function; to be called by template | |||
function p.modes_table(frame) | |||
local scale_sig = frame.args["Scale Signature"] or "5L 2s" | |||
local input_mos = mos.parse(scale_sig) | |||
-- Get the mos's mode names, if given | |||
-- Mode names are entered as a semicolon-delimited list | |||
-- 5L 2s gets default names | |||
local mode_names = nil | |||
if scale_sig == "5L 2s" then | |||
mode_names = { | |||
"Lydian", | |||
"Ionian (major)", | |||
"Mixolydian", | |||
"Dorian", | |||
"Aeolian (minor)", | |||
"Phrygian", | |||
"Locrian" | |||
} | |||
end | |||
-- Get mode names entered | |||
if #frame.args["Mode Names"] ~= 0 then | |||
mode_names = tip.parse_entries(frame.args["Mode Names"], "$") | |||
end | |||
-- Get supplementary info | |||
local headers_unparsed = frame.args["Table Headers"] | |||
local headers = tip.parse_entries(headers_unparsed, "$") | |||
local entries_unparsed = frame.args["Table Entries"] | |||
local entries = tip.parse_entries(entries_unparsed, "$") | |||
local is_collapsed = yesno(frame.args["Collapsed"], false) | |||
local debugg = yesno(frame.args["debug"]) | |||
local result = p._mos_modes(input_mos, mode_names, headers, entries, is_collapsed) | |||
-- Current means of adding entries is unmaintainable; to be deprecated. | |||
if headers_unparsed ~= "" and entries_unparsed ~= "" then | |||
result = result .. "[[Category:Pages with deprecated template parameters]]" | |||
end | |||
return result | -- Debugger option | ||
if debugg == true then | |||
result = "<syntaxhighlight lang=\"wikitext\">" .. result .. "</syntaxhighlight>" | |||
end | |||
return frame:preprocess(result) | |||
end | end | ||
return p | return p |