FANDOM


-- HF stands for High Frequency.
-- This Module augments the built-in HF
local HF = mw.InfoboxBuilderHF
 
----------------------------
-- Libraries of functions --
----------------------------
-- Parses invocation parameters, trims whitespace, and removes blanks
HF.getArgs = require('Dev:Arguments').getArgs
 
-- Since this should only be evaluated once per pageview, it's now global
_G.vars = { Pagename = mw.title.getCurrentTitle().text }
 
-----------------------
-- Libraries of data --
-----------------------
-- Data tables for common Staff contributors
local StaffNames = require( 'Module:StaffCorrection' )
-- Data tables for common Publisher names
local CompanyNames = require( 'Module:CompanyCorrection' )
 
------------------------------------------------
-- Local functions (used only in this Module) --
------------------------------------------------
function invokeInt(funcName)
  -- This wrapper allows invocation of an internal function from a frame.
  -- In other words, it translates from a Template: to an internal function.
	return function (frame)
		local args = HF.getArgs(frame, { trim = true, removeBlanks = true })
		return HF[funcName](args, vars)
	end
end
 
----------------------------------------------------------
-- Public functions (called from a Template or article) --
----------------------------------------------------------
 
-- Adds a Help button to the title / corner of an Infobox.
-- (Does not implement a specific Template. Called from invoke.)
HF.TitleHelpButton = invokeInt('_TitleHelpButton')
 
-- Adds a Help button to the label of an Infobox field.
-- (Does not implement a specific Template. Called from invoke.)
HF.HelpButton = invokeInt('_HelpButton')
 
-- Takes a list (or array) of items in a field that are on a single line
-- and separated by a delimiter, and does something with them.
-- (Does not implement a specific Template. Called from invoke.)
HF.Iterator = invokeInt('_Iterator')
 
---------------------------------------------------------
-- Internal functions (used in this and other Modules) --
---------------------------------------------------------
-- eliminates whitespace from the front and back of a string 
function HF.trim(s)
  if type(s) == 'string' then
    return (s:gsub("^%s*(.-)%s*$", '%1'))
  else
    return false
  end
end
 
-- I think this is for padding with zeros
function HF.AddZeros( s, len )
  local output = ""
 
  local sLength = string.len( tostring( s ) )
  local diff = tonumber( len ) - tonumber( sLength )
 
  if diff > 0 then
    for i = 1, diff do
      output = output .. "0"
    end
  end
 
  output = output .. s
 
  return output
end
 
-- This creates an external link.
function HF.ExternalLink( target, label, plain )
  local output = string.format('[%s %s]', target, label)
 
  if plain == true then
    output = string.format('<span class="plainlinks">%s</span>', output)
  end  
 
  return output
end
 
-- This creates a link to a category, as well as placing it in that category.
-- `sortkey` and `label` are optional
-- If there's no `label` given, it will only place it in the category,
-- which is what HF.Category is for.
function HF.CategoryLink( category, sortkey, label )
  if not HF.isempty( label ) then
    return HF.LinkToCategory( category, label ) ..
        HF.Category( category, sortkey )
  else 
    return HF.Category( category, sortkey )
  end
end
 
-- Adds a Category
-- `sortkey` is optional
function HF.Category( category, sortkey )
    if sortkey == nil then sortkey = '' else sortkey = '|' .. sortkey end
    return string.format('[['..'Category:%s%s]]', category, sortkey)
end
 
-- Adds a link to a Category
function HF.LinkToCategory( category, label )
    return string.format('[[:'..'Category:%s|%s]]', category, 
        label or 'Category:' .. category )
end
 
-- Adds an internal link
-- `label` is optional
function HF.Link( link, text )
    if not HF.isempty( text ) then
        return string.format('[['..'%s|%s]]', link, text)
    else
        return string.format('[['..'%s]]', link)
    end
end
 
-- Checks to see if there's an existing article at the target.
-- If there is, creates a link.
-- If there's not, only write the target's name as text.
-- If it is passed a link, it will not perform this check and will only write the link.
function HF.KillNewLinks( object )
    if object:match("^%[%[(.*)%]%]$") then
        return object
    elseif mw.title.new( object ).exists == true then
        return HF.Link( object )
    else
        return object
    end
end
 
-- Checks to see if there's an existing category at the target.
-- If there is, creates a link.
-- If there's not, only write the target's name as text.
function HF.KillNewCatLinks( object )
    if mw.title.new( object, 'Category' ).exists == true then
        return HF.Link( ':Category:'..object, object )
    else
        return object
    end
end
 
-- Checks to see if there's an existing category at the target.
-- If there is, creates a link.
-- If there's not, only write the target's name as text.
function HF.KillNewCategories( object )
    if mw.title.new( object, 'Category' ).exists == true then
        return HF.Category( object, object, object)
    else
        return object
    end
end
 
function HF._HelpButton( args )
  if HF.isempty( args.buttonsize ) then args.buttonsize = "10px" end
	local link = string.format(
		'[['..'File:Information-silk.png|%s|link=Click here for help with this field#%s]] %s',
		args.buttonsize,
		args.Section or args.Label or '',
		args.Label or ''
	)
  return link
end
 
function HF._TitleHelpButton( args )
  if HF.isempty( args.buttonsize ) then args.buttonsize = "16px" end
	local link = string.format(
		'[['..'File:Help.png|%s|link=%s#%s|%s]]',
		args.buttonsize,
		args.Link or 'Help:Template Fields',
		args.Section or args.Label or '',
		args.Label or ''
	)
  return '<span class="title-help-button">'..link..'</span>'
end
 
function HF.ContributorNameCorrection( name )
  if type( StaffNames[ string.lower( name ) ] ) == "string" then
    return StaffNames[ string.lower( name ) ]
  else
    return name
  end
end
 
function HF.CompanyNameCorrection( name )
  if type( CompanyNames[ string.lower( name ) ] ) == "string" then
    return CompanyNames[ string.lower( name ) ]
  else
    return name
  end
end
 
function HF._Iterator( args )
    local text = args['text'] or args[1] or nil
    local delimiter = args['delimiter'] or args[2] or ';'
    local contributorrole = args['role'] or nil
    local check = args['check'] or nil
    local storage = mw.text.split( text, delimiter )
    local output = {}
 
    for i, item in ipairs( storage ) do
        item = HF.trim(item)
        check = HF.trim(check)
        if not string.match(item, '%S') then break end
        if check == 'company' then
            if type(item) == 'string' and 
              CompanyNames:in_database( item ) then
                table.insert( output,
                    HF.KillNewLinks( CompanyNames:normalize(item) ) ..
                    CompanyNames:cat_staff( item )
                )
            else
                table.insert( output,  item )
            end
        elseif check == 'staff' then
            table.insert(
                output,
                StaffNames:link( item ) ..
                StaffNames:cat_role( item, contributorrole )
            )
        elseif check == 'featured' then
            table.insert(
                output,
                HF.Category( item .. ' Titles') ..
                HF.Link( item )
            )
        elseif check == 'featured_publisher' then
            table.insert(
                output,
                HF.Category( CompanyNames:normalize(item) .. ' Titles') ..
                HF.KillNewLinks( CompanyNames:normalize(item) )
            )
        elseif check == 'category' then 
            table.insert(output, HF.KillNewCategories( item ))
        elseif check == 'categorylinkonly' then 
            table.insert(output, HF.KillNewCatLinks( item ))
        elseif check == 'noredlink' then 
            table.insert(output, HF.KillNewLinks( item ))
        elseif check == 'jobtitles' then 
            if mw.title.new( item..'s', 'Category' ).exists == true then
                table.insert(output, HF.CategoryLink( item..'s', item, item) )
            else
                table.insert(output, item)
            end
        else
            table.insert(output, item)
        end
    end
    return table.concat(output, ' · ')
end
 
HF.TrimOverflow = invokeInt('_TrimOverflow')
 
function HF._TrimOverflow( args )
    local input = args[1]
    local breakat = args['TrimBreak'] or ' '
    local limit = args['TrimLimit'] or 1000
    local morelabel = args['TrimMoreLabel'] or 'more...'
    local lesslabel = args['TrimLessLabel'] or 'less...'
    if not input then return nil end
    if mw.ustring.len( input ) > limit then
        local primary   = mw.ustring.sub( input, 1, limit )
        local secondary = mw.ustring.sub( input, limit )
        local shiftatbreak = ''
        if not args['TrimBreak'] and string.find(primary, '·') then breakat = '·'
        elseif not args['TrimBreak'] and string.find(primary, ';') then breakat = ';'
        elseif not args['TrimBreak'] and string.find(primary, ' ') then breakat = ' '
        end
 
        primary, shiftatbreak = mw.ustring.match( primary, '(.*)'..breakat..'(.*)$')
        secondary = shiftatbreak .. secondary
        local morebox = mw.html.create('div')
            :addClass('expansion-tag')
            :addClass('mw-collapsible')
            :addClass('mw-collapsed')
            :attr('data-expandtext',morelabel)
            :attr('data-collapsetext',lesslabel)
            :wikitext(secondary):allDone()
        return primary .. tostring(morebox)
    else
        return input
    end
end
 
-------------------------------------------------
-- Output (send it back to whatever called it) --
-------------------------------------------------
return HF

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

Also on FANDOM

Random Wiki