642
回編集
template>Rxy 細 (「モジュール:Location map」を保護しました: 影響が特に大きいテンプレート: 現時点で 22654 ページからの読み込み ([編集=管理者のみに許可] (無期限) [移動=管理者のみに許可] (無...) |
Triple-Zeta (トーク | 投稿記録) 細 (13版 をインポートしました) |
||
(2人の利用者による、間の3版が非表示) | |||
12行目: | 12行目: | ||
function p.getMapParams(map, frame) | function p.getMapParams(map, frame) | ||
if not map then | if not map then | ||
error(' | error('Location mapの名前は必ず指定しなければなりません。', 2) | ||
end | end | ||
local moduletitle = mw.title.new('Module:Location map/data/' .. map) | local moduletitle = mw.title.new('Module:Location map/data/' .. map) | ||
if not moduletitle then | if not moduletitle then | ||
error(' | error(string.format('%qはLocation mapの名前として無効です。', map), 2) | ||
elseif moduletitle.exists then | elseif moduletitle.exists then | ||
local mapData = mw.loadData('Module:Location map/data/' .. map) | local mapData = mw.loadData('Module:Location map/data/' .. map) | ||
33行目: | 33行目: | ||
local cache = {} | local cache = {} | ||
if type(frame) ~= 'table' or type(frame.expandTemplate) ~= 'function' then | if type(frame) ~= 'table' or type(frame.expandTemplate) ~= 'function' then | ||
error(' | error('古いLocation mapを使うときにフレームが存在しなければなりません。') | ||
end | end | ||
return function(name, params) | return function(name, params) | ||
48行目: | 48行目: | ||
end | end | ||
else | else | ||
error(' | error('Location mapのモジュール「"Module:Location map/data/' .. map .. '"」もしくはテンプレート「"Template:Location map ' .. map .. '"」が作成されていません。', 2) | ||
end | end | ||
end | end | ||
76行目: | 76行目: | ||
if decimal then | if decimal then | ||
if degrees then | if degrees then | ||
error(' | error(direction .. 'において10進数形式と度分秒は両方指定できません。', 2) | ||
elseif minutes then | elseif minutes then | ||
error(' | error(direction .. 'において分は度分秒方式でのみ指定してください。', 2) | ||
elseif seconds then | elseif seconds then | ||
error(' | error(direction .. 'において秒は度分秒方式でのみ指定してください。', 2) | ||
elseif hemisphere then | elseif hemisphere then | ||
error(' | error(direction .. 'において半球は度分秒方式でのみ指定してください。', 2) | ||
end | end | ||
local retval = tonumber(decimal) | local retval = tonumber(decimal) | ||
88行目: | 88行目: | ||
return retval | return retval | ||
end | end | ||
error(' | error(direction .. 'の値"' .. decimal .. '"は無効です。', 2) | ||
elseif seconds and not minutes then | elseif seconds and not minutes then | ||
error( | error(direction .. 'の秒を指定する時は分も指定してください。', 2) | ||
elseif not degrees then | elseif not degrees then | ||
if minutes then | if minutes then | ||
error( | error(direction .. 'の分を指定する時は度も指定してください。', 2) | ||
elseif hemisphere then | elseif hemisphere then | ||
error( | error(direction .. 'の半球を指定する時は度も指定してください。', 2) | ||
end | end | ||
return nil | return nil | ||
101行目: | 101行目: | ||
decimal = tonumber(degrees) | decimal = tonumber(degrees) | ||
if not decimal then | if not decimal then | ||
error(' | error(direction .. 'の度の値"' .. degrees .. '"は無効です。', 2) | ||
elseif minutes and not tonumber(minutes) then | elseif minutes and not tonumber(minutes) then | ||
error(' | error(direction .. 'の分の値"' .. minutes .. '"は無効です。', 2) | ||
elseif seconds and not tonumber(seconds) then | elseif seconds and not tonumber(seconds) then | ||
error(' | error(direction .. 'の秒の値"' .. seconds .. '"は無効です。', 2) | ||
end | end | ||
decimal = decimal + (minutes or 0)/60 + (seconds or 0)/3600 | decimal = decimal + (minutes or 0)/60 + (seconds or 0)/3600 | ||
111行目: | 111行目: | ||
local multiplier = hemisphereMultipliers[direction][hemisphere] | local multiplier = hemisphereMultipliers[direction][hemisphere] | ||
if not multiplier then | if not multiplier then | ||
error(' | error(direction .. 'の半球である"' .. hemisphere .. '"は無効です。', 2) | ||
end | end | ||
decimal = decimal * multiplier | decimal = decimal * multiplier | ||
end | end | ||
return decimal | 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]+°[NS] %-?[%.%d]+°[EW]') or '', '[ °]') | |||
if para == 'longitude' then result = {result[3], result[4]} end | |||
if not tonumber(result[1]) or not result[2] then return error('不正な座標指定です。', 2) end | |||
return tonumber(result[1]) * hemisphereMultipliers[para][result[2]] | |||
end | end | ||
150行目: | 158行目: | ||
end | end | ||
local width | local width | ||
local default_as_number = tonumber(mw.ustring.match(tostring(args.default_width),"%d*")) | |||
if not args.width then | if not args.width then | ||
width = round(( | width = round((default_as_number or 240) * (tonumber(map('defaultscale')) or 1)) | ||
elseif mw.ustring.sub(args.width, -2) == 'px' then | elseif mw.ustring.sub(args.width, -2) == 'px' then | ||
width = mw.ustring.sub(args.width, 1, -3) | width = mw.ustring.sub(args.width, 1, -3) | ||
157行目: | 166行目: | ||
width = args.width | width = args.width | ||
end | 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('defaultscale')) 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 = args.float == 'center' and '<div class="center">' or '' | local retval = args.float == 'center' and '<div class="center">' or '' | ||
if args.caption and args.caption ~= '' and args.border ~= 'infobox' then | if args.caption and args.caption ~= '' and args.border ~= 'infobox' then | ||
234行目: | 256行目: | ||
retval = retval .. '</div></div>' | retval = retval .. '</div></div>' | ||
if args.caption_undefined then | if args.caption_undefined then | ||
mw.log(' | mw.log('caption_undefinedは廃止されたパラメータです。') | ||
local parent = frame:getParent() | local parent = frame:getParent() | ||
if parent then | if parent then | ||
243行目: | 265行目: | ||
end | end | ||
if map('skew') ~= '' or map('lat_skew') ~= '' or map('crosses180') ~= '' or map('type') ~= '' then | if map('skew') ~= '' or map('lat_skew') ~= '' or map('crosses180') ~= '' or map('type') ~= '' then | ||
mw.log( | mw.log(map() .. 'において廃止されたパラメータです。') | ||
retval = retval .. '' | retval = retval .. '' | ||
end | end | ||
if string.find(map('name'), '|', 1, true) then | if string.find(map('name'), '|', 1, true) then | ||
mw.log( | mw.log(map() .. 'のLocation map名でパイプを使用しています。') | ||
retval = retval .. '' | retval = retval .. '' | ||
end | end | ||
337行目: | 359行目: | ||
longitude = decdeg(args.lon_deg, args.lon_min, args.lon_sec, args.lon_dir, args.long, 'longitude') | longitude = decdeg(args.lon_deg, args.lon_min, args.lon_sec, args.lon_dir, args.long, 'longitude') | ||
latitude = decdeg(args.lat_deg, args.lat_min, args.lat_sec, args.lat_dir, args.lat, 'latitude') | latitude = decdeg(args.lat_deg, args.lat_min, args.lat_sec, args.lat_dir, args.lat, 'latitude') | ||
if not longitude and not latitude and args.useWikidata then | if args.coordinates then | ||
-- Temporarily removed to facilitate infobox conversion. | |||
-- if longitude or latitude then | |||
-- error('[[Module:Coordinates]]からの座標とローカル指定座標の両方を提供できません。') | |||
-- end | |||
longitude = coord2text('longitude', args.coordinates) | |||
latitude = coord2text('latitude', 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. | -- If they didn't provide either coordinate, try Wikidata. If they provided one but not the other, don't. | ||
local entity = mw.wikibase.getEntity() | local entity = mw.wikibase.getEntity() | ||
346行目: | 376行目: | ||
end | end | ||
if not longitude then | if not longitude then | ||
error(' | error('緯度の値が指定されていません。') | ||
elseif not latitude then | |||
error('経度の値が指定されていません。') | |||
error(' | |||
end | end | ||
local builder = mw.html.create() | local builder = mw.html.create() | ||
364行目: | 393行目: | ||
end | end | ||
if args.skew or args.lon_shift or args.markhigh then | if args.skew or args.lon_shift or args.markhigh then | ||
mw.log(' | mw.log('呼び出しにおいて廃止されたパラメータです。') | ||
local parent = frame:getParent() | local parent = frame:getParent() | ||
if parent then | if parent then | ||
mw.log( | mw.log(parent:getTitle() .. 'の親です。') | ||
end | end | ||
mw.logObject(args, 'args') | mw.logObject(args, 'args') | ||
383行目: | 412行目: | ||
end | end | ||
if (x < 0 or x > 100 or y < 0 or y > 100) and not args.outside then | if (x < 0 or x > 100 or y < 0 or y > 100) and not args.outside then | ||
mw.log(' | mw.log('外部フラグ設定無しに地図外にマークが置かれました。 x = ' .. x .. ', y = ' .. y) | ||
local parent = frame:getParent() | local parent = frame:getParent() | ||
if parent then | if parent then | ||
mw.log( | mw.log(parent:getTitle() .. 'の親です。') | ||
end | end | ||
mw.logObject(args, 'args') | mw.logObject(args, 'args') | ||
402行目: | 431行目: | ||
end | end | ||
return builder:node(markOuterDiv(x, y, imageDiv, labelDiv)) | 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 | end | ||
423行目: | 462行目: | ||
end | end | ||
if type(map) == 'table' then | if type(map) == 'table' then | ||
local altmaps = switcherSeparate(args.AlternativeMap) | |||
if #altmaps > #map then | |||
error(string.format('%dのAlternativeMapsが提供されていますが、%dの地図のみの提供になります。', #altmaps, #map)) | |||
end | |||
local overlays = switcherSeparate(args.overlay_image) | |||
if #overlays > #map then | |||
error(string.format('%dのoverlay_imagesが提供されていますが、%dの地図のみの提供になります。', #overlays, #map)) | |||
end | |||
local outputs = {} | local outputs = {} | ||
args.autoSwitcherLabel = true | args.autoSwitcherLabel = true | ||
for k,v in ipairs(map) do | for k,v in ipairs(map) do | ||
args.AlternativeMap = altmaps[k] | |||
args.overlay_image = overlays[k] | |||
outputs[k] = p.main(frame, args, v) | outputs[k] = p.main(frame, args, v) | ||
end | end |