Module:Ilh

    From TestWiki

    Documentation for this module may be created at Module:Ilh/doc

    local ilh = {}
    local getArgs
    local yesno = require('Module:Yesno')
    local lan = require('Module:Lan')
    local langData = mw.loadData( 'Module:Ilh/data' )
    
    --local frameArgs
    local COMMON_TAIL='</span>'
    local MODEL={
    	 frame_head='<span class="ilh-all %s" data-orig-title="%s" data-lang-code="%s" data-lang-name="%s" data-foreign-title="%s">'
    	,frame_tail=COMMON_TAIL
    	,page_head='<span class="ilh-page">'
    	,page_tail=COMMON_TAIL
    	,comment_head='<span class="noprint ilh-comment">('
    	,comment_tail=')'..COMMON_TAIL
    	,lang_head='<span class="ilh-lang">'
    	,lang_tail=COMMON_TAIL
    	,colon='<span class="ilh-colon">:</span>'
    	,link_head='<span class="ilh-link">'
    	,link_body='-{[[:%s:%s|<span lang="%s" dir="auto">%s</span>]]}-'
    	,link_tail=COMMON_TAIL
    }
    local clazz_pageExist_framehead='ilh-blue'
    local TRA_CAT='[[Category:有蓝链却未移除内部链接助手模板的页面]]'
    
    function ilh.main(frame)
    	if not getArgs then
    		getArgs = require('Module:Arguments').getArgs
    	end
    	local args = getArgs(frame)
    	
    	if langData[args['lang-code']] == nil then
    		args['lang'] = mw.language.fetchLanguageName( args['lang-code'], mw.getContentLanguage():getCode() ) 	
    	elseif langData[args['lang-code']]['lang-hans'] and langData[args['lang-code']]['lang-hans'] then
    		args['lang'] = lan._main({['zh-hans']=langData[args['lang-code']]['lang-hans'], ['zh-hant']=langData[args['lang-code']]['lang-hant']}, frame)
    	elseif langData[args['lang-code']]['lang'] == nil then
    		args['lang'] = mw.language.fetchLanguageName( args['lang-code'], mw.getContentLanguage():getCode() ) 	
    	else 
    		args['lang'] = langData[args['lang-code']]['lang']
    	end
    
    	return ilh._ilh(args)
    end
    
    function ilh._ilh(args)
    	--frameArgs = getArgs(frame, {frameOnly=true})
    
    	local context={}
    	context["isMainPage"]=ilh.isMainPage()
    	context["localPage"]=args[1]
    	context["foreignPage"]=args[2] or args[1] --如果{{{2}}}不传入的话
    	context["displayName"]=args["d"] or args[1]
    	context["langCode"]=args["lang-code"]
    	context["lang"]=args["lang"]
    	context["nocat"]=yesno( args["nocat"] , false )
    
    	context["isExist"]= (args["$exist$"] and args["$exist$"]==1) or ilh.isExist(context["localPage"])
    	
    	local curPage_obj=mw.title.getCurrentTitle()
    	context["isNoCatWithNamespace"]=curPage_obj:inNamespaces(2,828) --User,Module
    	--context["curPageNamespace"]=curPage_obj.namespace
    
    	return (context["isMainPage"] and ilh.onlyLink(context)) or ilh.functionLink(context)
    end
    
    function ilh.onlyLink(context)
    	return ( context["isExist"] and mw.ustring.format( '[[%s|%s]]', context["localPage"], context["displayName"] ) ) or context["displayName"]
    end
    
    function ilh.functionLink(context)
    	context["_localPage"]=mw.ustring.gsub(context["localPage"],'"','&quot;')
    	context["_foreignPage"]=mw.ustring.gsub(context["foreignPage"],'"','&quot;')
    	local need_cat=
    				   (not context["nocat"])
    				   and
    				   (not context["isNoCatWithNamespace"])
    				   --[[not (
    					   context["curPageNamespace"]==2 --User
    					or context["curPageNamespace"]==828 --Module
    				   )]]
    	--mw.log(context["nocat"])
    	--mw.log(context["curPageNamespace"])
    	--mw.log(need_cat)
    
    	local output_context={}
    	table.insert(output_context,
    					mw.ustring.format(MODEL.frame_head ,
    						 (context["isExist"] and clazz_pageExist_framehead) or ''
    						,context["_localPage"]
    						,context["langCode"]
    						,context["lang"]
    						,context["_foreignPage"]
    					)
    				)
    		table.insert(output_context,MODEL.page_head)
    			table.insert(output_context,
    							mw.ustring.format('[[:%s|%s]]' ,
    								context["localPage"],context["displayName"]
    							)
    						)
    		table.insert(output_context,MODEL.page_tail)
    		if context["isExist"] then
    			if need_cat then
    				table.insert(output_context,TRA_CAT)
    			end
    		else
    			table.insert(output_context,MODEL.comment_head)
    				table.insert(output_context,MODEL.lang_head)
    					table.insert(output_context,context["lang"])
    				table.insert(output_context,MODEL.lang_tail)
    
    				table.insert(output_context,MODEL.colon)
    
    				table.insert(output_context,MODEL.link_head)
    					table.insert(output_context,
    									mw.ustring.format(MODEL.link_body,
    										 context["langCode"]
    										,(context["foreignPage"] or context["localPage"])
    										,context["langCode"]
    										,(context["foreignPage"] or context["localPage"])
    									)
    								)
    				table.insert(output_context,MODEL.link_tail)
    			table.insert(output_context,MODEL.comment_tail)
    		end
    	table.insert(output_context,MODEL.frame_tail)
    
    	return table.concat(output_context,"")
    end
    
    --以下需要更高效的实现
    
    --确定主页
    --使用mw信息获得主页名
    --使用language库获得本站默认语言代码(zh)来确定信息的对应语言,获得全主页名
    ---因为其他zh分语言只有名,没有命名空间,可以识别出来,但麻烦
    --然后判断当前页和主页是否一致
    ---计划做重定向判断,但没需要
    function ilh.isMainPage()
    	local mainpage_msgobj=mw.message.new('Mainpage')
    	mainpage_msgobj=mainpage_msgobj:inLanguage(mw.getContentLanguage():getCode())
    	local mainPage_obj=mw.title.makeTitle(0,mainpage_msgobj:plain())
    	local curpage_obj=mw.title.getCurrentTitle()
    	--local curpage_redirectFrom_obj=curpage_obj.redirectTarget
    	--[[if curpage_redirectFrom_obj ~=false then
    		curpage_obj=curpage_redirectFrom_obj
    	end]]
    	return mw.title.equals(mainPage_obj,curpage_obj) --and curpage_obj.namespace==4
    end
    
    --确定页面存在
    ---exists是高开销方法,需要更高效的实现
    --带保护的包装方法
    --由于exists和解析器函数ifexist都是高开销方法
    --而ifexist达到限制时默认返回结果为false的操作
    --而exists会直接抛出错误而中断执行
    --所以将相应调用包裹,压制exists的抛错,按照ifexist的理念,返回false
    --正常情况下则一切正常
    function ilh.isExist(pageName)
    	local execStatus,result=pcall(ilh._isExist,pageName)
    	
    	if execStatus then
    		return result
    	else
    		return false
    	end
    end
    --真实方法
    function ilh._isExist(pageName)
    	local localPage_obj=mw.title.makeTitle(0,pageName)
    	return localPage_obj.exists
    end
    --end
    
    return ilh