local function getListItem( data )
 if not type( data ) == 'string' then
 return ''
 end
 return mw.ustring.format
end

-- Returns an array containing the keys of all positional arguments
-- that contain data (i.e. non-whitespace values).
local function getArgNums( args )
 local nums = {}
 for k, v in pairs( args ) do
 if type( k ) == 'number' and
 k >= 1 and
 math.floor( k ) == k and
 type( v ) == 'string' and
 mw.ustring.match then
 table.insert
 end
 end
 table.sort( nums )
 return nums
end

-- Formats a list of classes, styles or other attributes.
local function formatAttributes
 local attributes = { ... }
 local nums = getArgNums( attributes )
 local t = {}
 for i, num in ipairs( nums ) do
 table.insert
 end
 if #t == 0 then
 return '' -- Return the blank string so concatenation will work.
 end
 return mw.ustring.format( ' %s="%s"', attrType, table.concat )
end

-- TODO: use Module:List. Since the update for this comment is routine,
-- this is blocked without a consensus discussion by
-- MediaWiki_talk:Common.css/Archive_15#plainlist_+_hlist_indentation
-- if we decide hlist in plainlist in this template isn't an issue, we can use
-- module:list directly
-- [https://en.wikipedia.org/w/index.php?title=Module:Collapsible_list/sandbox&oldid=1130172480]
-- is an implementation (that will code rot slightly I expect)
local function buildList( args )
 -- Get the list items.
 local listItems = {}
 local argNums = getArgNums( args )
 for i, num in ipairs( argNums ) do
 table.insert( listItems, getListItem( args[ num ] ) )
 end
 if #listItems == 0 then
 return ''
 end
 listItems = table.concat( listItems )

	-- hack around mw-collapsible show/hide jumpiness by looking for text-alignment
	-- by setting a margin if centered
	local textAlignmentCentered = 'text%-align%s*:%s*center'
	local centeredTitle = (args.title_style and args.title_style:lower:match(textAlignmentCentered)
		or args.titlestyle and args.titlestyle:lower:match(textAlignmentCentered)
		or args['제목스타일'] and args['제목스타일']:lower:match(textAlignmentCentered)
		or args['제목 스타일'] and args['제목 스타일']:lower:match(textAlignmentCentered))
	local centeredTitleSpacing
	if centeredTitle then
		centeredTitleSpacing = 'margin: 0 4em'
	else
		centeredTitleSpacing = ''
	end

 -- Get class, style and title data.
 local collapsibleContainerClass = formatAttributes
 local collapsibleContainerStyle = formatAttributes
 local collapsibleTitleStyle = formatAttributes
 local jumpyTitleStyle = formatAttributes
 local title = (args.title or args['제목']) or '목록'
 local ulclass = formatAttributes
 local ulstyle = formatAttributes
 
 local hlist_templatestyles = ''
 if args.hlist then
 	hlist_templatestyles = mw.getCurrentFrame:extensionTag{
 		name = 'templatestyles', args = { src = 'Hlist/styles.css' }
 end
 
 -- Build the list.
 return mw.ustring.format
end

function p.main( frame )
 local origArgs
 if frame == mw.getCurrentFrame then
 origArgs = frame:getParent.args
 for k, v in pairs( frame.args ) do
 origArgs = frame.args
 break
 end
 else
 origArgs = frame
 end
 
 local args = {}
 for k, v in pairs( origArgs ) do
 if type( k ) == 'number' or v ~= '' then
 args[ k ] = v
 end
 end
 return buildList( args )
end