𨀈𬧐內容
呈單正
呈單正
轉𨖅錆邊
隱
調向
張正
𠊝𢷮近低
張偶然
助𢴇
顯示吧入 Hiển thị và Nhập
風𡨸漢喃 Phông chữ Hán Nôm
部𢫈漢喃 Bộ gõ Hán Nôm
工具轉字 Công cụ chuyển tự
𡨸漢喃準 Chữ Hán Nôm chuẩn
榜𡨸漢喃準常用 Bảng chữ Hán Nôm chuẩn Thường dùng
榜𡨸翻音 Bảng chữ Phiên âm
名冊各詞摱憑𡨸漢喃準 Danh sách các từ mượn bằng chữ Hán Nôm chuẩn
向引編輯 Hướng dẫn Biên tập
定樣排𢪏 Định dạng bài viết
捐𢵰 Quyên góp
衆碎懃伴𢴇扡 Chúng tôi cần bạn giúp đỡ
尋檢
尋檢
造財款
登入
工具個人
造財款
登入
䀡碼源𧵑Mô đun:Location map
張
討論
English
讀
䀡碼源
䀡歷史
工具
工具
轉𨖅錆邊
隱
作務
讀
䀡碼源
䀡歷史
終
各連結𦤾低
𠊝𢷮連關
張特別
通信張
←
Mô đun:Location map
伴空得權𢯢𢷮張尼、爲理由𢖖󠄁:
只仍成員𥪝𡖡
成員通常
㵋得寔現操作尼。
伴吻固体䀡吧抄劄碼源𧵑張尼。
require('Module:No globals') local p = {} local argByViArg = { khung = "border", ["chú thích"] = "caption", ["nhãn"] = "label", ["trôi"] = "float", ["rộng"] = "width", ["rộng mặc định"] = "default_width", ["địa hình nổi"] = "relief", ["BD thay thế"] = "AlternativeMap", ["hình phủ"] = "overlay_image", ["kích thước nhãn"] = "label_size", ["rộng nhãn"] = "label_width", ["điểm"] = "mark", ["kích thước điểm"] = "marksize", ["vị trí"] = "position", ["màu nền"] = "background", ["liên kết"] = "link", ["vĩ"] = "lat_dir", ["vĩ độ"] = "lat_deg", ["vĩ phút"] = "lat_min", ["vĩ giây"] = "lat_sec", ["kinh độ"] = "lon_deg", ["kinh phút"] = "lon_min", ["kinh giây"] = "lon_sec", kinh = "lon_dir", ["toàn vĩ độ"] = "lat", ["toàn kinh độ"] = "long", } local rawGetArgs = require('Module:Arguments').getArgs local getArgs = function (frame, options) local args = rawGetArgs(frame, options) if args.lon_dir == "Đ" or args.lon_dir == "đ" or args.lon_dir == "T" or args.lon_dir == "t" then if args.lat_dir == "B" or args.lat_dir == "B" then args.lat_dir = "N" elseif args.lat_dir == "N" or args.lat_dir == "n" then args.lat_dir = "S" end end if args.lon_dir == "Đ" or args.lon_dir == "đ" then args.lon_dir = "E" elseif args.lon_dir == "T" or args.lon_dir == "t" then args.lon_dir = "W" end for viArgName, argName in pairs(argByViArg) do if args[viArgName] then args[argName] = args[viArgName] end end return args end local function round(n, decimals) local pow = 10^(decimals or 0) return math.floor(n * pow + 0.5) / pow end function p.getMapParams(map, frame) if not map then error('Cần định rõ tên của trang định rõ bản đồ định vị để sử dụng', 2) end local moduletitle = mw.title.new('Module:Location map/data/' .. map) if not moduletitle then error('“' .. map .. '” không phải là tên hợp lệ của trang định rõ bản đồ định vị', 2) elseif moduletitle.exists then local mapData = mw.loadData('Module:Location map/data/' .. map) return function(name, params) if name == nil then return 'Module:Location map/data/' .. 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 elseif mw.title.new('Template:Bản đồ định vị ' .. map).exists then local cache = {} return function(name, params) if params then return frame:expandTemplate{title = 'Bản đồ định vị ' .. map, args = { name, unpack(params) }} else if name == nil then return 'Template:Bản đồ định vị ' .. map elseif cache[name] == nil then cache[name] = frame:expandTemplate{title = 'Bản đồ định vị ' .. map, args = { name }} end return cache[name] end end elseif mw.title.new('Template:Location map ' .. map).exists then local cache = {} if type(frame) ~= 'table' or type(frame.expandTemplate) ~= 'function' then error('Phải cung cấp khung khi sử dụng bản đồ định vị kiểu cũ') end return function(name, params) if params then return frame:expandTemplate{title = 'Location map ' .. map, args = { name, unpack(params) }} else if name == nil then return 'Template:Location map ' .. map elseif cache[name] == nil then cache[name] = frame:expandTemplate{title = 'Location map ' .. map, args = { name }} end return cache[name] end end else error('Không tìm thấy trang định rõ bản đồ định vị. “Mô đun:Location map/data/' .. map .. '”, “Bản mẫu:Bản đồ định vị ' .. map .. '”, và “Bản mẫu:Location map ' .. map .. '” đều không tồn tại', 2) end end function p.data(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 = { ["kinh độ"] = { W = -1, w = -1, E = 1, e = 1 }, ["vĩ độ"] = { S = -1, s = -1, N = 1, n = 1 } } local function decdeg(degrees, minutes, seconds, hemisphere, decimal, direction) local direction_prefix = mw.ustring.gsub(direction, " độ", "") if decimal then if degrees then error('Không thể đặt cả giá trị thập phân cùng giá trị độ-phút-giây cho ' .. direction, 2) elseif minutes then error('Chỉ có thể đặt ' .. direction_prefix .. ' phút ở dạng độ-phút-giây', 2) elseif seconds then error('Chỉ có thể đặt ' .. direction_prefix .. ' giây ở dạng độ-phút-giây', 2) elseif hemisphere then error('Chỉ có thể đặt bán cầu ở dạng độ-phút-giây cho ' .. direction, 2) end local retval = tonumber(decimal) if retval then return retval end error('Giá trị “' .. decimal .. '” không phải là ' .. direction .. ' hợp lệ', 2) elseif seconds and not minutes then error('Đã đặt ' .. direction_prefix .. ' giây mà không đặt ' .. direction_prefix .. ' phút', 2) elseif not degrees then if minutes then error('Đã đặt ' .. direction_prefix .. ' phút mà không đặt ' .. direction, 2) elseif hemisphere then error('Đã đặt bán cầu cho ' .. direction .. ' mà không đặt ' .. direction, 2) end return nil end decimal = tonumber(degrees) if not decimal then error('Giá trị “' .. degrees .. '” độ trong ' .. direction .. ' không phải hợp lệ', 2) elseif minutes and not tonumber(minutes) then error('Giá trị “' .. minutes .. '” phút trong ' .. direction .. ' không phải hợp lệ', 2) elseif seconds and not tonumber(seconds) then error('Giá trị “' .. seconds .. '” giây trong ' .. direction .. ' không phải hợp lệ', 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('Bán cầu “' .. hemisphere .. '” trong ' .. direction .. ' không phải hợp lệ', 2) end decimal = decimal * multiplier end return decimal 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('image1') ~= '' then return map('image1') else return map('image') 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 if not args.width then width = round((args.default_width or 240) * (tonumber(map('defaultscale')) 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 retval = args.float == 'center' and '<div class="center">' or '' if args.caption and args.caption ~= '' and args.border ~= 'infobox' then retval = retval .. '<div class="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 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) retval = string.format( '%s[[Tập tin:%s|%spx|%s%s]]', retval, image, width, args.alt or ((args.label or mw.title.getCurrentTitle().text) .. ' trên bản đồ ' .. map('name')), args.maplink and ('|link=' .. args.maplink) or '' ) if args.overlay_image then return retval .. '<div style="position:absolute;top:0;left:0">[[Tập tin:' .. 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>' if not args.caption or args.border == 'infobox' then if args.border then 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>' 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">[[:Tập tin:' .. 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">Xem bản đồ ' .. map('name') .. '</span>' end retval = retval .. '</div></div>' if args.caption_undefined then mw.log('Removed parameter caption_undefined used.') local parent = frame:getParent() if parent then mw.log('Parent is ' .. parent:getTitle()) end mw.logObject(args, 'args') retval = retval .. '[[Thể loại:Bản đồ định vị có thể có lỗi|Trang có tham số dời]]' end if map('skew') ~= '' or map('lat_skew') ~= '' or map('crosses180') ~= '' or map('type') ~= '' then mw.log('Removed parameter used in map definition ' .. map()) retval = retval .. '[[Thể loại:Bản đồ định vị có thể có lỗi|Trang có tham số dời]]' end if string.find(map('name'), '|', 1, true) then mw.log('Pipe used in name of map definition ' .. map()) retval = retval .. '[[Thể loại:Bản đồ định vị có thể có lỗi|Tên có dấu sổ thẳng]]' 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') :cssText('position:absolute;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') :cssText('position:absolute;left:-' .. round(marksize / 2) .. 'px;top:-' .. round(marksize / 2) .. 'px;line-height:0') :attr('title', title) if marksize ~= 0 then builder:wikitext(string.format( '[[Tập tin:%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'):cssText('font-size:0%;position:absolute'):wikitext(label) end local builder = mw.html.create('div') :cssText('font-size:' .. label_size .. '%;line-height:110%;position:absolute;width:' .. label_width .. 'em') local distance = round(marksize / 2 + 1) local spanCss if position == 'top' then -- specified top builder:cssText('bottom:' .. distance .. 'px;left:' .. (-label_width / 2) .. 'em;text-align:center') elseif position == 'bottom' then -- specified bottom builder:cssText('top:' .. distance .. 'px;left:' .. (-label_width / 2) .. 'em;text-align:center') elseif position == 'left' or (tonumber(x) > 70 and position ~= 'right') then -- specified left or autodetected to left builder:cssText('top:-0.75em;right:' .. distance .. 'px;text-align:right') spanCss = 'float:right' else -- specified right or autodetected to right builder:cssText('top:-0.75em;left:' .. distance .. 'px;text-align:left') spanCss = 'float:left' end builder = builder:tag('span') :cssText('padding:1px;text-shadow:-1px -1px 2px #FFF,1px 1px 2px #FFF,-1px 1px 2px #FFF,-1px 1px 2px #FFF') :cssText(spanCss) :wikitext(label) if background then builder:cssText('background-color:' .. background) end return builder:done() end local function getX(longitude, left, right) 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) return 100 * (top - latitude) / (top - bottom) end function p.mark(frame, args, map) if not args then args = getArgs(frame, {wrappers = 'Bản mẫu:Bản đồ định vị~'}) end if not map then map = p.getMapParams(args[1], frame) end local x, y, longitude, latitude longitude = decdeg(args.lon_deg, args.lon_min, args.lon_sec, args.lon_dir, args.long, 'kinh độ') latitude = decdeg(args.lat_deg, args.lat_min, args.lat_sec, args.lat_dir, args.lat, 'vĩ độ') if 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 end if not longitude then error('Không có giá trị kinh độ') end if not latitude then error('Không có giá trị vĩ độ') end local builder = mw.html.create() if (not args.lon_deg) ~= (not args.lat_deg) then builder:wikitext('[[Thể loại:Bản đồ định vị có độ chính xác kinh độ và vĩ độ khác nhau|Độ]]') elseif (not args.lon_min) ~= (not args.lat_min) then builder:wikitext('[[Thể loại:Bản đồ định vị có độ chính xác kinh độ và vĩ độ khác nhau|Phút]]') elseif (not args.lon_sec) ~= (not args.lat_sec) then builder:wikitext('[[Thể loại:Bản đồ định vị có độ chính xác kinh độ và vĩ độ khác nhau|Giây]]') elseif (not args.lon_dir) ~= (not args.lat_dir) then builder:wikitext('[[Thể loại:Bản đồ định vị có độ chính xác kinh độ và vĩ độ khác nhau|Bán cầu]]') elseif (not args.long) ~= (not args.lat) then builder:wikitext('[[Thể loại:Bản đồ định vị có độ chính xác kinh độ và vĩ độ khác nhau|Thập phân]]') end if args.skew or args.lon_shift or args.markhigh then mw.log('Removed parameter used in invocation.') local parent = frame:getParent() if parent then mw.log('Parent is ' .. parent:getTitle()) end mw.logObject(args, 'args') builder:wikitext('[[Thể loại:Bản đồ định vị có thể có lỗi|Trang có tham số dời]]') end if map('x') ~= '' then x = tonumber(mw.ext.ParserFunctions.expr(map('x', { latitude, longitude }))) else x = tonumber(getX(longitude, map('left'), map('right'))) end if map('y') ~= '' then y = tonumber(mw.ext.ParserFunctions.expr(map('y', { latitude, longitude }))) else y = tonumber(getY(latitude, map('top'), map('bottom'))) end if (x < 0 or x > 100 or y < 0 or y > 100) and not args.outside then mw.log('Mark placed outside map boundaries without outside flag set. x = ' .. x .. ', y = ' .. y) local parent = frame:getParent() if parent then mw.log('Parent is ' .. parent:getTitle()) end mw.logObject(args, 'args') builder:wikitext('[[Thể loại:Bản đồ định vị có thể có lỗi|Điểm bên ngoài bản đồ không được yêu cầu]]') end local mark = args.mark or map('mark') if mark == '' then mark = 'Red pog.svg' end local marksize = tonumber(args.marksize) or tonumber(map('marksize')) 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 90, args.label_width or 6, args.position, args.background, x, marksize) end return builder:node(markOuterDiv(x, y, imageDiv, labelDiv)) end function p.main(frame, args, map) if not args then args = getArgs(frame, {wrappers = 'Bản mẫu:Bản đồ định vị', valueFunc = p.valueFunc}) end if args.useWikidata == nil then args.useWikidata = true end if not map then if args[1] then map = {} for mapname in string.gmatch(args[1], '[^#]+') do map[#map + 1] = p.getMapParams(mapname, frame) end if #map == 1 then map = map[1] end else map = p.getMapParams('Thế giới', frame) end end if type(map) == 'table' then local outputs = {} args.autoSwitcherLabel = true for k,v in ipairs(map) do 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
板㑄用𥪝張尼:
Module:Mô đun:Location map/tài liệu
(
䀡碼源
)
𢮿徠
Mô đun:Location map
。
轉𢷮朝㢅內容界限