Modulo:InfoboxImage/provejo2

Dokumentado por ĉi tiu modulo povas esti kreata ĉe Modulo:InfoboxImage/provejo2/dokumentado

-- Inputs:
--    image - Can either be a bare filename (with or without the File:/Image: prefix) or a fully formatted image link
--    ending - An optional parameter for the file ending, like gif, jpg, jpeg, png, svg.
--    endingdefault - An optional parameter for the default ending.
--    size - size to display the image
--    maxsize - maximum size for image
--    sizedefault - default size to display the image if size param is blank
--    alt - alt text for image
--    title - title text for image
--    border - set to yes if border
--    center - set to yes, if the image has to be centered
--    upright - upright image param
--    link - page to visit when clicking on image
--    suppressplaceholder - if yes then checks to see if image is a placeholder and suppresses it
--    usecaption - if yes then the caption from the image is used, else it isn't used
--                 and the infobox has to add it. this avoids dupplicates
-- Outputs:
--    Formatted image.

local i = {};

local placeholder_image = {
    "Blue - Replace this image female.svg",
    "Blue - Replace this image male.svg",
    "Female no free image yet.png",
    "Flag of None (square).svg",
    "Flag of None.svg",
    "Flag of.svg",
    "Green - Replace this image female.svg",
    "Green - Replace this image male.svg",
    "Image is needed female.svg",
    "Image is needed male.svg",
    "Location map of None.svg",
    "Male no free image yet.png",
    "Missing flag.png",
    "No flag.svg",
    "No free portrait.svg",
    "No portrait (female).svg",
    "No portrait (male).svg",
    "Red - Replace this image female.svg",
    "Red - Replace this image male.svg",
    "Replace this image female (blue).svg",
    "Replace this image female.svg",
    "Replace this image male (blue).svg",
    "Replace this image male.svg",
    "Silver - Replace this image female.svg",
    "Silver - Replace this image male.svg",
}

function i.IsPlaceholder(image)
    -- change underscores to spaces
    image = mw.ustring.gsub(image, "_", " ");
    assert(image ~= nil, 'mw.ustring.gsub(image, "_", " ") ne redonu nenion')
    -- if image starts with [[ then remove that and anything after |
    if mw.ustring.sub(image,1,2) == "[[" then
        image = mw.ustring.sub(image,3);
        image = mw.ustring.gsub(image, "([^|]*)|.*", "%1");
        assert(image ~= nil, 'mw.ustring.gsub(image, "([^|]*)|.*", "%1") ne redonu nenion')
    end
    -- Trim spaces
    image = mw.ustring.gsub(image, '^[ ]*(.-)[ ]*$', '%1');
    assert(image ~= nil, "mw.ustring.gsub(image, '^[ ]*(.-)[ ]*$', '%1') ne redonu nenion")
    -- remove prefix if exists
    local allNames = mw.site.namespaces[6].aliases
    allNames[#allNames + 1] = mw.site.namespaces[6].name
    allNames[#allNames + 1] = mw.site.namespaces[6].canonicalName
    for i, name in ipairs(allNames) do
        if mw.ustring.lower(mw.ustring.sub(image, 1, mw.ustring.len(name) + 1)) == mw.ustring.lower(name .. ":") then
            image = mw.ustring.sub(image, mw.ustring.len(name) + 2);
            break
        end
    end
    -- Trim spaces
    image = mw.ustring.gsub(image, '^[ ]*(.-)[ ]*$', '%1');
    -- capitalise first letter
    image = mw.ustring.upper(mw.ustring.sub(image,1,1)) .. mw.ustring.sub(image,2);

    for i,j in pairs(placeholder_image) do
        if image == j then
            return true
        end
    end
    return false
end

function i.ValidateEnding (f)
    -- analyzes the valid endings for images in the Wikipedia. 
    -- according to http://commons.wikimedia.org/wiki/Commons:File_types, 
    -- but not tiff, because browser can have some problems with this format 
    -- xcf works only in MediaWiki
    if f == "gif" or f == "jpg" or f == "jpeg" or f == "png" or f == "svg" then 
        return true
    else return false
    end    
end    

function i.AddEnding (image, ending, endingdefault)
        -- analyzes, if an ending already exists in the image
        local f = image:gsub("^(.*)%.","") 
        f = mw.ustring.lower(f)  -- it changes letters into lower case letters
        if i.ValidateEnding(f) == true then 
            return image  -- if yes, it returns the image name without change
        end
        -- add an ending to the image name
        if ending ~="" and ending ~=nil then
            if i.ValidateEnding(ending) == true then 
                image = image .. "." .. ending
            end    
        elseif endingdefault ~="" and endingdefault ~=nil then
            if i.ValidateEnding(endingdefault) == true then 
                image = image .. "." .. endingdefault
            end    
        end  
        return image
end

function i.GetCaption (image, flag)
		local i = image
		local c = ""		
		local f = flag
		local param = {}
		
		-- extracts the image
        i = mw.ustring.sub(i,3); -- removes [[
        i = mw.ustring.gsub(i, "([^|]*)|.*", "%1");
        local lenimage = mw.ustring.len (image)
        local leni = mw.ustring.len (i)
        if leni + 2 == lenimage then
        	-- [[File:Example.jpg]]caption, [[File:Example.jpg]]<br />caption
        	-- or [[File:Example.jpg]]
        	local ending = mw.ustring.find(mw.ustring.lower(image), ".jpg")
        	or mw.ustring.find(mw.ustring.lower(image),".gif")
        	or mw.ustring.find(mw.ustring.lower(image),".png")        	
        	or mw.ustring.find(mw.ustring.lower(image),".svg")         	
        	if ending then
        		local i1 = mw.ustring.sub(image,1,ending+3) .. "|center|frameless]]"
        		if f == "yes" then
        			c = mw.ustring.sub(image,ending+6) 
        		end
        		image = i1 
        	else
        	local ending = mw.ustring.find(mw.ustring.lower(image), ".jpeg")        		
        		if ending then
        			local i1 = mw.ustring.sub(image,1,ending+4) .. "|center|frameless]]"
        			if f == "yes" then
        				c = mw.ustring.sub(image,ending+7)  
        			end
        			image = i1        		
        		end	
    		end	
    	
			-- if the caption has an br, remove it
			local br, caption = mw.ustring.find(c,"(%s*%<%s*[Bb][Rr]%s*/?%s*%>)%s*(%S?)")
			if (br~=nil) and (caption~=nil) then
				local c1 = caption 
				local c2 = br + 1
				c = mw.ustring.sub( c, c1 )
				c = "<div>" .. c .. "</div>"
			end	    	
    	
        	return c, image -- the image hasn't parameters
        end	
        local lenparam = lenimage - (leni+2)
        -- extracts the parameters in the wiki code and the text after the ]]
        c = mw.text.truncate(image, -lenparam, "")
        local lenc = mw.ustring.len(c)
        local endbracket = mw.ustring.find (c,"%]%]", lenc-1)
        if (endbracket == lenc -1) then
        	-- [[File:Example.jpg|thumb|frameless]] or something similar
        	-- removes brackets ]]
        	c = mw.ustring.sub(c, 1, endbracket-1)
        	-- changes [[link|text]] into [[link{{!}}text]], if it exists
			c = mw.ustring.gsub(c, "%[%[(.-)|(.-)%]%]", "[[%1{{!}}%2]]")
			-- splits the parameters
			local strings = mw.text.split(c, "|", plain) 

			local output = {}
			local isframeless = false
			local iscenter = false
			local n = 0 -- number of parameters, that have to remain 
			for k,v in pairs(strings) do
				-- local parameter = i.ImageParam(v) -- doesn't work. why? :-(
				-- analyses if the parameter is "thumb" or an alias and removes it
				-- it has to be changed, so the variations could be found automatically
				if ((v =="thumb") and (v~="thumbtime")) or (v =="thumbnail") or (v=="eta") 
				or (v== "framed") or (v== "frame") 
				or mw.ustring.find(v,"thumb%]%]") or mw.ustring.find(v, "thumbnail%]%]") 
				or mw.ustring.find(v, "eta%]%]") or mw.ustring.find(v, "framed%]%]") or 
				mw.ustring.find (v, "frame%]%]") then
					output[k] = ""
				-- analyses if the parameter is "frameless"	and set a flag for this
				elseif (v == "frameless") then
					-- analyses if it is the last parameter
					if (k ~=size) then
						v = v .. "|"
					end				
					output[k] = v 
					isframeless = true
					n = n + 1
				--elseif (v == "frameless]]") then
				elseif mw.ustring.find(v, "frameless%]%]") then
					v = "frameless|"
					output[k] = v 
					isframeless = true
					n = n + 1					
				-- analyses if the parameter is "center" and set a flag for this
				elseif (v == "center") then
					-- analyses if it is the last parameter
					if (k ~=size) then
						v = v .. "|"
					end				
					output[k] = v 
					iscenter = true
					n = n + 1	
				--elseif (v == "center]]") then
				elseif mw.ustring.find (v, "center%]%]") then
					v = "center|" 
					output[k] = v 
					iscenter = true
					n = n + 1					
				-- analyses if the parameter is an other part of the wiki image syntax	
				--elseif parameter then
				-- it has to be changed, so the variations could be found automatically
				elseif (v== "border") or (v=="bottom") or (v== "left") or (v=="middle") 
				or (v=="none") or (v== "right") or (v== "sub") or (v=="super") 
				or (v== "thumbtime") or (v== "top") or (v== "upright") then
					-- analyses if it is the last parameter			
					if (k ~=size) then
						v = v .. "|"
					end				
					output[k] = v 
					n = n + 1
				-- analyses the parameters with values
				elseif mw.ustring.find(v,"alt=") or mw.ustring.find(v, "lang=") 
				or mw.ustring.find(v, "link=") or mw.ustring.find (v, "px") 
				or mw.ustring.find(v, "upright=") then
					-- analyses if it is the last parameter			
					if (k ~=size) then
						v = v .. "|"
					end				
					output[k] = v 
					n = n + 1			
				-- analyses if it is the image	
				-- it has to be changed, so the variations could be found automatically
				elseif mw.ustring.find(v, "Dosiero:") or mw.ustring.find(v, "File:") then
					output[k] = ""
				else	
					-- analyses if it is the last parameter			
					if (k ~=size) then
						v = v .. "|"
					end					
					output[k] = v 
					n = n  + 1
					-- undoes the tricky substitution
					v = mw.ustring.gsub(v, "%[%[(.-){{!}}(.-)%]%]", "[[%1|%2]]")
					c = "<div>" .. v .. "</div>"
				end
			end
	
			local r = ""
			-- it has to be added to i, because in some cases these parameters would be
			-- added to the caption
			if (iscenter == false) then
				i = i .. "|center"
			end				
			if (isframeless == false) then
				i = i .. "|frameless"
			end				

			if n > 0 then -- if image parameters were found above, add them to the image code
				r = "[[" .. i .. "|" .. table.concat(output)
			else
				r = "[[" .. i 
			end
			r = r .. "]]"
			-- sytax correction
			r = mw.ustring.gsub(r, "||", "|")
			r = mw.ustring.gsub(r, "|%]%]", "]]")
		
			-- analyses it "f" has the value "yes". if not, change the caption into empty string
			if (f ~= "yes") then 
				c = ""
			else
				-- removes | at the end
				c = mw.ustring.gsub(c,"|%</div%>","</div>")
			end
		
			return c, r -- caption, image syntax with parameters		
			
        end	-- end of [[File:Example.jpg|thumb|frameless]] or something similar
        
		-- analyses the parameters 
		local thumb = mw.ustring.find(c, "|%s*thumb%s*[|%]]")  
		if thumb then
			c1 = mw.ustring.sub(c,1, thumb-1)
			c2 = mw.ustring.sub(c,thumb+6)
			c = c1 .. c2 .. '<span style="display:none;">' .. thumb .. "</span>"
		else
		local thumb = mw.ustring.find(c, "|%s*thumbnail%s*[|%]]") 		
			if thumb then
				c1 = mw.ustring.sub(c,1, thumb-1)
				c2 = mw.ustring.sub(c,thumb+10)
				c = c1 .. c2 .. '<span style="display:none;">' .. thumb .. "</span>"
			else
			local thumb = mw.ustring.find(c, "|%s*eta%s*[|%]]")			
				if thumb then
					c1 = mw.ustring.sub(c,1, thumb-1)
					c2 = mw.ustring.sub(c,thumb+4)
					c = c1 .. c2 .. '<span style="display:none;">' .. thumb .. "</span>"
				end
			end	
		end	
		local frameless = mw.ustring.find (c,"|%s*frameless%s*[|%]]")
		-- it has to be added to i, because in some cases the |frameless parameter would be added
		-- to the caption, but not to the parameters
		if (frameless == nil) then
			i = i .. "|frameless"
		else
			c1 = mw.ustring.sub(c,1,frameless-1)
			c2 = mw.ustring.sub(c,frameless+10)
			c = c1 .. c2
			i = i .. "|frameless"
		end	
		local size, size2 = mw.ustring.find (c, "|%s*%d*px%s*[|%]]")
		if size then
			s = mw.ustring.sub(c,size+1,size2)
			s = mw.ustring.gsub(s, "(.*)|", "%1")  -- remove |, if it exists
			c1 = mw.ustring.sub(c,1,size-1)
			local len = size2 - size --+1
			c2 = mw.ustring.sub(c,size+len)
			c = c1 .. c2
			i = i .. "|" .. s
		end
		local center = mw.ustring.find (c, "|%s*center%s*[|%]]")
		if center then
			c1 = mw.ustring.sub(c,1,center-1)
			c2 = mw.ustring.sub(c,center+7)
			c = c1 .. c2
			i = i .. "|center"
		end	
		
		-- if the caption has an br, remove it
			local br, caption = mw.ustring.find(c,"(%s*%<%s*[Bb][Rr]%s*/?%s*%>)%s*(%S?)")
			if (br~=nil) and (caption~=nil) then
				local c1 = caption 
				local c2 = br + 1
				c = mw.ustring.sub( c, c1 )
				if (f == "yes") then
					c = "]]<div>" .. c .. "</div>"
				else 
					c = "]]"
				end
			end			
		
 		-- tests
 		i = "[[" .. i

		return c, i -- caption, image
end	-- GetCaption


function i.InfoboxImage(frame)
    local image = frame.args["image"];
    local usecaption = frame.args["usecaption"];
    
    if image == "" or image == nil then
        return "";
    end
    if image == "&nbsp;" then
        return image;
    end    
    if frame.args["suppressplaceholder"] ~= "no" then
        if i.IsPlaceholder(image) == true then
            return "";
        end
    end

    if mw.ustring.lower(mw.ustring.sub(image,1,5)) == "http:" then
        return "";
    end
    if mw.ustring.lower(mw.ustring.sub(image,1,6)) == "[http:" then
        return "";
    end
    if mw.ustring.lower(mw.ustring.sub(image,1,7)) == "[[http:" then
        return "";
    end
    if mw.ustring.lower(mw.ustring.sub(image,1,6)) == "https:" then
        return "";
    end
    if mw.ustring.lower(mw.ustring.sub(image,1,7)) == "[https:" then
        return "";
    end
    if mw.ustring.lower(mw.ustring.sub(image,1,8)) == "[[https:" then
        return "";
    end
    if mw.ustring.sub(image,1,2) == "[[" then
    -- search for thumbnail images and add to tracking cat if found
        if mw.title.getCurrentTitle().namespace == 0 and (mw.ustring.find(image, "|%s*thumb%s*[|%]]") or mw.ustring.find(image, "|%s*thumbnail%s*[|%]]") or mw.ustring.find(image, "|%s*eta%s*[|%]]")) then
        		local caption, image = i.GetCaption (image, usecaption)
        		return image .. caption .. "[[Kategorio:Paĝoj uzantaj informkestojn kun etaj bildoj]]";
        else
        		local caption, image = i.GetCaption (image, usecaption)
        		return image .. caption 
        end
    elseif mw.ustring.sub(image,1,2) == "{{" and mw.ustring.sub(image,1,3) ~= "{{{" then
        return image;
    elseif mw.ustring.sub(image,1,1) == "<" then
        return image;
    elseif mw.ustring.sub(image,1,5) == mw.ustring.char(127).."UNIQ" then
        -- Found strip marker at begining, so pass don't process at all
        return image;        
    else
        local result = "";
        local ending = frame.args["ending"];
        local endingdefault = frame.args["endingdefault"];        
        local size = frame.args["size"];
        local maxsize = frame.args["maxsize"];        
        local sizedefault = frame.args["sizedefault"];
        local alt = frame.args["alt"];
        local link = frame.args["link"];
        local title = frame.args["title"];
        local border = frame.args["border"];
        local upright = frame.args["upright"] or "";
        local thumbtime = frame.args["thumbtime"] or "";
        local center = frame.args["center"]
        
        -- remove prefix if exists
        local allNames = mw.site.namespaces[6].aliases
        allNames[#allNames + 1] = mw.site.namespaces[6].name
        allNames[#allNames + 1] = mw.site.namespaces[6].canonicalName
        for i, name in ipairs(allNames) do
            if mw.ustring.lower(mw.ustring.sub(image, 1, mw.ustring.len(name) + 1)) == mw.ustring.lower(name .. ":") then
                image = mw.ustring.sub(image, mw.ustring.len(name) + 2);
                break
            end
        end     

        if maxsize ~= "" and maxsize ~= nil then
            -- if no sizedefault then set to maxsize
            if sizedefault == "" or sizedefault == nil then
                sizedefault = maxsize
            end
            -- check to see if size bigger than maxsize
            if size ~= "" and size ~= nil then
                local sizenumber = tonumber(mw.ustring.match(size,"%d*")) or 0;
                local maxsizenumber = tonumber(mw.ustring.match(maxsize,"%d*")) or 0;
                if sizenumber>maxsizenumber and maxsizenumber>0 then
                    size = maxsize;
                end
            end
        end
        -- add px to size if just a number
        if (tonumber(size) or 0) > 0 then
            size = size .. "px";
        end
        image = i.AddEnding (image,ending,endingdefault)
        
        result = "[[File:" .. image;
        if size ~= "" and size ~= nil then
            result = result .. "|" .. size;
        elseif sizedefault ~= "" and sizedefault ~= nil then
            result = result .. "|" .. sizedefault;
        else
            result = result .. "|frameless";
        end
        if center == "yes" then
            result = result .. "|center"
        end
        if alt ~= "" and alt ~= nil then
            result = result .. "|alt=" .. alt;
        end
        if link ~= "" and link ~= nil then
        	result = result .. "|link=" .. link;
        end	
        if border == "yes" then
            result = result .. "|border";
        end
        if upright ~= "" then
            result = result .. "|upright=" .. upright;
        end    
        if thumbtime ~= "" then
        	result = result .. "|thumbtime=" .. thumbtime;
        end	
        if title ~= "" and title ~= nil then
            result = result .. "|" .. title;
        elseif alt ~= "" and alt ~= nil then
            result = result .. "|" .. alt;
        end          
        result = result .. "]]";
        
        return result;
    end
end

return i;