Difference between revisions of "Module:Flags"

From blackwiki
Jump to navigation Jump to search
blackwiki>QuimGil
(Introducing customizable link)
blackwiki>QuimGil
(Taking changes from Moroboshi at Module:Flags/Sandbox)
Line 1: Line 1:
 
local p = {}
 
local p = {}
 
-- Converts "Flag of" in a variable in order to accept images that don't follow this name schema
 
flagOf = "Flag_of_"
 
  
 
-- Loading the flag translations module --
 
-- Loading the flag translations module --
Line 8: Line 5:
 
local master = mw.loadData("Module:Flags/MasterData")
 
local master = mw.loadData("Module:Flags/MasterData")
  
-- Assigning the parameter to a flag and a link
+
-- check if name is an original name in translation.fullname and
function p.flag(territory)
+
-- return its value, otherwise return nil
+
function check_translation(name)
-- Searching in the master table only.
+
    local link
-- 2 letter code search
+
    for translation, commonsName in pairs(translations.fullName) do
    if #territory.args[1] == 2 then
+
        if commonsName == name then
        for flagParameter,commonsFile in pairs(master.twoLetter) do
+
            link = translation
            if flagParameter == territory.args[1]  then
+
             break --if found break out from the loop
                commonsName = commonsFile
 
                tempLink = commonsFile
 
            end
 
        end
 
        for flagParameter,commonsFile in pairs(translations.fullName) do
 
            if commonsFile == tempLink then
 
                link = flagParameter
 
             end
 
        end
 
        if link == nil then link = commonsName
 
 
         end
 
         end
 
     end
 
     end
 +
    return link
 +
end
  
-- 3 letter code search
+
-- Size of flag --
    if #territory.args[1] == 3 then
+
-- Function to define the default size for the flag if needed
        for flagParameter,commonsFile in pairs(master.threeLetter) do
+
function defaultSize()
            if flagParameter == territory.args[1]  then
+
    --todo: move exception to Module:Flags/MasterData
                commonsName = commonsFile
+
    local sizeExceptions = { "Nepal", "Switzerland", "the Vatican City", }
                tempLink = commonsFile
+
    local size = "20x22px" --initialize with default value
            end
+
    for some,exceptions in pairs(sizeExceptions) do
        end
+
        if commonsName == exceptions then
        for flagParameter,commonsFile in pairs(translations.fullName) do
+
            size = "20x17px"
            if commonsFile == tempLink then
+
             break --if found break out from loop
                link = flagParameter
 
             end
 
        end
 
        if link == nil then link = commonsName
 
 
         end
 
         end
 
     end
 
     end
 +
    return size
 +
end
  
-- Searching in FlagTranslations, then in FlagMaster
+
-- Assigning the parameter to a flag and a link
-- Full name search
+
function p.flag(territory)
 +
  --always declare local variable, they are more efficient and dont pollute global namespace
 +
  local  commonsName
 +
  local flagOf = "Flag_of_" -- Converts "Flag of" in a variable in order to accept images that don't follow this name schema
 +
  local link = ""
 +
  -- more efficient to access
 +
  local flag_code = territory.args[1] or ""
 +
-- Searching in the master table only.
 +
-- 2 letter code search
 +
    if #flag_code == 2 then
 +
        -- try to assign a value to commonsName and check for nil value
 +
        commonsName = master.twoLetter[flag_code]
 +
        --if check_translation return nil then it will execute the or part and assign commonsName to link
 +
        if commonsName then link = check_translation(commonsName) or commonsName; end
 +
    elseif #flag_code == 3 then -- 3 letter code search
 +
        commonsName = master.threeLetter[flag_code]
 +
        if commonsName then link = check_translation(commonsName) or commonsName; end
 +
    end
 +
--  check if commonsName is still nil
 
     if commonsName == nil then
 
     if commonsName == nil then
         flagTables = { translations.fullName, master.fullName, }
+
         -- check master.fullName table
         for k,v in ipairs(flagTables) do
+
        commonsName = master.fullName[flag_code]
            for flagParameter,commonsFile in pairs(v) do
+
         if commonsName then
                if flagParameter == territory.args[1] then
+
          link = check_translation(commonsName) or commonsName;
                    commonsName = commonsFile
+
        else -- Searching in FlagTranslations
                    link = flagParameter
+
            commonsName = translations.fullName[flag_code]
                elseif commonsFile == territory.args[1]  then
+
            if commonsName then
                    commonsName = commonsFile
+
                link = flag_code
                    link = flagParameter
+
            else -- Fallback to Commons when the parameter doesn't have an entry in the tables
                end
+
              commonsName = flag_code
 +
              link = flag_code
 
             end
 
             end
 
         end
 
         end
    end
 
 
-- Fallback to Commons when the parameter doesn't have an entry in the table.   
 
    if commonsName == nil then
 
        commonsName = territory.args[1]
 
        link = territory.args[1]
 
 
     end
 
     end
  
 
-- Variant check for historical flags --
 
-- Variant check for historical flags --
    if territory.args[3] ~= "" then  
+
  local variant =  territory.args[3]
        variant = territory.args[3]
+
  if variant and variant ~= "" then
        commonsName = master.variant[commonsName .. "|" .. variant]  
+
      commonsName = master.variant[commonsName .. "|" .. variant]
        flagOf=""
+
      flagOf=""
    end
+
  end
  
 
-- Label check --
 
-- Label check --
    if territory.args[2] ~= "{{{2}}}" then
+
  variant = territory.args[2]
        variant = territory.args[2]
+
  if variant and variant ~="{{{2}}}" then
        commonsName = master.variant[commonsName .. "|" .. variant]
+
      commonsName = master.variant[commonsName .. "|" .. variant]
        flagOf = ""
+
      flagOf=""
     end
+
     end
  
 
-- Digesting Commons flag files not following the format "Flag of "
 
-- Digesting Commons flag files not following the format "Flag of "
Line 88: Line 88:
 
     if commonsName ~= nil and string.find( commonsName, "File:", 1 ) == 1 then
 
     if commonsName ~= nil and string.find( commonsName, "File:", 1 ) == 1 then
 
         commonsName = string.sub( commonsName, 6)
 
         commonsName = string.sub( commonsName, 6)
         flagOf = ""
+
         flagOf=""
 
     end
 
     end
  
 
-- Fallback for non-identified variant/label flags --
 
-- Fallback for non-identified variant/label flags --
     if commonsName == nil then
+
     if commonsName == nil then commonsName = "Flag of None" end
        commonsName = "Flag of None"
 
    end
 
  
 
-- Border for everybody except Nepal and Ohio
 
-- Border for everybody except Nepal and Ohio
     if commonsName == "Nepal" or commonsName == "Ohio" then  
+
-- todo: move exception to Module:Flags/MasterData
         border = ""
+
    local border = "border|"
    else
+
     if commonsName == "Nepal" or commonsName == "Ohio" then
        border = "border|"  
+
         border = ""
 
     end
 
     end
  
 +
-- Checking whether a size parameter has been introduced, otherwise set default
 +
    if territory.args[4]:find("px", -2) ~= nil then
 +
        size = territory.args[4]
 +
    else
 +
        size = defaultSize(commonsName)
 +
    end
  
-- Size of flag --
 
-- Function to define the default size for the flag if needed
 
    function defaultSize()
 
        sizeExceptions = { "Nepal", "Switzerland", "the Vatican City", }
 
        for some,exceptions in pairs(sizeExceptions) do
 
            if commonsName == exceptions then
 
                size = "20x17px"
 
            end
 
        end
 
        if size == nil then
 
            size = "20x22px"
 
        end
 
        return size
 
    end
 
-- Checking whether a size parameter has been introduced, otherwise set default   
 
    if territory.args[4]:find("px", -2) ~= nil then
 
        size = territory.args[4]
 
    else
 
        size = defaultSize(commonsName)
 
    end
 
   
 
 
-- Customizing the link
 
-- Customizing the link
 
     openBrackets = "[["
 
     openBrackets = "[["
Line 139: Line 122:
 
         textLink = link .. "|"
 
         textLink = link .. "|"
 
     end
 
     end
       
+
 
 
-- Text in addition to flag
 
-- Text in addition to flag
 
     if territory.args[6] == "" then
 
     if territory.args[6] == "" then
 
         text = " " .. openBrackets .. link .. closeBrackets
 
         text = " " .. openBrackets .. link .. closeBrackets
     elseif territory.args[6] ~= "{{{text}}}" then  
+
     elseif territory.args[6] ~= "{{{text}}}" then
 
         text = " " .. openBrackets .. textLink .. territory.args[6] .. closeBrackets
 
         text = " " .. openBrackets .. textLink .. territory.args[6] .. closeBrackets
 
     else text = ""
 
     else text = ""

Revision as of 03:50, 22 August 2013

All the logics of Template:Flags are handled here. This module works together with Module:Flags/MasterData and Module:Flags/LocaleData, where the flags data is maintained.

Features

Functionality implemented:

  • Full name in English or the locale language: "Andorra". 23px
  • 2 letter code - link points to full name: "AD" 23px
  • 3 letter code - link points to full name: "AND" 23px
  • Nepal and Ohio flags are shown without border. 23px 23px
  • When a name is not found in the list, attempts to offer a Commons image and a link e.g. "Berlin" or "WHO". 23px 23px
  • Size as in "size=44px" or "size=40x44px" can be defined in any position. 44px 26x44px
  • Nepal, Switzerland and Vatican City have a default size of 20x17px (for the rest it's 20x22px): 23px 23px 23px
  • Variants for historical flags "1901" 23px or "variant=1901" (for compatibility reasons) 23px
  • Variants for labeled flags: "naval", "air force" and any other specified at FlagTranslations: "civil" 23px - "naval-RMAS" 23px
  • Variant / label flags not found in FlagTranslations return the Flag of None but still point to the right article: "whatever" 23px - "quatsch" 23px
  • Redirects (different names pointing to a same flag) are supported: "GB" 23px - "UK" 23px
  • Full Commons filenames can be defined in tables when they don't follow the "Flag of " syntax: "File:Flag Belgium brussels" 23px
  • Localization: "Illes Balears" 23px - "中華人民共和國" 23px
  • Localization + variants: "Afganistan" + "1901" 23px - "Regne Unit" + "civil" 23px
  • Flags listed only in FlagTranslations always link to the local language article: parameter "Native Peoples of Colombia" 23px links to "Pueblos Indígenas de Colombia"

Roadmap

  • Performance testing.
  • Extensive testing with copies of real pages, also for non-Latin scripts and Right-to-left languages.
  • Cover the rest of functionality offered by other flag templates.
  • Allow editors to define the year of the event, leaving to the template the task of finding the right flag.

local p = {}

-- Loading the flag translations module --
local translations = mw.loadData("Module:Flags/LocaleData")
local master = mw.loadData("Module:Flags/MasterData")

-- check if name is an original name in translation.fullname and
-- return its value, otherwise return nil
function check_translation(name)
    local link
    for translation, commonsName in pairs(translations.fullName) do
        if commonsName == name then
            link = translation
            break --if found break out from the loop
        end
    end
    return link
end

-- Size of flag --
-- Function to define the default size for the flag if needed
function defaultSize()
    --todo: move exception to Module:Flags/MasterData
    local sizeExceptions = { "Nepal", "Switzerland", "the Vatican City", }
    local size = "20x22px" --initialize with default value
    for some,exceptions in pairs(sizeExceptions) do
        if commonsName == exceptions then
            size = "20x17px"
            break --if found break out from loop
        end
    end
    return size
end

-- Assigning the parameter to a flag and a link
function p.flag(territory)
   --always declare local variable, they are more efficient and dont pollute global namespace
   local  commonsName
   local flagOf = "Flag_of_" -- Converts "Flag of" in a variable in order to accept images that don't follow this name schema
   local link = ""
   -- more efficient to access
   local flag_code = territory.args[1] or ""
-- Searching in the master table only.
-- 2 letter code search
    if #flag_code == 2 then
        -- try to assign a value to commonsName and check for nil value
        commonsName = master.twoLetter[flag_code]
        --if check_translation return nil then it will execute the or part and assign commonsName to link
        if commonsName then link = check_translation(commonsName) or commonsName; end
    elseif #flag_code == 3 then -- 3 letter code search
        commonsName = master.threeLetter[flag_code]
        if commonsName then link = check_translation(commonsName) or commonsName; end
    end
--  check if commonsName is still nil
    if commonsName == nil then
        -- check master.fullName table
        commonsName = master.fullName[flag_code]
        if commonsName then
           link = check_translation(commonsName) or commonsName;
        else -- Searching in FlagTranslations
            commonsName = translations.fullName[flag_code]
            if commonsName then
                link = flag_code
            else -- Fallback to Commons when the parameter doesn't have an entry in the tables
               commonsName = flag_code
               link = flag_code
            end
        end
    end

-- Variant check for historical flags --
   local variant =  territory.args[3]
   if variant and variant ~= "" then
      commonsName = master.variant[commonsName .. "|" .. variant]
      flagOf=""
   end

-- Label check --
   variant = territory.args[2]
   if variant and variant ~="{{{2}}}" then
      commonsName = master.variant[commonsName .. "|" .. variant]
      flagOf=""
    end

-- Digesting Commons flag files not following the format "Flag of "
-- These filenamess must be preceded by "File:" in the table values.

    if commonsName ~= nil and string.find( commonsName, "File:", 1 ) == 1 then
        commonsName = string.sub( commonsName, 6)
        flagOf=""
    end

-- Fallback for non-identified variant/label flags --
    if commonsName == nil then commonsName = "Flag of None" end

-- Border for everybody except Nepal and Ohio
-- todo: move exception to Module:Flags/MasterData
    local border = "border|"
    if commonsName == "Nepal" or commonsName == "Ohio" then
        border = ""
    end

-- Checking whether a size parameter has been introduced, otherwise set default
    if territory.args[4]:find("px", -2) ~= nil then
        size = territory.args[4]
    else
        size = defaultSize(commonsName)
    end

-- Customizing the link
    openBrackets = "[["
    closeBrackets = "]]"
    if territory.args[5] == "" then
        flagLink = ""
        textLink = ""
        openBrackets = ""
        closeBrackets = ""
    elseif territory.args[5] ~= "{{{link}}}" then
        flagLink = territory.args[5]
        textLink = territory.args[5] .. "|"
    else flagLink = link
        textLink = link .. "|"
    end

-- Text in addition to flag
    if territory.args[6] == "" then
        text = " " .. openBrackets .. link .. closeBrackets
    elseif territory.args[6] ~= "{{{text}}}" then
        text = " " .. openBrackets .. textLink .. territory.args[6] .. closeBrackets
    else text = ""
    end

return '[[File:' .. flagOf .. commonsName .. '.svg|' .. border .. 'link=' .. flagLink .. '|'.. size .. ']]' .. text
end
return p