Module:Header
Þessi síða var afrituð frá ensku Wikiheimild. Reynt hefur verið að aðlaga hana að íslensku Wikiheimildum með sem fæstum mögulegum breytingum. Það er gert til að forðast fjölverknað og spara tíma en einnig svo hægt sé að taka við uppfærslum og nýjum eiginleikum með sem minnstri fyrirhöfn. Leiðbeiningar um notkun hennar má finna á enska verkefninu. Einungis það sem lesandinn sér skal íslenskað. Ef frekari breytingar eru nauðsynlegar til að aðlaga hana að íslenska verkefninu skulu þær útskýrðar hér fyrir neðan.
--[=[
This is a module to implement logic for the {{header}} template
It doesn't do everything yet, but over time it can accrete functions from
the template, which will become simpler and simpler until it's just an invoke.
Not implemented yet:
* Categories (deprecated anyway)
* Subpage checking
]=]
local p = {} --p stands for package
local yesno = require('Module:Yesno')
local getArgs = require('Module:Arguments').getArgs
-- get the param_override or param parameter in that order
-- nil if neither is there
function get_arg_or_override(args, param)
if args["override_" .. param] then
return args["override_" .. param]
elseif args[param] then
return args[param]
end
return nil
end
-- return true if any value in list is nil in args
-- (nil means not present; empty string is not nil)
function any_arg_nil(args, list)
for k,v in pairs(list) do
if args[v] == nil then
return true
end
end
return false
end
-- return true if any value in list is not nil or empty in args
-- (nil means not present; empty string is not nil)
function has_any_arg(args, list)
for k,v in pairs(list) do
if args[v] ~= nil and args[v] ~= "" then
return true
end
end
return false
end
--[=[
Return '1' if the template has missing required parameters
]=]
function p.has_missing_params(frame)
local args = getArgs(frame, {
removeBlanks = false
})
local required_args = {'title', 'section', 'author', 'previous', 'next', 'notes'}
if any_arg_nil(args, required_args) then
return '1'
end
return ''
end
-- Place each value from a table of IDs:values into the given parent element
function append_mf_values(parent, values)
for k,v in pairs(values) do
parent:tag("span")
:attr("id", k)
:wikitext(v)
end
end
-- Create the Microformat wrapper div
function construct_mf_wrapper(args)
local mf_div = mw.html.create("div")
mf_div:addClass("ws-noexport")
:attr("id", "ws-data")
:css({
speak = "none"
})
-- hide the microformat unless it's overriden
if not (args["show_microformat"] and yesno(args['show_microformat'])) then
mf_div:css("display", "none")
end
return mf_div
end
-- Collect all the values of microformat data from the arguments provided
-- Returns a table of microformat ID:contents.
function collect_mf_data(args)
-- collect the MF values here
local mf = {};
mf["ws-article-id"] = mw.title.getCurrentTitle().id
-- add the title
if args["title"] then
mf["ws-title"] = args['title']
-- append section if there is one
if args["section"] then
mf["ws-title"] = mf["ws-title"] .. " — " .. args["section"]
end
end
local author = get_arg_or_override(args, "contributor")
if not author then
author = get_arg_or_override(args, "section_author")
end
if not author then
author = get_arg_or_override(args, "author")
end
if author then
mf['ws-author'] = author
end
local translator = get_arg_or_override(args, "translator")
if translator then
mf['ws-translator'] = translator
end
local year = get_arg_or_override(args, "year")
if year then
mf['ws-year'] = year
end
if args['cover'] then
mf['ws-cover'] = args['cover']
end
return mf
end
--[=[
Construct the [[Help:Microformat]] for the page.
This is in the form:
<div id="ws-data" ...>
<span id="ws-title">Title here...</span>
...
<div>
]=]
function p.microformat(frame)
local args = getArgs(frame)
local mf_div = construct_mf_wrapper(args)
local mf = collect_mf_data(args)
append_mf_values(mf_div, mf)
return tostring(mf_div)
end
function make_category_list(categories)
local s = ""
for k,v in pairs(categories) do
s = s .. "[[Flokkur:" .. v .. "]]\n"
end
return s
end
--[=[
Detect explicit formatting in fields like "section" and "title"
]=]
function explicit_formatting(str)
return string.match(str, "'''?")
or string.match(str, "<%s*/?%s*[iIbB]%s*>")
-- add more cases here
end
function check_non_existent_author_pages(args, param, categories)
if args[param] then
-- some pages expect an invalid author
local special = false
local lower_arg = string.lower(args[param])
if lower_arg == "unknown" or lower_arg == "not mentioned" then
special = true
end
if not special then
local target = mw.title.makeTitle("Höfundur", args[param])
-- expensive function!
if not target or not target.exists then
-- table.insert(categories, "Works with non-existent author pages")
end
end
end
end
--[=[
Construct the automatic categories for the header
]=]
function p.categories(frame)
local args = getArgs(frame)
local categories = {}
local this_page = mw.title.getCurrentTitle();
if args["override_author"] then
-- table.insert(categories, "Pages with override author")
end
-- Eftirfarandi if-yrðing veldur villu á þessu verkefni. Innri kóði er samt keyrður.
-- if this_page:inNamespaces(0, 114) then
check_non_existent_author_pages(args, "author", categories)
check_non_existent_author_pages(args, "editor", categories)
check_non_existent_author_pages(args, "translator", categories)
check_non_existent_author_pages(args, "section_translator", categories)
check_non_existent_author_pages(args, "section_author", categories)
check_non_existent_author_pages(args, "contributor", categories)
-- end
if args["contributor"] or args["section_author"] then
-- table.insert(categories, "Pages with contributor")
end
if args["override_contributor"] or args["override_section_author"] then
-- table.insert(categories, "Pages with override contributor")
end
local author = get_arg_or_override(args, "author")
if author and (string.lower(author) == "óþekktur") then
table.insert(categories, "Verk óþekktra höfunda")
end
local editor = get_arg_or_override(args, "editor")
if editor then
editor = string.lower(editor)
if editor == "óþekktur" or editor == "?" then
-- table.insert(categories, "Works with unknown editors")
elseif editor == "ónefndur" then
-- table.insert(categories, "Works with unmentioned editors")
end
end
local translator = get_arg_or_override(args, "translator")
if translator then
translator = string.lower(translator)
if translator == "unknown" or translator == "not mentioned" or translator == "?" then
-- table.insert(categories, "Translations without translator information specified")
elseif translator == "wikisource" and (this_page.baseText == this_page.text) then
-- if a basepage
-- ?? why is this not done by {{translation}} ??
table.insert(categories, "Wikiheimild-þýðingar")
end
end
if args["shortcut"] then
table.insert(categories, "Aðalnafnrýmissíður með flýtileiðir")
end
if args["override_year"] then
-- table.insert(categories, "Pages with override year")
end
if args["noyear"] then
-- table.insert(categories, "Pages with noyear")
end
if args["noyearcat"] then
-- table.insert(categories, "Pages with noyearcat")
end
if args["cover"] then
-- table.insert(categories, "Pages with an export cover")
end
-- sanity/maintenance checks on various parameters
-- allow_explicit_formatting parameter suppresses this check
-- used by, for example, [[Template:Versions]]
if args["allow_explicit_formatting"] == nil and args["allow_illegal_formatting"] == nil then
if args["title"] and explicit_formatting(args['title']) then
-- table.insert(categories, "Pages with explicit formatting in header fields")
end
if args["section"] and explicit_formatting(args['section']) then
-- table.insert(categories, "Pages with explicit formatting in header fields")
end
end
return make_category_list(categories)
end
--[=[
Generate a {{DEFAULTSORT}} magic word according to the defaultsort parameter
]=]
function p.defaultsort(frame)
local args = getArgs(frame)
local defsortKey = ''
if args.defaultsort then
defsortKey = args.defaultsort
else
-- at this point, could construct defaultsort automatically
-- by stripping A/An/The as needed
end
-- if a suitable key is found or constructed, apply it
if defsortKey ~= '' then
return frame:preprocess{text = "{{DEFAULTSORT:" .. defsortKey .. "}}"}
end
-- otherwise, don't do anything and use the default
return ''
end
function get_plain_sister(frame, args, sister_args)
local ps_args = {}
for k,v in pairs(sister_args) do
if args[v] then
ps_args[v] = args[v]
end
end
return frame:expandTemplate{title = "plain sister", args = ps_args}
end
--[=[
Return the title span
>
--]=]
function construct_title(args)
local title = mw.html.create("span")
:attr("id", "header_title_text")
:css({
["font-weight"] = "bold",
})
if args["title"] then
title:wikitext(args["title"])
else
title:wikitext("Ótitlað")
end
return title
end
--[=[
Construct the title field
]=]
function p.title(frame)
local args = getArgs(frame)
local title = construct_title(args)
return tostring(title)
end
--[=[
Construct the year span
--]=]
function construct_year(frame, args)
local year = mw.html.create("span")
:attr("id", "header_year_text")
if args["override_year"] then
year:wikitext( '(' .. args["override_year"] .. ')' )
else
local year_args = {
[1] = args["year"],
noprint = "0",
nocat = "0",
}
if args["noyear"] then
year_args['noprint'] = "1"
end
if args["disambiguation"] and yesno(args['disambiguation']) then
-- disambiguations never categorise
year_args['nocat'] = "1"
else
if args["noyearcat"] and yesno(args['noyearcat']) then
-- manually no-catted
year_args['nocat'] = "1"
elseif mw.title.getCurrentTitle().isSubpage then
-- only categorise if this is a base page
year_args['nocat'] = "1"
end
end
mw.logObject(year_args)
year:wikitext(mw.text.trim(frame:expandTemplate{
title = "header/year",
args = year_args
}))
end
return year
end
--[=[
Construct the year field
]=]
function p.year(frame)
local args = getArgs(frame)
ret = ""
if get_arg_or_override(args, "year") then
ret = tostring(construct_year(frame, args))
end
return ret
end
function create_vcard(id, content, wrap_fn)
local span = mw.html.create("span")
:addClass("vcard")
:css({
['font-style'] = 'italic'
})
:attr("id", id)
if wrap_fn then
span:tag("span")
:addClass("fn")
:wikitext(content)
else
span:wikitext(content)
end
return span
end
function p.author(frame)
local args = getArgs(frame)
local param_name = "author"
local prefix = "höfundur"
local id = "header_author_text"
local s = ""
local atext;
local wrap_fn = true
if args["override_" .. param_name] then
s = s .. "<br/>"
atext = args["override_" .. param_name]
elseif args[param_name] then
if args['section'] then
s = s .. " "
else
s = s .. "<br/>"
end
if string.lower(args[param_name]) == "óþekktur" then
atext = "óþekktur"
wrap_fn = false
else
atext = "[[Höfundur:" .. args[param_name] .. "|" .. args[param_name] .. "]]"
end
s = s .. "<i>" .. prefix .. "</i>" .. " "
end
local a_span = create_vcard(id, atext, wrap_fn)
return s .. tostring(a_span)
end
function p.editor(frame)
local args = getArgs(frame)
local ed = get_arg_or_override(args, "editor")
-- no editors
if ed == nil then
return ""
end
local have_authors = get_arg_or_override(args, "author") ~= nil
local s = " "
if have_authors then
s = ", "
end
if not have_authors and not args["section"] then
s = s .. "<br/>"
end
-- need to tidy this up and check for override_editor = unknown|not mentioned|?
local special
if ed == "?" or string.lower(ed) == "óþekktur" then
special = "ritstjóri óþekktur"
elseif string.lower(ed) == "ónefndur" then
special = "ritstjóri ónefndur"
elseif ed ~= nil then
s = s .. "ritstjórn"
end
s = "<i>" .. s .. "</i> "
local etext
local wrap_fn = true
if args["override_editor"] then
etext = args["override_editor"]
elseif args["editor"] then
if special then
etext = special
wrap_fn = false
else
etext = "[[Höfundur:" .. args["editor"] .. "|" .. args["editor"] .. "]]"
end
end
local span = create_vcard("header_editor_text", etext, true)
return s .. tostring(span)
end
function p.translator(frame)
local args = getArgs(frame)
local tr = get_arg_or_override(args, "translator")
-- no translator
if tr == nil then
return ""
end
local have_authors = get_arg_or_override(args, "author") ~= nil
local have_editors = get_arg_or_override(args, "editor") ~= nil
local s = " "
if have_authors or have_editors then
s = ", "
end
if not have_authors and not have_authors and args["section"] == nil then
s = s .. "<br/>"
end
local special
if tr == "?" or string.lower(tr) == "óþekktur" then
special = "þýðandi óþekktur"
elseif string.lower(tr) == "not mentioned" then
special = "þýðandi ónefndur"
elseif string.lower(tr) == "wikisource" then
special = "þýðing <span id=\"header_translator_text\">Wikiheimildar</span>"
elseif tr ~= nil then
s = s .. "þýðing"
end
s = "<i>" .. s .. "</i> "
local etext
local wrap_fn = true
if args["override_translator"] then
etext = args["override_translator"]
elseif args["translator"] then
if special then
etext = special
wrap_fn = false
else
etext = "[[Höfundur:" .. args["translator"] .. "|" .. args["translator"] .. "]]"
end
end
local span = create_vcard("header_translator_text", etext, true)
return s .. tostring(span)
end
function p.section(frame)
local args = getArgs(frame)
if not args["section"] then
return
end
local s = "<br /><span id=\"header_section_text\">" .. args["section"] .. "</span>"
-- there are synonyms for this
local trans = get_arg_or_override(args, "section_translator")
if trans == nil then
trans = get_arg_or_override(args, "contributing_translator")
end
-- there are synonyms for this
local sec_author = get_arg_or_override(args, "section_author")
if sec_author == nil then
sec_author = get_arg_or_override(args, "contributor")
end
-- first part of section_translator, adds a line return to split to two lines due to length if section translator exists
if trans and sec_author then
s = s .. "<br/>"
end
if sec_author then
s = s .. "<i> hlutahöfundur <span id=\"header_contributor_text\" class=\"vcard\">"
s = s .. "<span class=\"fn\">"
if args["override_section_author"] then
s = s .. args["override_section_author"]
elseif args["override_contributor"] then
s = s .. args["override_contributor"]
else
s = s .. "[[Höfundur:" .. sec_author .. "|" .. sec_author .. "]]"
end
s = s .. "</span></span></i>"
end
if trans then
if sec_author then
s = s .. ","
end
s = s .. " <i>þýðing <span id=\"header_section_translator_text\" class=\"vcard\">"
s = s .. "<span class=\"fn\">"
if args["override_section_translator"] then
s = s .. args['override_section_translator']
else
s = s .. "[[Höfundur:" .. trans .. "|" .. trans .. "]]"
end
s = s .. "</span></span></i>"
end
return s
end
--[=[
Construct the notes field
]=]
function p.notes(frame)
local args = getArgs(frame)
local notes_args = {
style = "border-bottom: 1px solid #A0A0A0; background-color: #FAFAFF;",
id = navigationNotes
}
local wdid = mw.wikibase.getEntityIdForCurrentPage()
local sister_args = {"disambiguation", "edition", "portal", "related_author",
"wikipedia", "commons", "commonscat", "wikiquote", "wikinews",
"wiktionary", "wikibooks", "wikidata", "wikivoyage",
"wikiversity", "wikispecies", "meta"}
local sisters = ""
if wdid ~= nil or has_any_arg(args, sister_args) then
notes_args['sister'] = (get_plain_sister(frame, args, sister_args))
end
if args["shortcut"] then
notes_args['shortcut'] = args["shortcut"]
end
if args["notes"] then
notes_args['content'] = args['notes']
end
if not notes_args['sister'] and
not notes_args['content'] and
not notes_args['shortcut'] then
return nil
end
return frame:expandTemplate{title = "header/notes block", args = notes_args}
end
return p