-- This test module has been cleaned up - most functions removed due to lack of interest -- or collaboration to create viable modules for wikivoyage use. -- Left a few functions as they are used on another article page. Module will remain and -- probably will be used for testing other functions... Matroc -- Note: may wish to change some code to do "if not " (boolean) ???? testing for nil local p = {} local function loadwikinames() local wikinames = {} wikinames[1] = "wikisource" wikinames[2] = "wikibooks" wikinames[3] = "wikinews" wikinames[4] = "wikiquote" wikinames[5] = "wikivoyage" wikinames[6] = "wiki" return wikinames end function p.date(frame) return os.date("%m%d%Y -- %I:%M:%S") end -- Load a page and scan it for listing templates and find duplicate parameters -- The next five functions though not used may be useful for someone else to use in the future -- in building circles for OpenStreetMaps -- see p.circle function below local function isINF(value) return value == math.huge or value == -math.huge end local function degrees2meterslat(lat) x = math.log(math.tan((90 + lat) * math.pi / 360)) / (math.pi / 180) x = x * 20037508.34 / 180 return x end local function degrees2meterslong(long) y = long * 20037508.34 / 180 --- longitude to meters return y end local function meters2degreeslat(y) lat = math.atan(math.exp(y * math.pi / 20037508.34)) * 90 / math.pi - 90 return lat end local function meters2degreeslong(y) long = y * 180 / 20037508.34 return long end -- Rough calculation of distance between 2 coordinates in miles and kilometres local function distance(lat1,long1,lat2,long2) -- in Progress lat1 = math.rad(lat1) lat2 = math.rad(lat2) long1 = math.rad(long1) long2 = math.rad(long2) local longd = long2 - long1 local latd = lat2 - lat1 local x = (math.sin(latd/2))^2 + math.cos(lat1) * math.cos(lat2) * (math.sin(longd/2))^2 local y = 2 * math.atan2( math.sqrt(x), math.sqrt(1-x) ) local distance1 = 3861 * y -- miles local distance2 = 6373 * y -- kilometers return "Approximate distance in '''miles''': " .. distance1 .. " Approximate distance in '''kilometers''': " .. distance2 end function p.distance(frame,lat1,long1,lat2,long2) -- in Progress local lat1 = frame.args['lat1'] lat1 = math.rad(lat1) local lat2 = frame.args['lat2'] lat2 = math.rad(lat2) local long1 = frame.args['long1'] long1 = math.rad(long1) local long2 = frame.args['long2'] long2 = math.rad(long2) local longd = long2 - long1 local latd = lat2 - lat1 local x = (math.sin(latd/2))^2 + math.cos(lat1) * math.cos(lat2) * (math.sin(longd/2))^2 local y = 2 * math.atan2( math.sqrt(x), math.sqrt(1-x) ) local distance1 = 3861 * y -- miles local distance2 = 6373 * y -- kilometers distance1 = string.format("%.6f",distance1) distance2 = string.format("%.6f",distance2) return "Approximate distance in '''miles''': " .. distance1 .. " Approximate distance in '''kilometers''': " .. distance2 end -- load a table for tblukup local function load_t1(t1,table2load) if pcall(function()t1 = mw.loadData(table2load) end) then return t1 else error ("Unable to load table!") end end -- FROM WIKIBASE -- Returns the most updated info from a series of statements - called by some of the other functions local function updated(item,prop,frame) if item~=nil then local claims = item.claims if claims~=nil and claims[prop]~=nil then for index,claim in pairs(claims[prop]) do local qual = claim.qualifiers if qual==nil or qual.P582==nil then -- p582 è la data di fine, significa che non è il valore attuale local val = claim.mainsnak.datavalue.value if val['numeric-id']~=nil then local id = 'Q'..val['numeric-id'] local sl = mw.wikibase.sitelink(id) local lb = mw.wikibase.label(id) if sl~=nil and sl~='' then return frame:preprocess('[['..sl..'|'..lb..']]') end return lb end return val end end end end return '' end function p.libya(frame) local linkTarget = mw.wikibase.sitelink("Q1016") local linkName = mw.wikibase.label("Q1016") return "LinkTarget: " .. linkTarget .. " LinkName: " .. linkName end -- GET LATITUDE -- P625 function p.latitude(frame) -- if frame.args[1]~=nil and frame.args[1]~='' then -- return frame.args[1] -- end local latitude = "" local arg1 = frame.args[1] local entity = mw.wikibase.getEntityObject(arg1) -- local entity = mw.wikibase.getEntityObject() if entity == nil then return latitude end local claims = entity.claims if claims == nil then return latitude end if claims.P625 ~= nil then latitude = entity.claims.P625[1].mainsnak.datavalue.value.latitude return latitude end return latitude end -- GET LONGITUDE -- P625 function p.longitude(frame) -- if frame.args[1]~=nil and frame.args[1]~='' then -- return frame.args[1] -- end local longitude = "" local arg1 = frame.args[1] local entity = mw.wikibase.getEntityObject(arg1) -- local entity = mw.wikibase.getEntityObject() if entity == nil then return longitude end local claims = entity.claims if claims == nil then return longitude end if claims.P625 ~= nil then longitude = entity.claims.P625[1].mainsnak.datavalue.value.longitude return longitude end return longitude end -- GET URL -- P856 function p.url(frame) -- if frame.args[1]~=nil and frame.args[1]~='' then -- return frame.args[1] -- end local url = "" local arg1 = frame.args[1] local entity = mw.wikibase.getEntityObject(arg1) if entity == nil then return url end local claims = entity.claims if claims == nil then return end if claims.P856 ~= nil then url = entity.claims.P856[1].mainsnak.datavalue.value url = string.gsub(url,"%,.*","") -- KEEP ONLY ONE return url end return url end -- make a completed mapframe template from data from Wikidata with zoom of 13 {{mapframe|||}} function p.makemapframe(frame) local output = "" local latitude = "" local longitude = "" local arg1 = frame.args[1] local entity = mw.wikibase.getEntityObject(arg1) if entity == nil then return end local claims = entity.claims if claims == nil then return end if claims.P625 == nil then return end -- pcall is actually used as a test mechanism - bit more complicated in use than regular tests if pcall(function () t = claims.P625 end) then if pcall(function () t = entity.claims.P625[1].mainsnak.datavalue.value.latitude end ) then latitude = entity.claims.P625[1].mainsnak.datavalue.value.latitude end if pcall(function () t = entity.claims.P625[1].mainsnak.datavalue.value.longitude end ) then longitude = entity.claims.P625[1].mainsnak.datavalue.value.longitude end if latitude ~= "" and latitude ~= nil and longitude ~= "" and longitude ~= nil then latitude = string.format("%.6f",latitude) -- format number to 6 decimal places ie. 10.00 becomes 10.000000 ie. 12.345 becomes 12.345000 ie. 1 becomes 1.000000 longitude = string.format("%.6f",longitude) -- format number to 6 decimal places see above latitude = string.gsub(latitude,"0+$","") -- strip any number of ending zeroes - 10.000000 becomes 10. 12.345000 becomes 12.345 1.000000 becomes 1. longitude = string.gsub(longitude,"0+$","") -- string any number of ending zeroes - see above latitude = string.gsub(latitude,"%.$","") -- strip and ending period - 10. becomes 10, 12.345 remains and 1. becomes 1 longitude = string.gsub(longitude,"%.$","") -- strip an ending period output = output .. "{{mapframe|" .. latitude .. "|" .. longitude .. "|zoom=8}}\n" end end if output ~=nil and output ~= "" then return output end end -- make a completed geo template from data from Wikidata {{geo||}} function p.makegeo(frame) local output = "" local latitude = "" local longitude = "" local arg1 = frame.args[1] local entity = mw.wikibase.getEntityObject(arg1) if entity == nil then return end local claims = entity.claims if claims == nil then return end if claims.P625 == nil then return end -- pcall is actually used as a test mechanism - bit more complicated in use than regular tests if pcall(function () t = claims.P625 end) then if pcall(function () t = entity.claims.P625[1].mainsnak.datavalue.value.latitude end ) then latitude = entity.claims.P625[1].mainsnak.datavalue.value.latitude end if pcall(function () t = entity.claims.P625[1].mainsnak.datavalue.value.longitude end ) then longitude = entity.claims.P625[1].mainsnak.datavalue.value.longitude end if latitude ~= "" and latitude ~= nil and longitude ~= "" and longitude ~= nil then -- latitude = string.format("%.4f",latitude) -- format number to 4 decimal places -- keeping now as 4 decimal places -- longitude = string.format("%.4f",longitude) -- format number to 4 decimal places latitude = string.format("%.6f",latitude) -- format number to 6 decimal places ie. 10.00 becomes 10.000000 ie. 12.345 becomes 12.345000 ie. 1 becomes 1.000000 longitude = string.format("%.6f",longitude) -- format number to 6 decimal places see above latitude = string.gsub(latitude,"0+$","") -- strip any number of ending zeroes - 10.000000 becomes 10. 12.345000 becomes 12.345 1.000000 becomes 1. longitude = string.gsub(longitude,"0+$","") -- string any number of ending zeroes - see above latitude = string.gsub(latitude,"%.$","") -- strip and ending period - 10. becomes 10, 12.345 remains and 1. becomes 1 longitude = string.gsub(longitude,"%.$","") -- strip an ending period -- if zoom parameter is desired this can be done fairly easily -- output = output .. "{{geo|" .. latitude .. "|" .. longitude .. "| zoom=13}}\n" output = output .. "{{geo|" .. latitude .. "|" .. longitude .. "}}\n" end end if output ~=nil and output ~= "" then output = string.gsub(output,'}}','|zoom=13}}') return output end end -- TBLUKUP - loads a table and does a lookup for table -- Table to load is required to be on a Module: page by itself function p.tblukup(frame) local table2load = frame.args[1] or "" local lookup = frame.args[2] or "" local bywhat = "key" --- lookup to be performed on the key - can add args[3] as key or str in future if table2load == "" or table2load == nil then return end table2load = "Module:" .. table2load -- table is to be found on a Module: page if lookup == "" or lookup == nil then return end local t1 = {} t1 = load_t1(t1,table2load) if bywhat == "key" then -- Shorter version possible rather than cycling through all if t1[lookup] then return t1[lookup] end -- for key,value in pairs(t1) do -- if key == lookup then -- return value -- end -- end end -- if bywhat == "str" then -- for key,value in pairs(t1) do -- if value == lookup then -- return key -- end -- end -- end return lookup end -- Purpose: Create a basic simple map template in an article based on Qnn for future editorial purposes -- What is produced is actual code for extension Kartographer - this is very verbose and probably not -- for the faint at heart -- programming is being done to translate listings directly in maps -- One general argument is this function is at cross purposes to normal see, buy listings etc. and probably not -- desired however it appears that just a little bit more can be accomplished in the image field -- than the image field in a listing. -- Whereas there is no place for other pieces of information as found in a see listing. -- arg1 would be the overall location of the Qnn passed to get the latitude and longitude for the overall marker -- arg2 would be multiple Qnnn,Qnnn - separated by a comma -- and build each feature from data garnered from Wikidata - (latitude, longitude, image etc.) -- error could possibly arise if the Qnnn in not in Wikidata -- arguments that can be passed as well have been added for this function are: -- zoom -- group -- show -- color -- symbol -- Possible issue to check - the name in Wikidata may not be name in wikivoyage -- may have to do a check there as well -- safesubst to be used so you can see what you get and once saved can be edited manually -- Is there room for both forms - I do not know. There should be at least some discussion about this.... function p.amapframe(frame) local arg1 = frame.args[1] or "" if string.match(arg1,"^[Qq]%d+$") == nil then return "" end -- arg1 should be in a specific format 'Qnnnn' testing local arg2 = frame.args['list'] or "" if arg2 ~= nil and arg2 ~= "" then arg2 = string.gsub(arg2,"%s","") end local group = frame.args['group'] or "city" local show = frame.args['show'] or "city" local zoom = frame.args['zoom'] or "4" local markercolor = frame.args['color'] or "#33a2ff" -- prep for color argument -- change the concatenation of text if markercolor == nil or markercolor == "" then markercolor = "#33a2ff" end local markersymbol = frame.args['symbol'] or "city" -- prep for symbol argument if markersymbol == nil or markersymbol == "" then markersymbol = "city" end local markercolor = '"marker-color": "' .. markercolor .. '"' local markersymbol = '"marker-symbol": "' .. markersymbol .. '",' -- use these items for concatenation below local latitude = "" local longitude = "" local separator = "," local output = "" local feature = "" local entity = mw.wikibase.getEntityObject(arg1) if entity == nil then return end local claims = entity.claims if claims == nil then return end if claims.P625 == nil then return end -- pcall is actually used as a test mechanism - bit more complicated in use than regular tests if pcall(function () t = claims.P625 end) then if pcall(function () t = entity.claims.P625[1].mainsnak.datavalue.value.latitude end ) then latitude = entity.claims.P625[1].mainsnak.datavalue.value.latitude end if pcall(function () t = entity.claims.P625[1].mainsnak.datavalue.value.longitude end ) then longitude = entity.claims.P625[1].mainsnak.datavalue.value.longitude end end if latitude ~= "" and latitude ~= nil and longitude ~= "" and longitude ~= nil then latitude = string.format("%.6f",latitude) -- format number to 6 decimal places ie. 10.00 becomes 10.000000 ie. 12.345 becomes 12.345000 ie. 1 becomes 1.000000 longitude = string.format("%.6f",longitude) -- format number to 6 decimal places see above latitude = string.gsub(latitude,"0+$","") -- strip any number of ending zeroes - 10.000000 becomes 10. 12.345000 becomes 12.345 1.000000 becomes 1. longitude = string.gsub(longitude,"0+$","") -- string any number of ending zeroes - see above latitude = string.gsub(latitude,"%.$","") -- strip and ending period - 10. becomes 10, 12.345 remains and 1. becomes 1 longitude = string.gsub(longitude,"%.$","") -- strip an ending period local part1 = '\n' -- not going to output div box -- local part1 = '\n<div style="border-style:solid; border-width:2px; width:412px; \ -- height:412px; padding:12px 12px 2px 2px; float:right;">\n' local part2 = '\n<mapframe latitude=' .. latitude .. ' longitude=' .. longitude .. ' zoom=' .. zoom .. ' width="400" height="400" group="' .. group .. '" show="' .. show .. '">\n' local part3 = '\n' .. '{' .. '\n\t' .. '"type": "FeatureCollection",' .. '\n\t' .. '"features": [' .. '\n' -- count up others to put on map - using Qnnnn and add basic type feature -- module to get each name, latitude and longitude using split arg2 would be Qnnn,Qnnn,Qnnn -- can get label -- get latitude longitude and basic description and image if possible -- Need to eliminate duplicates - perhaps put Qnns in an array and scan each and eliminate duplicates ---- TEST OF REMOVING DUPLICATES FROM LIST OF Qnn local index = 1 local items = {} local flags = {} for str in string.gmatch(arg2,"([^"..separator.."]+)") do items[index] = str index = index + 1 end for i=1,#items do if not flags[items[i]] then flags[items[i]] = true feature = feature .. p.feature(items[i],markercolor,markersymbol) -- extra arguments ?? end end ---- END TEST OF REMOVING DUPLICATES FROM LIST OF Qnnn ---- OLD CODE KEEP -- ---- for str in string.gmatch(arg2,"([^"..separator.."]+)") do -- ---- feature = feature .. p.feature(str,markercolor,markersymbol) -- ---- feature = feature .. p.feature(str) -- -- end -- ----OLD CODE KEEP -- feature = string.gsub(feature,",$","") local part4 = '\n\t' .. ']' .. '\n' .. '}</mapframe>' .. '\n' -- not outputting div -- local part4 = '\n\t' .. ']' .. '\n' .. '}</mapframe>' .. '\n' .. '</div>' .. '\n' output = part1 .. part2 .. part3 .. feature .. part4 end return output end -----------function p.feature(str) function p.feature(str,markercolor,markersymbol) local text = "" local lat = "" local long = "" local name = "" local image = "" local voysitename = "" local voysitename2 = "" local wiki = "" local xtraname = "" local part1 = "" local part2 = "" local part3 = "" local part4 = "" local part5 = "" local part6 = "" local part7 = "" local part8 = "" -- Do check on str to insure its correct format and check to see if we get object or maybe do a test -- using pcall if string.match(str,"^[Qq]%d+$") == nil then return "" end -- str should be in a specific format 'Qnnn' -- if pcall(function () t = mw.wikibase.getEntityObject(str) end ) then -- local entity = mw.wikibase.getEntityObject(str) -- else return end local entity = mw.wikibase.getEntityObject(str) if entity == nil then return "" end local claims = entity.claims if claims == nil then return "" end if pcall(function () t = claims.P625 end) then if pcall(function () t = entity.claims.P625[1].mainsnak.datavalue.value.latitude end ) then lat = entity.claims.P625[1].mainsnak.datavalue.value.latitude end if pcall(function () t = entity.claims.P625[1].mainsnak.datavalue.value.longitude end ) then long = entity.claims.P625[1].mainsnak.datavalue.value.longitude end end if pcall(function () t = claims.P18 end) then if pcall(function () t = entity.claims.P18[1].mainsnak.datavalue.value end ) then image = entity.claims.P18[1].mainsnak.datavalue.value end end if lat == "" or long == "" then return "" end lat = string.format("%.6f",lat) -- format number to 6 decimal places ie. 10.00 becomes 10.000000 ie. 12.345 becomes 12.345000 ie. 1 becomes 1.000000 long = string.format("%.6f",long) -- format number to 6 decimal places see above lat = string.gsub(lat,"0+$","") -- strip any number of ending zeroes - 10.000000 becomes 10. 12.345000 becomes 12.345 1.000000 becomes 1. long = string.gsub(long,"0+$","") -- string any number of ending zeroes - see above lat = string.gsub(lat,"%.$","") -- strip and ending period - 10. becomes 10, 12.345 remains and 1. becomes 1 long = string.gsub(long,"%.$","") -- strip an ending period if image ~= "" then image = str.gsub(image,'%"','\\"') -- Believe it or not there are image names with quotes -- this can be picked up as a redlinked image image = '[[File:' .. image .. '|280px|link=]]' -- image = '"[[File:' .. image .. '|280px|link=]]"' else if pcall(function () t = claims.P948 end) then if pcall(function () t = entity.claims.P948[1].mainsnak.datavalue.value end ) then image = entity.claims.P948[1].mainsnak.datavalue.value image = '[[File:' .. image .. '|280px|link=]]' end end end if image == "" then image = '[[File:Wikivoyage-Logo-v3-small-en.png|Wikivoyage|80px|link=]]<br>' -- [[File:WV-logo-artmap.jpg|120px]] end name = mw.wikibase.sitelink(str) if name == "" or name == nil then name = mw.wikibase.label(str) or "" end voysitename = "" if pcall(function()t1 = entity:getSitelink("enwikivoyage") end) then voysitename = entity:getSitelink("enwikivoyage") or "" if voysitename ~= nil and voysitename ~= "" then name = "[[" .. voysitename .."]]" end end -- testing an idea can be removed if not wanted wiki = "enwiki" xtraname = "" xtraname = entity:getSitelink(wiki) or "" -- If blank as is in many cases skip adding link to description description = mw.wikibase.description(entity.id) if description == "" or description == nil then description = "" end if str.len(xtraname .. description) <= 15 then -- arbitrary bending of the rules to make images in box nicer description = description .. ' ' end part1 = '\n\t' .. '{' .. '\n\t' .. '"type": "Feature",' .. '\n\t\t' .. '"properties": {' if xtraname ~= "" then part2 = '\n\t\t\t' .. '"description": "'.. image .. ' ' .. name .. ' — (w:[[:w:' .. xtraname .. '|' .. xtraname .. ']])' .. ' ' .. description .. '",' else part2 = '\n\t\t\t' .. '"description": "'.. image .. ' ' .. name .. ' —' .. ' ' .. description .. '",' end part3 = '\n\t\t\t' .. '"title": "' .. name .. '",' part4 = '\n\t\t\t' .. markersymbol part5 = '\n\t\t\t' .. '"marker-size": "medium",' part6 = '\n\t\t\t' .. markercolor part7 = '\n\t\t' .. '},' .. '\n\t\t' .. '"geometry": {' .. '\n\t\t\t' .. '"type": "Point",' .. '\n\t\t\t' .. '"coordinates": [' part8 = '\n\t\t\t' .. long .. ',' .. '\n\t\t\t' .. lat .. '\n\t\t\t' .. ']' .. '\n\t\t'.. '}' .. '\n\t' .. '},' text = part1 .. part2 .. part3 .. part4 .. part5 .. part6 .. part7 .. part8 return text end -- END Function -- Make a marker -- function p.initmarker(frame) -- if frame.args[1]~=nil and frame.args[1]~='' then -- return frame.args[1] -- end local arg1 = frame.args[1] or '' local arg2 = frame.args[2] or 'red' local entity = mw.wikibase.getEntityObject(arg1) if entity == nil then return end local claims = entity.claims if claims == nil then return end local listing = "" local type = arg2 local name = "" local url = "" local latitude = "" local longitude = "" local image = "" local description = "" -- name name = mw.wikibase.sitelink(arg1) if name == "" or name == nil then name = mw.wikibase.label(arg1) end -- url if claims.P856 ~= nil then url = entity.claims.P856[1].mainsnak.datavalue.value url = string.gsub(url,"%,.*","") -- KEEP ONLY ONE if url == nil or url == "" then url = "" end end -- coordinates if claims.P625 ~= nil then latitude = entity.claims.P625[1].mainsnak.datavalue.value.latitude if latitude == nil or latitude == "" then latitude = "" end longitude = entity.claims.P625[1].mainsnak.datavalue.value.longitude if longitude == nil or longitude == "" then longitude = "" end end -- image if claims.P18 ~= nil then image = entity.claims.P18[1].mainsnak.datavalue.value if image == nil then image = "" end end -- description description = mw.wikibase.description(entity.id) if description == "" or description == nil then description = "" end marker = "{{marker\n| type=" .. type .. "\n| zoom=13\n| wikidata=" .. arg1 .. "\n| name=" .. name .. "\n| url=" .. url .. "\n| lat=" .. latitude .. "\n| long=" .. longitude.. "\n| image=" .. image .. "}} — " .. description return marker end function p.initlisting(frame) -- if frame.args[1]~=nil and frame.args[1]~='' then -- return frame.args[1] -- end local arg1 = frame.args[1] or '' local arg2 = frame.args[2] or 'see' local entity = mw.wikibase.getEntityObject(arg1) if entity == nil then return end local claims = entity.claims if claims == nil then return end local listing = "" local type = arg2 local name = "" local alt = "" local url = "" local email = "" local wiki = "" local name = "" local wikidata = arg1 local wikiname = "" local address = "" local directions = "" local phone = "" local tollfree = "" local fax = "" local hours = "" local price = "" local checkin = "" local checkout = "" local latitude = "" local longitude = "" local image = "" local description = "" local lastedit = "" -- get wikipedia name lang = mw.language.getContentLanguage(arg1).code wiki = lang .. "wiki" wikiname = entity:getSitelink(wiki) or "" -- name name = mw.wikibase.sitelink(arg1) if name == "" or name == nil then name = mw.wikibase.label(arg1) end -- url if claims.P856 ~= nil then url = entity.claims.P856[1].mainsnak.datavalue.value url = string.gsub(url,"%,.*","") -- KEEP ONLY ONE if url == nil or url == "" then url = "" end end -- coordinates if claims.P625 ~= nil then latitude = entity.claims.P625[1].mainsnak.datavalue.value.latitude if latitude == nil or latitude == "" then latitude = "" end longitude = entity.claims.P625[1].mainsnak.datavalue.value.longitude if longitude == nil or longitude == "" then longitude = "" end end -- image if claims.P18 ~= nil then image = entity.claims.P18[1].mainsnak.datavalue.value if image == nil then image = "" end end -- description description = mw.wikibase.description(entity.id) if description == "" or description == nil then description = "" end local part1 = "{{" .. type .. "\n| name=" .. name .. " | alt= " .. alt .. "| wikidata=" .. wikidata .. "| wikipedia=" .. wikiname local part2 = "\n| email=" .. email .. " | address=" .. address .. " | directions=" .. directions local part3 = "\n| phone=" .. phone .. " | tollfree=" .. tollfree .. " | fax=" .. fax local part4 = "\n| hours=" .. hours .. " | price=" .. price .. " | checkin=" .. checkin .. " | checkout=" .. checkout local part5 ="\n| url=" .. url .. "\n| lat=" .. latitude .. "\n| long=" .. longitude local part6 ="\n| image=" .. image .. "| content=" .. description .. "}}\n" listing = part1 .. part2 .. part3 .. part4 .. part5 .. part6 return listing end function p.getwiki(frame) local wikip = "" local asitelink = "" local lang = "" local commons = "" local quotelink = "" local output = "" local arg1 = frame.args[1] or "" if arg1 == nil or arg1 == "" then return end local item = mw.wikibase.getEntityObject(arg1) if item == nil or item == "" then return end lang = mw.language.getContentLanguage(arg1).code if lang ~= nil and lang ~= "" then asitelink = lang .. "wiki" asitelink = item:getSitelink(asitelink) if asitelink ~= nil and asitelink ~= "" then asitelink = "[[w:" .. lang .. ":" .. asitelink .. "|W]] " end quotelink = lang .. "wikiquote" quotelink = item:getSitelink(quotelink) if quotelink ~= nil and quotelink ~= "" then quotelink = "[[q:" .. lang .. ":" .. quotelink .. "|Q]] " end end local claims = item.claims if claims ~= nil and claims ~= "" then commons = item.claims.P373[1].mainsnak.datavalue.value if commons ~= nil and commons ~= "" then commons = "[[c:" .. commons .. "|C]] " end end output = asitelink .. commons .. quotelink output = string.gsub(output,"%s+","") -- just for cleaning up since outputting 3 variables as one output = string.gsub(output," $","") -- getting rid of ending space return output end function p.tocheaders3(frame) local page = frame.args[1] local title = mw.title.new(page) if title == nil then return end if title.id == 0 then return "Page does not exist!" end local data = title:getContent() if data == nil or data == "" then return end data = string.gsub(data,"\n","@@@@@") data = string.gsub(data,"@@@@@@@@@@","@@@@@") local tt = {} local count = 0 local output = "\n: [[" .. page .. "]]\n" local separator = "@@@@@" for str in string.gmatch(data,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then if string.find(str, '^%=') == 1 then -- not just an ='s sign but one at beginning of line count = count + 1 tt[count] = str end end end local part1 = "" local part2 = "" local part2a = "" for key,value in pairs(tt) do value = mw.text.unstrip(value) value = string.gsub(value,"%[","") value = string.gsub(value,"%]","") value = string.gsub(value,"^%s+","") -- remove lead spaces value = string.gsub(value,"%=%s","%=") value = string.gsub(value,"%s+$"," ") -- change multiple spaces to " " value = string.gsub(value,"%=+$","") -- remove trailing = value = string.gsub(value,"%+$","") -- remove trailing spaces value = string.gsub(value,"^%=%=%=%=%=%=","::::::") -- change leading = to : value = string.gsub(value,"^%=%=%=%=%=",":::::") -- change leading = to : value = string.gsub(value,"^%=%=%=%=","::::") -- change leading = to : value = string.gsub(value,"^%=%=%=",":::") -- change leading = to : value = string.gsub(value,"^%=%=","::") -- change leading = to : value = string.gsub(value,"^%=",":") -- change leading = to : part1 = string.gsub(value,"^(%:+)(.*)","%1") part2 = string.gsub(value,"^(%:+)(.*)","%2") if value ~= nil and value ~= "" then part2a = string.gsub(part2," ","_") -- output = output .. part1 .. "[http://localhost/wiki/index.php/" .. page .. "#" .. part2a .. " " .. part2 .. "]\n" output = output .. part1 .. "[[" .. page .. "#" .. part2 .. "|" .. part2 .. "]]" .. "\n" end end return output end -- Load a page and scan it for images and produce a gallery function p.getsomeimages(frame) local page = frame.args[1] or "Main Page" local flags = frame.args['flags'] or "n" if flags ~= "y" then flags = "n" end -- Images from {{flag|name}} as in embassies -- y or n local title = mw.title.new(page) if title == nil then return end if title.id == 0 then return "Page does not exist!" end local data = title:getContent() if data == nil or data == "" then return end local tt = {} local count = 0 local output = "" local separator = "@@@@@" local newstr = "" local imagechecklist = {'jpg','JPG','jpeg','JPEG','jpe','JPE','png','PNG','apng','APNG','svg','SVG','TIF','tif','TIFF','tiff'} data = string.gsub(data,'%{%{%s*pagebanner%s*%}%}','') --get ride of {{pagebanner}} data = string.gsub(data,"@","BULLET") --because I use @@@@@ as a separator changing @ to BULLET data = string.gsub(data,"%s+"," ") --change multiple spaces to a space data = string.gsub(data,"\n","@@@@@") --change \n to separator @@@@@ data = string.gsub(data,'%s*%=%s*','=') --get rid of spaces around = signs -- special case regionmap image data = string.gsub(data,'regionmap%s*%=%s*@@@@@',"") data = string.gsub(data,'regionmap%s*%=%s*','@@@@@[[File:') --if regionmap then put separator @@@@@ plus [[File: -- to consider getting images from quickbar (flag,location) -- | flag = Flag of India.svg -- | location = LocationIndia.png {{quickbar| location= data = string.gsub(data,"flag%s*%=%s*@@@@@","") data = string.gsub(data,"flag%s%=%s*%|","") data = string.gsub(data,"flag%s*%=%s*","@@@@@[[File:") data = string.gsub(data,"location%s*%=%s*@@@@@","") data = string.gsub(data,"location%s*%=%s*%|","") data = string.gsub(data,"location%s*%=%s*","@@@@@[[File:") -- ie. {{pagebanner}} or {{pagebanner|TajMahal Banner.jpg|caption=Taj Mahal}} -- ie. {{pagebanner|pgname=aaaaaa|named banner.jpg}} etc will not work in this case figure out when going through for loop?? data = string.gsub(data,'%{%{%s*pagebanner%s*','@@@@@PAGEBANNERFIX') -- Issue with SPARQL code - test to see if can eliminate in checking -- may need to refine further -- sample:(concat(?stateLabel, '\\n', '[[File:', substr(str(?img), 52, 100), '|200px]]') as ?description) data = string.gsub(data,"%'%[%[File%:%'%,","SPARQL") data = string.gsub(data,"%]%]%'%)","XSPARQL") -- area for flags as found in embassies? {{flag|Afghanistan}} -- make template break up with separator @@@@@ data = string.gsub(data,'%{%{%s*flag%s*%|','@@@@@{{flag|') data = string.gsub(data,'%{%{%s*listing','@@@@@{{listing') -- try and get images from routebox - special set data = string.gsub(data,'%{%{%s*routebox','@@@@@{{routebox') data = string.gsub(data,'image...%s*%=%s*','image=') --picks up image1= or image10= or image10a data = string.gsub(data,'image..%s%=%s*','image=') data = string.gsub(data,'image.%s*%=%s*','image=') -- also consider see,buy,drink,marker etc. as in listing above -- drop empties data = string.gsub(data,'image%=%}%}','') data = string.gsub(data,'image%=@@@@@','@@@@@') data = string.gsub(data,'%s*image%=%s*%|','') data = string.gsub(data,'image%s*%=%s*image%s*%=%s*','image=') -- change image=image= to image= data = string.gsub(data,'image%s*%=%s*File%:%s*','image=WHAMMO') -- change image=File: to image= (Sometimes File may be in another language data = string.gsub(data,'%s*image%=%s*@@@@@%|','') -- more cleanup -- also other languages to consider data = string.gsub(data,'%s*image%=%s*@@@@@%}','') -- data = string.gsub(data,'%s*image%=','@@@@@[[File:') -- duplicate see below data = string.gsub(data,"%[%[%s*File:%s*","@@@@@[[File:") data = string.gsub(data,"%[%[%s*file:%s*","@@@@@[[File:") data = string.gsub(data,"%[%[%s*image:%s*","@@@@@[[File:") data = string.gsub(data,"%[%[%s*Image:%s*","@@@@@[[File:") data = string.gsub(data,'%s*image%=','@@@@@[[File:') -- simply setting up the breakup of data using separator -- Issue with names like Budapest districts WV map.svg 2.0.png -- Single exception found to -- if many more then need to figure a way around this rather unique situation data = string.gsub(data,'Budapest districts WV map%.svg 2%.0.png',"Budapest districts WV map.DUMBFIX 2.0.png") data = string.gsub(data,'%.jpg','.jpg|border|250px]]@@@@@') -- original prep for images remove |border|250px data = string.gsub(data,'%.JPG','.JPG|border|250px]]@@@@@') data = string.gsub(data,'%.PNG','.PNG|border|250px]]@@@@@') data = string.gsub(data,'%.png','.png|border|250px]]@@@@@') data = string.gsub(data,'%.SVG','.SVG|border|250px]]@@@@@') data = string.gsub(data,'%.svg','.svg|border|250px]]@@@@@') data = string.gsub(data,'%.jpeg','.jpeg|border|250px]]@@@@@') data = string.gsub(data,'%.JPEG','.JPEG|border|250px]]@@@@@') data = string.gsub(data,'%.tif','.tif|border|250px]]@@@@@') -- add .tif image -- return exception back to original data = string.gsub(data,'Budapest districts WV map%.DUMBFIX 2%.0.png',"Budapest districts WV map.svg 2.0.png") data = string.gsub(data,"@@@@@@@@@@","@@@@@") -- getting rid of blank breakup data = string.gsub(data,"@@@@@@@@@@","@@@@@") for str in string.gmatch(data,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then if string.find(str,'PAGEBANNERFIX') ~= nil then -- caption=sometext pgname=sometext diasambig=yes star=yes dotm=yes otb=yes ftt=yes unesco=yes -- toc=black or white notoc=true index=yes fop=yes -- remove to gettheimage???? str = string.gsub(str,'%|%a*%=','DELETEME=') newstr = "" if string.find(str,'DELETEME') ~= nil then for str2 in string.gmatch(str,"([^".."|".."]+)") do str2 = string.gsub(str2,'DELETEME.*',"") if str2 ~= nil then newstr = newstr .. "|" .. str2 end end str = string.gsub(newstr,'%|PAGEBANNERFIX%|','[[File:') end str = string.gsub(str,'PAGEBANNERFIX%|','[[File:') end str = string.gsub(str,'%s*$','') -- drop ending space str = string.gsub(str,'File:%s*%}%}','') -- JUNKY FIX NEED SOLUTION TO A DISTINCT UNIQ ISSUE if string.find(str,'^%{%{flag%|.*%}%}') == 1 then str = string.gsub(str,'%{%{flag%s*%|%s*(.*)%}%}.*',"[[File:Flag of %1.svg]]") -- template puts in "the" if flags=="n" then str = "" end end if string.find(str, '^%[%[File:') == 1 then -- Key is to have [[File:image...]] str = string.gsub(str,'%_'," ") str = string.gsub(str,'%%2C',",") count = count + 1 tt[count] = str end end end table.sort(tt) -- BUILD A GALLERY OF PICTURES local check = "" local previous = "" local galleryfile = "" for key,value in pairs(tt) do if value ~= previous then -- Check if ^[[File:.*%.jpg or JPG or jpg or jpeg or JPEG or PNG or png or SVG or svg or tif]]$ for i,checker in ipairs(imagechecklist) do check = "^%[%[File:.*" .. checker .. "%]%]$" if string.gmatch(value,check) then galleryfile=value galleryfile=string.gsub(galleryfile,'%[%[File:%s*','File:') galleryfile=string.gsub(galleryfile,'%|.*$','') galleryfile=string.gsub(galleryfile,'%]%]','') -- Special case image=WHAMMO as image=File:somename is an error - in order to pick it up easier using this as test in gallery output -- instead of outputting File:somename which will work - just output name galleryfile=string.gsub(galleryfile,'WHAMMO','image=File:') -- Special case as well image name surrounded by \" -- have to change to "somename" - \" needed for maplink/mapframe - kartographer -- only dealing with one such known case - if more develop then will just replace \\" with" galleryfile=string.gsub(galleryfile,'\\"kirti mandir\\".jpg','"kirti mandir".jpg') output = output .. galleryfile .. "\n" break end end previous = value end end output = string.gsub(output,"\n$","") output = string.gsub(output,"BULLET","@") -- return '<gallery mode="packed">\n' .. output .. "\n</gallery>" return '<gallery widths=150px heights=150px perrow=6>\n' .. output .. "\n</gallery>" end local function latitude(wikidata) local latitude = "" local entity = mw.wikibase.getEntityObject(wikidata) if entity == nil then return latitude end local claims = entity.claims if claims == nil then return latitude end if claims.P625 ~= nil then latitude = entity.claims.P625[1].mainsnak.datavalue.value.latitude return latitude end return latitude end -- GET LONGITUDE -- P625 local function longitude(wikidata) local longitude = "" local entity = mw.wikibase.getEntityObject(wikidata) if entity == nil then return longitude end local claims = entity.claims if claims == nil then return longitude end if claims.P625 ~= nil then longitude = entity.claims.P625[1].mainsnak.datavalue.value.longitude return longitude end return longitude end function p.games(frame) local data = frame.args[1] local wikidata = "" local lat = "" local long = "" local lang = "" local wiki = "" local wikipedia = "" data = string.gsub(data,'\n','@@@@@NEWLINE') data = string.gsub(data,'%s*%|%s*','@@@@@') data = string.gsub(data,'%s*%=%s*','=') data = string.gsub(data,'%}%}','@@@@@}}') if string.find(data,'.*wikidata%=Q%d+.*') == 1 then wikidata = string.gsub(data,'.*@@@@@wikidata%=(Q%d+).*',"%1") local entity = mw.wikibase.getEntityObject(wikidata) if entity ~= nil then lang = mw.language.getContentLanguage(wikidata).code wiki = lang .. "wiki" wikipedia = entity:getSitelink(wiki) or "" lat = latitude(wikidata) or "" long = longitude(wikidata) or "" end if string.find(data,'wikipedia%=') == nil and wikipedia ~= " " then data = string.gsub(data,'}}','@@@@@wikipedia%='..wikipedia..'}}') else data = string.gsub(data,'wikipedia%=@@@@@','wikipedia%='..wikipedia..'@@@@@') end if string.find(data,'lat%s*%=%s*%d') == nil and lat ~= "" then -- check for lat=n and long=n data = string.gsub(data,'lat%=','lat='..lat) end if string.find(data,'lat%=') == nil and lat ~= "" then -- no lat= something then add parameter data = string.gsub(data,'}}','@@@@@lat='..lat..'}}') end if string.find(data,'long%s*%=%s*%d') == nil and long ~= "" then data = string.gsub(data,'long%=','long='..long) end if string.find(data,'long%=') == nil and long ~= "" then -- no long then add parameter data = string.gsub(data,'}}','@@@@@long='..long..'}}') end end data = string.gsub(data,'@@@@@@@@@@','@@@@@') data = string.gsub(data,'@@@@@}}','}}') data = string.gsub(data,'NEWLINE@@@@@','\n| ') data = string.gsub(data,'@@@@@NEWLINE','\n') data = string.gsub(data,'@@@@@',' | ') data = string.gsub(data,'NEWLINE','\n') return data end function p.games2(frame) local list = frame.args['list'] or "" local data = "" local separator = "," local name = "" if list ~= nil and list ~= "" then list = string.gsub(list,"%s","") else return "" end local index = 1 local items = {} local flags = {} for str in string.gmatch(list,"([^"..separator.."]+)") do items[index] = str index = index + 1 end for i=1,#items do if not flags[items[i]] then flags[items[i]] = true name = "" name = mw.wikibase.sitelink(items[i]) if name == "" or name == nil then name = mw.wikibase.label(items[i]) or "" end data = data .. items[i] .. " - " .. name .. "XNEWLINEX" end end data = string.gsub(data,'XNEWLINEX','</br>') return data end --* {{see --| name=Akhaura Checkpost | alt= | url= | email= --| address= | lat=23.838611 | long=91.254444 | directions= --| phone= | tollfree= | fax= --| hours= | price= --| content=It handles the largest number of visitors to and from neighbouring Bangladesh. --}} -- dont forget to include a mapframe for the maplinks to work on -- <mapframe latitude="24.3" longitude="74.4" zoom="5" width="400" height="400" group="locations" show="see,do,buy,eat,drink,sleep,go,site,other"/> -- local function loadchecklist() local checklist = {'see','do','buy','eat','drink','sleep','city','vicinity','go','site','around','other','gold','lime','magenta','mediumaquamarine','orange','plum','red','silver','unknown'} return checklist end local function loadcolors() local colors = {} -- table of colors much of which can be used in marker or listings - based on type colors['see'] = "#4682B4" colors['do'] = "#808080" colors['buy'] = "#008080" colors['eat'] = "#D2691E" colors['drink'] = "#000000" colors['sleep'] = "#000080" -- made extras as people tend to mix marker stuff with listing stuff colors['city'] = "#0000FF" colors['vicinity'] = "#800000" colors['go'] = "#A52A2A" colors['view'] = "#4169E1" colors['site'] = "#CD2626" colors['around'] = "800080" colors['other'] = "#228B22" -- by color colors['gold'] = "#FFD700" colors['lime'] = "#00FF00" colors['magenta'] = "#FF00FF" colors['mediumaquamarine'] = "#66CDAA" colors['orange'] = "#FFA500" colors['plum'] = "#DDA0DD" colors['red'] = "#FF0000" colors['silver'] = "#C0C0C0" colors['unknown'] = "#FF00FF" return colors end -- can also create symbols if we dont want to number them which I like better -- right now limited symbols - use of numbers greater -- Maki symbols not available local function loadsymbols() local symbols = {} symbols['see'] = "star" symbols['do'] = "marker" symbols['buy'] = "shop" symbols['eat'] = "restaurant" symbols['drink'] = "bar" symbols['sleep'] = "lodging" -- made extras as people tend to mix marker stuff with listing stuff symbols['city'] = "city" symbols['vicinity'] = "town" symbols['go'] = "suitcase" symbols['site'] = "monument" symbols['other'] = "triangle" return symbols end local function imagex(id) local id = id local image = "" local entity = mw.wikibase.getEntityObject(id) if entity == nil then return "" end local claims = entity.claims if claims == nil then return image end if pcall(function () t = claims.P18 end) then if pcall(function () t = entity.claims.P18[1].mainsnak.datavalue.value end ) then image = entity.claims.P18[1].mainsnak.datavalue.value return image end end return image end -- getting lat long via passing an ID local function latitudex(id) local latitude = "" local arg1 = id local entity = mw.wikibase.getEntityObject(arg1) if entity == nil then return latitude end local claims = entity.claims if claims == nil then return latitude end if claims.P625 ~= nil then latitude = entity.claims.P625[1].mainsnak.datavalue.value.latitude return latitude end return latitude end -- GET LONGITUDE -- P625 local function longitudex(id) local longitude = "" local arg1 = id local entity = mw.wikibase.getEntityObject(arg1) if entity == nil then return longitude end local claims = entity.claims if claims == nil then return longitude end if claims.P625 ~= nil then longitude = entity.claims.P625[1].mainsnak.datavalue.value.longitude return longitude end return longitude end function p.list2maplink(frame) -- checklist has args for main listings but also those found in marker and sometimes used in listing templates local data = frame.args[1] or "" if data == "" then return data end local msymbol = frame.args['symbol'] or "n" -- symbol=y then use from symbols table else use '-number' local separator = "@@@@@" local newdata = "" local color = "" local symbol = "" local group = "" local wikidata = "" local image = "" local latitude = "" local longitude = "" local content = "" local name = "" local lang = "" local wikipedia = "" local url = "" local counter = "" local checklist = loadchecklist() local colors = loadcolors() local symbols = loadsymbols() data = string.gsub(data,"%@","BULLET") data = string.gsub(data,"%s*%|\n","|") data = string.gsub(data,"\n%s*%}%}","}}") data = string.gsub(data,"%s*%|%s*","|") data = string.gsub(data,"\n","@@@@@") for i,checker in ipairs(checklist) do data = string.gsub(data,"%{%{%s*"..checker,"{{listing|type="..checker) end data = string.gsub(data,"%{%{%s*listing%|name%=",'{{listing|type=other|name=') data = string.gsub(data,"%{%{%s*listing%|image%=",'{{listing|type=other|image=') --if data ~= "" then return data end data = string.gsub(data,'%{%{listing','@@@@@{{listing') for str in string.gmatch(data,"([^"..separator.."]+)") do if string.find(str,'%{%{listing') == 1 then str = string.gsub(str,'%}%}$','|}}') str = string.gsub(str,'image%=%|','') str = string.gsub(str,'name%=%|','') str = string.gsub(str,'content%=%|','') str = string.gsub(str,'lat%=%|','') str = string.gsub(str,'long%=%|','') str = string.gsub(str,'url%=%|','') str = string.gsub(str,'wikipedia%=%|','') -- I parameter counter= is empty then its a simple -number if counter=aaaa then its a -number-aaaa if string.find(str,'counter%=%|') then counter = "-number" else if string.find(str,'counter%=%|') then counter = string.gsub(str,'^.*counter%=','') counter = string.gsub(counter,'%|.*','') counter = "-number-" .. counter -- alpha letters if counter=letter -- special case only - made up --- what about alpha groups (type) if string.find(counter,'%-number%-letter') then counter = "-letter" end else counter = "" end end if string.find(str,'name%=') then name = string.gsub(str,'^.*name%=','') name = string.gsub(name,'%|.*','') else name = "" end if string.find(str,'wikipedia%=') then wikipedia = string.gsub(str,'^.*wikipedia%=','') wikipedia = string.gsub(wikipedia,'%|.*','') wikipedia = " [[w:enwiki:" .. wikipedia .."|" .. wikipedia .. "]]" end if string.find(str,'image%=') then -- xxx image = string.gsub(str,'^.*image%=','') image = string.gsub(str,'^.*%|image%=','') image = string.gsub(image,'%|.*','') -- xxx image = '[[File:' .. image .. '|280px|link=]]' -- should not be necessary image = '[[File:' .. image .. '|280px|link=]]' -- should not be necessary else image = "" end if string.find(str,'lat%=') then latitude = string.gsub(str,'^.*lat%=','') latitude = string.gsub(latitude,'%|.*','') else latitude = "" end if string.find(str,'long%=') then longitude = string.gsub(str,'^.*long%=','') longitude = string.gsub(longitude,'%|.*','') else longitude = "" end if string.find(str,'wikidata%=') then -- If wikidata and lat long ='s "" then get lat long from wikidata wikidata = string.gsub(str,'^.*wikidata%=','') wikidata = string.gsub(wikidata,'%|.*','') if string.match(wikidata,"^[Qq]%d+$") ~= nil then -- if string.match(arg1,"^[Qq]%d+$") ~= nil then if latitude == "" then latitude = latitudex(wikidata) end if longitude == "" then longitude = longitudex(wikidata) end end else wikidata = "" end if string.find(str,'content%=') then content = string.gsub(str,'^.*content%=','') content = string.gsub(content,'%|.*','') -- issue with double quotes as they will cause a JSON error - below should fix it list of others may be incorporated -- xxx content = string.gsub(content,'%"','\"') content = string.gsub(content,'%"','\\"') -- a blank image not needed as code has been fixed to handle how text comes out when -- one clicks on the marker -- this was precautionary -- -- if image == "" then -- image = "[[File:3by2white.svg|280px 1px|link=]]" -- content = string.gsub(content,'^%s*','') -- end else content = "" end if string.find(str,'url%=') then url = string.gsub(str,'^.*url%=','') url = string.gsub(url,'%|.*','') url = "[" .. url .. " ]" else url = "" end -- NOT MAKING A DEFAULT OF lat 0 and long 0 as this would bunch up a load of maplinks somewhere in Africa -- Have to have latitude and longitude to create a maplink -- or dropping creation of maplink from a listing if latitude ~= "" and longitude ~= "" then group = string.gsub(str,".*type%=(%a+)(%|.*)","%1") if colors[group] == nil then -- solves two issues - if bad group then it becomes other and we get a color for it group = "other" end color = colors[group] if msymbol == "y" then -- use a symbol from table for certain group (small list) for on a map symbol = symbols[group] -- no numbers alpha or symbols appear on article page - dealing with maplinks not listing output else if counter ~= "" then -- if counter= numbered on page then numbered on map instead - symbols are out???? symbol = counter if counter == "-letter" then symbol = "-letter" .. "-" .. group end else symbol = "-number" .. "-" .. group end end newdata = newdata .. '\n<maplink class="no-icon" zoom="5" text="" latitude="' .. latitude .. '" longitude="' .. longitude .. '" group="' .. group .. '">' newdata = newdata .. '\n{\n\t"type": "Feature",\n\t"geometry": { "type":"Point", "coordinates":[' .. longitude .. ',' .. latitude .. '] },' newdata = newdata .. '\n\t"properties": {\n\t "title": "' .. name .. '",\n' -- newdata = newdata .. '\t"description": "' .. image .. content .. url .. '",\n' newdata = newdata .. '\t"description": "' .. image .. name .. url .. "— " .. wikipedia .. " " .. content .. '",\n' newdata = newdata .. '\t"marker-size": "medium",\n' newdata = newdata .. '\t"marker-color": "' .. color .. '",\n' newdata = newdata .. '\t"marker-symbol": "' .. symbol .. '"\n' newdata = newdata .. '}\n}\n</maplink>' end end end newdata = string.gsub(newdata,"BULLET","@") -- return orignal input plus maplink(s) return frame.args[1] .. "\n" .. newdata end --* {{marker|type=vicinity|zoom=13 --| name=Mollem National Park --| lat=15.33390 | long=74.28835 --| image= --}} (Bhagwan Mahaveer Sanctuary and Mollem National Park), [[Goa]] — a pristine area diverse in flowering plant life and vegetation is habitat for many mammals, birds, butterflies and reptiles. The largest protected area in [[Goa]]. One can also find the ''Tambdi Surla Temple'', ''Tambdi Falls'' and other attractions here -- In progress function p.marker2maplink(frame) local checklist = loadchecklist() local colors = loadcolors() local symbols = loadsymbols() local data = frame.args[1] or "" if data == "" then return data end local msymbol = frame.args['symbol'] or "n" -- symbol=y then use from symbols table else use '-number' local separator = "@@@@@" local newdata = "" local color = "" local symbol = "" local group = "" local type = "" local name = "" local latitude = "" local longitude = "" local zoom = "" local url = "" local image = "" local wikidata = "" local content = "" local url = "" local counter = "" data = string.gsub(data,"%@","BULLET") data = string.gsub(data,"%s*%|\n","|") data = string.gsub(data,"\n%s*%}%}","}}") data = string.gsub(data,"%s*%|%s*","|") data = string.gsub(data,"\n","@@@@@") -- not to mess with — and text for now data = string.gsub(data,'%{%{marker','@@@@@{{marker') for str in string.gmatch(data,"([^"..separator.."]+)") do if string.find(str,'%{%{marker') == 1 then if string.find(str,'%{%{%|type=') == nil then str = string.gsub(str,'%{%{marker','{{marker|type=other') -- make default type end str = string.gsub(str,'%}%}',"|}}") -- get end of marker add | to be able to pick out the pieces str = string.gsub(str,'%s*%=%s*',"=") str = string.gsub(str,'image%=%|','') str = string.gsub(str,'name%=%|','') str = string.gsub(str,'lat%=%|','') str = string.gsub(str,'long%=%|','') str = string.gsub(str,'url%=%|','') if string.find(str,'name%=') then name = string.gsub(str,'^.*name%=','') name = string.gsub(name,'%|.*','') else name = "" end if string.find(str,'image%=') then image = string.gsub(str,'^.*image%=','') image = string.gsub(image,'%|.*','') image = '[[File:' .. image .. '|280px|link=]]' else image = "" end if string.find(str,'lat%=') then latitude = string.gsub(str,'^.*lat%=','') latitude = string.gsub(latitude,'%|.*','') else latitude = "" end if string.find(str,'long%=') then longitude = string.gsub(str,'^.*long%=','') longitude = string.gsub(longitude,'%|.*','') else longitude = "" end content = string.gsub(str,'^.*%}%}','') -- last ditch attempt at content field for a marker - can be tricky - depends what text entered content = string.gsub(content," — ","") content = string.gsub(content,'%[%[File.*$','') -- some have an image in content which won't work content = string.gsub(content,'%"','\"') -- if image == "" then -- image = "[[File:3by2white.svg|280px 1px|link=]]" -- content = string.gsub(content,'^%s*','') -- end if string.find(str,'wikidata%=') then -- If wikidata and lat long ='s "" then get lat long from wikidata wikidata = string.gsub(str,'^.*wikidata%=','') wikidata = string.gsub(wikidata,'%|.*','') if string.match(wikidata,"^[Qq]%d+$") ~= nil then if latitude == "" then latitude = latitudex(wikidata) end if longitude == "" then longitude = longitudex(wikidata) end if image == nil or image == "" then image = imagex(wikidata) if image ~= "" then image = '[[File:' .. image .. '|280px|link=]]' else image = "" end end end else wikidata = "" end if string.find(str,'url%=') then url = string.gsub(str,'^.*url%=','') url = string.gsub(url,'%|.*','') url = "[" .. url .. " ]" else url = "" end if string.find(str,'counter%=%|') then counter = "-number" else if string.find(str,'counter%=%') then counter = string.gsub(str,'^.*counter%=','') counter = string.gsub(counter,'%|.*','') counter = "-number-" .. counter -- in case counter has a name -- alpha letters if counter=letter -- special case only - made up --- what about alpha groups (type) if string.find(counter,'%-number%-letter') then counter = "-letter" end else counter = "" end end if latitude ~= "" and longitude ~= "" then group = string.gsub(str,".*type%=(%a+)(%|.*)","%1") if colors[group] == nil then -- solves two issues - if bad group then it becomes other and we get a color for it group = "other" end color = colors[group] if msymbol == "y" then symbol = symbols[group] else if counter == "-letter" then symbol = "-letter" .. "-" .. group end symbol = "-number" .. "-" .. group end -- If counter parameter then it is all numbered either with -number or -number-xxxx -- Color is retained for the type or group if counter ~= "" and counter ~= nil then symbol = counter end newdata = newdata .. '\n<maplink class="icon" zoom="5" text="' .. name .. '" latitude="' .. latitude .. '" longitude="' .. longitude .. '" group="' .. group .. '">' -- newdata = newdata .. '\n<maplink class="no-icon" zoom="5" text="" latitude="' .. latitude .. '" longitude="' .. longitude .. '" group="' .. group .. '">' newdata = newdata .. '\n{\n\t"type": "Feature",\n\t"geometry": { "type":"Point", "coordinates":[' .. longitude .. ',' .. latitude .. '] },' newdata = newdata .. '\n\t"properties": {\n\t "title": "' .. name .. '",\n' newdata = newdata .. '\t"description": "' .. image .. content .. url .. '",\n' newdata = newdata .. '\t"marker-size": "medium",\n' newdata = newdata .. '\t"marker-color": "' .. color .. '",\n' newdata = newdata .. '\t"marker-symbol": "' .. symbol .. '"\n' newdata = newdata .. '}\n}\n</maplink> ' .. content end end end return frame.args[1] .. "\n" .. newdata end function p.pagesincategory(frame) local arg1 = frame.args[1] local entity = mw.wikibase.getEntityObject(arg1) if entity == nil then return end local name=mw.wikibase.sitelink(entity.id) return '{{#categorytree:' .. name .. '|hideroot|namespaces="-"}}' end function p.wikidataids(frame) local separator = "," local wikidatax = "" local list = frame.args['list'] or "" if list ~= nil and list ~= "" then list = string.gsub(list,"%s","") end local index = 1 local items = {} local flags = {} for str in string.gmatch(list,"([^"..separator.."]+)") do items[index] = str index = index + 1 end for i=1,#items do if not flags[items[i]] then flags[items[i]] = true wikidatax = wikidatax .. p.getwikidatax(items[i]) end end return "{|border=1\n" .. "! ID !! name !! countryID !! admin || lat !! long !! image !! wikipedia || wikivoyage !! Description \n|-\n" .. wikidatax .. "|}" end function p.getwikidatax(str) local id = "" local name = "" local country = "" local lat = "" local long = "" local image = "" local wikiname = "" local voysitename = "" local description = "" local lang = "" local admin = "" if string.match(str,"^[Qq]%d+$") == nil then return "" end local entity = mw.wikibase.getEntityObject(str) if entity == nil then return "" end local claims = entity.claims if claims == nil then return "" end id = str name = mw.wikibase.sitelink(str) if name == "" or name == nil then name = mw.wikibase.label(str) or "" end if pcall(function () t = entity.claims.P17[1].mainsnak.datavalue.value end) then for k, v in pairs( entity.claims.P17[1].mainsnak.datavalue.value ) do if k == "numeric-id" then country = country .. "Q" .. v end end if country ~= "" then country = "[[D:" .. country .. "|" .. country .. "]] - " .. mw.wikibase.label(country) end end if pcall(function () t = claims.P625 end) then if pcall(function () t = entity.claims.P625[1].mainsnak.datavalue.value.latitude end ) then lat = entity.claims.P625[1].mainsnak.datavalue.value.latitude end if pcall(function () t = entity.claims.P625[1].mainsnak.datavalue.value.longitude end ) then long = entity.claims.P625[1].mainsnak.datavalue.value.longitude end end if lat ~= "" and lat ~= nil and long ~= "" and long ~= nil then lat = string.format("%.6f",lat) -- format number to 6 decimal places ie. 10.00 becomes 10.000000 ie. 12.345 becomes 12.345000 ie. 1 becomes 1.000000 long = string.format("%.6f",long) -- format number to 6 decimal places see above lat = string.gsub(lat,"0+$","") -- strip any number of ending zeroes - 10.000000 becomes 10. 12.345000 becomes 12.345 1.000000 becomes 1. long = string.gsub(long,"0+$","") -- string any number of ending zeroes - see above late = string.gsub(lat,"%.$","") -- strip and ending period - 10. becomes 10, 12.345 remains and 1. becomes 1 long = string.gsub(long,"%.$","") -- strip an ending period end if pcall(function () t = claims.P18 end) then if pcall(function () t = entity.claims.P18[1].mainsnak.datavalue.value end ) then image = entity.claims.P18[1].mainsnak.datavalue.value end end -- Keeping only 1st value for administrative entity if pcall(function () t = claims.P131 end) then local t = {} if pcall(function () t = entity.claims.P131[1].mainsnak.datavalue.value end ) then t = entity.claims.P131[1].mainsnak.datavalue.value for k, v in pairs( t ) do admin = v if not mw.wikibase.label(admin) then admin = "" break end if admin ~= "" and admin ~= nil then admin = "[[D:" .. admin .. "|" .. admin .. "]] - " .. mw.wikibase.label(admin) break end end end end lang = mw.language.getContentLanguage(str).code or "en" local wiki = lang .. "wiki" local wikiname = entity:getSitelink(wiki) or "" if wikiname ~= "" and wikiname ~= nil then wikiname = "[[w:" .. lang .. ":" .. wikiname .. "|" .. wikiname .. "]]" end description = mw.wikibase.description(entity.id) if description == "" or description == nil then description = "" end voysitename = "" if pcall(function()t1 = entity:getSitelink("enwikivoyage") end) then voysitename = entity:getSitelink("enwikivoyage") or "" if voysitename ~= nil and voysitename ~= "" then voysitename = "[[" .. voysitename .."]]" end end if id ~= "" and id ~= nil then id = "[[D:" .. id .. "|" .. id .. "]]" end return "\n| " .. id .. " || " .. name .. " || " .. country .. " || " .. admin .. " || " .. lat .. " || " .. long .. " || " .. image .. " || " .. wikiname .. " || " .. voysitename .. " || " .. description .. "\n|-\n" end -- Create basic initial listings to work on in editor - can add more later -- Not all parameters are filled just the basic ones function p.wikidatalistings(frame) local separator = "," local wikidatax = "" local counter = 0 local interim = "" local list = frame.args['list'] or "" local listingtype = frame.args['type'] or "see" if list ~= nil and list ~= "" then list = string.gsub(list,"%s","") end local index = 1 local items = {} local flags = {} for str in string.gmatch(list,"([^"..separator.."]+)") do items[index] = str index = index + 1 end for i=1,#items do if not flags[items[i]] then flags[items[i]] = true interim = p.getwikidataxlistings(items[i],listingtype) if interim ~= "" then wikidatax = wikidatax .. interim end --- For future use as numbers only go to 99 counter = counter + 1 --- May want to change listing type or color -- wikidatax = wikidatax .. p.getwikidataxlistings(items[i],listingtype) end end return wikidatax end function p.getwikidataxlistings(str,listingtype) -- local alt = "" -- local email = "" -- local address = "" -- local directions = "" -- local phone = "" -- local tollfree = "" -- THESE PARAMETERS ARE NOT INCLUDED IN MAKING INITIAL BASIC LISTING -- local fax = "" -- local hours = "" -- local price = "" -- local checkin = "" -- local lastedit = "" -- THESE PARAMETERS ARE INCLUDED local id = "" local name = "" local url = "" local country = "" local lat = "" local long = "" local image = "" local wikiname = "" local voysitename = "" local description = "" local wiki = "" local lang = "" -- This is to allow this one function to be called separately from a list if type(str) == "table" then str = str.args[1] end local listingtype = listingtype or "see" if string.match(str,"^[Qq]%d+$") == nil then return "" end local entity = mw.wikibase.getEntityObject(str) if entity == nil then return "" end local claims = entity.claims if claims == nil then return "" end id = str name = mw.wikibase.sitelink(str) if name == "" or name == nil then name = mw.wikibase.label(str) or "" end if claims.P856 ~= nil then url = entity.claims.P856[1].mainsnak.datavalue.value url = string.gsub(url,"%,.*","") -- KEEP ONLY ONE end if pcall(function () t = claims.P625 end) then if pcall(function () t = entity.claims.P625[1].mainsnak.datavalue.value.latitude end ) then lat = entity.claims.P625[1].mainsnak.datavalue.value.latitude end if pcall(function () t = entity.claims.P625[1].mainsnak.datavalue.value.longitude end ) then long = entity.claims.P625[1].mainsnak.datavalue.value.longitude end end -- format lat and long if lat ~= "" and lat ~= nil and long ~= "" and long ~= nil then lat = string.format("%.6f",lat) -- format number to 6 decimal places ie. 10.00 becomes 10.000000 ie. 12.345 becomes 12.345000 ie. 1 becomes 1.000000 long = string.format("%.6f",long) -- format number to 6 decimal places see above lat = string.gsub(lat,"0+$","") -- strip any number of ending zeroes - 10.000000 becomes 10. 12.345000 becomes 12.345 1.000000 becomes 1. long = string.gsub(long,"0+$","") -- string any number of ending zeroes - see above late = string.gsub(lat,"%.$","") -- strip and ending period - 10. becomes 10, 12.345 remains and 1. becomes 1 long = string.gsub(long,"%.$","") -- strip an ending period end if pcall(function () t = claims.P18 end) then if pcall(function () t = entity.claims.P18[1].mainsnak.datavalue.value end ) then image = entity.claims.P18[1].mainsnak.datavalue.value end end lang = mw.language.getContentLanguage(arg1).code wiki = lang .. "wiki" wikiname = entity:getSitelink(wiki) or "" description = mw.wikibase.description(entity.id) if description == "" or description == nil then description = "" end voysitename = "" if pcall(function()t1 = entity:getSitelink("enwikivoyage") end) then voysitename = entity:getSitelink("enwikivoyage") or "" end if voysitename ~= "" and voysitename ~= nil then name = "[[" .. voysitename .. "|" .. name .. ']]' end return '\n* {{listing|type=' .. listingtype .. '|name=' .. name .. '|url=' .. url .. '|wikidata=' .. id .. '|wikipedia=' .. wikiname .. '|image=' .. image .. '|lat=' .. lat .. '|long=' .. long .. '|content=' .. description .. '}}' end -- gpxmaplink function -- {{safesubst:#invoke:Gpx|gpxmaplink|Test100|maplink=no|lat=65|long=102}} -- This module produces <maplinks> - considering argument to produce a <mapframe> will all contained as one <mapframe> -- Will create a maplink for each segment from a GPX file - will do up to 10 segments only. -- Most GPX template files contain at most 1-4 - a few have more. -- Single set of coordinates will produce a marker "Point" multiple coordinates will produce "LineString" -- colors are random -- all Points are the same color #ff33f3 whereas Lines are random -- can edit results as you see fit -- Arguments: -- "maplink=no" produces group segment of GPX coordinates only - default is "yes" is arg is missing -- and this will create Maplinks -- "lat=nnnn" - latitude otherwise a default is used (middle of Atlantic Ocean) -- "long=nnnn" - longitude otherwise default is used (middle of Atlantic Ocean) -- "set=n" or "set=all" = which group you want out of the track segments - 1 - 10 or all - all is default -- "info=" 'before or after' - some input files have <name> and <desc> after <trkseg> others after -- look at GPX file 1st then go ahead and add this arg. -- default is "before" function one(xdata,part1,part2,part1a,part2a,name,description,color) name = string.gsub(name,'^.*<name>','') name = string.gsub(name,'</name>.*$','') description = string.gsub(description,'^.*<desc>','') description = string.gsub(description,'</desc>.*$','') if xdata ~= "" then local _, commacount = string.gsub(xdata, '%,', '') if commacount > 2 then xdata = '[' .. xdata xdata = string.gsub(xdata,'^$s+','') xdata = string.gsub(xdata,'],$',']],') xdata = part1 .. xdata .. part2 xdata = string.gsub(xdata,'#00e500',color) else xdata = string.gsub(xdata,',$','') xdata = string.gsub(xdata,'^$s+','') xdata = part1a .. xdata .. part2a end xdata = string.gsub(xdata,'"title": ""','"title": "' .. name .. '"') xdata = string.gsub(xdata,'"description": ""','"description": "' .. description .. '"') end return xdata end function two(vdata) vdata = string.gsub(vdata,'.*%<trkpt.*lat%=%"',"") vdata = string.gsub(vdata,'%".*lon=%"','ALTERNATE') vdata = string.gsub(vdata,'%".*','') vdata = string.gsub(vdata,'(.*ALTERNATE)(.*)','%2%,%1') vdata = string.gsub(vdata,'ALTERNATE','') vdata = '[' .. vdata .. '],' return vdata end function p.gpxmaplink(frame) local page = frame.args[1] if page == nil then return end local title = mw.title.new(page) local lat = frame.args['lat'] or "38.5" local long = frame.args['long'] or "38.5" local maplink = frame.args['maplink'] or "yes" local set = frame.args['set'] or "all" local info = frame.args['info'] or "before" local tt1 = {} local count = 0 local separator = "@@@@@" local newdata = {} --local ele = "" --local elevation = {} --local checker = 0 local finalnewdata = "" local names = {} local descriptions = {} local colors = {"#662200", "#dc90a9", "#989f4d", "#acedc1", "#b43a32", "#cbffd3", "#bdd52b", "#fbbfb4", "#5c5c5c", "#ffffff"} local name = "" local description = "" local part1 = "" local part2 = "" local part1a = "" local part2a = "" local datagroup = 0 local goahead = 0 if title == nil then return end if title.id == 0 then return "Page does not exist!" end local data = title:getContent() if data == nil or data == "" then return end for i=0, 12 do names[i] = "" descriptions[i] = "" newdata[i] = "" end if maplink == "yes" then part1 = '<maplink class="no-icon" text="" latitude="' .. lat .. '" longitude="' .. long .. '" zoom="5" group="GPX">\n' part1 = part1 .. '{"type":\n\t"Feature","geometry":\n' part1 = part1 .. '\t{"coordinates":\n' part2 = '\n\t\t"type":"LineString"},' part2 = part2 .. '\n\t\t"properties":{' part2 = part2 .. '\n\t\t"title": "",' part2 = part2 .. '\n\t\t"description": "",' part2 = part2 .. '\n\t\t"stroke":"#00e500",' part2 = part2 .. '\n\t\t"stroke-width":3\n}}\n</maplink>\n' part1a = '<maplink class="no-icon" text="" latitude="' .. lat .. '" longitude="' .. long .. '" zoom="5" group="Point">\n' part1a = part1a .. '{"type":\n"Feature","geometry":{ "type":"Point", "coordinates":' part2a = " },\n" part2a = part2a .. '\t"properties": {' part2a = part2a .. '\n\t\t"title": "",' part2a = part2a .. '\n\t\t"description": "",' part2a = part2a .. '\n\t\t"marker-size": "medium",' part2a = part2a .. '\n\t\t"marker-color": "#ff33f3",' part2a = part2a .. '\n\t\t"marker-symbol": "marker"\n}}</maplink>\n' end --data = string.gsub(data,'%s+%<%s+ele%s+%>','@@@@@<ele') --data = string.gsub(data,'%s+%<%s+/%s+ele%s+%>','</ele>@@@@@') -- prep for elevation - output maplink and pointers with elevation? future data = string.gsub(data,'%s+%<%s+name%s+%>','@@@@@<name') data = string.gsub(data,'%s+%<%s+/%s+name%s+%>','</name>@@@@@') data = string.gsub(data,'%s+%<%s+desc%s+%>','@@@@@<desc') data = string.gsub(data,'%s+%<%s+/%s+desc%s+%>','</desc>@@@@@') data = string.gsub(data,'%s+%<%s+trkseg%s+%>','@@@@@<trkseg') data = string.gsub(data,'%s+%<%s+/%s+trkseg%s+%>','</trkseg>@@@@@') data = string.gsub(data,'%s+%<%s+trkpt%s+%>','@@@@@<trkpt') data = string.gsub(data,'%s+%<%s+%/%s+trkpt%s+%>','</trkpt>@@@@@') data = string.gsub(data,'%/%>','/>@@@@@') data = data .. '@@@@@<trksegENDIT>@@@@@' data = string.gsub(data,"\n","@@@@@") data = string.gsub(data,"@@@@@@@@@@","@@@@@") local _, datagroup = string.gsub(data, "<trkseg>", "") if datagroup == 0 then return "no trkseg" end for i = 1,datagroup, 1 do data = string.gsub(data,"<trkseg>", "<trkseg" .. tostring(i) .. ">",1) end for line in string.gmatch(data,"([^"..separator.."]+)") do tt1[count] = line count = count + 1 end for k,v in pairs(tt1) do if string.find(v,'<name>',1) ~= nil then name = v end --if string.find(v,'<trkpt>',1) ~= nil then --elevation[checker] = v --checker = checker + 1 --end --if string.find(v,'<ele>',1) ~= nil then -- prep for creating elevation maplink -- elevation[checker] = v --end if string.find(v,'<desc>',1) ~= nil then description = v end for i=1, 10 do if string.find(v,'<trkseg' .. tostring(i) .. '>',1) ~= nil then goahead = i names[1] = name name = "" descriptions[i] = description description = "" break end end if string.find(v,'<trksegENDIT>',1) ~= nil then names['END'] = name name = "" descriptions['END'] = description description = "" end for i=1, 10 do if goahead == i then if set == "1" or set == "all" then if string.find(v,'<trkpt',1) ~= nil then v = two(v) newdata[i] = newdata[i] .. v end end end end end -- END OF CYCLING THROUGH LINE BY LINE if info == "after" then for i=1, goahead do names[i] = names[i + 1] descriptions[i] = descriptions[i + 1] end names[goahead] = names['END'] descriptions[goahead] = descriptions['END'] end for i=1, goahead do newdata[i] = one(newdata[i],part1,part2,part1a,part2a,names[i],descriptions[i],colors[i]) end for i=1, goahead do finalnewdata = finalnewdata .. newdata[i] .. "\n" end finalnewdata = string.gsub(finalnewdata,'\n+$','\n') finalnewdata = string.gsub(finalnewdata,'%]%]%,',']],\n') return finalnewdata end -- STAGING a CIRCLE start -- Extra functions while looking at how to build a circle - may be useful for others in building circles etc. -- using some other method. Little or no useful help was found while searching the internet for -- the not so mathematically (trigonometry, algebra etc.) inclined such as myself - hardly anything -- This function is the result of an exhausting trial and error process of what is called Iterative Programming -- The function newlat below is used by p.circle function newlat(a) -- newlat = math.log(math.tan((90 + a) * math.pi / 360)) / (math.pi / 180) -- worked this code elsewhere in function can remove newlatitude = 180/math.pi * (2 * math.atan(math.exp( a * math.pi/180)) - math.pi/2 ) if newlatitude > 89.5 then point = 89.5 end -- END if -- straight line at top of map if newlatitude < -89.5 then point = -89.5 end -- END if -- straight line at bottom of map return newlatitude end -- CIRCLE FUNCTION -- Get coordinates for a circle to use for drawing a line (LineString) - not filled in -- or get coordinates to build a geoshape (Polygon) -- Note: Polygon can be edited to do just an outline or a solid filled in circle -- Colors etc. can also be changed for fill or outline (stroke) - thickness for stroke as well -- Latitude and Longitude formatted to %6f or 6 numbers after decimal point - can increase -- Arguments or parameters: -- Required: -- lat - latitude - ie. 27.0 - error msg will show if missing -- long - longitude - ie. 28.0 - error msg will show if missing -- Optional -- type - "line" or "poly" default is "line" -- group - group name to be used as "show" argument in <mapframe> - default is "circle" -- title - title to be used in <maplink> -- default is "A circle" -- desc - description default is "" -- radius - radius of circle to be implemented - default is .5 -- MAX set at 10 -- and can not be less than or equal to 0 -- fill - default set to #ccef64 if missing -- stroke - default set to #0000ff -- marker - y or yes - create a marker - at input lat long -- Code example: -- {{safesubst:#invoke:Sandbox/Matroc|circle|lat=22.35|long=70.07|type=poly|radius=10|fill=#000000|stroke=#0000cc}} -- This creates a <maplink> -- Uses - function newlat -- Note: Yes this is OLD STYLE function p.circle(frame) if frame.args['lat'] == nil then error("Missing argument lat!") end -- END if if frame.args['long'] == nil then error("Missing argument long!") end -- EMD if local x = string.format("%.6f",frame.args['lat']) local y = string.format("%.6f",frame.args['long']) local lat = frame.args['lat'] local long = frame.args['long'] local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end if tonumber(frame.args['lat']) > 85.35 or tonumber(frame.args['lat']) < -85.35 then error("Latitude must be between 85.35 and -85.35!") end -- END if -- I set this as a default - function will not handle the polar circles yet will still handle areas within the majority of a map if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end -- END if -- this will draw a full circle at 0 lat and 180 long local group = frame.args['group'] or 'circle' local title = frame.args['title'] or 'A circle' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" -- default -- radius of 10 is approx. 500 km - futz with sizes - below 3 would probably be adequate - .1 is about 20km - .0001 is about 30 m r = tonumber(r) if r > 10 then error("10 for radius is MAX") end -- END if - my default if r <= 0 then error("radius has to be greater than 0") end -- END if local fill = frame.args['fill'] or "#ccef64" if string.len(fill) ~= 7 then error("Incorrect length for argument fill!") end -- END if if string.gsub(fill,"#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]","") ~= "" then error("Incorrect hexidecimal format for argument fill!") end -- END if local stroke = frame.args['stroke'] or "#0000ff" if string.len(stroke) ~= 7 then error("Incorrect length for argument stroke!") end -- END if if string.gsub(stroke,"#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]","") ~= "" then error("Incorrect hexidecimal format for argument stroke!") end -- END if local data = {} local coordinates = "" local ptx = 0 local pty = 0 local angle = 0 local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end -- END if -- Text for building a maplink - added together with circle coordinates in final output -- This can be modified to output in different order or format if so desired -- my default local part1a = '<maplink class="no-icon" text="" latitude="' .. lat .. '" longitude="' .. long .. '" ' local part1a = part1a .. 'zoom="5" group="' .. group .. '">\n{"type": "Feature","geometry":\t{"coordinates":\n' local part2a = '\n\t\t"type":"LineString"},\n\t"properties":{\n\t\t"title": "' .. title .. '",\n' local part2a = part2a .. '\t\t"description": "' .. description .. '",\n' local part2a = part2a .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":1\n}}\n</maplink>\n' local part1b = '<maplink class="no-icon" text="" latitude="' .. lat .. '" longitude="' .. long .. '" ' local part1b = part1b .. 'zoom="5" group="' .. group .. '">\n{"type": "Feature","geometry":\t{"coordinates":\n' local part2b = '\n\t\t"type":"Polygon"},\n\t"properties":{\n\t\t"title": "' .. title .. '",\n' local part2b = part2b .. '\t\t"description": "' .. description .. '",\n\t\t"fill": "' .. fill .. '",\n' local part2b = part2b .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":1\n}}\n</maplink>\n' -- fix latitude to position on mercator openstreetmap - -10.5 to + 10.5 is my default as -- circles in these latitudes are fine for circle drawing if tonumber(x) >= 10.5 then x = math.log(math.tan((90 + x) * math.pi/360)) / (math.pi/180) elseif tonumber(x) <= -10.5 then x = math.log(math.tan((90 + x) * math.pi/360)) / (math.pi/180) end -- END if ELSEIF -- get the latitude & longitudinal places for building or drawing a circle -- this is a common method to build a 360 degree circle for i = 1, 360 do angle = i * math.pi / 180 ptx = x + r * math.cos( angle ) pty = y + r * math.sin( angle ) -- ptx, pty = x + r * math.cos( angle ), y + r * math.sin( angle ) -- original code split for readability above -- fix latitude so that the circle is output and not an eliptical polygon at higher or lower latitudes - this would be due -- to something called isotropy within a mercator projection if tonumber(x) >= 10.5 then ptx = newlat(ptx) -- makes correction to make circle show up on map - upper latitudes end -- END if if tonumber(x) <= -10.5 then ptx = newlat(ptx) -- makes correction to make circle show up on map - lower latitudes end -- END if data[i] = '[' .. string.format("%.6f",pty) .. "," .. string.format("%.6f",ptx) .. ']' end -- END for -- cycle through array and put in a separator symbol (every fifth) so we can put groups of -- 5 coordinates on a single line - in the maplink format for i = 5,359, 5 do data[i] = data[i] .. "@@@@@" end -- END for -- cycle through array and build single string of all coordinates to be output for i = 1,360, 1 do coordinates = coordinates .. data[i] end -- END for -- fix the string to arrange the coordinates with brackets "[]"s separated by "," coordinates = coordinates.gsub(coordinates,'%]%[','],[') coordinates = coordinates.gsub(coordinates,'%]@@@@@%[','],\n[') coordinates = "[" .. coordinates .. ',' .. data[1] .. "]," -- close the circle extra precautionary measure -- format string coordinates or linestring if a polygon or linestring if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']],') coordinates = part1b .. string.gsub(coordinates,'^%[','[[') .. part2b else coordinates = part1a .. coordinates .. part2a end -- END if if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Circle|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- BOX or RECTANGLE -- Build a box -- Args: -- upper -- latitude and longitude for upper left hand corner -- upper=latitude,longitude -- lower -- latitude and longitude for lower right hand corner -- lower=latitude,longitude -- type -- line or poly -- marker -- y or yes to build an extra marker to place in center of box -- group -- group name -- title -- title -- description -- brief description -- fill -- fill color -- stroke -- color of outline -- Code to build small box for Kronstadt (Russia): -- {{#invoke:Sandbox/Matroc|box|upper=60.03732,29.62099|lower=,59.96866,29.82149|type=poly|title=Kronstadt|marker=y}} function p.box(frame) if frame.args['upper'] == nil or frame.args['upper'] == "" then error("Missing argument upper!") end if frame.args['lower'] == nil or frame.args['lower'] == "" then error("Missing argument lower!") end local separator = "@@@@@" local x = string.gsub(frame.args['upper'],'%,','@@@@@') local y = string.gsub(frame.args['lower'],'%,','@@@@@') x = string.gsub(x,'%s+','') y = string.gsub(y,'%s+','') local tt = {} local data = {} local latitudes = {} local longitudes = {} local count = 1 local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end for str in string.gmatch(x,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then tt[count] = str count = count + 1 end end for str in string.gmatch(y,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then tt[count] = str count = count + 1 end end if count >=6 then error("Check the upper and lower arguments for format!") end for i=1,4 do if tt[i] == nil or tt[i] == "" then error("Check for missing latitude or longitude separated by a comma!") end end longitudes[1] = tonumber(tt[2]) if longitudes[1] > 180 or longitudes[1] <- 180 then error("longitude should be between 180 and -180") end data[1] = "[" .. tt[2] latitudes[1] = tonumber(tt[1]) if latitudes[1] > 90 or latitudes[1] <- 90 then error("latitude should be between 90 and -90") end data[2] = "," .. tt[1] .. "]" longitudes[2] = tonumber(tt[2]) if longitudes[2] > 180 or longitudes[2] <- 180 then error("longitude should be between 180 and -180") end data[3] = "[" .. tt[2] latitudes[2] = tonumber(tt[3]) if latitudes[2] > 90 or latitudes[2] <- 90 then error("latitude should be between 90 and -90") end data[4] = "," .. tt[3] .. "]" longitudes[3] = tonumber(tt[4]) if longitudes[3] > 180 or longitudes[3] <- 180 then error("longitude should be between 180 and -180") end data[5] = "[" .. tt[4] latitudes[3] = tonumber(tt[3]) if latitudes[3] > 90 or latitudes[3] <- 90 then error("latitude should be between 90 and -90") end data[6] = "," .. tt[3] .. "]" longitudes[4] = tonumber(tt[4]) if longitudes[4] > 180 or longitudes[4] <- 180 then error("longitude should be between 180 and -180") end data[7] = "[" .. tonumber(tt[4]) latitudes[4] = tonumber(tt[1]) if latitudes[4] > 90 or latitudes[4] <- 90 then error("latitude should be between 90 and -90") end data[8] = "," .. tt[1] .. "]" -- if one wants to output a marker or center of box -- as well as assign the lat/long arguments to maplink (not for geometry coordinates) table.sort(latitudes) table.sort(longitudes) local lat = latitudes[1] + ((latitudes[4] - latitudes[1]) / 2 ) local long = longitudes[1] + ((longitudes[4] - longitudes[1]) / 2) local group = frame.args['group'] or 'box' local title = frame.args['title'] or 'A box' local description = frame.args['desc'] or '' local fill = frame.args['fill'] or "#ccef64" if string.len(fill) ~= 7 then error("Incorrect length for argument fill!") end if string.gsub(fill,"#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]","") ~= "" then error("Incorrect hexidecimal format for argument fill!") end local stroke = frame.args['stroke'] or "#0000ff" if string.len(stroke) ~= 7 then error("Incorrect length for argument stroke!") end if string.gsub(stroke,"#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]","") ~= "" then error("Incorrect hexidecimal format for argument stroke!") end local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end -- Text for building a maplink - added together with box coordinates in final output -- This can be modified to output in different order if so desired - my default local part1a = '<maplink class="no-icon" text="" latitude="' .. lat .. '" longitude="' .. long .. '" ' local part1a = part1a .. 'zoom="5" group="' .. group .. '">\n{"type": "Feature","geometry":\t{"coordinates":\n' local part2a = '\n\t\t"type":"LineString"},\n\t"properties":{\n\t\t"title": "' .. title .. '",\n' local part2a = part2a .. '\t\t"description": "' .. description .. '",\n' local part2a = part2a .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":1\n}}\n</maplink>\n' local part1b = '<maplink class="no-icon" text="" latitude="' .. lat .. '" longitude="' .. long .. '" ' local part1b = part1b .. 'zoom="5" group="' .. group .. '">\n{"type": "Feature","geometry":\t{"coordinates":\n' local part2b = '\n\t\t"type":"Polygon"},\n\t"properties":{\n\t\t"title": "' .. title .. '",\n' local part2b = part2b .. '\t\t"description": "' .. description .. '",\n\t\t"fill": "' .. fill .. '",\n' local part2b = part2b .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":1\n}}\n</maplink>\n' -- cycle through array and build single string of all coordinates to be output for i = 1,8, 1 do coordinates = coordinates .. data[i] end coordinates = coordinates .. data[1] .. data[2] -- close the box/rectangle polygon -- fix the string to arrange the coordinates with brackets "[]"s separated by "," coordinates = coordinates.gsub(coordinates,'%]%[','],[') coordinates = coordinates.gsub(coordinates,'%]@@@@@%[','],\n[') coordinates = "[" .. coordinates .. "]," -- format string coordinates or linestring if a polygon or linestring if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']],') coordinates = part1b .. string.gsub(coordinates,'^%[','[[') .. part2b else coordinates = part1a .. coordinates .. part2a end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Box|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- TRIANGLE -- Build a triangle -- Args: -- coord1 -- latitude and longitude for point1 of triangle -- coord1=latitude,longitude -- coord2 -- latitude and longitude for point2 of triangle -- coord2=latitude,longitude -- coord3 -- latitude and longitude for point3 of triangle -- coord2=latitude,longitude -- type -- line or poly -- marker -- y or yes to build an extra vicinity marker to place in center of box -- with the name "Center Triangle" -- group -- group name -- title -- title -- description -- brief description -- fill -- fill color -- stroke -- color of outline -- Code for Bermuda Triangle: -- {{safesubst:#invoke:Sandbox/Matroc|triangle|coord1=25.72909,-80.23744|coord2=32.313,-64.765|coord3=18.46633,-66.104736|type=poly|fill=#000000|marker=y}} function p.triangle(frame) if frame.args['coord1'] == nil or frame.args['coord1'] == "" then error("Missing argument coord1!") end if frame.args['coord2'] == nil or frame.args['coord2'] == "" then error("Missing argument coord2!") end if frame.args['coord3'] == nil or frame.args['coord3'] == "" then error("Missing argument coord3!") end local separator = "@@@@@" local x = string.gsub(frame.args['coord1'],'%,','@@@@@') local y = string.gsub(frame.args['coord2'],'%,','@@@@@') local z = string.gsub(frame.args['coord3'],'%,','@@@@@') x = string.gsub(x,'%s+','') y = string.gsub(y,'%s+','') z = string.gsub(z,'%s+','') local tt = {} local data = {} local latitudes = {} local longitudes = {} local count = 1 local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end for str in string.gmatch(x,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then tt[count] = str count = count + 1 end end for str in string.gmatch(y,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then tt[count] = str count = count + 1 end end for str in string.gmatch(z,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then tt[count] = str count = count + 1 end end if count >=8 then error("Check the upper and lower arguments for format!") end for i=1,6 do if tt[i] == nil or tt[i] == "" then error("Check for missing latitude or longitude separated by a comma!") end end longitudes[1] = tonumber(tt[2]) if longitudes[1] > 180 or longitudes[1] <- 180 then error("longitude should be between 180 and -180") end data[1] = "[" .. tt[2] latitudes[1] = tonumber(tt[1]) if latitudes[1] > 90 or latitudes[1] <- 90 then error("latitude should be between 90 and -90") end data[2] = "," .. tt[1] .. "]" longitudes[2] = tonumber(tt[4]) if longitudes[2] > 180 or longitudes[2] <- 180 then error("longitude should be between 180 and -180") end data[3] = "[" .. tt[4] latitudes[2] = tonumber(tt[3]) if latitudes[2] > 90 or latitudes[2] <- 90 then error("latitude should be between 90 and -90") end data[4] = "," .. tt[3] .. "]" longitudes[3] = tonumber(tt[6]) if longitudes[3] > 180 or longitudes[3] <- 180 then error("longitude should be between 180 and -180") end data[5] = "[" .. tt[6] latitudes[3] = tonumber(tt[5]) if latitudes[3] > 90 or latitudes[3] <- 90 then error("latitude should be between 90 and -90") end data[6] = "," .. tt[5] .. "]" -- if one wants to output a marker or find center of box -- as well as assign the lat/long arguments to maplink (not for geometry coordinates) local lat = (latitudes[1] + latitudes[2] + latitudes[3]) / 3 local long = (longitudes[1] + longitudes[2] + longitudes[3]) / 3 lat = string.format("%.6f",lat) long = string.format("%.6f",long) local group = frame.args['group'] or 'triangle' local title = frame.args['title'] or 'A triangle' local description = frame.args['desc'] or '' local fill = frame.args['fill'] or "#ccef64" if string.len(fill) ~= 7 then error("Incorrect length for argument fill!") end if string.gsub(fill,"#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]","") ~= "" then error("Incorrect hexidecimal format for argument fill!") end local stroke = frame.args['stroke'] or "#0000ff" if string.len(stroke) ~= 7 then error("Incorrect length for argument stroke!") end if string.gsub(stroke,"#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]","") ~= "" then error("Incorrect hexidecimal format for argument stroke!") end local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end -- Text for building a maplink - added together with box coordinates in final output -- This can be modified to output in different order if so desired - my default local part1a = '<maplink class="no-icon" text="" latitude="' .. lat .. '" longitude="' .. long .. '" ' local part1a = part1a .. 'zoom="5" group="' .. group .. '">\n{"type": "Feature","geometry":\t{"coordinates":\n' local part2a = '\n\t\t"type":"LineString"},\n\t"properties":{\n\t\t"title": "' .. title .. '",\n' local part2a = part2a .. '\t\t"description": "' .. description .. '",\n' local part2a = part2a .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":1\n}}\n</maplink>\n' local part1b = '<maplink class="no-icon" text="" latitude="' .. lat .. '" longitude="' .. long .. '" ' local part1b = part1b .. 'zoom="5" group="' .. group .. '">\n{"type": "Feature","geometry":\t{"coordinates":\n' local part2b = '\n\t\t"type":"Polygon"},\n\t"properties":{\n\t\t"title": "' .. title .. '",\n' local part2b = part2b .. '\t\t"description": "' .. description .. '",\n\t\t"fill": "' .. fill .. '",\n' local part2b = part2b .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":1\n}}\n</maplink>\n' -- cycle through array and build single string of all coordinates to be output for i = 1,6, 1 do coordinates = coordinates .. data[i] end coordinates = coordinates .. data[1] .. data[2] -- close the triangle -- fix the string to arrange the coordinates with brackets "[]"s separated by "," coordinates = coordinates.gsub(coordinates,'%]%[','],[') coordinates = coordinates.gsub(coordinates,'%]@@@@@%[','],\n[') coordinates = "[" .. coordinates .. "]," -- format string coordinates or linestring if a polygon or linestring if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']],') coordinates = part1b .. string.gsub(coordinates,'^%[','[[') .. part2b else coordinates = part1a .. coordinates .. part2a end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Triangle|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- ELIPSE -- Essentially the same code for a circle - this elipise if set to a certain shape -- Get coordinates for an elipse to use for drawing a line (LineString) - not filled in -- or get coordinates to build a geoshape (Polygon) -- Note: Polygon can be edited to do just an outline or a solid filled in elipse -- Colors etc. can also be changed for fill or outline (stroke) - thickness for stroke as well -- Latitude and Longitude formatted to %6f or 6 numbers after decimal point - can increase -- If its a polygon and you want it to appear with no fill edit output by adding "fill-opacity":, also can change this to a 0 or 1 I think to make -- the fill solid with no opacity -- Arguments or parameters: -- Required: -- lat - latitude - ie. 27.0 - error msg will show if missing -- long - longitude - ie. 28.0 - error msg will show if missing -- Optional -- type - "line" or "poly" default is "line" -- group - group name to be used as "show" argument in <mapframe> - default is "circle" -- title - title to be used in <maplink> -- default is "A circle" -- desc - description default is "" -- radius - radius of circle before it is changed to be implemented - default is .5 -- MAX set at 10 -- and can not be less than or equal to 0 -- fill - default set to #ccef64 if missing -- stroke - default set to #0000ff -- marker - y or yes - create a marker - at input lat long -- style - h or v -- horizontal or vertical - horizontal or h is default -- Code example: -- {{safesubst:#invoke:Sandbox/Matroc|elipse|lat=22.35|long=70.07|type=poly|radius=10|marker=y|style=h}} -- This creates a <maplink> with coordinates and a marker function p.elipse(frame) if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end local x = string.format("%.6f",frame.args['lat']) local y = string.format("%.6f",frame.args['long']) local lat = frame.args['lat'] local long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end local group = frame.args['group'] or 'elipse' local title = frame.args['title'] or 'An elipse' local description = frame.args['desc'] or '' local r = frame.args['radius'] or ".5" -- default r = tonumber(r) if r > 10 then error("10 for radius is MAX") end -- my default if r <= 0 then error("radius has to be greater than 0") end local fill = frame.args['fill'] or "#ccef64" if string.len(fill) ~= 7 then error("Incorrect length for argument fill!") end if string.gsub(fill,"#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]","") ~= "" then error("Incorrect hexidecimal format for argument fill!") end local stroke = frame.args['stroke'] or "#0000ff" if string.len(stroke) ~= 7 then error("Incorrect length for argument stroke!") end if string.gsub(stroke,"#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]","") ~= "" then error("Incorrect hexidecimal format for argument stroke!") end local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end local style = frame.args['style'] or "h" if style == nil or style == "" then style = "h" end if style ~= "v" then style = "h" end -- if not v (ie. other garbage then force style to be h) local data = {} local coordinates = "" local ptx = 0 local pty = 0 local angle = 0 local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end -- Text for building a maplink - added together with elipse coordinates in final output -- This can be modified to output in different order if so desired - my default local part1a = '<maplink class="no-icon" text="" latitude="' .. lat .. '" longitude="' .. long .. '" ' local part1a = part1a .. 'zoom="5" group="' .. group .. '">\n{"type": "Feature","geometry":\t{"coordinates":\n' local part2a = '\n\t\t"type":"LineString"},\n\t"properties":{\n\t\t"title": "' .. title .. '",\n' local part2a = part2a .. '\t\t"description": "' .. description .. '",\n' local part2a = part2a .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":1\n}}\n</maplink>\n' local part1b = '<maplink class="no-icon" text="" latitude="' .. lat .. '" longitude="' .. long .. '" ' local part1b = part1b .. 'zoom="5" group="' .. group .. '">\n{"type": "Feature","geometry":\t{"coordinates":\n' local part2b = '\n\t\t"type":"Polygon"},\n\t"properties":{\n\t\t"title": "' .. title .. '",\n' local part2b = part2b .. '\t\t"description": "' .. description .. '",\n\t\t"fill": "' .. fill .. '",\n' local part2b = part2b .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":1\n}}\n</maplink>\n' -- fix latitude to position on mercator openstreetmap - -10.5 to + 10.5 is my default as -- circles in these latitudes are fine for circle drawing if tonumber(x) >= 10.5 then x = math.log(math.tan((90 + x) * math.pi/360)) / (math.pi/180) elseif tonumber(x) <= -10.5 then x = math.log(math.tan((90 + x) * math.pi/360)) / (math.pi/180) end -- get the latitude & longitudinal places for an elipse for i = 1, 360 do angle = i * math.pi / 180 ptx = x + r * math.cos( angle ) if style == "v" then pty = y - 0.5 * r * math.sin( angle ) -- for elipse vertical elseif style == "h" then pty = y + 2.0 * r * math.sin(angle) -- for elipse horizontal end -- ptx, pty = x + r * math.cos( angle ), y + r * math.sin( angle ) -- fix latitude so that the elipse is output even at higher or lower latitudes if tonumber(x) >= 10.5 then ptx = newlat(ptx) -- makes correction to make circle show up on map end if tonumber(x) <= -10.5 then ptx = newlat(ptx) -- makes correction to make circle show up on map end data[i] = '[' .. string.format("%.6f",pty) .. "," .. string.format("%.6f",ptx) .. ']' end -- cycle through array and put in a separator symbol (every fifth) so we can put groups of -- 5 coordinates on a single line - in the maplink format for i = 5,359, 5 do data[i] = data[i] .. "@@@@@" end -- cycle through array and build single string of all coordinates to be output for i = 1,360, 1 do coordinates = coordinates .. data[i] end -- fix the string to arrange the coordinates with brackets "[]"s separated by "," coordinates = coordinates.gsub(coordinates,'%]%[','],[') coordinates = coordinates.gsub(coordinates,'%]@@@@@%[','],\n[') coordinates = "[" .. coordinates .. ',' .. data[1] .. "]," -- close the circle extra precautionary measure -- format string coordinates or linestring if a polygon or linestring if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']],') coordinates = part1b .. string.gsub(coordinates,'^%[','[[') .. part2b else coordinates = part1a .. coordinates .. part2a end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Elipse|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- STAR -- Get coordinates for a star to use for drawing a line (LineString) - not filled in -- or get coordinates to build a filled in geoshape (Polygon) -- Note: Polygon can be edited to do just an outline or a solid filled in elipse -- Colors etc. can also be changed for fill or outline (stroke) - thickness for stroke as well -- Latitude and Longitude formatted to %6f or 6 numbers after decimal point - can increase -- Arguments or parameters: -- Required: -- lat - latitude - ie. 27.0 - error msg will show if missing -- long - longitude - ie. 28.0 - error msg will show if missing -- Optional -- type - "line" or "poly" default is "line" -- group - group name to be used as "show" argument in <mapframe> - default is "star" -- title - title to be used in <maplink> -- default is "A star" -- desc - description default is "" -- radius - radius of circle upon which a star is built - default is .5 -- MAX set at 10 -- and can not be less than or equal to 0 -- fill - default set to #ccef64 if missing -- stroke - default set to #0000ff -- marker - y or yes - create a marker - at input lat long -- Code example: -- {{safesubst:#invoke:Circle4|star|lat=22.35|long=70.07|type=poly|radius=10}} -- This creates a <maplink> function p.star(frame) if frame.args['lat'] == nil then error("Missing argument lat!") end if frame.args['long'] == nil then error("Missing argument long!") end local latitude = string.format("%.6f",frame.args['lat']) local longitude = string.format("%.6f",frame.args['long']) local lat = frame.args['lat'] local long = frame.args['long'] if tonumber(frame.args['lat']) > 90 or tonumber(frame.args['lat']) < -90 then error("Latitude must be between 90 and -90!") end if tonumber(frame.args['long']) > 180 or tonumber(frame.args['long']) < -180 then error("Longitude must be between 180 and -180!") end local group = frame.args['group'] or 'star' local title = frame.args['title'] or 'A star' local description = frame.args['desc'] or '' local radius = frame.args['radius'] or ".5" -- default radius = tonumber(radius) if radius > 10 then error("10 for radius is MAX") end -- my default if radius <= 0 then error("radius has to be greater than 0") end local radius2 = radius * 3; local fill = frame.args['fill'] or "#ccef64" if string.len(fill) ~= 7 then error("Incorrect length for argument fill!") end if string.gsub(fill,"#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]","") ~= "" then error("Incorrect hexidecimal format for argument fill!") end local stroke = frame.args['stroke'] or "#0000ff" if string.len(stroke) ~= 7 then error("Incorrect length for argument stroke!") end if string.gsub(stroke,"#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]","") ~= "" then error("Incorrect hexidecimal format for argument stroke!") end local marker = frame.args['marker'] or "no" if marker == nil or marker == "" then marker = "no" end latitude = math.log(math.tan((90 + latitude) * math.pi/360)) / (math.pi/180) local ra = 0 local angle = 0 local points = {} local coordinates = "" local type = frame.args['type'] or "line" -- default line for LineString if type ~= "line" then type = "poly" end local part1a = '<maplink text="" latitude="' .. lat .. '" longitude="' .. long .. '" ' local part1a = part1a .. 'zoom="5" group="' .. group .. '">\n{"type": "Feature","geometry":\t{"coordinates":\n' local part2a = '\n\t\t"type":"LineString"},\n\t"properties":{\n\t\t"title": "' .. title .. '",\n' local part2a = part2a .. '\t\t"description": "' .. description .. '",\n' local part2a = part2a .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":1\n}}\n</maplink>\n' local part1b = '<maplink text="" latitude="' .. lat .. '" longitude="' .. long .. '" ' local part1b = part1b .. 'zoom="5" group="' .. group .. '">\n{"type": "Feature","geometry":\t{"coordinates":\n' local part2b = '\n\t\t"type":"Polygon"},\n\t"properties":{\n\t\t"title": "' .. title .. '",\n' local part2b = part2b .. '\t\t"description": "' .. description .. '",\n\t\t"fill": "' .. fill .. '",\n' local part2b = part2b .. '\t\t"stroke":"' .. stroke .. '",\n\t\t"stroke-width":1\n}}\n</maplink>\n' for i = 1,10, 1 do mod = math.mod(i,2) if mod == 1 then ra = radius else ra = radius2 end angle = ((2 * math.pi / 10)) * i points[i] = '[' .. string.format("%.6f",longitude + (ra * math.cos(angle))) .. "," points[i] = points[i] .. string.format("%.6f",newlat(latitude + (ra * math.sin(angle)))) .. "]," end for i = 1,10, 1 do coordinates = coordinates .. points[i] .. "\n" end coordinates = coordinates .. points[1] if type == "poly" then coordinates = string.gsub(coordinates,'%]%,$',']]],') coordinates = part1b .. string.gsub(coordinates,'^%[','[[[') .. part2b else coordinates = string.gsub(coordinates,'%]%,$',']],') coordinates = part1a .. string.gsub(coordinates,'^%[','[[') .. part2a end if marker == "yes" or marker == "y" then coordinates = coordinates .. '\n* {{marker|type=vicinity|name=Center Star|lat=' .. lat .. "|long=" .. long .. '}}\n' end return coordinates end -- Load a page and scan it for listing templates and find duplicate parameters function p.checkparameters(frame) local page = frame.args[1] or "Main Page" local flags = frame.args['flags'] or "n" if flags ~= "y" then flags = "n" end -- Images from {{flag|name}} as in embassies -- y or n local title = mw.title.new(page) if title == nil then return end if title.id == 0 then return "Page does not exist!" end local data = title:getContent() if data == nil or data == "" then return "" end -- Isolate listings,eliminate extra spaces etc. and and pull them out of data local separator = "@@@@@" data = string.gsub(data,'\n',' ') data = string.gsub(data,'%s+',' ') data = string.gsub(data,"http://www","HTTPWWW") data = string.gsub(data,"https://www","HTTPSWWW") data = string.gsub(data,"http://","HTTP") data = string.gsub(data,"https://",'HTTPS') data = string.gsub(data,'%s+=%s+','=') data = string.gsub(data,'%s+|%s+','|') data = string.gsub(data,'%s+}','}') data = string.gsub(data,'{%s+','{') -- eliminate some templates to minimize later processing data = string.gsub(data,'{{deadlink','DEADLINK') data = string.gsub(data,'{{dead link','DEADLINK') data = string.gsub(data,'{{ISBN','ISBN') data = string.gsub(data,'{{seealso','SEEALSO') data = string.gsub(data,'{{see also','SEEALSO') data = string.gsub(data,'{{seeDistricts}}','') -- other hatnotes could be added here as well data = string.gsub(data,'{{SeeDistricts}}','') data = string.gsub(data,'{{pagebanner','PAGEBANNER') data = string.gsub(data,'{{quickbar','QUICKBAR') data = string.gsub(data,'{{regionlist','REGIONLIST') data = string.gsub(data,'{{Regionlist','REGIONLIST') data = string.gsub(data,'{{translate','TRANSLATE') data = string.gsub(data,'{{IATA','IATA') data = string.gsub(data,'{{related','RELATED') data = string.gsub(data,'{{geo','GEO') data = string.gsub(data,'{{infobox','INFOBOX') data = string.gsub(data,'{{','@@@@@') data = string.gsub(data,'%s+@@@@@%s+','@@@@@') local index = 0 local items = {} local flags = {} local number = 0 for str in string.gmatch(data,"([^"..separator.."]+)") do str = string.gsub(str,'DEADLINK.*%d%d%d%d}}','') -- template inside a template removestring str = string.gsub(str,'}}.*','') local check = { 'Listing', 'Marker', 'See', 'Do', 'Buy', 'Eat', 'Drink', 'Sleep', 'listing', 'marker', 'see', 'do', 'buy', 'eat', 'drink', 'sleep'} -- pick out listings by type Listing,See, Do, Buy, Eat, Drink and Sleep for k,v in ipairs(check) do if string.match(str,"^" .. v) then index = index + 1 items[index] = str break end end end local dummy = "" local dump1 = "" local newitems = {} local count2 = 0 check = {'Listing', 'Marker', 'See', 'Do', 'Buy', 'Eat', 'Drink', 'Sleep', 'listing', 'marker', 'see', 'do', 'buy', 'eat', 'drink', 'sleep'} if index >= 1 then for i=1,index do str = items[i] str = string.gsub(str,'%|',"@@@@@") for k,v in ipairs(check) do str = string.gsub(str,"^"..v.."@@@@@","") end for matchdupes in string.gmatch(str,"([^"..separator.."]+)") do -- matchdupes = string.gsub(matchdupes,"%=.*$","=") -- split off parameters by name matchdupes = string.gsub(matchdupes,"%=.*","=") -- split off parameters by name dummy,count = string.gsub(items[i],matchdupes,"") if count >= 2 then items[i] = string.gsub(items[i],matchdupes,"<duplicate>"..matchdupes.."</duplicate>") end end end end local testdata = "" if index >= 1 then for i=1,index do if string.find(items[i],".*<duplicate>.*") then items[i] = string.gsub(items[i],"duplicate>","b>") testdata = testdata .. "\n* ---- " .. items[i] .. "\n" end end end return "\n----" .. testdata .. "No. of templates reviewed = " .. index .. "\n----" end function p.betadellistparams(frame) local page = frame.args[1] local title = mw.title.new(page) if title == nil then return end if title.id == 0 then return "Page does not exist!" end local data = title:getContent() local newdata = "" if data == nil or data == "" then return end local tt = {} local count = 0 local continue = 0 local separator = "@@@@@" --data = string.gsub(data,'\n','@@@@@') --data = string.gsub(data,'\n','@@@@@') data = string.gsub(data,'%| *[Hh]ours\= *','|hours=') data = string.gsub(data,'%| *[Pp]rice\= *','|price=') data = string.gsub(data,'%| *[Cc]ontent\= *','|content=') data = string.gsub(data,'%| *[Dd]irections\= *','|directions=') data = string.gsub(data,'%| *[Cc]heckin\= *','|checkin=') data = string.gsub(data,'%| *[Cc]heckout\= *','|checkout=') data = string.gsub(data,'|','@@@@@+++++|') data = string.gsub(data,'\}\}','@@@@@}}') data = string.gsub(data,'@@@@@@@@@@','@@@@@') data = string.gsub(data,'@@@@@@@@@@','@@@@@') for str in string.gmatch(data,"([^"..separator.."]+)") do -- if string.find(str,'content') ~= nil then return str end if string.find(str,'^\+\+\+\+\+.*') ~= nil then str = string.gsub(str,'^\+\+\+\+\+','') str = string.gsub(str,'|hours\=.*','|hours=') str = string.gsub(str,'|price\=.*','|price=') str = string.gsub(str,'|checkin\=.*','|checkin=') str = string.gsub(str,'|checkout\=.*','|checkout=') str = string.gsub(str,'|directions\=.*','|directions=') str = string.gsub(str,'|content\=.*','|content=') -- if string.find(str,'content') ~= nil then return str end else -- str = str" .. "\n" end if str ~= nil and str ~= "" then count = count + 1 tt[count] = str end end for key,value in pairs(tt) do newdata = newdata .. value end return newdata end -- GET LATITUDE -- P625 local function combo(id) local latitude = "" local longitude = "" local name = "" local osm = "none" local linkosm = "" local entity = mw.wikibase.getEntityObject(id) if entity == nil then return latitude,longitude,name end local claims = entity.claims if claims == nil then return latitude,longitude,name end if claims.P625 ~= nil then latitude = entity.claims.P625[1].mainsnak.datavalue.value.latitude latitude = string.format("%.6f",latitude) longitude = entity.claims.P625[1].mainsnak.datavalue.value.longitude longitude = string.format("%.6f",longitude) end if claims.P402 ~= nil then osm = entity.claims.P402[1].mainsnak.datavalue.value or "none" if osm == nil then osm = "none" end if osm ~= "none" then linkosm = "[https://www.openstreetmap.org/relation/" .. osm .. " " .. osm .. "]" osm = linkosm end end if pcall(function()t1 = entity:getSitelink("enwikivoyage") end) then name = entity:getSitelink("enwikivoyage") or "" if name ~= nil and name ~= "" then name = "wv: [[" .. name .."]]" else name = "wv: ----" end end return latitude,longitude,name,osm end -- Combine following into 1 function to avoid multiple repeating actions -- Doing lookup for OSM relation ID move to combo local function yikes(v) local entity = mw.wikibase.getEntityObject(string.gsub(v,' ','')) local claims = entity.claims if claims == nil then return "---" end if claims.P402 == nil then return "---" end local xxx = entity.claims.P402[1].mainsnak.datavalue.value return xxx end -- GET LATITUDE -- P625 local function latitude2(id) local latitude = "" local entity = mw.wikibase.getEntityObject(id) -- local entity = mw.wikibase.getEntityObject() if entity == nil then return latitude end local claims = entity.claims if claims == nil then return latitude end if claims.P625 ~= nil then latitude = entity.claims.P625[1].mainsnak.datavalue.value.latitude return string.format("%.6f",latitude) end return latitude end local function longitude2(id) local longitude = "" local entity = mw.wikibase.getEntityObject(id) if entity == nil then return longitude end local claims = entity.claims if claims == nil then return longitude end if claims.P625 ~= nil then longitude = entity.claims.P625[1].mainsnak.datavalue.value.longitude return string.format("%.6f",longitude) end return longitude end local function sitename2(id) local name = "" local entity = mw.wikibase.getEntityObject(id) if pcall(function()t1 = entity:getSitelink("enwikivoyage") end) then name = entity:getSitelink("enwikivoyage") or "" if name ~= nil and name ~= "" then name = "wv: [[" .. name .."]]" else name = "wv: ----" end end return name end -- look for admin units and related OSM ID function p.looksee(frame) local newdata = "" local previous = "" local voysitename = "" local name2 = "" local lat = "" local long = "" local wv = "" local osm = "" local arg1 = frame.args[1] local entity = mw.wikibase.getEntityObject(arg1) local str = "" local strx = "" local xxx = "" if entity == nil then return newdata end local claims = entity.claims if claims == nil then return newdata end local data = "" local t = {} local tt = {} local separator = "%s" local count = 0 -- P47 for bordering entities if claims.P150 ~= nil then for k,v in pairs(claims.P150) do count = count + 1 t = {} if pcall(function () t = entity.claims.P150[count].mainsnak.datavalue.value end) then t = entity.claims.P150[count].mainsnak.datavalue.value else return newdata end t = entity.claims.P150[count].mainsnak.datavalue.value for k, v in pairs( t ) do v = string.gsub(v,"item","") v = " Q" .. v v = string.gsub(v,"^ Q$","") v = string.gsub(v,'Q+','Q') if v ~= previous then if v ~= nil and v ~= "" then xxx = yikes(v) -- data = data .. v .. "@@@" .. xxx data = data .. " " .. v end previous = v end end end count = 1 for str in string.gmatch(data,"([^"..separator.."]+)") do -- strx = string.gsub(str,'^.*@@@','') -- OSM ID -- str = string.gsub(str,"@@@.*$",'') -- Wikidata ID lat,long,name2,osm=combo(str) if pcall(function()t1 = entity:getSitelink("enwikivoyage") end) then voysitename = entity:getSitelink("enwikivoyage") or "" if voysitename ~= nil and voysitename ~= "" then voysitename = "wv: [[" .. voysitename .."]]" else voysitename = "wv: ----" end end -- if mw.wikibase.sitelink( str ) ~= nil then --tt[count] = "'''[[" .. mw.wikibase.sitelink( str ) .. "]]''': " .. "'''[[d:" .. str .. " | " .. str .. "]]''' ('''" .. strx .. "''')" --tt[count]= tt[count] .. " '''lat''': " .. lat .. " '''long''': " .. long .. " - " .. voysitename .. "---" .. name2 -- --else -- if mw.wikibase.label(str) == nil or mw.wikibase.label(str) == "" then -- tt[count] = "'''No Label''': " .. "'''[[d:" .. str .. " | " .. str .. "]]''' ('''No Label ''')" -- tt[count]= tt[count] .. " '''lat''': " .. lat .. " '''long''': " .. long .. " - " .. voysitename .. "---" .. name2 -- count = count + 1 -- break end -- --tt[count] = "'''[[" .. mw.wikibase.label(str) .. "]]''': " .. "'''[[d:" .. str .. " | " .. str .. "]]''' ('''" .. strx .. "''')" --tt[count]= tt[count] .. " '''lat''': " .. lat .. " '''long''': " .. long .. " - " .. voysitename .. "---" .. name2 -- end if mw.wikibase.label(str) == nil or mw.wikibase.label(str) == "" then tt[count] = "'''No Label''': " .. "'''[[d:" .. str .. " | " .. str .. "]]''' ('''" .. osm .. "''')" tt[count]= tt[count] .. " '''lat''': " .. lat .. " '''long''': " .. long .. " - " .. voysitename .. "---" .. name2 else tt[count] = "'''[[" .. mw.wikibase.label(str) .. "]]''': " .. "'''[[d:" .. str .. " | " .. str .. "]]''' ('''" .. osm .. "''')" tt[count]= tt[count] .. " '''lat''': " .. lat .. " '''long''': " .. long .. " - " .. voysitename .. "---" .. name2 end count = count + 1 end table.sort(tt) count = 1 for k, v in pairs (tt) do if count == 1 then newdata = tt[count] else -- newdata = newdata .. ", " .. tt[count] newdata = newdata .. "</br>" .. tt[count] end count = count + 1 end if newdata ~= "" then newdata = "<div style=\"background-color:WhiteSmoke; border-style:solid; border-width:thin; padding-right: 10px; padding-left: 10px;\">" .. newdata .. "</div>" end return newdata end return newdata end -- END MODULE function p.convchar(frame) local xxx = frame.args[1] xxx = string.gsub(xxx,"'","\'") xxx = string.gsub(xxx,""",'\"') -- xxx = string.gsub(xxx," ",' ') return xxx end function p.getname(frame) local name=mw.wikibase.getEntityIdForTitle(frame.args[1]) if name == "" or name == nil then return "" end return name end function p.getname2(frame) local names=frame.args[1] local name = "" local image = "" local items = {} local index = 1 local id = "" local latitude = '' local longitude = '' local marker = '' local entity = '' local data = "" local separator = '\n' local lang = '' local wiki = '' local wikiname = '' for str in string.gmatch(names,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then str = string.gsub(str,"^%s+","") str = string.gsub(str,"%s+$","") if str ~= "" then items[index] = str index = index + 1 end end end for i=1,#items do name = items[i] id = "" wikiname = '' id=mw.wikibase.getEntityIdForTitle(items[i]) if id == nil then id = '' end if id ~= nil and id ~= '' then entity = mw.wikibase.getEntityObject(id) if entity == nil then latitude = "" longitude = "" end local claims = entity.claims if claims == nil then latitude = "" longitude = "" end -- if claims.P625 ~= nil then if pcall(function () t =claims.P625 end ) then if pcall(function () t =entity.claims.P625[1].mainsnak.datavalue.value.latitude end ) then latitude = entity.claims.P625[1].mainsnak.datavalue.value.latitude else latitude = "" end if pcall(function () t =entity.claims.P625[1].mainsnak.datavalue.value.longitude end ) then longitude = entity.claims.P625[1].mainsnak.datavalue.value.longitude else longitude = "" end end -- if claims.P18 ~= nil then -- image = entity.claims.P18[1].mainsnak.datavalue.value -- if image == nil then -- image = "" -- -- Replace above due to error of getting a nil value -- Lua error in line 3210: attempt to index field 'datavalue' (a nil value). image="" if pcall(function () t =claims.P625 end ) then if pcall(function () t =entity.claims.P18[1].mainsnak.datavalue.value end ) then image = entity.claims.P18[1].mainsnak.datavalue.value else image = "" end end end wikiname = "" lang = mw.language.getContentLanguage(id).code wiki = lang .. "wiki" if pcall(function()t1 = entity:getSitelink("wiki") end) then wikiname = entity:getSitelink(wiki) or "" else wikiname = "" end if id == "" then wikiname = "" end if id ~= nil and id ~= "" then name = "[[" .. name .. "]]" end marker = '* {{see | name=' .. name .. " | lat=" .. latitude .. " | long=" .. longitude .. " | image=" .. image .. " | wikipedia=" .. wikiname .. " | wikidata=" .. id .. "}}" data = data .. marker .. "\n" marker = '' name = '' latitude = '' longitude = '' image= '' id = '' wikiname = '' end return data end function p.getname3(frame) local names=frame.args[1] local type = "" local name = "" local image = "" local items = {} local index = 1 local id = "" local latitude = '' local longitude = '' local listing = '' local entity = '' local data = "" local separator = '\n' local lang = '' local wiki = '' local wikiname = '' local counter = 0 for str in string.gmatch(names,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then str = string.gsub(str,"^%s+","") str = string.gsub(str,"%s+$","") if str ~= "" then items[index] = str index = index + 1 end end end for i=1,#items do name = items[i] id = "" wikiname = '' id=mw.wikibase.getEntityIdForTitle(items[i]) if id == nil then id = '' end if id ~= nil and id ~= '' then entity = mw.wikibase.getEntityObject(id) if entity == nil then latitude = "" longitude = "" end local claims = entity.claims if claims == nil then latitude = "" longitude = "" end if claims.P625 ~= nil then latitude = entity.claims.P625[1].mainsnak.datavalue.value.latitude longitude = entity.claims.P625[1].mainsnak.datavalue.value.longitude end if claims.P18 ~= nil then image = entity.claims.P18[1].mainsnak.datavalue.value if image == nil then image = "" end end end wikiname = "" lang = mw.language.getContentLanguage(id).code wiki = lang .. "wiki" if pcall(function()t1 = entity:getSitelink("wiki") end) then wikiname = entity:getSitelink(wiki) or "" else wikiname = "" end if id == "" then wikiname = "" end if id ~= nil and id ~= "" then name = "[[" .. name .. "]]" end if latitude ~= "" then counter = counter + 1 end -- make different type for listings after groups of 99 listing = '* {{ listing | type=' .. type .. ' | name=' .. name .. " | lat=" .. latitude .. " | long=" .. longitude .. " | image=" .. image .. " | wikipedia=" .. wikiname .. " | wikidata=" .. id .. "}}" data = data .. listing .. "\n" listing = '' name = '' latitude = '' longitude = '' image= '' id = '' wikiname = '' end return data end function p.dumbidea(frame) local data = "" data = '* {{User:Matroc/Mapdraw2 | map=link ' data = data .. '| group=shape | show=shape | type=poly ' data = data .. '| shape=external | geotype=geoshape | class=no-icon | title=HELP | stroke=#4B0082' data = data .. '| strokewidth=3 | fill=\#ff00ff | id=Q25396 | zoom=9 | text=TEST GEOSHAPE }}' return data end -- WIKISTIES INFORMATION function p.wikisites(frame) -- if frame.args[1]~=nil and frame.args[1]~='' then -- return frame.args[1] -- end local arg1 = frame.args[1] or "" local xarg1 = arg1 local arg2 = frame.args[2] or "wikivoyage" -- wikiname for program - wikivoyage alternative -- if not Qnnn then get local Qnnn id if string.find(arg1,"^w") ~= nil then arg2 = arg1 end if string.find(arg1,"^Q") == nil then local item = mw.wikibase.getEntityObject() if item == nil then return end if item.id ~= nil then arg1 = item.id else return end end local wikinames = loadwikinames() -- table of wikinames local lukup = "" for k,v in pairs(wikinames) do if v == arg2 then lukup = v .. "$" end end if lukup == "" then return end local entity = mw.wikibase.getEntityObject(arg1) -- local entity = mw.wikibase.getEntityObject() if entity == nil then return end local sites = entity.sitelinks if sites ~= nil and sites ~= '' then local list = "" local newlist = "" local separator = "%s" local tt = {} local asitelink = "" for k,v in pairs(sites) do if string.match(k,lukup) == arg2 then asitelink = entity:getSitelink(k) asitelink = string.gsub(asitelink," ","@@@") list = list .. "'''" .. string.gsub(k,lukup,"") .. "''':''" .. asitelink .. "'' " end end list = string.gsub(list," $","") if list == "" then return "" end count = 1 for str in string.gmatch(list,"([^"..separator.."]+)") do tt[count] = str count = count + 1 end table.sort(tt) for k,v in pairs(tt) do newlist = newlist .. v .. ", " end newlist = string.gsub(newlist,", $","") newlist = string.gsub(newlist,"@@@"," ") newlist = "<span style=\"color:blue; font-family:Times New Roman; font-weight:bold\">" .. arg2 .. "</span>: " .. newlist return newlist end return "" end -- Load a page and scan it for images and produce a list of internal links function p.getinternallinks(frame) local page = frame.args[1] or "Main Page" local title = mw.title.new(page) local displayactual = frame.args['option'] or "yes" if title == nil then return end if title.id == 0 then return "Page does not exist!" end local data = title:getContent() if data == nil or data == "" then return end local tt = {} local count = 0 local output = "" local separator = "@@@@@" local newstr = "" data = string.gsub(data,"\n","@@@@@") --change \n to separator @@@@@ data = string.gsub(data,"@","BULLET") --because I use @@@@@ as a separator changing @ to BULLET data = string.gsub(data,"%s+"," ") --change multiple spaces to a space data = string.gsub(data,"%[%[","@@@@@[[") --change [[ to separator @@@@@[[ data = string.gsub(data,"%]%]","]]@@@@@") --change ]] to separator ]]@@@@@ data = string.gsub(data,"@@@@@@@@@@","@@@@@") --change ]] to separator ]]@@@@@ for str in string.gmatch(data,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then -- Get rid of File,file,Image,image str = string.gsub(str,"%[%[[fF]ile.*",'') str = string.gsub(str,"%[%[[iI]mage.*",'') str = string.gsub(str,'%s*$','') -- drop ending space str = string.gsub(str,'^%s+','') if string.find(str, '^%[%[') == 1 then -- Key is to have [[ at beginning str = string.gsub(str,'%_'," ") -- Change _ to space str = string.gsub(str,'%%2C',",") str = string.gsub(str,'%s+%|%s+','|') str = string.gsub(str,'%[%[%#','[[' .. page .. '#') -- If plain [[something]] then change it into [[something|something]] if string.find(str, '^%[%[.*%|.*%]%]') == 0 then str = string.gsub(str,"(%[%[)(.*)(%]%])","%1%2|%2%3") -- Change [[something]] to [[something|something]] end -- Display only actual link make it an option if displayactual == "yes" then str = string.gsub(str,"%|.*%]%]","]]") end count = count + 1 -- localstr = str.gsub(str,'^.*|','') localstr = str.gsub(str,'|.*','') localstr = string.upper (localstr) tt[count] = localstr .. "@-@" .. str end end end table.sort(tt) local previous = "" for key,value in pairs(tt) do value = string.gsub(value,'^.*@-@','') if value ~= previous then output = output .. value .. " -- " end previous = value end output = string.gsub(output,"BULLET","@") output = string.gsub(output," -- $","") return output end -- function p.grabmarkertype(frame) local sectionorig = frame.args['section'] or "" local section = "" local sectionx = "" local level = frame.args['level'] or "0" if sectionorig == nil or sectionorig == "" then level = "0" end if tonumber(level) <= 1 or tonumber(level) > 5 then level = "0" sectionorig = "" end local a,b,c,d = "" local part1 = "" local part2 = "" local page = frame.args['page'] or "" local type = frame.args['type'] or "" local title = mw.title.new(page) local sort = frame.args['sort'] or "no" local sortbytype = frame.args['sortbytype'] or "no" local sortby = "" local sortname = "" local data = "" local newdata = "" if title == nil then return end if title.id == 0 then return "Page does not exist!" end newdata = title:getContent() if newdata == nil or newdata == "" then return end -- IMPORTANT TO INCORPORATE IN SOME OF THE TEST MODULES ABOVE GOING BY LINE TO INITIATE for line in string.gmatch(newdata,'[^\r\n]+') do -- change any @ to BULLET line = string.gsub(line,"@","BULLET") -- add a @@@@@ to each line to act as a separator line = string.gsub(line,"%s+|%s+","|") line = string.gsub(line,"^%*%s+|","") line = string.gsub(line,"^%*+%s+","") line = string.gsub(line,"%[%[File:.*%]%]","") line = string.gsub(line,"%[%[Image:.*%]%]","") if line ~= "^$" then if string.find(line, "^[%||%}|%{]") ~= nil then line = string.gsub(line,"^%}%}","}}@@@@@") data = data .. line else data = data .. line .. "@@@@@" end end end local tt = {} -- create an arrary for markers local count = 0 -- local counter for arrary tt local output = "" -- output - destination of all markers local separator = "@@@@@" -- indicator for line separation local newstr = "" -- to be used for sorting of markers by name if desired if sectionorig ~= nil and sectionorig ~= "" then sectionorig = string.gsub(sectionorig,"@","|") if level == "5" then section = "section5" .. sectionorig .. "section5" sectionx = "section5 " .. sectionorig .. " section5" end if level == "4" then section = "section4" .. sectionorig .. "section4" sectionx = "section4 " .. sectionorig .. " section4" end if level == "3" then section = "section3" .. sectionorig .. "section3" sectionx = "section3 " .. sectionorig .. " section3" end if level == "2" then section = "section2" .. sectionorig .. "section2" sectionx = "section2 " .. sectionorig .. " section2" end data = string.gsub(data,"%(","openparens") data = string.gsub(data,"%)","closeparens") data = string.gsub(data,"%|","PIPE") data = string.gsub(data,"%.","PERIOD") data = string.gsub(data,"%,","COMMA") data = string.gsub(data,"(==+)(%[+%s*)","%1") data = string.gsub(data,"(%s*%]+)(==+)","%2") data = string.gsub(data,"openparens","(") data = string.gsub(data,"closeparens",")") data = string.gsub(data,"PIPE","|") data = string.gsub(data,"PERIOD",".") data = string.gsub(data,"COMMA",",") data = string.gsub(data,"=====","section5") data = string.gsub(data,"====","section4") data = string.gsub(data,"===","section3") data = string.gsub(data,"==","section2") if string.find(data,sectionx .. ".*") ~= nil then section = sectionx end if string.find(data,section .. ".*") == nil then return "section not found" else a,b = string.find(data,section .. ".*") data = string.sub(data,a) part1 = data end if string.find(data,section .. ".*",10) ~= nil then c,d=string.find(data,section .. ".*",10) part1 = string.sub(data,1,c) part2 = string.sub(data,c) end part1 = string.gsub(part1,section,"BEGINSECTION") part2 = string.gsub(part2,section,"BEGINSECTION") if level == "2" then part1 = string.gsub(part1,"section2.*","") part2 = string.gsub(part2,"section2.*","") end if level == "3" then part1 = string.gsub(part1,"section[23].*","") part2 = string.gsub(part2,"section[23].*","") end if level == "4" then part1 = string.gsub(part1,"section[234].*","") part2 = string.gsub(part2,"section[234].*","") end if level == 5 then part1 = string.gsub(part1,"section[2345].*","") part2 = string.gsub(part2,"section[2345].*","") end data = part1 .. part2 part1 = "" part2 = "" data = string.gsub(data,"BEGINSECTION",section) data = data end data = string.gsub(data,"\n%s+%|","|") data = string.gsub(data,"%s+"," ") --change multiple spaces to a space data = string.gsub(data,"%}%}%}","rightcurliesrightcurliesrightcurlies") data = string.gsub(data,"%{%{%{","leftcurliesleftcurliesleftcurlies") data = string.gsub(data,"({{)(IATA|)(...)(}}","leftcurliesleftcurlies%2%3rightcurliesrightcurlies") -- Special case -- SPACE FOR MORE SPECIAL CASES data = string.gsub(data,"%*%s+%{","{") data = string.gsub(data,"%*%{","{") data = string.gsub(data,"%{ ","{") data = string.gsub(data,"%{%{","@@@@@{{") --change {{ to separator @@@@@{{ data = string.gsub(data,"%}%}","}}@@@@@") --change }} to separator ]]@@@@@ data = string.gsub(data,"==+","@@@@@") --change to separator@@@@@ data = string.gsub(data,"@@@@@@@@@@","@@@@@") data = string.gsub(data,"%}%}@@@@@ %—","}} —") data = string.gsub(data,"%}%}@@@@@, ","}}, ") data = string.gsub(data,"%}%}@@@@@%s%[","}} [") data = string.gsub(data,"%}%}@@@@@%-","}} -") data = string.gsub(data,"%}%}@@@@@ –","}} –") data = string.gsub(data,"%}%}@@@@@%s%-","}} -") -- take care of text at end of line if any 1/2 way data = string.gsub(data,"%}%}@@@@@ %(","}} (") -- oddballs add here data = string.gsub(data,"%}%}@@@@@ ","}} ") data = "@@@@@" .. data .. "@@@@@" for str in string.gmatch(data,"([^"..separator.."]+)") do if str ~= nil and str ~= "" then str = string.gsub(str,'%s+$','') -- drop ending space str = string.gsub(str,'^%s+','') if string.find(str, '^%{%{marker') ~= nil then -- Key is to have {{marker at beginning str = string.gsub(str,'%_'," ") -- Change _ to space str = string.gsub(str,'%%2C',",") str = string.gsub(str,'%s+%|%s+','|') str = string.gsub(str,"BULLET","@") if string.find(str,"type=") == nil then -- no type then add type listing to marker as default str = string.gsub(str,"%{%{marker","{{marker|type=listing") end if sort == "yes" then sortname = str sortname = str.gsub(sortname,"%s+%|%s+","|") -- space|space to | sortname = str.gsub(sortname,"^.*%|name=","") -- chop up to name= sortname = str.gsub(sortname,"%|.*","") -- delete | and after - CHANGE sortname = str.gsub(sortname,"%]+.*","") -- delete ]] and after sortname = str.gsub(sortname,"%[+","") sortname = str.gsub(sortname,"}+.*","") sortname = sortname .. string.rep(".", 20 - #sortname) -- pad sortname to 40 chars sortname = sortname:upper() sortname = sortname .. "SORTIT" if sortbytype == "yes" then sortby = str sortby = str.gsub(sortby,"%s+%|%s+","|") -- space|space to | sortby = str.gsub(sortby,"^.*type=","") -- chop up to type= sortby = str.gsub(sortby,"%|.*","") sortby = str.gsub(sortby,"}+.*","") sortby = sortby:upper() sortby = sortby .. string.rep(".", 10 - #sortby) sortname = sortby .. sortname end end if type ~= nil and type ~= "" then if string.find(str,"type=" .. type) ~= nil then count = count + 1 if sort == "yes" then tt[count] = sortname .. str else tt[count] = str end end else count = count + 1 if sort == "yes" then tt[count] = sortname .. str else tt[count] = str end end end end end if sort == "yes" then table.sort(tt) end local previous = "" for key,value in pairs(tt) do if value ~= previous then if sort == "yes" then output = output .. "* " .. string.gsub(value,".*SORTIT","") .. "\n" else output = output .. "* " .. value .. "\n" end end previous = value end output = string.gsub(output,"rightcurlies","}") output = string.gsub(output,"leftcurlies","{") output = string.gsub(output,"BULLET","@") return output end -- grab a mapmask if possible and convert to different formats -- for smaller mapmasks only -- otherwise run out of processing time! function p.grabmapmask(frame) local page = frame.args['name'] or "" local out = frame.args['out'] or "inapoly" local data = "" local mapmask = "" local inapoly = "" local coordinates = "" local title = mw.title.new(page) if title == nil then return "Need name argument!" end if title.id == 0 then return "Page does not exist!" end data = title:getContent() if string.match(data,"{{[M|m]apmask") == nil and string.match(data,"{{ [M|m]apmask") == nil then return "There is no mapmask in " .. page end data = string.gsub(data,".*{{[M|m]apmask","") data = string.gsub(data,".*{{ [M|m]apmask","") data = string.gsub(data,"}}.*","") data = string.gsub(data,"%s+","") data = string.gsub(data,"\n","") data = string.gsub(data,"%w%=%w%|","") mapmask = data mapmask = string.gsub(mapmask,"^|","") mapmask = string.gsub(mapmask,"|"," | ") inapoly = string.gsub(data,",",":") inapoly = string.gsub(inapoly,"^|","") inapoly = string.gsub(inapoly,"|",", ") coordinates = string.gsub(data,"^|","") coordinates = string.gsub(coordinates,"(%d+%.%d+)(,)(%d+%.%d+)","%3%2%1") coordinates = string.gsub(coordinates,"%|","],[") coordinates = "[[[" .. coordinates .. "]]]" if out == "inapoly" then return inapoly elseif out == "mapmask" then return mapmask elseif out == "json" then return coordinates end return "'''mapmask''' - " .. mapmask .. "\n\n'''inapoly''' - " .. inapoly .. "\n\n'''coordinates''' - " .. coordinates end function p.grabmarkerinpoly(frame) local page = frame.args['page'] or "" local type = frame.args['type'] or "" local title = mw.title.new(page) local data = "" local newdata = "" if title == nil then return end if title.id == 0 then return error "Page does not exist!" end newdata = title:getContent() if newdata == nil or newdata == "" or not newdata then return end local separator = "@@" local tt = {} -- create an arrary for markers local count = 1 -- local counter for arrary tt local output = "" -- output - destination of all markers newdata = string.gsub(newdata,"@","BULLET") newdata = string.gsub(newdata,"\n+"," ") newdata = string.gsub(newdata,"%s+"," ") newdata = string.gsub(newdata,"%{%{ Marker","@@{{marker") newdata = string.gsub(newdata,"%{%{ marker","@@{{marker") newdata = string.gsub(newdata,"%{%{Marker","@@{{marker") newdata = string.gsub(newdata,"%{%{marker","@@{{marker") newdata = string.gsub(newdata,"@@@@","@@") -- if newdata ~= nil then return newdata end for str in string.gmatch(newdata,"([^"..separator.."]+)") do if string.find(str,"^%{%{marker") ~= nil then str = str.gsub(str,"}}.*","") str = "@" .. str .. "@" str = str.gsub(str,"= ","=") str = str.gsub(str," =","=") str = str.gsub(str,"name=","@n") str = str.gsub(str,"lat=","@a") str = str.gsub(str,"long=","@b") str = str.gsub(str,"wikidata=","@w") str = str.gsub(str,"zoom=","@z") str = str.gsub(str,"type=","@t") str = str.gsub(str,"url=","@u") str = str.gsub(str,"image=","@i") str = str.gsub(str,"^@{{marker","@xmarker") str = str.gsub(str,"%s&s+"," ") str = str.gsub(str,"%s@","@") str = string.gsub(str,"%s*|%s*@","@") str = string.gsub(str,"@$","") output = output .. str .. ":" tt[count] = str count = count + 1 end end output,_ = string.gsub(output,":$","") return output end function p.combo(frame) local id = frame.args['id'] or "" local latitude = "" local longitude = "" local name = frame.args['name'] or "" local osm = "none" local linkosm = "" local entity = "" if id == "" or id == nil then id=mw.wikibase.getEntityIdForTitle(name) end entity = mw.wikibase.getEntityObject(id) if entity == nil then return "id=" .. id .. " name=" .. name .. " latitude=" .. latitude .. " longitude=" .. longitude .. " osm=" .. osm end local claims = entity.claims if claims == nil then return "id=" .. id .. " name=" .. name .. " latitude=" .. latitude .. " longitude=" .. longitude .. " osm=" .. osm end if claims.P625 ~= nil then if pcall(function () t =entity.claims.P625[1].mainsnak.datavalue.value.latitude end ) then latitude = entity.claims.P625[1].mainsnak.datavalue.value.latitude latitude = string.format("%.6f",latitude) else latitude = "" end if pcall(function () t =entity.claims.P625[1].mainsnak.datavalue.value.longitude end ) then longitude = entity.claims.P625[1].mainsnak.datavalue.value.longitude longitude = string.format("%.6f",longitude) else longitude = "" end end if claims.P402 ~= nil then osm = entity.claims.P402[1].mainsnak.datavalue.value or "none" if osm == nil then osm = "none" end if osm ~= "none" then linkosm = "[https://www.openstreetmap.org/relation/" .. osm .. " " .. osm .. "]" osm = linkosm end end if pcall(function()t1 = entity:getSitelink("enwikivoyage") end) then name = entity:getSitelink("enwikivoyage") or "" if name ~= nil and name ~= "" then name = "wv: [[" .. name .."]]" else name = "wv: ----" end end return "* id='''" .. id .. "''' name=" .. name .. " latitude=" .. latitude .. " longitude=" .. longitude .. " osm=" .. osm end function p.checkuni(frame) local page = frame.args['page'] local separator = frame.args['separator'] or " " -- added so can put in a different separator default is space if separator == nil or separator == "" then separator = " " end local newdata = "" local title = mw.title.new(page) if title == nil then return "Non-existant or empty page! " .. page end if title.id == 0 then return "Page: " .. page .. " does not exist!" end newdata = title:getContent() if newdata == nil or newdata == "" or not newdata == true then return "No page data to work with! " .. page end local output = "" local counter = 1 for txt in string.gmatch(newdata,"([^"..separator.."]+)") do if mw.ustring.match(txt,"") ~= nil then output = output .. counter .. " " .. txt .. " " counter = counter + 1 end end return output end function p.checkevent(frame) local page = frame.args['page'] local newdata = "" local title = mw.title.new(page) if title == nil then return "Non-existant or empty page! " .. page end if title.id == 0 then return "Page: " .. page .. " does not exist!" end newdata = title:getContent() if newdata == nil or newdata == "" or not newdata == true then return "No page data to work with! " .. page end local name = "" local year = "" local month = "" local date = "" local endyear = "" local endmonth = "" local enddate = "" local yymmdd = "" local endyymmdd = "" local frequency = "" local separator = "@@@@" local counter = 1 local formatcheck = "" local checkdate = "" checkdate = os.date("%Y%m%d") local eventenddate = "" local output = "" local message = "" local strcopy = "" local list = {} list[1] = {month="[Jj]an%a*",value="01"} list[2] = {month="[Ff]eb%a*",value="02"} list[3] = {month="[Mm]ar%a*",value="03"} list[4] = {month="[Aa]pr%a*",value="04"} list[5] = {month="[Ma]ay%a*",value="05"} list[6] = {month="[Jj]un%a*",value="06"} list[7] = {month="[Jj]ul%a*",value="07"} list[8] = {month="[Aa]ug%a*",value="08"} list[9] = {month="[Ss]ep%a*",value="09"} list[10] = {month="[Oo]ct%a*",value="10"} list[11] = {month="[Nn]ov%a*",value="11"} list[12] = {month="[Dd]ec%a*",value="12"} if string.find(newdata,"{{%s*[Ee]vent") == nil then return "No events found in page: " .. page .. "\n" end newdata = string.gsub(newdata,"@","BULLETX") newdata = string.gsub(newdata,"{{%s*[Ee]vent","@@@@{{Event") for str in string.gmatch(newdata,"([^"..separator.."]+)") do if string.find(str,"^%{%{[Ee]vent") ~= nil then str = string.gsub(str,"{{%s*[Ee]vent","") str = string.gsub(str,"=%{%{","=opencurlyopencurly") str = string.gsub(str,"}}%s*|","closecurlyclosecurly|") str = string.gsub(str,"}}%s*}}","closecurlyclosecurly}}") str = string.gsub(str,"}}.*","") str = string.gsub(str,"%s*|%s*","@") str = "@" .. str .. "@" str = string.gsub(str,"@%s*@","@") str = string.gsub(str,"%s*=%s*","=") str = string.gsub(str,"@yymmdd=@","@") str = string.gsub(str,"@endyymmdd=@","@") str = string.gsub(str,"@endyear=@","@") str = string.gsub(str,"@endmonth=@","@") str = string.gsub(str,"@enddate=@","@") str = string.gsub(str,"%s@","@") name = string.gsub(string.gsub(str,"^.*@name=",""),"@.*","") if string.find(str,"yymmdd") ~= nil then yymmdd = string.gsub(string.gsub(str,"^.*@yymmdd=",""),"@.*","") yymmdd = string.gsub(yymmdd,"%s*-%s*","") year = string.sub(yymmdd,1,4) month = string.sub(yymmdd,5,6) date = string.sub(yymmdd,7,8) end if string.find(str,"endyymmdd") ~= nil then endyymmdd = string.gsub(string.gsub(str,"^.*@yymmdd=",""),"@.*","") endyymmdd = string.gsub(yymmdd,"%s*-%s*","") endyear = string.sub(yymmdd,1,4) endmonth = string.sub(yymmdd,5,6) enddate = string.sub(yymmdd,7,8) end if year == nil or year == "" then year,_ = string.gsub(string.gsub(str,"^.*@year=",""),"@.*","") end if month == nil or month == "" then month,_ = string.gsub(string.gsub(str,"^.*@month=",""),"@.*","") end if date == nil or date == ""then date,_ = string.gsub(string.gsub(str,"^.*@date=",""),"@.*","") end if endyear == nil or endyear == "" then endyear,_ = string.gsub(string.gsub(str,"^.*@endyear=",""),"@.*","") end if endyear == nil or endyear == "" then endyear = year end if endmonth == nil or endmonth == "" then endmonth,_ = string.gsub(string.gsub(str,"^.*@endmonth=",""),"@.*","") end if endmonth == nil or endmonth == "" then endmonth = month end if endmonth == nil or endmonth == "" == nil then endmonth = "00" formatcheck = formatcheck .. " endmonth - notfound!" end if enddate == nil or enddate == "" then enddate,_ = string.gsub(string.gsub(str,"^.*@enddate=",""),"@.*","") end if enddate == nil or enddate == "" then enddate = date end if enddate == nil or enddate == "" then enddate = "00" formatcheck = formatcheck .. " enddate - not found - set check enddate to 00!" end frequency,_ = string.gsub(string.gsub(str,"^.*@frequency=",""),"@.*","") for i=1,#list do endmonth = string.gsub(endmonth,list[i].month,list[i].value) end if string.match(endmonth,"^%d$") ~= nil then endmonth = string.format("%02d",tonumber(endmonth)) end if string.match(endmonth,"^%d%d$") == nil then formatcheck = formatcheck .. " format for endmonth is invalid - set check endmonth to 00!" endmonth = "00" end if string.match(enddate,"^%d$") ~= nil then enddate = string.format("%02d",tonumber(enddate)) end if string.match(enddate,"^%d%d$") == nil then formatcheck = formatcheck .. " format for enddate is invalid! - set check enddate to 00" enddate = "00" end if string.match(endyear,"^%d%d%d%d$") == nil then if string.match(endyear,"[Aa]nnual") ~= nil or frequency ~= nil or frequency ~= "" then formatcheck = formatcheck .. " Annual or Frequency set check endyear to 3000 " endyear = "3000" else formatcheck = formatcheck .. " format for endyear/year invalid set check endyear to 1000 " endyear = "1000" end end eventenddate = endyear .. endmonth .. string.format("%02d",enddate) if frequency ~= nil and frequency ~= "" then message = message .. " '''<span style= \"color:limegreen;\">Event entry of Frequency type! </span>''' " end if year == "annual" or year == "Annual" then message = message .. " '''<span style= \"color:limegreen;\">Event appears to be an Annual event! Event appears to be still a go!</span>''' " elseif tonumber(checkdate) > tonumber(eventenddate) then message = message .. " '''<span style= \"color:red;\">Event appears to be over!</span>''' " else message = message .. " '''<span style= \"color:limegreen;\">Event appears to be still a go! </span>''' " end str = string.gsub(str,"^@","") str = string.gsub(str,"@$","") str = string.gsub(str,"@"," | ") str = string.gsub(str,"BULLETX","@") str = string.gsub(str,"opencurly","{") str = string.gsub(str,"closecurly","}") str = string.gsub(str,"{","{") str = string.gsub(str,"{","{") str = string.gsub(str,"}","}") str = string.gsub(str,"}","}") str = string.gsub(str,"|","|") str = string.gsub(str,"|","|") strcopy = "<div style=\"color:black; background:papayawhip; border:1px solid black;\">" .. str .. "</div>" str = "{{event|" .. str .. "}}" formatcheck = string.gsub(formatcheck,"^%s*","") output = output .. "<div class=\"rectangle\" style=\"width:100px; height:10px; background-color:black\"></div>" .. "\n" output = output .. "----\n* '''Page''': " .. page .. "''' Event''': " .. name .. " '''Results''': " .. message .. " '''Event end date''': " output = output .. eventenddate .. " '''Check date''': " .. checkdate .. " '''date''': " .. date .. " '''month''': " .. month .. " '''year''' " .. year .. " '''enddate''': " .. enddate .. " '''endmonth''': " .. endmonth .. " '''endyear''': " .. endyear .. "\n" if formatcheck ~= nil and formatcheck ~= "" then output = output .. "\n* " .. str .. "\n\n* " .. strcopy .. "\n\n*" .. "'''Verify all parameter format & useage requirements!''' " .. formatcheck else output = output .. "\n* " .. str .. "\n\n* " .. strcopy .. "\n\n* '''Verify all parameter formats & useage requirements!'''\n----\n" end -- clear - start anew title = "" name = "" year = "" month = "" date = "" endyear = "" endmonth = "" enddate = "" yymmdd = "" endyymmdd = "" eventenddate = "" frequency = "" message = "" formatcheck = "" strcopy="" end end return output end function p.events(frame) local output = "" checkdate = os.date("%Y%m%d") local sortby = frame.args['sortby'] or "begindate" beginevent = "" endevent = "" order = {} order2 = {} order3 = {} counter = 1 local name = "" local image = "" local list = {} list[1] = {month="[Jj]an%a*",value="01"} list[2] = {month="[Ff]eb%a*",value="02"} list[3] = {month="[Mm]ar%a*",value="03"} list[4] = {month="[Aa]pr%a*",value="04"} list[5] = {month="[Ma]ay%a*",value="05"} list[6] = {month="[Jj]un%a*",value="06"} list[7] = {month="[Jj]ul%a*",value="07"} list[8] = {month="[Aa]ug%a*",value="08"} list[9] = {month="[Ss]ep%a*",value="09"} list[10] = {month="[Oo]ct%a*",value="10"} list[11] = {month="[Nn]ov%a*",value="11"} list[12] = {month="[Dd]ec%a*",value="12"} local events = {} events[1] = {name="World Youth Day in Panama City", text="World Youth Day in Panama, [[Panama]], 22-27 January", year="2019", month="January", day="22", endyear="2019", endmonth="January", endday="27"} events[2] = {name="Winter Universiade 2019", text="Winter Universiade 2019, in [[Krasnoyarsk]], [[Russia]], March 2-12", year="2019", month="March", day="2", endyear="2019", endmonth="March", endday="12"} events[3] = {name="European Capital of Culture", text="European Capital of Culture, [[Matera]] [[Italy]] and [[Plovdiv]] [[Bulgaria]]", year="2019", month="January", day="1", endyear="2020", endmonth="December", endday="31"} events[4] = {name="2019 South Asian Games", text="2019 South Asian Games, in [[Kathmandu]] and [[Pokhara]], [[Nepal]], 9–18 March", year="2019", month="March", day="9", endyear="2019", endmonth="March", endday="18"} events[5] = {name="Special Olympics World Summer Games", text="Special Olympics World Summer Games, [[Abu Dhabi]], [[United Arab Emirates]], 14–21 March", year="2019", month="March", day="14", endyear="2019", endmonth="March", endday="21"} events[6] = {name="Eurovision song contest", text="Eurovision song contest, [[Tel Aviv]], [[Israel]], Tuesday 14, Thursday 16 and Saturday 18 May 2019", year="2019", month="May", day="14", endyear="2019", endmonth="May", endday="18"} events[7] = {name="Travelling during Ramadan", text="[[Travelling during Ramadan]], 6 May–3 June", year="2019", month="May", day="6", endyear="2019", endmonth="June", endday="3"} events[8] = {name="WorldPride New York",text="2019 WorldPride [[New York City | NYC]], 1-30 June", year="2019", month="June", day="1", endyear="2019", endmonth="June", endday="1"} events[9] = {name="2019 Summer Universiade", text="2019 Summer Universiade, [[Naples]], [[Italy]], in July", year="2019", month="July", day="3", endyear="2019", endmonth="July", endday="14"} events[10] = {name="2019 Pacific Games", text="2019 Pacific Games, [[Apia]], [[Samoa]], 8-20 July", year="2019", month="July", day="8", endyear="2019", endmonth="July", endday="20"} events[11] = {name="Wikimania", text="Wikimania, [[Stockholm]]], [[Sweden]] 14-18 August", year="2019", month="August", day="14", endyear="2019", endmonth="August", endday="18"} events[12] = {name="Pan American/Parapan American Games", text="Pan American/Parapan American Games, in [[Lima]], [[Peru]], 26 July 26-1 September", year="2019", month="September", day="26", endyear="2019", endmonth="September", endday="26"} events[13] = {name="Toronto International Film Festival", text="Toronto International Film Festival, in [[Toronto]], [[Canada]], 5–15 September", year="2019", month="September", day="5", endyear="2019", endmonth="September", endday="15"} events[14] = {name="12th African Games", text="12 African Games, in [[Casablanca]], [[Morocco]], 14-31 October", year="2019", month="October", day="14", endyear="2019", endmonth="October", endday="14"} events[15] = {name="Southeast Asian Games", text="Southeast Asian Games, the [[Philippines]], 29 November-10 December", year="2019", month="November", day="29", endyear="2019", endmonth="December", endday="29"} events[16] = { name="Invictus Games", image="Invictus games logo cropped.png", text="From Oct 20-27, 2018, [[Sydney]], [[Australia]], will host the '''Invictus Games''', an international multi-sport event in which wounded, injured or sick armed services personnel and veterans take part in sports.", year="2018", month="October", day="20", endyear="2018", endmonth="October", endday="27" } for i=1,#events do if events[i].endyear == nil then events[i].endyear = events[i].year end if events[i].endmonth == nil then events[i].endmonth = events[i].month end if events[i].endday == nil then events[i].endday = events[i].day end for x=1,#list do events[i].month = string.gsub(events[i].month,list[x].month,list[x].value) events[i].endmonth = string.gsub(events[i].endmonth,list[x].month,list[x].value) end if events[i].image == nil then events[i].image = "" end events[i].day = string.format("%02d",tonumber(events[i].day)) events[i].endday = string.format("%02d",tonumber(events[i].endday)) beginevent = events[i].year .. events[i].month .. events[i].day endevent = events[i].endyear .. events[i].endmonth .. events[i].endday order[counter] = "@a" .. beginevent .. "@b" .. endevent .. "@n" .. events[i].name .. "@i" .. events[i].image .. "@t" .. events[i].text order2[counter] = "@b" .. endevent .. "@a" .. beginevent .. "@n" .. events[i].name .. "@i" .. events[i].image .. "@t" .. events[i].text counter = counter + 1 end table.sort(order) counter = 1 for i=1,#order do beginevent = string.gsub(order[i],"^.*@a","") beginevent = string.gsub(beginevent,"@.*$","") endevent =string.gsub(order[i],"^.*@b","") endevent = string.gsub(endevent,"@.*$","") name = string.gsub(order[i],"^.*@n","") name = string.gsub(name,"@.*$","") image = string.gsub(order[i],"^.*@i","") image = string.gsub(image,"@.*$","") text = string.gsub(order[i],"^.*@t","") text = string.gsub(text,"@.*$","") if tonumber(checkdate) > tonumber(endevent) then output = output .. "* Event " .. name .. " has expired!" .. checkdate .. " " .. beginevent .. " " .. endevent .. "\n" elseif tonumber(checkdate) >= tonumber(beginevent) and tonumber(checkdate) <= tonumber(endevent) then output = output .. "* Event " .. name .. " is happening" .. checkdate .. " " .. beginevent .. " " .. endevent .. "\n" elseif tonumber(checkdate) > tonumber(beginevent) - 30 and tonumber(checkdate) < tonumber(endevent) then output = output .. "* Event " ..name .. " attempt at 30 day notice! !" .. checkdate .. " " .. beginevent .. " " .. endevent .. "\n" elseif tonumber(checkdate) < tonumber(beginevent) and tonumber(checkdate) < tonumber(endevent) then output = output .. "*Event " .. name .. " is a future event! " .. checkdate .. " " .. beginevent .. " " .. endevent .. "\n" else output = output .. checkdate .. "CHECK " .. beginevent .. " " .. endevent .. "\n" end end -- output = "|title2=" .. events[1].name .. "|content2=" .. events[1].text return output end -- below replaced with quickgrab2 below -- TO BE REMOVED function p.quickgrab(frame) local page = frame.args['page'] or "Ethiopia" local type = frame.args['type'] or "marker" local subtype = frame.args['subtype'] or "" local pattern = "" local counter = 0 local copypattern = "" -- type = string.gsub(type,"(%a)(.*)","[" .. string.upper(%1) .. string.lower(%1) .. "]%2") local title = mw.title.new(page) if title == nil then return "Non-existant or empty page! " .. page end if title.id == 0 then return "Page: " .. page .. " does not exist!" end local newdata = title:getContent() if newdata == nil or newdata == "" or not newdata == true then return "No data to work with on page: " .. page end -- Special spot for addition-- UTF-8 characters if need be for gsub as they can kill processing in places newdata = string.gsub(newdata,"ö","UMLAUT") newdata = string.gsub(newdata,"ß","SSSSS") -- General can get away with newdata = string.gsub(newdata,"%s*|%s*","|") -- yes - no spaces around newdata = string.gsub(newdata,"%s+"," ") -- down to single spacing -- see also -- anchor if type ~= "IATA" then newdata = string.gsub(newdata,"{{IATA(%|*%w*)}}","opencurlyopencurlyIATA%1closecurlyclosecurly") end if type ~= "rint" then newdata = string.gsub(newdata,"{{rint(%|*%w*%|*%w*)}}","opencurlyopencurlyrint%1closecurlyclosecurly") newdata = string.gsub(newdata,"{{rint(%/*%w*%|*%w*)}}","opencurlyopencurlyrint%1closecurlyclosecurly") newdata = string.gsub(newdata,"{{rint(%/*%w*%|*%w*%|*%w*)}}","opencurlyopencurlyrint%1closecurlyclosecurly") end if type == "flag+" then type = "flag" newdata = string.gsub(newdata,"{{flag|(%w*%s*%w*%s*%w*%s*%w*%s*%w*%s*%w*%s*)}}%s*{{","{{flag|%1closecurlyclosecurly opencurlyopencurly") end if type ~= "station" then pattern="|%w*%/*%s*%w*" counter = 0 copypattern=pattern for i=1,15 do newdata,counter = string.gsub(newdata,"{{station(" .. copypattern .. ")}}","opencurlyopencurlystation%1closecurlyclosecurly") copypattern = copypattern .. pattern end end if type ~= "station" and type ~= "rint" and type ~= "marker" and type ~= "anchor" then -- newdata = string.gsub(newdata,"%*%s*%{%{","*{{") newdata = string.gsub(newdata,"%{%{%{%{","{{opencurlyopencurly") -- Question - internal template? newdata = string.gsub(newdata,"}}}}","closecurlyclosecurly}}") newdata = string.gsub(newdata,"%{%{%{","opencurlyopencurlyopencurly") newdata = string.gsub(newdata,"}}}","closecurlyclosecurlyclosecurly") newdata = string.gsub(newdata,"=%{%{","=opencurlyopencurly") newdata = string.gsub(newdata,"}}%s*|","closecurlyclosecurly|") -- newdata = string.gsub(newdata,"}} ","closecurlyclosecurly ") -- newdata = string.gsub(newdata,"}}%,","closecurlyclosecurly,") -- newdata = string.gsub(newdata,"}}%;","closecurlyclosecurly;") newdata = string.gsub(newdata,"}}%s*}}","closecurlyclosecurly}}") newdata = string.gsub(newdata,"@","BULLET") else end local output = "" -- local xyz = string.match (mw.title.new ('United States National Parks'):getContent(), '{{ *marker *| *([^}]+) *}}') local zip = type -- zip = "[" .. string.upper(string.sub(type,1,1)) .. string.lower(string.sub(type,1,1)) .. "]" .. string.sub(zip,2,20) if subtype == nil or subtype == "" then for i in string.gmatch (newdata, '{{%s*' .. zip .. '%s*|%s*([^}]+)%s*}}') do output = output .. "\n* {{" .. type .. "|" .. i .. "}}" end else for i in string.gmatch (newdata, '{{%s*' .. zip .. '%s*|%s*type=' .. subtype .. '%s*|%s*([^}]+)%s*}}') do output = output .. "\n* {{" .. type .. "| type=" .. subtype .. "|" .. i .. "}}" end end output = string.gsub(output,"opencurly","{") output = string.gsub(output,"closecurly","}") output = string.gsub(output,"BULLET","@") output = string.gsub(output,"UMLAUT","ö") output = string.gsub(output,"SSSSS","ß") return output end -- Generally speaking - listing templates such as see can contain marker, station and rint templates and hopefully not another see template -- markers, station and rint templates can be extracted on their own - or can grab station & other templates within the confines of -- an overall template - this insures the complete template one is looking for... -- Matroc -- getname local function for quickgrab2 local function getname(page) local name=mw.wikibase.getEntityIdForTitle(page) if name == "" or name == nil then return "" end return name end function p.quickgrab2(frame) local sort = frame.args['sort'] or "no" local sortname = "" local sectionorig = frame.args['section'] or "" local section = "" local sectionx = "" local level = frame.args['level'] or "0" if sectionorig == nil or sectionorig == "" then level = "0" end if tonumber(level) <= 1 or tonumber(level) > 5 then level = "0" sectionorig = "" end local name = frame.args['name'] or "" -- look for particular name=aaaaa aaa local counter = 1 -- counter for array content local content = {} -- array for matching template entries local x = "" -- beginning position for template str to be output local y = "" -- end position of template str to be output local output = "" -- concatenated output of found template strings local separator = "@@@@@" -- separator to split page up by local page = frame.args['page'] or "" -- page to lookup and work from local type = frame.args['type'] or "" -- type of listing to search for (ie listing) local typeul = "" -- type for replacement 1st character becomes {Aa] local subtype = frame.args['subtype'] or "" -- specific type to select from local subtypeul = "" -- 1st character for replacement 1st character becomes [Aa] local zip = "" -- used to copy typeul and/or subtypeul local replacement = "" -- replacement string to make templates in common form local title = mw.title.new(page) -- create an empty new page workspace -- later get Content of existing page to work with if type == nil or type == "" then return "Selection type is missing for page: " .. page end if title == nil then return "Non-existant or empty page! " .. page end if title.id == 0 then return "Page: " .. page .. " does not exist!" end local id = getname(page) -- certain mapshapes don't have anything but would need id local newdata = title:getContent() local part1 = "" local part2 = "" -- split up newdata if need be to 2 parts then recombine local a,b,c,d = 0 if newdata == nil or newdata == "" or not newdata == true then return "No data to work with on page: " .. page end if sectionorig ~= nil and sectionorig ~= "" then sectionorig = string.gsub(sectionorig,"@","|") if level == "5" then section = "section5" .. sectionorig .. "section5" sectionx = "section5 " .. sectionorig .. " section5" end if level == "4" then section = "section4" .. sectionorig .. "section4" sectionx = "section4 " .. sectionorig .. " section4" end if level == "3" then section = "section3" .. sectionorig .. "section3" sectionx = "section3 " .. sectionorig .. " section3" end if level == "2" then section = "section2" .. sectionorig .. "section2" sectionx = "section2 " .. sectionorig .. " section2" end newdata = string.gsub(newdata,"%(","openparens") newdata = string.gsub(newdata,"%)","closeparens") newdata = string.gsub(newdata,"%|","PIPE") newdata = string.gsub(newdata,"%.","PERIOD") newdata = string.gsub(newdata,"%,","COMMA") newdata = string.gsub(newdata,"(==+)(%[+%s*)","%1") newdata = string.gsub(newdata,"(%s*%]+)(==+)","%2") newdata = string.gsub(newdata,"openparens","(") newdata = string.gsub(newdata,"closeparens",")") newdata = string.gsub(newdata,"PIPE","|") newdata = string.gsub(newdata,"PERIOD",".") newdata = string.gsub(newdata,"COMMA",",") newdata = string.gsub(newdata,"=====","section5") newdata = string.gsub(newdata,"====","section4") newdata = string.gsub(newdata,"===","section3") newdata = string.gsub(newdata,"==","section2") if string.find(newdata,sectionx .. ".*") ~= nil then section = sectionx end if string.find(newdata,section .. ".*") == nil then return "section not found" else a,b = string.find(newdata,section .. ".*") newdata = string.sub(newdata,a) part1 = newdata end if string.find(newdata,section .. ".*",10) ~= nil then c,d=string.find(newdata,section .. ".*",10) part1 = string.sub(newdata,1,c) part2 = string.sub(newdata,c) end part1 = string.gsub(part1,section,"BEGINSECTION") part2 = string.gsub(part2,section,"BEGINSECTION") if level == "2" then part1 = string.gsub(part1,"section2.*","") part2 = string.gsub(part2,"section2.*","") end if level == "3" then part1 = string.gsub(part1,"section[23].*","") part2 = string.gsub(part2,"section[23].*","") end if level == "4" then part1 = string.gsub(part1,"section[234].*","") part2 = string.gsub(part2,"section[234].*","") end if level == 5 then part1 = string.gsub(part1,"section[2345].*","") part2 = string.gsub(part2,"section[2345].*","") end newdata = part1 .. part2 part1 = "" part2 = "" newdata = string.gsub(newdata,"BEGINSECTION",section) newdata = newdata end newdata = string.gsub(newdata,"\n", " ") newdata = string.gsub(newdata,"%s+"," ") newdata = string.gsub(newdata,"@","BULLET") -- avoiding @ clash with @@@@@ separator newdata = string.gsub(newdata,"{{%s*","{{") newdata = string.gsub(newdata,"%s*}}","}}") newdata = string.gsub(newdata,"%s*|%s*","|") newdata = string.gsub(newdata,'%{%{seealso','{{SEEALSO') newdata = string.gsub(newdata,'%{%{see also','{{SEEALSO') newdata = string.gsub(newdata,'%{%{[Ss]eeDistricts}}','SEEDISTRICTS') -- other hatnotes could be added here as well -- to avoid issues with listing templates -- should always have a type - marker,listing,see,mapframe,station,rint etc. if type == "flag+" then -- common form substitution to get {{flag}} {{listing combinations type = "flag" newdata = string.gsub(newdata,"-","HYPHEN") -- special to be able to make match/substitutions newdata = string.gsub(newdata,"ã","AACCENTA") newdata = string.gsub(newdata,"é","EACCENTE") newdata = string.gsub(newdata,"í","IACCENTI") newdata = string.gsub(newdata,"'","ACCENT") newdata = string.gsub(newdata,"{{[Ff]lag|(%w*%s*%w*%s*%w*%s*%w*%s*%w*%s*%w*)}}%s*{{","{{flag|%1closecurlyclosecurly opencurlyopencurly") newdata = string.gsub(newdata,"HYPHEN","-") newdata = string.gsub(newdata,"AACCENTA","ã") newdata = string.gsub(newdata,"EACCENTE","é") newdata = string.gsub(newdata,"IACCENTI","í") newdata = string.gsub(newdata,"ACCENT","'") end -- Some put in lowercase first character others uppercase - this should match up ok zip = type typeul = "[" .. string.upper(string.sub(zip,1,1)) .. string.lower(string.sub(zip,1,1)) .. "]" .. string.sub(zip,2,20) replacement = typeul if subtype ~= nil and subtype ~= "" then zip = subtype subtypeul = "[" .. string.upper(string.sub(zip,1,1)) .. string.lower(string.sub(zip,1,1)) .. "]" .. string.sub(zip,2,20) replacement = replacement .. "|type=" .. subtypeul newdata = string.gsub(newdata,"{{" .. replacement,"@@@@@{{" .. type .. "|type=" .. subtype) else newdata = string.gsub(newdata,"{{" .. replacement,"@@@@@{{" .. type) end for str in string.gmatch(newdata,"([^"..separator.."]+)") do if string.find(str,"^%{%{" .. replacement) ~= nil then if str ~= nil then x,y = string.find(str,"%b{}") if x ~= nil and y ~= nil then str = string.sub(str,x,y) str = string.gsub(str,"BULLET","@") if name == nil or name == "" then -- str = string.gsub(str,"^","\n%* ") if sort == "yes" then sortname = string.gsub(str,"^.*name=","") -- sortname = string.gsub(sortname,"|.*","") -- sort by internal link sortname = string.gsub(sortname,"|%s*%w*=.*","") -- sort by name sortname = string.gsub(sortname,"^.*|","") -- sort by name sortname = string.gsub(sortname,"}}.*","") sortname = str.gsub(sortname,"%[+","") sortname = sortname .. string.rep(".", 20 - #sortname) sortname = string.upper(sortname) str = sortname .. "SORTIT" .. str end content[counter],_ = str counter = counter + 1 elseif string.find(str,"|name=" .. name) ~= nil or string.find(str,"|name=%[%[" .. name) ~= nil or string.find(str,"name=%[%[%s*.*%s*|%s*" .. name) ~= nil then -- str = string.gsub(str,"^","\n%* ") if sort == "yes" then sortname = string.gsub(str,"^.*name=","") -- sortname = string.gsub(sortname,"|.*","") -- sort by internal link sortname = string.gsub(sortname,"|%s*%w*=.*","") -- sort by name sortname = string.gsub(sortname,"^.*|","") -- sort by name sortname = string.gsub(sortname,"}}.*","") sortname = str.gsub(sortname,"%[+","") sortname = sortname .. string.rep(".", 20 - #sortname) sortname = string.upper(sortname) str = sortname .. "SORTIT" .. str end content[counter],_ = str counter = counter + 1 end end end end end if sort == "yes" then table.sort(content) end -- want some output to not be preceded by an * -- some templates like geo can't stand apaces befor and after | for i=1,#content do if string.match(type,"^[Mm]ap.*") ~= nil or string.match(type,"^[Gg]eo.*") ~= nil then if string.match(type,"[Mm]apshape") ~= nil and string.match(content[i],"{{[Mm]apshape}}") ~= nil then if id ~= nil then content[i] = string.gsub(content[i],"}}","|wikidata=" .. id .. "}}") end end if string.match(type,"[Mm]apframe") ~= nil and string.match(content[i],"{{[Mm]apframe.*}}") ~= nil then if string.match(content[i],"name=") == nil then content[i] = string.gsub(content[i],"}}","|name=" .. page .. "}}") end end if string.match(type,"^[Gg]eo.*") ~= nil then content[i] = string.gsub(content[i],"|","PIPE") end output = output .. "\n" .. string.gsub(content[i],".*SORTIT","") else output = output .. "\n* " .. string.gsub(content[i],".*SORTIT","") end end output = string.gsub(output,"opencurly","{") output = string.gsub(output,"closecurly","}") output = string.gsub(output,"%{%{SEEALSO","{{see also") output = string.gsub(output,"%{%{SEEDISTRICTS","SeeDistricts") output = string.gsub(output,"|"," | ") output = string.gsub(output,"PIPE","|") return output end -- getting lat long image via passing an ID local function returnitems(wikidata) local latitude = "" local longitude = "" local image = "" local id = wikidata local entity = mw.wikibase.getEntityObject(id) if entity == nil then return latitude,longitude,image end local claims = entity.claims if claims == nil then return latitude,longitude,image end if claims.P625 ~= nil then latitude = entity.claims.P625[1].mainsnak.datavalue.value.latitude end if claims.P625 ~= nil then longitude = entity.claims.P625[1].mainsnak.datavalue.value.longitude end if claims.P18 ~= nil then image = entity.claims.P18[1].mainsnak.datavalue.value end return latitude,longitude,image end -- MOST OUTPUT FIXED function p.returnit(frame) local data = frame.args[1] or "" local group = frame.args['group'] or "luksee" local show = frame.args['show'] or group local records = {} for i=1,100 do records[i] = {} records[i]['name'] = "" records[i]['wikidata'] = "" records[i]['lat'] = "" records[i]['long'] = "" records[i]['image'] = "" records[i]['description'] = "" end local separator = "ENDREC" local counter = 1 local nolistings = 0 local name= "" local wikidata = "" local lat = "" local long = "" local latitude = "" -- from wikidata local longitude = "" -- from wikidata local image = "" local latitudexx = "" local longitudexx = "" local imagexx = "" -- from wikidata local description = "" local beginit = "" local endit = "" local output = "" local symbol = frame.args['symbol'] or "star" local color = frame.args['color'] or "#ffaabb" for line in string.gmatch(data,"([^"..separator.."]+)") do if line ~= "" and line ~= nil then line = "@@@@@" .. line line = string.gsub(line,"XPIPEX","|") --line = string.gsub(line,"EQUALS","=") line = string.gsub(line,"%}%}","@@@@@") line = string.gsub(line,'%}%}','') line = string.gsub(line,"%|","@@@@@") name = string.gsub(string.gsub(line,'^.*name%=',''),'@@@@@.*','') wikidata = string.gsub(string.gsub(line,'^.*wikidata%=',''),'@@@@@.*','') lat = string.gsub(string.gsub(line,'^.*lat%=',''),'@@@@@.*','') long = string.gsub(string.gsub(line,'^.*long%=',''),'@@@@@.*','') image = string.gsub(string.gsub(line,'^.*image%=',''),'@@@@@.*','') description = string.gsub(string.gsub(line,'^.*content%=',''),'@@@@@.*','') -- if wikidata ~= nil and wikidata ~= "" then -- latitudexx,longitudexx,imagexx = returnitems(wikidata) -- if lat == nil or lat == "" then lat = latitudexx end -- if long == nil or long == "" then long = longitudexx end -- if image == nil or image == "" then image = imagexx end -- end -- end if wikidata if image ~= nil and image ~= "" then image = "[[File:" .. image .. "|260px]] " description = image .. description end -- records[counter] = {} records[counter]['name'] = name or "" -- assume there records[counter]['wikidata'] = wikidata or "" -- may or may not be there records[counter]['lat'] = lat -- may or may not be there records[counter]['long'] = long -- may or may not be there records[counter]['image'] = image -- may or ay not be there records[counter]['description'] = description -- may or may not be there counter = counter + 1 if records[2]['description'] ~= nil and records[2]['description'] ~= "" then return records[2]['description'] end -- if line ~= nil then return line end -- if counter == 2 then return line end end end -- checkpoint if counter >= 1 then return counter end beginit = "<maplink class=\"no-icon\" text=\"\" zoom=\"11\" group=\"seeSwansea\">{\"" beginit = beginit .. "\"type\": \"FeatureCollection\", \"features\": [" endit = "] }</maplink> \n\n" -- testcheck - if beginit ~= nil then return beginit .. endit end for i = 1,counter -1 ,1 do output = output .. '\<maplink class=\"icon\" text=\"\" zoom=\"11\" group=\"' .. group .. '\"\>\n' output = output .. '{\"type\": \"Feature\",\"geometry\": { \"type\":\"Point\", \"coordinates\":\n' output = output .. '[' .. records[i]['long'] .. "," .. records[i]['lat'] .. ']},\n' output = output .. '\"properties\":{\n' output = output .. '\"title\": \"' .. records[i]['name'] .. '\",\n' if records[i]['description'] ~= nil and records[i]['description'] ~= "" then output = output .. '\"description\": \"' .. records[i]['description'] .. '\",\n' end output = output .. '\"marker-symbol\": \"' .. symbol .. '",\n' output = output .. '\"marker-color\": \"' .. color .. '\"\n}},' -- testcheck2 - if output ~= nil then return output end end if output ~= nil and output ~= "" then output = string.gsub(output,"%,$",'') -- get rid of ending comma output = beginit .. output .. endit else output = "" end return output end function p.linkref(frame) local name = frame.args['name'] or "" local output = "" local maplink = frame.args['maplink'] or "0" local id = frame.args['id'] or "" local lat = frame.args['lat'] or "" local latitude = "" local longitude = "" local long = frame.args['long'] or "" local zoom = frame.args['zoom'] or "11" local entity = "" local claims = "" if lat == nil or lat == '' and long == nil or long == '' then if id ~= nil and id ~= '' then entity = mw.wikibase.getEntityObject(id) claims = entity.claims if pcall(function () t =claims.P625 end ) then if pcall(function () t =entity.claims.P625[1].mainsnak.datavalue.value.latitude end ) then latitude = entity.claims.P625[1].mainsnak.datavalue.value.latitude else latitude = "" end if pcall(function () t =entity.claims.P625[1].mainsnak.datavalue.value.longitude end ) then longitude = entity.claims.P625[1].mainsnak.datavalue.value.longitude else longitude = "" end end end end if lat ~= nil and lat ~= "" then latitude = lat end if long ~= nil and long ~= "" then longitude = long end latitude = string.format("%.4f",latitude) longitude = string.format("%.4f",longitude) output = "[[{{FULLPAGENAME}}#map/" .. maplink .. "/" .. zoom .. "/" .. latitude .. '/' .. longitude .. "|" .. name .. "]]" return output end function p.newcenter(frame) local x = string.format("%.6f",frame.args['lat']) local y = string.format("%.6f",frame.args['long']) local radius = frame.args['radius'] local angle = 0 local ptx = 0 local pty = 0 local type = frame.args['type'] or "c" local direction = frame.args['direction'] or "e" if direction ~= "e" and direction ~= "w" and direction ~= "n" and direction ~= "s" then direction = "e" end radius = tonumber(radius) if radius > 10 then error("10 for radius is MAX") end -- my default if radius <= 0 then error("radius has to be greater than 0") end if type == "c" then radius = radius * 2 else radius = radius * 1.5 end if direction == "e" then angle = 90 * math.pi / 180 ptx = x + radius * math.cos( angle ) pty = y + radius * math.sin( angle ) end if direction == "w" then angle = 270 * math.pi / 180 ptx = x + radius * math.cos( angle ) pty = y + radius * math.sin( angle ) end if direction == "n" then angle = 360 * math.pi / 180 ptx = x + radius * math.cos( angle ) pty = y + radius * math.sin( angle ) end if direction == "s" then angle = 180 * math.pi / 180 ptx = x + radius * math.cos( angle ) pty = y + radius * math.sin( angle ) end if tonumber(x) >= 10.5 then ptx = newlat(ptx) -- makes correction to make circle show up on map end if tonumber(x) <= -10.5 then ptx = newlat(ptx) -- makes correction to make circle show up on map end ptx = string.format("%.4f",ptx) pty = string.format("%.4f",pty) return "latitude: " .. ptx .. " - longitude: " .. pty end function p.connect(frame) local id=frame.args['id'] local count = 0 local latlong = {} local latitude = "" local longitude = "" local cumlat = 0 local cumlong = 0 local line = "" local output="" local entity = mw.wikibase.getEntityObject(id) if entity == nil then return "No lat long" end local claims = entity.claims if claims == nil then return "No lat long" end if claims.P625 ~= nil then for _ in pairs(entity.claims.P625) do count = count + 1 longitude = entity.claims.P625[count].mainsnak.datavalue.value.longitude latitude = entity.claims.P625[count].mainsnak.datavalue.value.latitude latlong[count] = longitude .. "," .. latitude cumlong = cumlong + longitude cumlat = cumlat + latitude end end for i=1, count do line = line .. "[" .. latlong[i] .. "]" .. "," end line = string.gsub(line,"%,$","") output = output .. '\n<mapframe text="Test Map" frame="yes" zoom="6" latitude="' .. cumlat/count .. '" longitude="' .. cumlong/count .. '" width="600" height="400" frame="yes">' output = output .. '\n{"type": "FeatureCollection", "features": [' for i=1, count do output = output .. '\n\n{' .. '"type": "Feature",' .. '"properties": {' .. '"marker-color": "#bbccff",' output = output .. ' "marker-symbol": "-number",' .. '},' .. '\n\n"geometry": {' .. ' "type": "Point",' output = output .. ' "coordinates": [' .. latlong[i] .. "]}}," end output = output .. '\n\n{"type":"Feature", "properties": { "stroke":"#D3D3D3", "stroke-opacity":0.7, "stroke-width":50,},' output = output .. '\n\n"geometry": {"type":"LineString", "coordinates": [' .. line .. ']}},' output = output .. ']}<br></mapframe>\n' end return p