Module:Archives Explained

p =

local cfg = mw.loadData('Module:Archives/config')

local function is_filled(var) return var and var ~= end

-- simple helper for simple caseslocal function var_or_default(var, default) if is_filled(var) then return var else return default endend

local function wikilink(link, display) if display then return '' .. display .. '' else return '' .. link .. '' endend

local function talk_other(demospace, talk) if is_filled(demospace) then return demospace end if mw.title.getCurrentTitle.isTalkPage then return talk end return nil -- just return nil rather than 'other' since we have no needend

local function add_image(image) if image.image and (image.image

'none' or image.image

) then return nil end

return mw.html.create('div'):addClass('archives-image'):wikitext(require('Module:InfoboxImage/sandbox')._InfoboxImage )end

local function auto_list(list_root, is_banner, list_auto, list_prefix) local list_args = if list_root then list_args.root = list_root else list_args.DISABLE1 = list_root end if is_banner then list_args.nobr = 'yes' list_args.DISABLE2 = list_auto or 'long' else list_args.nobr = 'no' list_args.auto = list_auto or 'long' end if list_prefix then list_args.prefix = list_prefix else list_args.DISABLE3 = list_prefix end return require('Module:Archive list').main(list_args)end

local function make_title(is_banner, title)

end

local function search_box(frame, is_banner, root, search)

if search.search and search.search

cfg.search_no then return nil end local prefix = if is_filled(search.prefix) then prefix = search.prefix -- this double-check elseif may move out to code-proper elseif is_filled(root) then prefix = root else prefix = mw.title.getCurrentTitle.prefixedText .. '/' end -- break local sbreak if search.sbreak and (search.sbreak

'yes' or search.sbreak

'no') then sbreak = search.sbreak end -- set sbreak's default if not sbreak then if is_banner then sbreak = 'no' else sbreak = 'yes' end end -- width local width = if not is_banner then width = var_or_default(search.width, cfg.search_width) end -- label local label = var_or_default(search.label, cfg.search_label) local inputbox_options = local inputbox_content = for k, v in pairs(inputbox_options) do table.insert(inputbox_content, k .. '=' .. v) end

return mw.html.create('div'):addClass('archives-search'):wikitext(frame:extensionTag)end

local function note_auto(frame, auto) if not is_filled(auto.age) and not is_filled(auto.target) then return nil end local age = var_or_default(auto.age, nil) local target = var_or_default(auto.target, nil) local target_text = if target then target_text = mw.ustring.format(cfg.has_archives, frame:callParserFunction('#rel2abs', target), age and ' ' or ) end local age_text = if age then local units = var_or_default(auto.units, cfg.units) -- there's probably a friendlier l10n way to do this check on units... -- TODO make it friendlier. maybe split it to a separate function? -- (borrowed from Module:String.endswith in the meantime) if age ~= '1' and mw.ustring.sub(units, -1, -1) ~= 's' then units = units .. 's' end -- TODO localize local age_with_units = age .. ' ' .. units local has_bot = is_filled(auto.bot) local has_minthreads = is_filled(auto.minthreads) if has_bot and has_minthreads then age_text = mw.ustring.format(cfg.age_bot_threads, age_with_units, wikilink('User:' .. auto.bot, auto.bot), var_or_default(auto.minthreads, cfg.min_threads) ) elseif has_bot then age_text = mw.ustring.format(cfg.age_bot, age_with_units, wikilink('User:' .. auto.bot, auto.bot) ) elseif has_minthreads then age_text = mw.ustring.format(cfg.age_threads, age_with_units, var_or_default(auto.minthreads, cfg.min_threads) ) else age_text = mw.ustring.format(cfg.age, age_with_units ) end end return mw.html.create('div'):addClass('archives-auto'):wikitext(target_text .. age_text)end

local function edit_list(frame, auto, list1, archive_list, archive_list_exists, editbox) local has_editbox = not editbox or (editbox and (editbox

or editbox

'yes')) if not (archive_list_exists and has_editbox and not auto and list1) then return nil end return mw.html.create('div'):addClass('archives-edit'):wikitext(mw.ustring.format(cfg.edit_this_box, archive_list.fullUrl('action=edit' .. cfg.pre_load) ))end

local function render_list(root, auto, list1, archive_list_title, archive_list_exists, list, index, prefix) -- this logic is seriously fucking screwy -- only hope is for the test cases to catch the insanity local auto_default = true if list1 then auto_default = false end

local is_foreign = true if (auto and auto

'no') or (not auto and not auto_default) then is_foreign = false end local foreign_archive_list = local list = var_or_default(content.list, nil) if not list and is_foreign then local index_page = frame:callParserFunction('#rel2abs', var_or_default(content.index, './Archive index') ) local index_link = if mw.title.new(index_page).exists then index_link = wikilink(index_page, 'Index') end

local prefix = var_or_default(content.prefix, nil) if archive_list_exists then foreign_archive_list = frame:expandTemplate else foreign_archive_list = auto_list(root, is_banner, auto, prefix) end foreign_archive_list = index_link .. foreign_archive_list end local local_archive_list = if list or list1 then local_archive_list = '\n' .. (list or list1) end return foreign_archive_list .. local_archive_list

end

local function add_main_content(frame, is_banner, content) local is_collapsible = false local is_collapsed = false if content.collapsible and content.collapsible

'yes' then is_collapsible = true end if content.collapsed and content.collapsed

'yes' then is_collapsed = true is_collapsible = true end local root = var_or_default(content.root, nil) local auto = var_or_default(content.auto, nil) local list1 = var_or_default(content.list1, nil) local archive_list_name = frame:callParserFunction('#rel2abs', var_or_default(content.archive_list, cfg.archive_list) ) local archive_list_title = mw.title.new(archive_list_name) local archive_list_exists = archive_list_title.exists local all_lists = render_list(root, auto, list1, archive_list_title, archive_list_exists, content.list, content.index, content.prefix ) local main_content = mw.html.create main_content :tag('div') :addClass('archives-flex-child') :wikitext(all_lists) :node(search_box(frame, is_banner, root, content.search)) :node(note_auto(frame, content.auto_explanation)) :node(edit_list(frame, auto, list1, archive_list_title, archive_list_exists, content.editbox ))

return main_contentend

--pass the frame down for a minute because we do a lot of work with a framefunction p._main(args, frame)

local is_banner = false if (args[cfg.arg.banner] and args[cfg.arg.banner]

cfg.banner_yes) or (args[cfg.arg.large] and args[cfg.arg.large]

cfg.banner_yes) then is_banner = true end local archives = mw.html.create archives :tag('div') :addClass('archives plainlinks') -- banner is roughly mbox, small is roughly mbox-small :addClass(is_banner and 'archives-banner' or 'archives-small') -- archives-talk has same-ish styles as tmbox tmbox-notice -- base styles are same-ish as ombox ombox-notice :addClass(talk_other(var_or_default(args[cfg.arg.demospace], nil), 'archives-talk' )) :css('width', var_or_default(args[cfg.arg.box_width], nil)) :cssText(var_or_default(args[cfg.arg.style], nil)) :node(add_image) :node(add_main_content(frame, is_banner,))

return frame:extensionTag .. tostring(archives)end

function p.main(frame) return p._main(require('Module:Arguments').getArgs(frame), frame)end

return p