Module:Shortcut: Difference between revisions

    From Nonbinary Wiki
    (use wikilinks rather than URLs, as it would change the redlink behaviour, and that's better done after it is discussed)
    (calculate the number of list items based on a table of list items, rather than doing it ad hoc from the shortcuts plus whatever else we want to add)
    Line 15: Line 15:
    frame = frame or mw.getCurrentFrame()
    frame = frame or mw.getCurrentFrame()
    cfg = cfg or mw.loadData(CONFIG_MODULE)
    cfg = cfg or mw.loadData(CONFIG_MODULE)
    local nShortcuts = #shortcuts
    -- Check that we have something to display
    if nShortcuts < 1 and not options.msg then
    return nil
    end


    -- Validate shortcuts
    -- Validate shortcuts
    Line 30: Line 24:
    ), 2)
    ), 2)
    end
    end
    end
    -- Make the list items. These are the shortcuts plus any extra lines such
    -- as options.msg.
    local listItems = {}
    for i, shortcut in ipairs(shortcuts) do
    listItems[i] = string.format('[[%s]]', shortcut)
    end
    table.insert(listItems, options.msg)
    local nListItems = #listItems
    -- Exit if we have nothing to display
    if nListItems < 1 then
    return nil
    end
    end


    Line 49: Line 57:
    local shortcutHeading = mw.message.newRawMessage(
    local shortcutHeading = mw.message.newRawMessage(
    cfg['shortcut-heading'],
    cfg['shortcut-heading'],
    nShortcuts
    nListItems
    ):plain()
    ):plain()
    shortcutHeading = frame:preprocess(shortcutHeading)
    shortcutHeading = frame:preprocess(shortcutHeading)
    Line 72: Line 80:
    :newline()
    :newline()
    :tag('ul')
    :tag('ul')
    for i, shortcut in ipairs(shortcuts) do
    for i, item in ipairs(listItems) do
    shortcutList:tag('li'):wikitext(string.format(
    shortcutList:tag('li'):wikitext(item)
    '[[%s]]',
    shortcut
    ))
    end
    if options.msg then
    shortcutList:tag('li'):wikitext(options.msg)
    end
    end



    Revision as of 13:43, 15 December 2014

    Documentation for this module may be created at Module:Shortcut/doc

    -- This module implements {{shortcut}}.
    
    -- Set constants
    local CONFIG_MODULE = 'Module:Shortcut/config'
    
    -- Load required modules
    local checkType = require('libraryUtil').checkType
    
    local p = {}
    
    function p._main(shortcuts, options, frame, cfg)
    	checkType('_main', 1, shortcuts, 'table')
    	checkType('_main', 2, options, 'table', true)
    	options = options or {}
    	frame = frame or mw.getCurrentFrame()
    	cfg = cfg or mw.loadData(CONFIG_MODULE)
    
    	-- Validate shortcuts
    	for i, shortcut in ipairs(shortcuts) do
    		if type(shortcut) ~= 'string' or #shortcut < 1 then
    			error(string.format(
    				'shortcut #%d was invalid (shortcuts must be strings of ' ..
    				'at least one character in length)'
    			), 2)
    		end
    	end
    
    	-- Make the list items. These are the shortcuts plus any extra lines such
    	-- as options.msg.
    	local listItems = {}
    	for i, shortcut in ipairs(shortcuts) do
    		listItems[i] = string.format('[[%s]]', shortcut)
    	end
    	table.insert(listItems, options.msg)
    	local nListItems = #listItems
    
    	-- Exit if we have nothing to display
    	if nListItems < 1 then
    		return nil
    	end
    
    	local root = mw.html.create()
    
    	-- Anchors
    	local anchorDiv = root
    		:tag('div')
    			:css('position', 'relative')
    			:css('top', '-3em')
    	for i, shortcut in ipairs(shortcuts) do
    		local anchor = mw.uri.anchorEncode(shortcut)
    		anchorDiv:tag('span'):attr('id', anchor)
    	end
    
    	root:newline() -- To match the old [[Template:Shortcut]]
    
    	-- Shortcut heading
    	local shortcutHeading = mw.message.newRawMessage(
    		cfg['shortcut-heading'],
    		nListItems
    	):plain()
    	shortcutHeading = frame:preprocess(shortcutHeading)
    
    	-- Shortcut box
    	local shortcutList = root
    		:tag('table')
    			:addClass('shortcutbox noprint')
    			:css('float', 'right')
    			:css('border', '1px solid #aaa')
    			:css('background', '#fff')
    			:css('margin', '.3em .3em .3em 1em')
    			:css('padding', '3px')
    			:css('text-align', 'center')
    				:tag('tr')
    					:tag('th')
    						:addClass('plainlist')
    						:css('border', 'none')
    						:css('background', 'transparent')
    						:tag('small')
    							:wikitext(shortcutHeading)
    							:newline()
    							:tag('ul')
    	for i, item in ipairs(listItems) do
    		shortcutList:tag('li'):wikitext(item)
    	end
    
    	-- Error category
    	if shortcuts[1] then
    		local title = mw.title.new(shortcuts[1])
    		if not title or not title.exists then
    			root:wikitext(string.format(
    				'[[%s:%s]]',
    				mw.site.namespaces[14].name,
    				cfg['first-parameter-error-category']
    			))
    		end
    	end
    
    	return tostring(root)
    end
    
    function p.main(frame)
    	local args = require('Module:Arguments').getArgs(frame, {
    		wrappers = 'Template:Shortcut'
    	})
    
    	-- Separate shortcuts from options
    	local shortcuts, options = {}, {}
    	for k, v in pairs(args) do
    		if type(k) == 'number' then
    			shortcuts[k] = v
    		else
    			options[k] = v
    		end
    	end
    
    	-- Compress the shortcut array, which may contain nils.
    	local function compressArray(t)
    		local nums, ret = {}, {}
    		for k in pairs(t) do
    			nums[#nums + 1] = k
    		end
    		table.sort(nums)
    		for i, num in ipairs(nums) do
    			ret[i] = t[num]
    		end
    		return ret
    	end
    	shortcuts = compressArray(shortcuts)
    
    	return p._main(shortcuts, options, frame)
    end
    
    return p