模組:沙盒/a2569875/Test3

123

require('Module:Module wikitext')._addText('123')
local p={}
local encode_table={}
local libencode = require('Module:EncoderUtil')
local libqrcode = libencode._get_libqrcode()
local lib_arg={}

--{{#invoke:沙盒/a2569875/Test3|qr_graph|123|width=250}}
function p.qr_graph(frame)
	-- For calling from #invoke.
    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}) --frame
        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()
    end
    local ec_level_list={l=1,m=2,q=3,h=4,[0]=1,[1]=1,[2]=2,[3]=3,[4]=4,
		low=1,medium=2,quartile=3,high=4
    }
    local qr_message =args.text or args.message or args.msg or args['string'] or args[1] or args['1'] or 'QR Code'
    local ec_level = ec_level_list[args.eclevel or'']or 1
	local pxsize = tonumber(args.width or args.size or args.height or 120)
	
	local fun_light = args.fun_light or args.light or '#fff'
	local message_light = args.message_light or args.light or '#fff'
	local fun_dark = args.fun_dark or args.dark or '#000'
	local message_dark = args.message_dark or args.dark or '#000'
	
	local success,result = libqrcode.qrcode(qr_message,ec_level,nil,tonumber(args.version or args.ver))
	local w_count = #result
	local cell_width = pxsize / (w_count+2)
	local graph_data = {
		width=pxsize,
		height=pxsize,
		data={},
		padding={left=cell_width,top=cell_width,bottom=cell_width,right=cell_width},
		scales={
		    {name="x",type="linear",domain={0,w_count},range="width"},
		    {name="y",type="linear",domain={0,w_count},range="height"},
		    {name="qr",type="ordinal",domain={-2,-1,0,1,2},range={fun_light,message_light,message_light,message_dark,fun_dark}}
		},
		marks={
		    {
		      type="rect",
		      from={data="qrcode"},
		      properties={
		        enter={
		          x={scale="x",field="0"},y={scale="y",field="1"},
		          width={value=cell_width},height={value=cell_width},
		          stroke={scale="qr",field="2"},
		          fill={scale="qr",field="2"}
		        }
		      }
		    }
		 }
	}

	local qr_data = {name="qrcode",values={}}
	for x=1,w_count do
		for y=1,#(result[x]) do
			qr_data.values[#(qr_data.values)+1] = {x-1,#(result[x])-y+1,result[x][y]}
		end
	end
	graph_data.data[#(graph_data.data)+1] = qr_data
	local body = working_frame:callParserFunction{ name = '#tag:graph', args = {
    	mw.text.jsonEncode(graph_data)
	} }
	return body
end

--{{#invoke:沙盒/a2569875/Test3|checkHeader}}
function p.checkHeader(frame)
-- For calling from #invoke.
    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) --frame
    else
        -- We're being called from another module or from the debug console, so assume
        -- the args are passed in directly.
        args = frame
    end
    working_frame = mw.getCurrentFrame()
    local magic_str='{{subst:void|僅能透過模板內部呼叫}}'
    local input_str = working_frame.args[1] or working_frame.args['1']
    local arg_str = working_frame.args[2] or working_frame.args['2']
    if input_str then
    	local start = mw.ustring.len(magic_str) + 1
    	local check_start = mw.ustring.lower(mw.ustring.sub(input_str,1,start-1))
    	if mw.ustring.lower(check_start) ~= mw.ustring.lower(magic_str) then
    		if arg_str then mw.addWarning( '錯誤! 參數 \''.. arg_str ..'\' 僅能由模板呼叫。' ) end
    		require('Module:TrackingCategory').append(working_frame,'CAS號參數誤植的條目')
    		require('Module:TrackingCategory').append(working_frame,'含有未被索引CAS號的條目')
    		return input_str
    	else return mw.ustring.sub(input_str,start,-1)
    	end
    else return magic_str
    end
end


--{{#invoke:沙盒/a2569875/Test3|findArgs}}
function p.findArgs(frame)
	-- For calling from #invoke.
    local args
    --是否存在有效的frame可供呼叫
    local can_call_parse = false
    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.
        args = frame.args
        can_call_parse = true
    else
        -- We're being called from another module or from the debug console, so assume
        -- the args are passed in directly.
        args = frame
    end
    local out_frame = mw.getCurrentFrame():getParent() --模板外層
    local out_args = {} --紀錄來自模板外層提供的參數
    local body = ''
    local to_find={}
    local default=''
    
    if out_frame then out_args = out_frame.args or out_args end
    for key,val in pairs(args) do
    	local parse_name=tonumber(key)
    	if parse_name then to_find[#to_find+1]=val end
    end
    default = args.default or default
    local find_result={}
    local is_find=false
    for key,val in pairs(out_args) do
    	for i=1,#to_find do
	    	if mw.ustring.lower(mw.text.trim(val)) == mw.ustring.lower(mw.text.trim(to_find[i])) then
	    		is_find=true
	    		find_result[mw.text.trim(key)]=is_find;
	    	end
    	end
    end
    if is_find then
    	local body = ''
    	for key,val in pairs(find_result) do 
    		if body~='' then body=body..','end
    		body=body..key
    	end
    	return body
    else
    	return default
    end
end

return p