642
回編集
template>K-iczn (en:Module:Location map 20:16, 27 April 2015(UTC)より) |
Triple-Zeta (トーク | 投稿記録) 細 (13版 をインポートしました) |
||
(3人の利用者による、間の5版が非表示) | |||
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 ~= '' then | if args.caption and args.caption ~= '' and args.border ~= 'infobox' then | ||
retval = retval .. '<div class="noviewer thumb ' | retval = retval .. '<div class="noviewer thumb ' | ||
if args.float == '"left"' or args.float == 'left' then | if args.float == '"left"' or args.float == 'left' then | ||
212行目: | 234行目: | ||
local retval = '</div>' | local retval = '</div>' | ||
if not args.caption then | if not args.caption or args.border == 'infobox' then | ||
retval = retval .. '<div style="font-size:90%;padding-top:3px">' | if args.border then | ||
.. ((args.label or mw.title.getCurrentTitle().text) .. ' (' .. map('name') .. ')') | retval = retval .. '<div>' | ||
else | |||
retval = retval .. '<div style="font-size:90%;padding-top:3px">' | |||
end | |||
retval = retval | |||
.. (args.caption or (args.label or mw.title.getCurrentTitle().text) .. ' (' .. map('name') .. ')') | |||
.. '</div>' | .. '</div>' | ||
elseif args.caption ~= '' then | elseif args.caption ~= '' then | ||
224行目: | 251行目: | ||
retval = retval .. '<span class="switcher-label" style="display:none">' .. args.switcherLabel .. '</span>' | retval = retval .. '<span class="switcher-label" style="display:none">' .. args.switcherLabel .. '</span>' | ||
elseif args.autoSwitcherLabel then | elseif args.autoSwitcherLabel then | ||
retval = retval .. '<span class="switcher-label" style="display:none"> | retval = retval .. '<span class="switcher-label" style="display:none">' .. map('name') .. 'の地図を表示</span>' | ||
end | end | ||
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 | ||
235行目: | 262行目: | ||
end | end | ||
mw.logObject(args, 'args') | mw.logObject(args, 'args') | ||
retval = retval .. '' | |||
end | |||
if map('skew') ~= '' or map('lat_skew') ~= '' or map('crosses180') ~= '' or map('type') ~= '' then | |||
mw.log(map() .. 'において廃止されたパラメータです。') | |||
retval = retval .. '' | |||
end | |||
if string.find(map('name'), '|', 1, true) then | |||
mw.log(map() .. 'のLocation map名でパイプを使用しています。') | |||
retval = retval .. '' | retval = retval .. '' | ||
end | end | ||
245行目: | 280行目: | ||
local function markOuterDiv(x, y, imageDiv, labelDiv) | local function markOuterDiv(x, y, imageDiv, labelDiv) | ||
return mw.html.create('div') | return mw.html.create('div') | ||
:cssText('position:absolute;z-index:1;top:' .. round(y, 3) .. '%;left:' .. round(x, 3) .. '% | :cssText('position:absolute;z-index:1;top:' .. round(y, 3) .. '%;left:' .. round(x, 3) .. '%') | ||
:node(imageDiv) | :node(imageDiv) | ||
:node(labelDiv) | :node(labelDiv) | ||
252行目: | 287行目: | ||
local function markImageDiv(mark, marksize, label, link, alt, title) | local function markImageDiv(mark, marksize, label, link, alt, title) | ||
local builder = mw.html.create('div') | local builder = mw.html.create('div') | ||
:cssText('position:absolute | :cssText('position:absolute;left:-' .. round(marksize / 2) .. 'px;top:-' .. round(marksize / 2) .. 'px;line-height:0') | ||
:attr('title', title) | :attr('title', title) | ||
if marksize ~= 0 then | if marksize ~= 0 then | ||
324行目: | 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() | ||
333行目: | 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() | ||
351行目: | 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') | ||
builder:wikitext('') | builder:wikitext('') | ||
end | end | ||
374行目: | 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') | ||
393行目: | 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 | ||
414行目: | 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 |