Module:Sandbox/Matroc/Listing

local p = {}

-- This is a LEARNING test of the listing template found in Wikivoyage -- Converted this from ParserFunction/template coding to a LUA MODULE - A HEADACHE INDEED! -- Template listing can stand alone or be called from other (see, do, buy, eat, drink, sleep) templates -- The other calling templates do not seem to need to be changed -- The field order is apparently the same for all - Parameters are named parameters with exception of {{{1|}} -- Built this using functions to give a little more flexibility to be able to handle changes in design, order etc.

function p.listing ( frame ) local text = "" local type = frame.args[1] or "listing" -- listing will be the DEFAULT local name = frame.args[2] or "" local alt = frame.args[3] or "" local url = frame.args[4] or "" local email = frame.args[5] or "" local address = frame.args[6] or "" local lat = frame.args[7] or "" local long = frame.args[8] or "" local directions = frame.args[9] or "" local phone = frame.args[10] or "" local tollfree = frame.args[11] or "" local fax = frame.args[12] or "" local hours = frame.args[13] or "" local price = frame.args[14] or "" local checkin = frame.args[15] or "" local checkout = frame.args[16] or "" local content = frame.args[17] or "" local one = frame.args[18] or "" local islatin = "" local latcheck = "" local longcheck = ""

--                                               ***  MINOR GENERAL ERROR CHECKING AND FIXES *** --                  NAME - check to see if REQUIRED name if name == "" then error("'NAME is a required field!'") end -- END IF --                  URL .. if does not begin with "http" or "https" then add "http://" to url ...  NOT KNOWN if others are to be used such as image, file etc.

if url ~= "" then if mw.ustring.find(url,"^http://") == nil and mw.ustring.find(url,"^https://") == nil then url = "http://" .. url                                -- add default of "http://        end   end -- END IF --                   LAT and LONG FIX attempt at some format check - (lat and long should have the same number of decimal places) -- lat and long are not required - one can exist without the other; the following is a pad for the lat and long -- based upon the notion that the numbers are nnn.nnnn this may be an incorrect assumption and limited - comment out if incorrect

if lat ~= "" and long ~= "" then if mw.ustring.find(lat,"%.") ~= nil and mw.ustring.find(long,"%.") ~= nil then latcheck = mw.ustring.gsub(lat,"^(.*)%.","") longcheck = mw.ustring.gsub(long,"^(.*)%.","") if #latcheck > #longcheck then long = long .. mw.ustring.rep("0", #latcheck - #longcheck) elseif #longcheck > #latcheck then lat = lat .. mw.ustring.rep("0", #longcheck - #latcheck) end end end -- END IF --                  NOTE - THIS IS A FIX -- Odd issue with way the last numbered parameter coded in certain templates if one ~= "" then one = mw.ustring.gsub(one,"\n","") end -- END IF --           END MINOR ERROR Checks

--                        *** PROCESS THE GIVEN DATA INFORMATION BASED ON TYPE AT MOMENT (listing,see,do,buy,eat,drink and sleep) *** --                          *** HERE YOU CAN ADD OR CHANGE THINGS AROUND BASED UPON "TYPE" ***

if type == "listing" or type == "see" or type == "do" or type == "buy" or type == "eat" or type == "drink" or type == "sleep" then text = proc_urlname(url,name,text) text = proc_alt(alt,islatincheck,text) text = proc_address(address,name,url,text) text = proc_directions(directions,text) text = proc_phone(phone,name,url,address,directions,text) text = proc_tollfree(tollfree,name,url,address,directions,phone,text) text = proc_fax(fax,name,url,address,directions,phone,tollfree,text) text = proc_email(email,name,url,address,directions,phone,tollfree,fax,text) text = proc_latlong(lat,long,text) text = proc_hours(hours,text) text = proc_checkinout(checkin,checkout,text) text = proc_content(content,one,text) text = proc_price(price,text) elseif type == "SAMPLE" then                   -- This ELSEIF IS JUST A SIMPLE EXAMPLE OF DIFFERENT OUTPUT text = proc_urlname(url,name,text) text = proc_alt(alt,islatincheck,text) text = proc_content(content,one,text) else error("types allowed are listing,see,do,buy,eat,drink or sleep... !") end

--                       **************************ENDING THE LISTING FUNCTION******************************* text = "" .. text .. " " return text

end --                       **************************END OF THE LISTING FUNCTION *******************************

--                       ****************************FUNCTIONS FOR PROCESSING********************************* --                          *** Here you can edit or add new functions based upon design / order ***

--                                       Name & URL function proc_urlname(url,name,text) if url ~= "" and name ~= "" then text = text .. "'''[" .. url .. "" .. name .. " ]'''"       elseif name ~= "" then text = text .. "'''" .. name .. " '''"        elseif url ~= "" then text = text .. "'''[" .. url .. "]'''"  end -- END IF   return text end --                                         Alt function proc_alt(alt,islatincheck,text) if alt ~= "" then islatincheck = isLatin(alt) if islatincheck == "yes" then text = text .. "&#32;(" .. alt .. " )" else text = text .. "&#32;(" .. alt .. " )" end end -- END IF  return text end --                                          Address function proc_address(address,name,url,text) if address ~= "" then if url ~= "" or name ~= "" then text = text .. ",&#160;" .. "" .. address .. " "        else text = text .. "" .. address .. " "        end end -- END IF  return text end --                                          Directions function proc_directions(directions,text) if directions ~= "" then text = text .. "&#32;(" .. directions .. " )" end -- END IF  return text end --                                           Phone function proc_phone(phone,name,url,address,directions,text) if phone ~= "" then if name ~= "" or url ~= "" or address ~= "" or directions ~= "" then text = text .. ",&#160;☎ " .. phone .. " "       else text = text .. "☎ " .. phone .. " "        end -- END IF   end -- END IF   return text end --                                           Tollfree function proc_tollfree(tollfree,name,url,address,directions,phone,text) if tollfree ~= "" then if name ~= "" or url ~= "" or address ~= "" or directions ~= "" or phone ~= "" then text = text .. ",&#160;toll-free: " .. tollfree .. " "       else text = text .. "toll-free: " .. tollfree .. " "     end -- END IF   end -- END IF   return text end --                                            Fax function proc_fax(fax,name,url,address,directions,phone,tollfree,text) if fax ~= "" then if name ~= "" or url ~= "" or address ~= "" or directions ~= "" or phone ~= "" or tollfree ~= "" then text = text .. ",&#160;fax : <span class=\"value listing-fax\">" .. fax .. " "         else text = text .. "<span class=\"tel\"><span class=\"type\"> : <span class=\"value listing-fax\">" .. fax .. " "      end -- END IF   end -- END IF   return text end --                                             E-mail function proc_email(email,name,url,address,directions,phone,tollfree,fax,text) if email ~= "" then if name ~= "" or url ~= "" or address ~= "" or directions ~= "" or phone ~= "" or tollfree ~= "" or fax ~= "" then text = text .. ",&#160;e-mail: <span class=\"email listing-email\">[mailto:" .. email .. " " .. email .. "] "         else text = text .. "e-mail: <span class=\"email listing-email\">[mailto:" .. email .. " " .. email .. "] "     end -- END IF   end -- END IF   return text end --                                             Lat/Long co-ordinates function proc_latlong(lat,long,text) if lat ~= "" or long ~= "" then text = text .. "<span class=\"noprint listing-coordinates\"> <abbr class=\"geo\" title=\"" .. lat .. ";" .. long .. "\"> " end -- END IF  return text end --          Hours function proc_hours(hours,text) if hours ~= "" then text = text .. "&#32;<span class=\"note listing-hours\">" .. hours .. " ." end -- END IF  return text end --                                              Checkin and checkout function proc_checkinout(checkin,checkout,text) if checkin ~= "" and checkout ~= "" then text = text .. "&#32;<span class=\"note\">Check-in: <span class=\"listing-checkin\">" .. checkin .. ", check-out: <span class=\"listing-checkout\">" .. checkout .. " ."       elseif checkin ~= "" then text = text .. "&#32;<span class=\"note\">Check-in: <span class=\"listing-checkin\">" .. checkin .. " ."       elseif checkout ~= "" then text = text .. "&#32;<span class=\"note\">Check-out: <span class=\"listing-checkout\">" .. checkout .. " ."  end -- END IF  return text end --                                              General listing content - alternative is  function proc_content(content,one,text) if content ~= "" then text = text .. "<span class=\"note listing-content\">" .. content .. " "      elseif one ~= "" then text = text .. "&#32;<span class=\"note listing-content\">" .. one .. " " end -- END IF  return text end --                                               Price function proc_price(price,text) if price ~= "" then text = text .. "&#32;<span class=\"note listing-price\">" .. price .. " " end -- END IF  return text end

--           Function to check for non-Latin/Latin characters function isLatin ( xyz )                         -- from  WOSlinker - Module:IsLatin - http://en.wikipedia.org/wiki/User:WOSlinker if xyz == '' then return ''; end len = mw.ustring.len(xyz); pos = 1; charval = "" while ( pos <= len ) do        charval = mw.ustring.codepoint(mw.ustring.sub(xyz, pos)) -- note 8364 is the € symbol if charval>687 and charval~=8364 then return "no"; end pos = pos + 1; end return "yes"; end

--                      **************************END OF MODULE RETURN RESULT******************************* return p