Jump to content

Module:ShaderDoc: Difference between revisions

From HedgeDocs
Justin113D (talk | contribs)
Created page with "--This module provides several functions used in the "Shader_Documentation" template local shader_doc = {} --[[ shader_link_list This function produces a bullet list of links to shaders Usage: {{#invoke:ShaderDoc|game=game_name|shaders=shader_a,shader_b,shader_c,etc}} parameters: game: The shader link prefix shaders: A comma separated list of shaders to list ]] function shader_docshader_link_list( frame ) local new_args = shader_doc_getParameters..."
 
Justin113D (talk | contribs)
Fixed create_sbo output
 
(16 intermediate revisions by the same user not shown)
Line 6: Line 6:


local shader_doc = {}
local shader_doc = {}
--[[
create_sbo
Creates an "Shader behavior overview" from a list of comma separated parameters
Usage:
{{#invoke:ShaderDoc|create_sbo|game=Game|parameters=model=2,toggle_1,toggle_2,toggle_3,etc}}
parameters:
    game: Prefix to use for the template
    parameters: A list of comma separated names. If a name is not "assigned", it will receive the value "1"
]]
function shader_doc.create_sbo( frame )
    local game = frame.args['game'];
    local parameters = frame.args['parameters'] or '';
    local parameter_list = mw.text.split( parameters, ',' );
    local args = {};
    for _, parameter in ipairs( parameter_list ) do
        if #parameter > 0 then
            local name = parameter;
            local value = 1;
           
            local equal_pos, equal_end = mw.ustring.find( parameter, '=' );
            if equal_pos ~= nil then
                name = mw.text.trim(mw.ustring.sub(parameter, 1, equal_pos - 1));
                value = mw.text.trim(mw.ustring.sub(parameter, equal_end + 1, #parameter));
            else
                name = mw.text.trim(name);
            end
            mw.log(name)
            mw.log(value)
            mw.log('---')
            args[name] = value;
        end
    end
    local title = game .. ' Shader Behavior';
    return frame:expandTemplate{ title = title, args = args };
end


--[[
--[[
Line 13: Line 58:


Usage:
Usage:
{{#invoke:ShaderDoc|game=game_name|shaders=shader_a,shader_b,shader_c,etc}}
{{#invoke:ShaderDoc|shader_link_list|game=game_name|shaders=shader_a,shader_b,shader_c,etc}}


parameters:
parameters:
Line 19: Line 64:
     shaders: A comma separated list of shaders to list
     shaders: A comma separated list of shaders to list
]]
]]
function shader_docshader_link_list( frame )
function shader_doc.shader_link_list( frame )
     local new_args = shader_doc_getParameters( frame.args, {'game'}, {'shaders'} );
     local game = frame.args['game'];
    local game = new_args['game'];
     local shaders = frame.args['shaders'];
     local shaders = new_args['shaders'];


     if game == nil then
     if game == nil then
         return shader_doc_error( 'Game not specified' );
         return shader_doc._error( 'Game not specified' );
     end
     end


     if shaders == nil then
     if shaders == nil then
         return shader_doc_error( 'Shaders not specified' );
         return shader_doc._error( 'Shaders not specified' );
     end
     end


Line 36: Line 80:


     for _, shader in ipairs( shader_list ) do
     for _, shader in ipairs( shader_list ) do
         result = result .. '* ' .. shader .. '\n';
         local trimmed_shader = mw.text.trim(shader);
 
        if #trimmed_shader > 0 then
            result = result .. '* [[' .. game .. ' Shaders - ' .. trimmed_shader .. '|' .. trimmed_shader .. ']]\n';
        end
     end
     end


Line 44: Line 92:


--[[
--[[
Helper function that populates the argument list given that user may need to use a mix of
shader_table
named and unnamed parameters.  This is relevant because named parameters are not
 
identical to unnamed parameters due to string trimming, and when dealing with strings
This function converts comma separated items to a list row
we sometimes want to either preserve or remove that whitespace depending on the application.
 
Usage:
{{#invoke:ShaderDoc|technical_features|cell1,cell2,cell3}}
 
info:
commas (,) = seperate items
underscores (_) before commas = span to the next cell
semicolons (;) = seperate rows
backslash  (\) before any of these 4: escape
]]
]]
function shader_doc_getParameters( frame_args, arg_list )
function shader_doc.shader_table( frame )
local new_args = {};
    local contents = frame.args[1];
local index = 1;
 
local value;
    if contents == nil then
        return shader_doc._error( 'No contents' );
    end


for i,arg in ipairs( arg_list ) do
    if #contents > 0 and string.sub(contents, -1) ~= ';' then
value = frame_args[arg]
        contents = contents .. ';';
if value == nil then
    end
value = frame_args[index];
 
index = index + 1;
    local current_cell_text = '';
end
    local span_length = 0;
new_args[arg] = value;
    local current_row = {};
end
    local rows = {};
    local escaped = false;
 
    for cp in mw.ustring.gcodepoint( contents ) do
        local char = mw.ustring.char( cp );
        local skip = false;
 
        if span_length > 0 then
            if char == '_' then
                span_length = span_length + 1;
                skip = true;
            elseif char ~= ',' and char ~= ';' then
                for i = 1,span_length,1 do
                    current_cell_text = current_cell_text .. '_'
                end
                span_length = 0;
            end
        end
 
        if escaped and not skip then
            escaped = false;
            current_cell_text = current_cell_text .. char;
            skip = true;
        end
 
        if not skip then
            if char == '\\' then
                escaped = true;
            elseif char == '_' then
                span_length = 1;
            elseif char == ',' or char == ';' then
               
                table.insert(current_row, {
                    ['text'] = current_cell_text,
                    ['span_length'] = span_length
                });
 
                span_length = 0;
                current_cell_text = '';
 
                if char == ';' then
                    table.insert(rows, current_row);
                    current_row = {};
                end
            else
                current_cell_text = current_cell_text .. char;
            end
        end
    end
 
    local result = '';
   
    for i, row in ipairs(rows) do
        result = result .. '|-\n';
        for j, cell in ipairs(row) do
            if j == 1 then
                result = result .. '!';
            else
                result = result .. '|';
            end
 
            span_length = cell['span_length'];
            if span_length > 0 then
                result = result .. 'colspan="' .. (span_length + 1) .. '"|';
            end
 
            current_cell_text = mw.text.trim(cell['text']);
 
            if #current_cell_text == 0 then
                current_cell_text = 'N/A';
            end
 
            if j == 1 then
                current_cell_text = '<code>' .. current_cell_text .. '</code>';
            end
 
            result = result .. current_cell_text .. '\n';
        end
    end
 
    return result;
end
 
--[[
technical_features
 
This function produces single column table rows with code formatting.
 
Usage:
{{#invoke:ShaderDoc|technical_features|feature_a,feature_b,feature_c,etc}}
 
parameters:
    features: A comma separated list of technical features
]]
function shader_doc.technical_features( frame )
    local features = frame.args[1];
 
    if features == nil then
        return shader_doc._error( 'Features not specified' );
    end
 
    local feature_list = mw.text.split( features, ',' );
    local result = '';
 
    for _, feature in ipairs( feature_list ) do
        local trimmed_feature = mw.text.trim(feature);
        if #trimmed_feature > 0 then
            result = result .. '|-\n|<code>' .. trimmed_feature .. '</code>\n';
        end
    end


return new_args;
    return result;
end
end


Line 69: Line 236:
Helper function to handle error messages.
Helper function to handle error messages.
]]
]]
function shader_doc_error( error_str )
function shader_doc._error( error_str )
local frame = mw.getCurrentFrame();
local frame = mw.getCurrentFrame();
local error_category = frame.args.error_category or 'Errors reported by Module String';
local error_category = frame.args.error_category or 'Errors reported by Module String';
Line 75: Line 242:
local no_category = frame.args.no_category or false;
local no_category = frame.args.no_category or false;


if shader_doc_getBoolean(ignore_errors) then
if shader_doc._getBoolean(ignore_errors) then
return '';
return '';
end
end


local error_str = '<strong class="error">String Module Error: ' .. error_str .. '</strong>';
local error_str = '<strong class="error">String Module Error: ' .. error_str .. '</strong>';
if error_category ~= '' and not shader_doc_getBoolean( no_category ) then
if error_category ~= '' and not shader_doc._getBoolean( no_category ) then
error_str = '[[Category:' .. error_category .. ']]' .. error_str;
error_str = '[[Category:' .. error_category .. ']]' .. error_str;
end
end
Line 90: Line 257:
Helper Function to interpret boolean strings
Helper Function to interpret boolean strings
]]
]]
function shader_doc_getBoolean( boolean_str )
function shader_doc._getBoolean( boolean_str )
local boolean_value;
local boolean_value;


Line 108: Line 275:
return boolean_value
return boolean_value
end
end
return shader_doc;

Latest revision as of 21:19, 17 August 2025

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

--[[

This module provides several functions used in the "Shader_Documentation" template

]]

local shader_doc = {}

--[[
create_sbo

Creates an "Shader behavior overview" from a list of comma separated parameters

Usage:
{{#invoke:ShaderDoc|create_sbo|game=Game|parameters=model=2,toggle_1,toggle_2,toggle_3,etc}}

parameters:
    game: Prefix to use for the template
    parameters: A list of comma separated names. If a name is not "assigned", it will receive the value "1"
]]
function shader_doc.create_sbo( frame )
    local game = frame.args['game'];
    local parameters = frame.args['parameters'] or '';

    local parameter_list = mw.text.split( parameters, ',' );

    local args = {};

    for _, parameter in ipairs( parameter_list ) do
        if #parameter > 0 then
            local name = parameter;
            local value = 1;
            
            local equal_pos, equal_end = mw.ustring.find( parameter, '=' );
            if equal_pos ~= nil then
                name = mw.text.trim(mw.ustring.sub(parameter, 1, equal_pos - 1));
                value = mw.text.trim(mw.ustring.sub(parameter, equal_end + 1, #parameter));
            else
                name = mw.text.trim(name);
            end
            mw.log(name)
            mw.log(value)
            mw.log('---')

            args[name] = value;
        end
    end

    local title = game .. ' Shader Behavior';

    return frame:expandTemplate{ title = title, args = args };
end

--[[
shader_link_list

This function produces a bullet list of links to shaders

Usage:
{{#invoke:ShaderDoc|shader_link_list|game=game_name|shaders=shader_a,shader_b,shader_c,etc}}

parameters:
    game: The shader link prefix
    shaders: A comma separated list of shaders to list
]]
function shader_doc.shader_link_list( frame )
    local game = frame.args['game'];
    local shaders = frame.args['shaders'];

    if game == nil then
        return shader_doc._error( 'Game not specified' );
    end

    if shaders == nil then
        return shader_doc._error( 'Shaders not specified' );
    end

    local shader_list = mw.text.split( shaders, ',' );
    local result = '';

    for _, shader in ipairs( shader_list ) do
        local trimmed_shader = mw.text.trim(shader);

        if #trimmed_shader > 0 then
            result = result .. '* [[' .. game .. ' Shaders - ' .. trimmed_shader .. '|' .. trimmed_shader .. ']]\n';
        end
    end

    return result;

end

--[[
shader_table

This function converts comma separated items to a list row

Usage:
{{#invoke:ShaderDoc|technical_features|cell1,cell2,cell3}}

info:
commas (,) = seperate items
underscores (_) before commas = span to the next cell
semicolons (;) = seperate rows
backslash  (\) before any of these 4: escape
]]
function shader_doc.shader_table( frame )
    local contents = frame.args[1];

    if contents == nil then
        return shader_doc._error( 'No contents' );
    end

    if #contents > 0 and string.sub(contents, -1) ~= ';' then
        contents = contents .. ';';
    end

    local current_cell_text = '';
    local span_length = 0;
    local current_row = {};
    local rows = {};
    local escaped = false;

    for cp in mw.ustring.gcodepoint( contents ) do
        local char = mw.ustring.char( cp );
        local skip = false;

        if span_length > 0 then
            if char == '_' then
                span_length = span_length + 1;
                skip = true;
            elseif char ~= ',' and char ~= ';' then
                for i = 1,span_length,1 do
                    current_cell_text = current_cell_text .. '_'
                end
                span_length = 0;
            end
        end

        if escaped and not skip then
            escaped = false;
            current_cell_text = current_cell_text .. char;
            skip = true;
        end

        if not skip then
            if char == '\\' then
                escaped = true;
            elseif char == '_' then
                span_length = 1;
            elseif char == ',' or char == ';' then
                
                table.insert(current_row, {
                    ['text'] = current_cell_text,
                    ['span_length'] = span_length
                });

                span_length = 0;
                current_cell_text = '';

                if char == ';' then
                    table.insert(rows, current_row);
                    current_row = {};
                end
            else
                current_cell_text = current_cell_text .. char;
            end
        end
    end

    local result = '';
    
    for i, row in ipairs(rows) do
        result = result .. '|-\n';
        for j, cell in ipairs(row) do
            if j == 1 then
                result = result .. '!';
            else
                result = result .. '|';
            end

            span_length = cell['span_length'];
            if span_length > 0 then
                result = result .. 'colspan="' .. (span_length + 1) .. '"|';
            end

            current_cell_text = mw.text.trim(cell['text']);

            if #current_cell_text == 0 then
                current_cell_text = 'N/A';
            end

            if j == 1 then
                current_cell_text = '<code>' .. current_cell_text .. '</code>';
            end

            result = result .. current_cell_text .. '\n';
        end
    end

    return result;
end

--[[
technical_features

This function produces single column table rows with code formatting.

Usage:
{{#invoke:ShaderDoc|technical_features|feature_a,feature_b,feature_c,etc}}

parameters:
    features: A comma separated list of technical features
]]
function shader_doc.technical_features( frame )
    local features = frame.args[1];

    if features == nil then
        return shader_doc._error( 'Features not specified' );
    end

    local feature_list = mw.text.split( features, ',' );
    local result = '';

    for _, feature in ipairs( feature_list ) do
        local trimmed_feature = mw.text.trim(feature);
        if #trimmed_feature > 0 then
            result = result .. '|-\n|<code>' .. trimmed_feature .. '</code>\n';
        end
    end

    return result;
end

--[[
Helper function to handle error messages.
]]
function shader_doc._error( error_str )
	local frame = mw.getCurrentFrame();
	local error_category = frame.args.error_category or 'Errors reported by Module String';
	local ignore_errors = frame.args.ignore_errors or false;
	local no_category = frame.args.no_category or false;

	if shader_doc._getBoolean(ignore_errors) then
		return '';
	end

	local error_str = '<strong class="error">String Module Error: ' .. error_str .. '</strong>';
	if error_category ~= '' and not shader_doc._getBoolean( no_category ) then
		error_str = '[[Category:' .. error_category .. ']]' .. error_str;
	end

	return error_str;
end

--[[
Helper Function to interpret boolean strings
]]
function shader_doc._getBoolean( boolean_str )
	local boolean_value;

	if type( boolean_str ) == 'string' then
		boolean_str = boolean_str:lower();
		if boolean_str == 'false' or boolean_str == 'no' or boolean_str == '0'
				or boolean_str == '' then
			boolean_value = false;
		else
			boolean_value = true;
		end
	elseif type( boolean_str ) == 'boolean' then
		boolean_value = boolean_str;
	else
		error( 'No boolean value found' );
	end
	return boolean_value
end

return shader_doc;
Cookies help us deliver our services. By using our services, you agree to our use of cookies.