Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

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("&nbsp;''(%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("&nbsp;''(%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