Module:沙盒/SuperGrey/Ilh:修订间差异
外观
删除的内容 添加的内容
高開銷函數不要叫那麼多次,謝謝。 |
无编辑摘要 |
||
第151行: | 第151行: | ||
--确定页面存在 |
--确定页面存在 |
||
---exists是高开销方法,需要更高效的实现 |
---exists是高开销方法,需要更高效的实现 |
||
--目前改采[[Module:TemplateExist#L-226]]的实现方式 |
|||
--带保护的包装方法 |
|||
--以页面是否有内容即非null/nil (就算是空页面也会有空字串内容) 来判定页面存在与否 |
|||
--由于exists和解析器函数ifexist都是高开销方法 |
|||
--因此避免掉了exists的使用 |
|||
--而ifexist达到限制时默认返回结果为false的操作 |
|||
--然而不当的输入 |
|||
-- |
--会直接抛出错误而中断执行 |
||
--所以将相应调用包裹,压制 |
--所以将相应调用包裹,压制其抛错,并返回false |
||
--正常情况下则一切正常 |
--正常情况下则一切正常 |
||
function ilh.isExist(pageName) |
function ilh.isExist(pageName) |
||
local execStatus,result=false,false |
local execStatus,result=false,false |
||
第170行: | 第171行: | ||
function ilh._isExist(pageName) |
function ilh._isExist(pageName) |
||
local localPage_obj=mw.title.makeTitle(0,pageName) |
local localPage_obj=mw.title.makeTitle(0,pageName) |
||
if localPage_obj then |
if localPage_obj then --頁面存在與否方法判定同[[Module:TemplateExist#L-226]] |
||
return type(localPage_obj:getContent()) == type("string") |
return type(localPage_obj:getContent()) == type("string") |
||
else return false end |
else return false end |
2025年1月1日 (三) 03:46的版本
local ilh = {}
local getArgs
local yesno = require('Module:Yesno')
local lan = require('Module:Lan')
local langData = mw.loadData( 'Module:Ilh/data' )
local lib_zhcvt = require('Module:ZhConversion') --繁簡轉換
--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"><span class="ilh-paren">('..COMMON_TAIL
,comment_tail='<span class="ilh-paren">)'..COMMON_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"],'"','"')
context["_foreignPage"]=mw.ustring.gsub(context["foreignPage"],'"','"')
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是高开销方法,需要更高效的实现
--目前改采[[Module:TemplateExist#L-226]]的实现方式
--以页面是否有内容即非null/nil (就算是空页面也会有空字串内容) 来判定页面存在与否
--因此避免掉了exists的使用
--然而不当的输入
--会直接抛出错误而中断执行
--所以将相应调用包裹,压制其抛错,并返回false
--正常情况下则一切正常
function ilh.isExist(pageName)
local execStatus,result=false,false
local varientChecker = {pageName, lib_zhcvt.to_hant(pageName), lib_zhcvt.to_hans(pageName)}
for _,page in ipairs(varientChecker) do
execStatus,result=pcall(ilh._isExist,page)
if result then return result end
end
return false
end
--真实方法
function ilh._isExist(pageName)
local localPage_obj=mw.title.makeTitle(0,pageName)
if localPage_obj then --頁面存在與否方法判定同[[Module:TemplateExist#L-226]]
return type(localPage_obj:getContent()) == type("string")
else return false end
end
--end
return ilh