Home
Random
Recent changes
Special pages
Community portal
Preferences
About Stockhub
Disclaimers
Search
User menu
Talk
Contributions
Create account
Log in
Editing
Module:Archives
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
p = {} local cfg = mw.loadData('Module:Archives/config') local function is_filled(var) return var and var ~= '' end -- simple helper for simple cases local function var_or_default(var, default) if is_filled(var) then return var else return default end end local function wikilink(link, display) if display then return '[[' .. link .. '|' .. display .. ']]' else return '[[' .. link .. ']]' end end 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 need end 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({ [cfg.img_mod.image] = var_or_default(image.image, cfg.image), [cfg.img_mod.alt] = var_or_default(image.alt, cfg.img_mod.alt_none), [cfg.img_mod.link] = var_or_default(image.link, cfg.img_mod.link_none), [cfg.img_mod.size] = var_or_default(image.size, nil), [cfg.img_mod.sizedefault] = cfg.image_size }) ) 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 = { ['bgcolor'] = 'transparent', ['type'] = 'fulltext', ['prefix'] = prefix, ['break'] = sbreak, ['width'] = width, ['searchbuttonlabel'] = label } 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{ name = 'inputbox', content = table.concat(inputbox_content, '\n') }) 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{ title = archive_list_name} 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_content end --[[ pass the frame down for a minute because we do a lot of work with a frame ]] function 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({ image = args[cfg.arg.image], alt = args[cfg.arg.alt], link = args[cfg.arg.link], size = args[cfg.arg.image_size] })) :node(add_main_content(frame, is_banner, { archive_list = args[cfg.arg.archive_list], auto = args[cfg.arg.auto], collapsible = args[cfg.arg.collapsible], collapsed = args[cfg.arg.collapsed], edit_box = args[cfg.arg.edit_box], index = args[cfg.arg.index], list = args[cfg.arg.list], list1 = args[cfg.arg.list1], prefix = args[cfg.arg.prefix], root = args[cfg.arg.root], title = args[cfg.arg.title], search = { search = args[cfg.arg.search], prefix = args[cfg.arg.search_prefix], width = args[cfg.arg.search_width], sbreak = args[cfg.arg.search_break], label = args[cfg.arg.search_button_label] }, auto_explanation = { age = args[cfg.arg.age], target = args[cfg.arg.target], units = args[cfg.arg.units], bot = args[cfg.arg.bot], minthreads = args[cfg.arg.minthreads] } })) return frame:extensionTag{ name = 'templatestyles', args = { src = cfg.templatestyles } } .. tostring(archives) end function p.main(frame) return p._main(require('Module:Arguments').getArgs(frame), frame) end return p
Summary:
Please note that all contributions to Stockhub may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Stockhub:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Template used on this page:
Module:Archives/doc
(
edit
)