Modül:Konum haritası
Vikipedi, özgür ansiklopedi
Bu modül şu Lua modüllerini kullanıyor: |
Çok fazla sayfada kullanılan bu modül korumaya alınmıştır. Vandalizm veya istem dışı hatalar pek çok sayfayı etkileyeceğinden ve en ufak düzenleme bile sunuculara önemli bir yük bindirebileceğinden korumaya tabidir. |
Bu Lua modülü yaklaşık 578.000 sayfada kullanılmaktadır. Lütfen yapacağınız değişiklikleri büyük ölçekli aksamaları ve sunucuya gereksiz yük binmesini önlemek için öncelikle şablonun deneme tahtası ile test senaryosu alt sayfalarında ya da kendi kullanıcı sayfanızda test ediniz. Testten geçen değişiklikler daha sonra bu sayfaya tek bir düzenlemede eklenebilir. Eğer yapmayı planladığınız değişiklikler ile istediğiniz sonucu elde edemiyorsanız tartışma sayfasında görüş alışverişinde bulununuz. |
Kullanımı
Bu modül {{Konum haritası}} ve {{Konum haritası~}} şablonlarını çalıştırır. Kullanım talimatları için lütfen şablonların belgelemelerine bakın.
İzleme/bakım kategorileri
Tüm haritalar
Ayrıca bakınız
require('Modül:Küresel değil') local p = {} local getArgs = require('Modül:Bağımsız değişkenler').getArgs local ulkeler = require("Modül:Ülkeler").ulkeler local function round(n, decimals) local pow = 10^(decimals or 0) return math.floor(n * pow + 0.5) / pow end function p.getTurkishParams(args) --Türkçe parametreleri tanıtalım args.width = args['genişlik'] or args.width args.default_width = args['varsayılan_genişlik'] or args.default_width args.float = args['pozisyon'] or args.float args.border = args['kontur'] or args.border args.caption = args['altyazı'] or args.caption args.relief = args['rölyef'] or args.relief args.AlternativeMap = args['alternatif_harita'] or args.AlternativeMap args.overlay_image = args['bindirilen_resim'] or args.overlay_image args.label = args['etiket'] or args['etiket1'] or args.label args.label_size = args['etiket_boyutu'] or args['etiket1_boyutu'] or args.label_size args.label_width = args['etiket_genişlik'] or args['etiket1_genişlik'] or args.label_width args.position = args['etiket_konumu'] or args['etiket1_konumu'] or args.position args.background = args['arkaplan'] or args['arkaplan1'] or args.background args.mark = args['işaret'] or args['işaret1'] or args.mark args.marksize = args['işaret_boyutu'] or args['işaret1_boyutu'] or args.marksize args.link = args['bağ'] or args['bağ1'] or args.link args.lat = args['enlem'] or args['enlem1'] or args.lat args.long = args['boylam'] or args['boylam1'] or args.long args.lat_deg = args['enlem_der'] or args['enlem1_der'] or args.lat_deg args.lat_min = args['enlem_dak'] or args['enlem1_dak'] or args.lat_min args.lat_sec = args['enlem_san'] or args['enlem1_san'] or args.lat_sec args.lat_dir = args['enlem_dir'] or args['enlem1_dir'] or args.lat_dir args.lon_deg = args['boylam_der'] or args['boylam1_der'] or args.lon_deg args.lon_min = args['boylam_dak'] or args['boylam1_dak'] or args.lon_min args.lon_sec = args['boylam_san'] or args['boylam1_san'] or args.lon_sec args.lon_dir = args['boylam_dir'] or args['boylam1_dir'] or args.lon_dir args.outside = args['dışarıda'] or args.outside args.places = args['yerler'] or args.places args.coordinates = args['koordinatlar'] or args['koordinatlar1'] or args.coordinates end local function ulkeBul(harita) local sayfa = harita local s, d = sayfa, "" local function bulvedeg(yazi, bir, iki) return mw.ustring.sub( mw.ustring.gsub(yazi, bir, iki), 1, -1 ) end for i=1,5 do if ulkeler[d] then break else d = d .. (d~="" and " " or "") .. bulvedeg(s, "%s.*", "") s = bulvedeg(s, "^[^%s]*%s*", "") end end return ulkeler[d] and bulvedeg(sayfa, d, ulkeler[d]) or sayfa end function p.getMapParams(map, frame) --ülke çevirici map = ulkeBul(map) if not map then error('Kullanılacak konum haritası tanımının adı belirtilmek zorundadır', 2) end local moduletitle = mw.title.new('Modül:Konum haritası/veri/' .. map) if not moduletitle then error(string.format('%q konum haritası tanımı için geçerli ad değil', map), 2) elseif moduletitle.exists then local mapData = mw.loadData('Modül:Konum haritası/veri/' .. map) return function(name, params) if name == nil then return 'Modül:Konum haritası/veri/' .. map elseif mapData[name] == nil then return '' elseif params then return mw.message.newRawMessage(tostring(mapData[name]), unpack(params)):plain() else return mapData[name] end end else return "-1" --error('Belirtilen konum haritası tanımı bulunamıyor. "Modül:Konum haritası/veri/' .. map .. '" mevcut değil', 2) end end function p.veri(frame, args, map) if not args then args = getArgs(frame, {frameOnly = true}) end if not map then map = p.getMapParams(args[1], frame) end local params = {} for k,v in ipairs(args) do if k > 2 then params[k-2] = v end end return map(args[2], #params ~= 0 and params) end local hemisphereMultipliers = { boylam = { W = -1, w = -1, B = -1, b = -1, E = 1, e = 1, D = 1, d = 1 }, enlem = { S = -1, s = -1, G = -1, g = -1, N = 1, n = 1, K = 1, k = 1 } } local function decdeg(degrees, minutes, seconds, hemisphere, decimal, direction) if decimal then if degrees then error('Desimal ve DDS dereceleri her iki ' .. direction .. ' için değer verilebilir', 2) elseif minutes then error('Dakikaya ' .. direction ..' için yalnızca DDS dereceleri ile değer verilebilir', 2) elseif seconds then error('Saniyeye ' .. direction ..' için yalnızca DDS dereceleri ile değer verilebilir', 2) elseif hemisphere then error('Bir yarımküreye ' .. direction ..' için yalnızca DDS dereceleri ile değer verilebilir', 2) end local retval = tonumber(decimal) if retval then return retval end error(direction .. ' için verilen değer ' .. decimal .. ' için geçerli değil', 2) elseif seconds and not minutes then error('Ayrıca ' .. direction .. ' için değer verilen dakika olmadan saniyeye değer verildi', 2) elseif not degrees then if minutes then error('Ayrıca ' .. direction .. ' için değer verilen derece olmadan dakikaya değer verildi', 2) elseif hemisphere then error('Ayrıca ' .. direction .. ' için değer verilen derece olmadan bir yarımküreye değer verildi', 2) end return nil end decimal = tonumber(degrees) if not decimal then error(direction .. ' için verilen değer ' .. degrees .. ' için geçerli değil', 2) elseif minutes and not tonumber(minutes) then error(direction .. ' için verilen değer ' .. minutes .. ' için geçerli değil', 2) elseif seconds and not tonumber(seconds) then error(direction .. ' için verilen değer ' .. seconds .. ' için geçerli değil', 2) end decimal = decimal + (minutes or 0)/60 + (seconds or 0)/3600 if hemisphere then local multiplier = hemisphereMultipliers[direction][hemisphere] if not multiplier then error(direction .. ' için verilen değer ' .. hemisphere .. ' için geçerli değil', 2) end decimal = decimal * multiplier end return decimal end -- Finds a parameter in a transclusion of {{Coord}}. local function coord2text(para,coord) -- this should be changed for languages which do not use Arabic numerals or the degree sign local result = mw.text.split(mw.ustring.match(coord,'%-?[%.%d]+°[NSKG] %-?[%.%d]+°[EWDB]') or '', '[ °]') if para == 'boylam' then result = {result[3], result[4]} end if not tonumber(result[1]) or not result[2] then return error('Hatalı koordinat değerleri', 2) end return tonumber(result[1]) * hemisphereMultipliers[para][result[2]] end -- effectively make removeBlanks false for caption and maplink, and true for everything else -- if useWikidata is present but blank, convert it to false instead of nil -- p.top, p.bottom, and their callers need to use this function p.valueFunc(key, value) if value then value = mw.text.trim(value) end if value ~= '' or key == 'caption' or key == 'maplink' then return value elseif key == 'useWikidata' then return false end end local function getContainerImage(args, map) if args.AlternativeMap then return args.AlternativeMap elseif args.relief and map('resim1') ~= '' then return map('resim1') else return map('resim') end end function p.top(frame, args, map) if not args then args = getArgs(frame, {frameOnly = true, valueFunc = p.valueFunc}) end if not map then map = p.getMapParams(args[1], frame) end local width local default_as_number = tonumber(mw.ustring.match(tostring(args.default_width),"%d*")) if not args.width then width = round((default_as_number or 240) * (tonumber(map('varsayılan_ölçü')) or 1)) elseif mw.ustring.sub(args.width, -2) == 'px' then width = mw.ustring.sub(args.width, 1, -3) else width = args.width end local width_as_number = tonumber(mw.ustring.match(tostring(width),"%d*")) or 0; if width_as_number == 0 then -- check to see if width is junk. If it is, then use default calculation width = round((default_as_number or 240) * (tonumber(map('varsayılan_ölçü')) or 1)) width_as_number = tonumber(mw.ustring.match(tostring(width),"%d*")) or 0; end if args.max_width ~= "" and args.max_width ~= nil then -- check to see if width bigger than max_width local max_as_number = tonumber(mw.ustring.match(args.max_width,"%d*")) or 0; if width_as_number>max_as_number and max_as_number>0 then width = args.max_width; end end local retval = frame:extensionTag{name = 'templatestyles', args = {src = 'Şablon:Konum haritası/stiller.css'}} if args.float == 'center' then retval = retval .. '<div class="center">' end if args.caption and args.caption ~= '' and args.border ~= 'infobox' then retval = retval .. '<div class="locmap noviewer thumb ' if args.float == '"left"' or args.float == 'left' then retval = retval .. 'tleft' elseif args.float == '"center"' or args.float == 'center' or args.float == '"none"' or args.float == 'none' then retval = retval .. 'tnone' else retval = retval .. 'tright' end retval = retval .. '"><div class="thumbinner" style="width:' .. (width + 2) .. 'px' if args.border == 'none' then retval = retval .. ';border:none' elseif args.border then retval = retval .. ';border-color:' .. args.border end retval = retval .. '"><div style="position:relative;width:' .. width .. 'px' .. (args.border ~= 'none' and ';border:1px solid lightgray">' or '">') else retval = retval .. '<div class="locmap" style="width:' .. width .. 'px;' if args.float == '"left"' or args.float == 'left' then retval = retval .. 'float:left;clear:left' elseif args.float == '"center"' or args.float == 'center' then retval = retval .. 'float:none;clear:both;margin-left:auto;margin-right:auto' elseif args.float == '"none"' or args.float == 'none' then retval = retval .. 'float:none;clear:none' else retval = retval .. 'float:right;clear:right' end retval = retval .. '"><div style="width:' .. width .. 'px;padding:0"><div style="position:relative;width:' .. width .. 'px">' end local image = getContainerImage(args, map) local currentTitle = mw.title.getCurrentTitle() retval = string.format( '%s[[Dosya:%s|%spx|%s%s]]', retval, image, width, args.alt or (map('ad') .. ' üzerinde ' .. (args.label or currentTitle.text)), args.maplink and ('|link=' .. args.maplink) or '' ) if args.caption and args.caption ~= '' then if (currentTitle.namespace == 0) and mw.ustring.find(args.caption, '##') then retval = retval .. '[[Kategori:Pages using location map with a double number sign in the caption]]' end end if args.overlay_image then return retval .. '<div style="position:absolute;top:0;left:0">[[Dosya:' .. args.overlay_image .. '|' .. width .. 'px]]</div>' else return retval end end function p.bottom(frame, args, map) if not args then args = getArgs(frame, {frameOnly = true, valueFunc = p.valueFunc}) end if not map then map = p.getMapParams(args[1], frame) end local retval = '</div>' local currentTitle = mw.title.getCurrentTitle() if not args.caption or args.border == 'infobox' then if args.border then retval = retval .. '<div style="padding-top:0.2em">' else retval = retval .. '<div style="font-size:91%;padding-top:3px">' end retval = retval .. (args.caption or (args.label or currentTitle.text) .. ' (' .. map('ad') .. ')') .. '</div>' elseif args.caption ~= '' then -- This is not the pipe trick. We're creating a link with no text on purpose, so that CSS can give us a nice image retval = retval .. '<div class="thumbcaption"><div class="magnify">[[:Dosya:' .. getContainerImage(args, map) .. '| ]]</div>' .. args.caption .. '</div>' end if args.switcherLabel then retval = retval .. '<span class="switcher-label" style="display:none">' .. args.switcherLabel .. '</span>' elseif args.autoSwitcherLabel then retval = retval .. '<span class="switcher-label" style="display:none">' .. map('ad') .. ' haritasında göster</span>' end retval = retval .. '</div></div>' if args.caption_undefined then mw.log('Silinen caption_undefined parametresi kullanıldı.') local parent = frame:getParent() if parent then mw.log('Parent is ' .. parent:getTitle()) end mw.logObject(args, 'args') if currentTitle.namespace == 0 then retval = retval .. '[[Kategori:Konum haritaları ile olası hataları|Sayfa parametresi kullanılarak kaldırılanlar]]' end end if map('eğri') ~= '' or map('enlem_eğri') ~= '' or map('çakışma180') ~= '' or map('tip') ~= '' then mw.log('Removed parameter used in map definition ' .. map()) if currentTitle.namespace == 0 then local key = (map('eğri') ~= '' and 'eğri' or '') .. (map('enlem_eğri') ~= '' and 'enlem_eğri' or '') .. (map('çakışma180') ~= '' and 'çakışma180' or '') .. (map('tip') ~= '' and 'tip' or '') retval = retval .. '[[Kategori:Konum haritaları ile olası hataları|' .. key .. ' ]]' end end if string.find(map('ad'), '|', 1, true) then mw.log('Pipe used in name of map definition ' .. map()) if currentTitle.namespace == 0 then retval = retval .. '[[Kategori:Konum haritaları ile olası hataları|Adı içeren boru]]' end end if args.float == 'center' then retval = retval .. '</div>' end return retval end local function markOuterDiv(x, y, imageDiv, labelDiv) return mw.html.create('div') :addClass('od') :cssText('top:' .. round(y, 3) .. '%;left:' .. round(x, 3) .. '%') :node(imageDiv) :node(labelDiv) end local function markImageDiv(mark, marksize, label, link, alt, title) local builder = mw.html.create('div') :addClass('id') :cssText('left:-' .. round(marksize / 2) .. 'px;top:-' .. round(marksize / 2) .. 'px') :attr('title', title) if marksize ~= 0 then builder:wikitext(string.format( '[[File:%s|%dx%dpx|%s|link=%s%s]]', mark, marksize, marksize, label, link, alt and ('|alt=' .. alt) or '' )) end return builder end local function markLabelDiv(label, label_size, label_width, position, background, x, marksize) if tonumber(label_size) == 0 then return mw.html.create('div'):addClass('l0'):wikitext(label) end local builder = mw.html.create('div') :cssText('font-size:' .. label_size .. '%;width:' .. label_width .. 'em') local distance = round(marksize / 2 + 1) if position == 'top' then -- specified top builder:addClass('pv'):cssText('bottom:' .. distance .. 'px;left:' .. (-label_width / 2) .. 'em') elseif position == 'bottom' then -- specified bottom builder:addClass('pv'):cssText('top:' .. distance .. 'px;left:' .. (-label_width / 2) .. 'em') elseif position == 'left' or (tonumber(x) > 70 and position ~= 'right') then -- specified left or autodetected to left builder:addClass('pl'):cssText('right:' .. distance .. 'px') else -- specified right or autodetected to right builder:addClass('pr'):cssText('left:' .. distance .. 'px') end builder = builder:tag('div') :wikitext(label) if background then builder:cssText('background-color:' .. background) end return builder:done() end local function getX(longitude, left, right) if longitude == nil then return 0 end local width = (right - left) % 360 if width == 0 then width = 360 end local distanceFromLeft = (longitude - left) % 360 -- the distance needed past the map to the right equals distanceFromLeft - width. the distance needed past the map to the left equals 360 - distanceFromLeft. to minimize page stretching, go whichever way is shorter if distanceFromLeft - width / 2 >= 180 then distanceFromLeft = distanceFromLeft - 360 end return 100 * distanceFromLeft / width end local function getY(latitude, top, bottom) if latitude == nil then return 0 end return 100 * (top - latitude) / (top - bottom) end function p.mark(frame, args, map) if not args then args = getArgs(frame, {wrappers = 'Şablon:Konum haritası~'}) end local mapnames = {} p.getTurkishParams(args) if not map then if args[1] then map = {} for mapname in mw.text.gsplit(args[1], '#', true) do map[#map + 1] = p.getMapParams(mw.ustring.gsub(mapname, '^%s*(.-)%s*$', '%1'), frame) mapnames[#mapnames + 1] = mapname end if #map == 1 then map = map[1] end else map = p.getMapParams('Dünya', frame) args[1] = 'Dünya' end end if type(map) == 'table' then local outputs = {} local oldargs = args[1] for k,v in ipairs(map) do args[1] = mapnames[k] outputs[k] = tostring(p.mark(frame, args, v)) end args[1] = oldargs return table.concat(outputs, '#PlaceList#') .. '#PlaceList#' end local x, y, longitude, latitude longitude = decdeg(args.lon_deg, args.lon_min, args.lon_sec, args.lon_dir, args.long, 'boylam') latitude = decdeg(args.lat_deg, args.lat_min, args.lat_sec, args.lat_dir, args.lat, 'enlem') if args.excludefrom then -- If this mark is to be excluded from certain maps entirely (useful in the context of multiple maps) for exclusionmap in mw.text.gsplit(args.excludefrom, '#', true) do -- Check if this map is excluded. If so, return an empty string. if args[1] == exclusionmap then return '' end end end local builder = mw.html.create() local currentTitle = mw.title.getCurrentTitle() if args.coordinates then -- Temporarily removed to facilitate infobox conversion. See [[Wikipedia:Coordinates in infoboxes]] -- if longitude or latitude then -- error('Coordinates from [[Module:Coordinates]] and individual coordinates cannot both be provided') -- end longitude = coord2text('boylam', args.coordinates) latitude = coord2text('enlem', args.coordinates) elseif not longitude and not latitude and args.useWikidata then -- If they didn't provide either coordinate, try Wikidata. If they provided one but not the other, don't. local entity = mw.wikibase.getEntity() if entity and entity.claims and entity.claims.P625 and entity.claims.P625[1].mainsnak.snaktype == 'value' then local value = entity.claims.P625[1].mainsnak.datavalue.value longitude, latitude = value.longitude, value.latitude end if args.link and (currentTitle.namespace == 0) then builder:wikitext("[[Kategori:Vikiveri'den koordinat çeken konum haritaları]]") end end if not args.useWikidata then if not longitude then error('Boylam değeri saptanamadı') elseif not latitude then error('Enlem değeri saptanamadı') end end if currentTitle.namespace > 0 then if (not args.lon_deg) ~= (not args.lat_deg) then builder:wikitext('[[Kategori:Konum haritaları ile farklı enlem ve boylam presizyonları|Derece]]') elseif (not args.lon_min) ~= (not args.lat_min) then builder:wikitext('[[Kategori:Konum haritaları ile farklı enlem ve boylam presizyonları|Dakika]]') elseif (not args.lon_sec) ~= (not args.lat_sec) then builder:wikitext('[[Kategori:Konum haritaları ile farklı enlem ve boylam presizyonları|Saniye]]') elseif (not args.lon_dir) ~= (not args.lat_dir) then builder:wikitext('[[Kategori:Konum haritaları ile farklı enlem ve boylam presizyonları|Yarımküre]]') elseif (not args.long) ~= (not args.lat) then builder:wikitext('[[Kategori:Konum haritaları ile farklı enlem ve boylam presizyonları|Desimal]]') end end if args.skew or args.lon_shift or args.markhigh then mw.log('Silinen parametre çağrıda kullanıldı.') local parent = frame:getParent() if parent then mw.log('Temel ' .. parent:getTitle()) end mw.logObject(args, 'args') if currentTitle.namespace == 0 then local key = (args.skew and 'eğri' or '') .. (args.lon_shift and 'lon_shift' or '') .. (args.markhigh and 'markhigh' or '') builder:wikitext('[[Kategori:Konum haritaları ile olası hataları|' .. key ..' ]]') end end if map('x') ~= '' then x = tonumber(mw.ext.ParserFunctions.expr(map('x', { latitude, longitude }))) else x = tonumber(getX(longitude, map('sol'), map('sağ'))) end if map('y') ~= '' then y = tonumber(mw.ext.ParserFunctions.expr(map('y', { latitude, longitude }))) else y = tonumber(getY(latitude, map('üst'), map('alt'))) end if (x < 0 or x > 100 or y < 0 or y > 100) and not args.outside then mw.log('İşaret, dış bayrak koyulmadan dış harita sınırlarına yerleştirildi. x = ' .. x .. ', y = ' .. y) local parent = frame:getParent() if parent then mw.log('Parent is ' .. parent:getTitle()) end mw.logObject(args, 'args') if currentTitle.namespace == 0 then local key = currentTitle.prefixedText builder:wikitext('[[Kategori:Konum haritaları ile olası hataları|' .. key .. ' ]]') end end local mark = args.mark or map('işaret') if mark == '' then mark = 'Red pog.svg' end local marksize = tonumber(args.marksize) or tonumber(map('işaret_boyutu')) or 8 local imageDiv = markImageDiv(mark, marksize, args.label or mw.title.getCurrentTitle().text, args.link or '', args.alt, args[2]) local labelDiv if args.label and args.position ~= 'none' then labelDiv = markLabelDiv(args.label, args.label_size or 91, args.label_width or 6, args.position, args.background, x, marksize) end return builder:node(markOuterDiv(x, y, imageDiv, labelDiv)) end local function switcherSeparate(s) if s == nil then return {} end local retval = {} for i in string.gmatch(s .. '#', '([^#]*)#') do i = mw.text.trim(i) retval[#retval + 1] = (i ~= '' and i) end return retval end function p.main(frame, args, map) local caption_list = {} if not args then args = getArgs(frame, {wrappers = 'Şablon:Konum haritası', valueFunc = p.valueFunc}) end if args.useWikidata == nil then args.useWikidata = true end p.getTurkishParams(args) if not map then if args[1] then map = {} for mapname in string.gmatch(args[1], '[^#]+') do local val = p.getMapParams(mw.ustring.gsub(mapname, '^%s*(.-)%s*$', '%1'), frame) if val ~= '-1' then map[#map + 1] = val end end if args['caption'] then if args['caption'] == "" then while #caption_list < #map do caption_list[#caption_list + 1] = args['caption'] end else for caption in mw.text.gsplit(args['caption'], '##', true) do caption_list[#caption_list + 1] = caption end end end if #map == 1 then map = map[1] end else map = p.getMapParams('Dünya', frame) end end if type(map) == 'table' then local altmaps = switcherSeparate(args.AlternativeMap) if #altmaps > #map then error(string.format('%d alternatif_harita girildi, ama sadece %d haritalar sağlandı', #altmaps, #map)) end local overlays = switcherSeparate(args.overlay_image) if #overlays > #map then error(string.format('%d bindirilen_resim girildi, ama sadece %d haritalar sağlandı', #overlays, #map)) end if #caption_list > #map then error(string.format('%d altyazılar girildi, ama sadece %d haritalar sağlandı', #caption_list, #map)) end local outputs = {} args.autoSwitcherLabel = true for k,v in ipairs(map) do args.AlternativeMap = altmaps[k] args.overlay_image = overlays[k] args.caption = caption_list[k] outputs[k] = p.main(frame, args, v) end return '<div class="switcher-container">' .. table.concat(outputs) .. '</div>' else return p.top(frame, args, map) .. tostring( p.mark(frame, args, map) ) .. p.bottom(frame, args, map) end end return p