Module:Dialogue: Difference between revisions
From Very Bad Wiki
More actions
No edit summary |
No edit summary |
||
| (One intermediate revision by the same user not shown) | |||
| Line 8: | Line 8: | ||
---- | ---- | ||
-- Parses invocation and template parameters, trims whitespace, and removes blanks. | -- Parses invocation and template parameters, trims whitespace, and removes blanks. | ||
local getArgs = | local function getArgs(frame, opts) | ||
local args = {} | |||
-- merge parent (template) args and frame args | |||
for k, v in pairs(frame:getParent().args) do | |||
if not opts.removeBlanks or v ~= "" then | |||
args[k] = v | |||
end | |||
end | |||
for k, v in pairs(frame.args) do | |||
if not opts.removeBlanks or v ~= "" then | |||
args[k] = v | |||
end | |||
end | |||
return args | |||
end | |||
---- | ---- | ||
-- Local Functions | -- Local Functions | ||
Latest revision as of 05:24, 20 March 2026
Documentation for this module may be created at Module:Dialogue/doc
--| Creates dialogue definition lists
--- For whatever reason, refuses to make blockquotes
--- <nowiki>
local Dialogue = {}
----
-- Libraries and Globals
----
-- Parses invocation and template parameters, trims whitespace, and removes blanks.
local function getArgs(frame, opts)
local args = {}
-- merge parent (template) args and frame args
for k, v in pairs(frame:getParent().args) do
if not opts.removeBlanks or v ~= "" then
args[k] = v
end
end
for k, v in pairs(frame.args) do
if not opts.removeBlanks or v ~= "" then
args[k] = v
end
end
return args
end
----
-- Local Functions
----
local function makeInvokeFunc(funcName)
return function(frame)
local args = getArgs(frame, { removeBlanks = false })
return Dialogue[funcName](args)
end
end
----
-- Public Functions
----
--% Formats dialogue between multiple speakers
--- Intended to replace {{Dialogue}}.
--- Syntax compliant with [[wikipedia:Template:Dialogue]]
--- with portability and citation modifications
--@ frame (table) Invokes the frame from {{Dialogue}}. See [[Template:Dialogue/doc]].
--: (string) HTML <dl />
Dialogue.main = makeInvokeFunc("dialogue")
--% & crafts the Dialogue definition list
--@ args (table) Arguments passed from Module function call <code>[.main]</code> or other Lua Modules
function Dialogue.dialogue(args)
local block = mw.html.create("dl"):addClass("dialogue-wrapper")
for i, v in ipairs(args) do
local next_param = i + 1
local mood_line = next_param / 2
if i == 1 then
if v == "action" then
block:tag("dd")
:tag("small"):attr("data-dialogue", "action")
:tag("u")
:wikitext("[" .. args[next_param] .. "]")
:done():done():done()
else
local speaker =
(args[i] and args[args[i]])
and args[args[i]]
or (
type(args[i]) == "string"
and mw.text.trim(args[i]):len() > 0
)
and args[i]
or nil
speaker = speaker and string.format("'''%s'''", speaker)
local mood = args["mood" .. mood_line] or nil
mood = mood and string.format(" ''(%s)''", mood)
if speaker or mood then
block
:tag("dt")
:wikitext(("%s%s"):format(speaker or "", mood or "")
)
:done()
end
if args[next_param] then
block:tag("dd"):tag("q")
:wikitext(args[next_param])
:done():done()
else
block:tag("dd"):wikitext("..."):done()
end
end
elseif math.fmod(i, 2) == 1 then
if v == "action" then
block:tag("dd")
:tag("small")
:attr("data-dialogue", "action")
:tag("u")
:wikitext("[" .. args[next_param] .. "]")
:done():done():done()
else
local speaker =
(args[i] and args[args[i]])
and args[args[i]]
or (
type(args[i]) == "string"
and mw.text.trim(args[i]):len() > 0
)
and args[i]
or nil
speaker = speaker and string.format("'''%s'''", speaker)
local mood = args["mood" .. mood_line] or nil
mood = mood and string.format(" ''(%s)''", mood)
if speaker or mood then
block
:tag("dt")
:wikitext(("%s%s"):format(speaker or "", mood or "")
)
:done()
end
if args[next_param] ~= "" then
block:tag("dd"):tag("q")
:wikitext(args[next_param])
:done():done()
else
block:tag("dd"):wikitext("..."):done()
end
end
end
end
block:done()
if args["cite"] then
block:tag("cite"):wikitext(string.format("— %s", args["cite"])):done()
end
return tostring(block)
end
----
-- Output
----
return Dialogue