<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ACo-op_profile</id>
	<title>Module:Co-op profile - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ACo-op_profile"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Co-op_profile&amp;action=history"/>
	<updated>2026-06-13T10:43:41Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Co-op_profile&amp;diff=135685&amp;oldid=prev</id>
		<title>imported&gt;Jtmorgan: code adjustment to account for mentor param in learner profile, which adds a cat based on value but is not displayed</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Co-op_profile&amp;diff=135685&amp;oldid=prev"/>
		<updated>2015-03-26T23:05:28Z</updated>

		<summary type="html">&lt;p&gt;code adjustment to account for mentor param in learner profile, which adds a cat based on value but is not displayed&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Wikipedia:Co-op/Mentor profile}} and {{Wikipedia:Co-op/Learner profile}}&lt;br /&gt;
--&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local TableTools = require(&amp;#039;Module:TableTools&amp;#039;)&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function chooseCategory(cat_table, cat_table_name, cat_path, args)&lt;br /&gt;
	-- adds categories to the child page based on template param values&lt;br /&gt;
	local cat&lt;br /&gt;
	if (args[cat_table_name] and string.len(args[cat_table_name]) &amp;gt; 0) then&lt;br /&gt;
		for k,v in pairs(cat_table) do&lt;br /&gt;
			if stringSpacesToUnderscores(stringToLowerCase(args[cat_table_name])) == k then&lt;br /&gt;
				cat = cat_path .. v&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return cat&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getCategories(data, args)&lt;br /&gt;
 	-- looks for args that have associated categories,&lt;br /&gt;
 	-- returns a string with a list of wikilinked categories&lt;br /&gt;
 	-- also appends any default categories you specify&lt;br /&gt;
	local cat_list = {}&lt;br /&gt;
	if data.categories.default then&lt;br /&gt;
		table.insert(cat_list, data.categories.default)&lt;br /&gt;
	end&lt;br /&gt;
	for k,v in pairs(data.fields) do&lt;br /&gt;
		if (data.fields[k].hasCategories == true and type(data.categories[k]) == &amp;quot;table&amp;quot;) then&lt;br /&gt;
			table.insert(cat_list, chooseCategory(data.categories[k], k, data.fields[k].cat_path, args))&lt;br /&gt;
		elseif (data.fields[k].hasCategories == true and args[k] and stringToLowerCase(args[k]) == &amp;quot;1&amp;quot;) then&lt;br /&gt;
			table.insert(cat_list, data.categories[k])&lt;br /&gt;
		end	&lt;br /&gt;
	end&lt;br /&gt;
	local page_categories = &amp;quot; [[&amp;quot; .. tostring(table.concat(cat_list, &amp;quot;]] [[&amp;quot;)) .. &amp;quot;]]&amp;quot;&lt;br /&gt;
	return page_categories&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function nodeBuilder(arg_data, arg_value)&lt;br /&gt;
	local field_div = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
	if arg_data.ftype == &amp;quot;image&amp;quot; then	&lt;br /&gt;
		field_div&lt;br /&gt;
			:cssText(arg_data.style1)&lt;br /&gt;
			:wikitext(&amp;quot;[[&amp;quot; .. arg_value .. &amp;quot;|&amp;quot; .. arg_data.style2 .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
			:done()		&lt;br /&gt;
	elseif arg_data.ftype == &amp;quot;wikilink&amp;quot; then&lt;br /&gt;
		field_div&lt;br /&gt;
			:cssText(arg_data.style1)&lt;br /&gt;
			:wikitext(&amp;quot;[[User_talk:&amp;quot; .. arg_value .. &amp;quot;|&amp;quot; .. arg_value .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
			:done()	&lt;br /&gt;
	elseif arg_data.ftype == &amp;quot;text&amp;quot; then&lt;br /&gt;
		field_div&lt;br /&gt;
			:cssText(arg_data.style1)&lt;br /&gt;
			:wikitext(arg_data.prefix .. arg_value)&lt;br /&gt;
			:done()	&lt;br /&gt;
	elseif arg_data.ftype == &amp;quot;choice&amp;quot; then&lt;br /&gt;
		field_div&lt;br /&gt;
			:cssText(arg_data.style1)&lt;br /&gt;
			:wikitext(arg_data.prefix)&lt;br /&gt;
			:done()			&lt;br /&gt;
	end&lt;br /&gt;
	field_div:allDone()&lt;br /&gt;
	return field_div&lt;br /&gt;
end			&lt;br /&gt;
&lt;br /&gt;
function insertProfileFields(ranked_fields, profile_div)&lt;br /&gt;
	ranked_fields = TableTools.compressSparseArray(ranked_fields)&lt;br /&gt;
	for k, v in ipairs(ranked_fields) do&lt;br /&gt;
		profile_div:node(v)&lt;br /&gt;
	end	&lt;br /&gt;
	return profile_div&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function makeProfile(data, args)&lt;br /&gt;
	-- what about a &amp;#039;nodebuilder&amp;#039; instead?&lt;br /&gt;
    -- builds the template in html&lt;br /&gt;
    ranked_fields = {}&lt;br /&gt;
    local field_div&lt;br /&gt;
	local profile_div = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
	profile_div&lt;br /&gt;
		:cssText(data.styles.box.outer)&lt;br /&gt;
		:addClass(&amp;quot;plainlinks&amp;quot;)&lt;br /&gt;
	for k,v in pairs(args) do&lt;br /&gt;
		if ((data.fields[k] and data.fields[k].isRequired) or (data.fields[k] and string.len(v) &amp;gt; 0)) then&lt;br /&gt;
			field_div = nodeBuilder(data.fields[k], v)&lt;br /&gt;
			ranked_fields[data.fields[k].rank] = field_div&lt;br /&gt;
--			profile_div:node(field_div)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	profile_div = insertProfileFields(ranked_fields, profile_div)&lt;br /&gt;
	profile_div:allDone()		&lt;br /&gt;
	return profile_div&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function deepCopyTable(data)&lt;br /&gt;
	-- the deep copy is a workaround step to avoid the restrictions placed on&lt;br /&gt;
	-- tables imported through loadData&lt;br /&gt;
	if type(data) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
	    return data&lt;br /&gt;
	end&lt;br /&gt;
	local data_copy = {}&lt;br /&gt;
	for k,v in pairs(data) do&lt;br /&gt;
		if type(v) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		    v = deepCopyTable(v)&lt;br /&gt;
		end&lt;br /&gt;
		data_copy[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	return data_copy&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getProfileData(args)&lt;br /&gt;
	-- loads the relevant stylesheet (/learner or /mentor), if a sub-template was called with a portal&lt;br /&gt;
	-- argument and a stylesheet exists with the same name. For example, calling&lt;br /&gt;
	-- {{#invoke:Co-op_profile|main|type=learner}} would load the&lt;br /&gt;
	-- Module:Co-op_profile/learner stylesheet&lt;br /&gt;
	-- member stylesheet is the default if no param set&lt;br /&gt;
	local data_readOnly = {}&lt;br /&gt;
	local data_writable = {}&lt;br /&gt;
	if (args.profile_type and mw.title.makeTitle( &amp;#039;Module&amp;#039;, &amp;#039;Co-op_profile/&amp;#039; .. args.profile_type).exists) then&lt;br /&gt;
		data_readOnly = mw.loadData(&amp;quot;Module:Co-op_profile/&amp;quot; .. args.profile_type)&lt;br /&gt;
	else&lt;br /&gt;
		data_readOnly = mw.loadData(&amp;quot;Module:Co-op_profile/learner&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	data_writable = deepCopyTable(data_readOnly)&lt;br /&gt;
	return data_writable&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- helper functions --&lt;br /&gt;
&lt;br /&gt;
function stringToLowerCase(value)&lt;br /&gt;
    -- returns a string in all lowercase chars&lt;br /&gt;
	return mw.ustring.lower(value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function stringSpacesToUnderscores(value)&lt;br /&gt;
    -- converts spaces to underscores in a string&lt;br /&gt;
	return mw.ustring.gsub(value, &amp;quot; &amp;quot;, &amp;quot;_&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function stringFirstCharToUpper(str)&lt;br /&gt;
    -- converts the first char of a string to uppercase&lt;br /&gt;
    return (str:gsub(&amp;quot;^%l&amp;quot;, string.upper))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function addMissingArgs(data, args)&lt;br /&gt;
    --if required args are not included in the calling template, adds&lt;br /&gt;
    -- them with default values&lt;br /&gt;
    for k,v in pairs(data.fields) do&lt;br /&gt;
        if data.fields[k].isRequired then&lt;br /&gt;
            if not args[k] then&lt;br /&gt;
                args[k] = data.fields[k].default&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end            &lt;br /&gt;
    return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function setDefaultValues(data, args)&lt;br /&gt;
	for k,v in pairs(args) do&lt;br /&gt;
	    if (string.len(args[k]) == 0 and data.fields[k] and data.fields[k].isRequired == true) then&lt;br /&gt;
	        args[k] = data.fields[k].default&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- main --&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = getArgs(frame, {removeBlanks = false})&lt;br /&gt;
	local data = getProfileData(args)&lt;br /&gt;
	args = setDefaultValues(data, args)&lt;br /&gt;
	args = addMissingArgs(data, args) --make this a sub-call of setDefaultValues&lt;br /&gt;
	local profile = tostring(makeProfile(data, args)) --added data param&lt;br /&gt;
	 if mw.title.getCurrentTitle().nsText == &amp;quot;Wikipedia&amp;quot; then&lt;br /&gt;
		 profile = profile .. getCategories(data, args)&lt;br /&gt;
	 end    &lt;br /&gt;
	return profile&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Jtmorgan</name></author>
	</entry>
</feed>