置顶公告:【置顶】关于临时开启评论区所有功能的公告(2022.10.22) | 【置顶】关于本站Widget恢复使用的公告
  • 你好~!欢迎来到萌娘百科镜像站!如需查看或编辑,请联系本站管理员注册账号。
  • 本镜像站和其他萌娘百科的镜像站无关,请注意分别。

Module:生日分类

贴贴♀百科,万娘皆可贴的百科全书!转载请标注来源页面的网页链接,并声明引自贴贴百科。内容不可商用。
跳到导航 跳到搜索
Template-info.svg 模块文档  [创建] [刷新]
  1. --[=[
  2. 供[[模板:生日]]使用,亦可以在其他模块中调用`from_text`、`from_month_day`两个函数
  3. 测试例:
  4. {{生日|1年2月3日}} -> 1年[[:分类:2月3日|2月3日]][[分类:2月3日]]
  5. {{生日|2月3日}} / {{生日|2|3}} -> [[:分类:2月3日|2月3日]][[分类:2月3日]]
  6. {{生日|1年<ref>……</ref>2月3日}} -> 1年<ref>……</ref>[[:分类:2月3日|2月3日]][[分类:2月3日]]
  7. {{生日|2月3日<ref>……</ref>}} -> [[:分类:2月3日|2月3日]]<ref>……</ref>[[分类:2月3日]]
  8. {{生日|2月30日}} -> 2月30日[[分类:错误生日]]
  9. {{生日|2月3.0日}} -> 2月3.0日[[分类:错误生日]]
  10. {{生日|2}} -> 2[[分类:错误生日]]
  11. {{生日|阿巴阿巴}} -> 阿巴阿巴[[分类:错误生日]]
  12. ]=]
  13. local p = {}
  14. local MAX_DAY_OF_MONTH = {
  15. -- 1 2 3 4 5 6 7 8 9 10 11 12
  16. 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
  17. }
  18. local REF_MARKER_PATTERN = '\127\'"`UNIQ%-%-[rR][eE][fF]%-%x%x%x%x%x%x%x%x%-QINU`"\'\127'
  19. local function ns0_category(category)
  20. return (mw.title.getCurrentTitle().namespace == 0) and ('[[分类:'..category..']]') or ''
  21. end
  22. local function for_hacking_template(date)
  23. return mw.getCurrentFrame():callParserFunction('#vardefine', '生日日期', date)
  24. end
  25. ---@param month string | integer
  26. ---@param day string | integer
  27. ---@return string? # 错误日期返回nil,正确日期返回分类链接和分类
  28. local function month_day_to_wikitext(month, day)
  29. month, day = tonumber(month), tonumber(day)
  30. local max_day = MAX_DAY_OF_MONTH[month]
  31. if not (max_day and day and day >= 1 and day <= max_day) then
  32. return nil
  33. end
  34. local month_day = month..'月'..day..'日'
  35. return '[[:分类:'..month_day..'|'..month_day..']]'..ns0_category(month_day)
  36. end
  37. ---@param text string
  38. ---@param ignore_error boolean? # 错误时不添加“错误生日”分类
  39. ---@return string
  40. function p.from_text(text, ignore_error)
  41. local var = ''
  42. repeat -- 仅执行一次,当出现错误时跳出
  43. local prefix, month, day, suffix = text:match('^(.-)(%d+)月(%d+)日(.-)$')
  44. if not prefix then -- string库比mw.ustring更快,也因此不能写“[日号]”
  45. prefix, month, day, suffix = text:match('^(.-)(%d+)月(%d+)号(.-)$')
  46. end
  47. if not prefix then break end
  48. var = for_hacking_template(month..'月'..day..'日')
  49. if prefix ~= '' and prefix:gsub('^..-年', '', 1):gsub(REF_MARKER_PATTERN, '') ~= '' then
  50. -- “X月X日”前面的不是“X年”+任意数量的“<ref>……</ref>”
  51. break
  52. end
  53. if suffix ~= '' and suffix:gsub(REF_MARKER_PATTERN, '') ~= '' then
  54. -- “X月X日”后面的不是任意数量的“<ref>……</ref>”
  55. break
  56. end
  57. local wikitext = month_day_to_wikitext(month, day)
  58. if not wikitext then break end -- 月份或日期不合法
  59. return var..prefix..wikitext..suffix
  60. until true
  61. if ignore_error then return var..text end
  62. return var..text..ns0_category('错误生日')
  63. end
  64. ---@param month string
  65. ---@param day string
  66. ---@param ignore_error boolean? # 错误时不添加“错误生日”分类
  67. ---@return string
  68. function p.from_month_day(month, day, ignore_error)
  69. local result = month_day_to_wikitext(month, day)
  70. if result then return result end
  71. result = month..'月'..day..'日'
  72. if ignore_error then return result end
  73. return result..ns0_category('错误生日')
  74. end
  75. function p.main(frame)
  76. local args = frame.args
  77. local arg1, arg2 = args[1], args[2]
  78. arg1 = arg1 and mw.text.trim(arg1)
  79. if not arg1 or arg1 == '' then
  80. return ''
  81. end
  82. local ignore_error = args.ft and args.ft ~= ''
  83. arg2 = arg2 and mw.text.trim(arg2)
  84. if arg2 and arg2 ~= '' then
  85. return p.from_month_day(arg1, arg2, ignore_error)
  86. end
  87. return p.from_text(arg1, ignore_error)
  88. end
  89. function p.from_parent(frame)
  90. return p.main(frame:getParent())
  91. end
  92. return p