跳转到内容

模組:EditState

本页使用了标题或全文手工转换
被永久保护的模块
维基百科,自由的百科全书

这是本页的一个历史版本,由A2569875留言 | 贡献2020年2月5日 (三) 12:46编辑。这可能和当前版本存在着巨大的差异。

local p={}
local lib_arg={};
local yesno = {}
function p.isPreview()
	local frame = mw.getCurrentFrame()
	local Preview_mode = frame:preprocess('{{REVISIONID}}');							-- use magic word to get revision id
	mw.log((Preview_mode == nil or mw.text.trim(Preview_mode or '') == ''))
	mw.log(Preview_mode)
	return (Preview_mode == nil or mw.text.trim(Preview_mode or '') == '')				-- if there is a value then this is not a preiview
end
function p.isCreating()
	local frame = mw.getCurrentFrame()
	local Preview_mode = frame:preprocess('{{PAGEID}}');
	mw.log((Preview_mode == nil or mw.text.trim(Preview_mode or '') == ''))
	mw.log(Preview_mode)
	return (Preview_mode == nil or mw.text.trim(Preview_mode or '') == '')
end
function p.hasParent(layer)
	local frame = mw.getCurrentFrame()
	local times = tonumber(layer or '') or 0
	local Parent = frame:getParent();
	for i=2,tonumber(times) do
		Parent = Parent:getParent()
		if Parent == nil then break end
	end
	return not (Parent == nil or Parent == '')
end

function p.getTitle(layer)
	local frame = mw.getCurrentFrame()
	local times = tonumber(layer or '') or 0
	if times <= 0 then return frame:getTitle()end
	local Parent = frame:getParent();
	for i=2,tonumber(times) do
		Parent = Parent:getParent()
		if Parent == nil then return '' end
	end
	return Parent:getTitle();
end
function p.call(frame)
	local args, working_frame
    if frame == mw.getCurrentFrame() then
        -- We're being called via #invoke. The args are passed through to the module
        -- from the template page, so use the args that were passed into the template.
        if lib_arg.getArgs == nil then lib_arg = require('Module:Arguments') end
        args = lib_arg.getArgs(frame, {parentFirst=true})
        working_frame = frame
    else
        -- We're being called from another module or from the debug console, so assume
        -- the args are passed in directly.
        args = frame
        working_frame = mw.getCurrentFrame()
        if type(args) ~= type({}) then args = {frame} end
    end
    local max_arg = 0 
    local num_args = {}
    local isJSON = false
    if args.isJSON then
    	if type(yesno) ~= type(tonumber) then yesno = require('Module:Yesno') end
    	if yesno(args.isJSON or 'no') then --local delnowiki=require('Module:Delcat').delnowiki --備用
			isJSON = true
		end
	end
	for key,value in pairs( args ) do
		local arg_id = tonumber(key or '')
		if arg_id then
			if arg_id > max_arg then max_arg = arg_id end
			num_args[arg_id] = value
		end
	end
	local func_name = num_args[1]
	if mw.text.trim(func_name or '') == '' then return '' end
	local call_args = {}
	local get_obj = function(obj)return obj end
	if isJSON then get_obj = function(obj)return mw.text.jsonDecode(obj)end end
	if max_arg > 1 then
		for i = 2,max_arg do
			if num_args[i] then 
				local try_to_get_obj = mw.clone(num_args[i])
				if not xpcall( function() --try
					try_to_get_obj = get_obj(num_args[i])
				end, function(msg)return msg end ) then --catch
					call_args[i-1] = num_args[i]
				else --finally
					call_args[i-1] = try_to_get_obj
				end
			else call_args[i-1] = '' end
		end
	end

	local func_path = mw.text.split(func_name,'%.') or { [1]=func_name }
	local func_body = mw[func_path[1]] or p[func_path[1]] or _G[func_path[1]]
	if mw.ustring.find(func_path[1],':') then
		func_body = require(func_path[1]) or func_body
	end
	if func_body then
		local old_obj = func_body
		for i=2,#func_path do
			func_body = func_body[func_path[i]]
			if func_body then
				old_obj = func_body
			else
				return ''
			end
		end
		local func_type = type( func_body )
		local times = 10
		for ti = 1,times do
			if func_type == type(nil) then
				return ''
			elseif func_type == type(0) then
				return '' .. func_body
			elseif func_type == type(true) then
				if func_type then return '1' end
				return ''
			elseif func_type == type(type) then
				if max_arg > 1 then 
					func_body = func_body(unpack(call_args))
					if func_body == nil then func_body = call_args[1] end
				else func_body = func_body() end
			elseif func_type == type("string") then
				return func_body
			elseif func_type == type({}) then
				return mw.text.jsonEncode(func_body)
			end
			func_type = type( func_body )
		end
	end
	return ''
end
return p