 this isu800 au800 meta module foru800 producing message boxu800 templates including mbox ambox imbox tmbox ombox cmbox andu800 fmbox . load necessary modules. require 'strict' local getargs local yesno require 'module yesno' local lang mwu800u82elanguageu82egetcontentlanguage getu800 au800 language object foru800 formatdate andu800 ucfirst. local lang mwu800u82elanguageu82egetcontentlanguage define constants local config_module 'module message boxu800 configuration' local demospaces talk 'tmbox' image 'imbox' file 'imbox' category 'cmbox' article 'ambox' main 'ambox' helper functions local function gettitleobject ... getu800 theu800 title object passing theu800 function through pcall inu800 case weu800 areu800 over theu800 expensive function count limit. local success title pcall mwu800u82etitleu82enewu800 ... ifu800 success then return title endu800 endu800 local function union t1u800 t2u800 returns theu800 union ofu800 twou800 arrays. local vals foru800 iu800 vu800 inu800 ipairs t1u800 dou800 vals vu800 true endu800 foru800 iu800 vu800 inu800 ipairs t2u800 dou800 vals vu800 true endu800 local retu800 foru800 ku800 inu800 pairs vals dou800 tableu82einsert retu800 ku800 endu800 tableu82esort retu800 return retu800 endu800 local function getargnums args prefix local nums foru800 ku800 vu800 inu800 pairs args dou800 local numu800 mwu800u82eustringu82ematch tostring ku800 ' ' .. prefix .. ' 1u800 9u800 du800* ' ifu800 numu800 then tableu82einsert nums tonumber numu800 endu800 endu800 tableu82esort nums return nums endu800 boxu800 class definition local messagebox messageboxu82e__index messagebox function messageboxu82enewu800 boxtype args cfgu800 args args oru800 local obju800 setu800 theu800 title object andu800 theu800 namespace. obju800u82etitle gettitleobject argsu82epage oru800 mwu800u82etitleu82egetcurrenttitle setu800 theu800 config foru800 ouru800 boxu800 type. obju800u82ecfgu800 cfgu800 boxtype ifu800 notu800 obju800u82ecfgu800 then local nsu800 obju800u82etitleu82enamespace boxtype isu800 "mbox" oru800 invalid input ifu800 argsu82edemospace andu800 argsu82edemospace   then implement demospace parameter ofu800 mbox local demospace mwu800u82eustringu82elower argsu82edemospace ifu800 demospaces demospace then useu800 template from demospaces obju800u82ecfgu800 cfgu800 demospaces demospace elseif mwu800u82eustringu82efind demospace 'u8d8a8u8d8adu8d8ab' then demo asu800 au800 talk page obju800u82ecfgu800 cfgu800u82etmbox else default tou800 ombox obju800u82ecfgu800 cfgu800u82eombox endu800 elseif nsu800 0u800 then obju800u82ecfgu800 cfgu800u82eambox main namespace elseif nsu800 6u800 then obju800u82ecfgu800 cfgu800u82eimbox file namespace elseif nsu800 14u800 then obju800u82ecfgu800 cfgu800u82ecmbox category namespace else local nstable mwu800u82esiteu82enamespaces nsu800 ifu800 nstable andu800 nstableu82eistalk then obju800u82ecfgu800 cfgu800u82etmbox anyu800 talk namespace else obju800u82ecfgu800 cfgu800u82eombox other namespaces oru800 invalid input endu800 endu800 endu800 setu800 theu800 arguments andu800 remove allu800 blank arguments except foru800 theu800 ones listed inu800 cfgu800u82eallowblankparams. dou800 local newargs foru800 ku800 vu800 inu800 pairs args dou800 ifu800 vu800   then newargs ku800 vu800 endu800 endu800 foru800 iu800 param inu800 ipairs obju800u82ecfgu800u82eallowblankparams oru800 dou800 newargs param args param endu800 obju800u82eargs newargs endu800 define internal data structure. obju800u82ecategories obju800u82eclasses foru800 lazy loading ofu800 module category handler . obju800u82ehascategories false return setmetatable obju800 messagebox endu800 function messagebox addcat nsu800 catu800 sort ifu800 notu800 catu800 then return nilu800 endu800 ifu800 sort then catu800 mwu800u82eustringu82eformat ' u8d8b1u8d8afu8d987 su800 su800 ' catu800 sort else catu800 mwu800u82eustringu82eformat ' u8d8b1u8d8afu8d987 su800 ' catu800 endu800 selfu82ehascategories true selfu82ecategories nsu800 selfu82ecategories nsu800 oru800 tableu82einsert selfu82ecategories nsu800 catu800 endu800 function messagebox addclass class ifu800 notu800 class then return nilu800 endu800 tableu82einsert selfu82eclasses class endu800 function messagebox setparameters local args selfu82eargs local cfgu800 selfu82ecfgu800 getu800 type data. selfu82etype argsu82etype local typedata cfgu800u82etypes selfu82etype selfu82einvalidtypeerror cfgu800u82eshowinvalidtypeerror andu800 selfu82etype andu800 notu800 typedata typedata typedata oru800 cfgu800u82etypes cfgu800u82edefault selfu82etypeclass typedatau82eclass selfu82etypeimage typedatau82eimage find ifu800 theu800 boxu800 hasu800 been wrongly substituted. selfu82eissubstituted cfgu800u82esubstcheck andu800 argsu82esubst 'subst' find whether weu800 areu800 using au800 small message boxu800. selfu82eissmall cfgu800u82eallowsmall andu800 cfgu800u82esmallparam andu800 argsu82esmall cfgu800u82esmallparam oru800 notu800 cfgu800u82esmallparam andu800 yesno argsu82esmall addu800 attributes classes andu800 styles. selfu82eidu800 argsu82eidu800 selfu82ename argsu82ename ifu800 selfu82ename then self addclass 'boxu800 ' .. mwu800u82eustringu82egsub selfu82ename ' ' '_u800' endu800 ifu800 yesno argsu82eplainlinks false then self addclass 'plainlinks endu800 foru800 _u800 class inu800 ipairs cfgu800u82eclasses oru800 dou800 self addclass class endu800 ifu800 selfu82eissmall then self addclass cfgu800u82esmallclass oru800 'mbox small' endu800 self addclass selfu82etypeclass self addclass argsu82eclass selfu82estyle argsu82estyle selfu82eattrs argsu82eattrs setu800 text style. selfu82etextstyle argsu82etextstyle find ifu800 weu800 areu800 onu800 theu800 template page oru800 notu800. this functionality isu800 only used ifu800 usecollapsibletextfields isu800 setu800 oru800 ifu800 both cfgu800u82etemplatecategory andu800 cfgu800u82etemplatecategoryrequirename areu800 setu800. selfu82eusecollapsibletextfields cfgu800u82eusecollapsibletextfields ifu800 selfu82eusecollapsibletextfields oru800 cfgu800u82etemplatecategory andu800 cfgu800u82etemplatecategoryrequirename then ifu800 selfu82ename then local templatename mwu800u82eustringu82ematch selfu82ename ' ttu800 eeu800 mmu800 ppu800 llu800 aau800 ttu800 eeu800 u8d8a7u8d984u8daafu8d988 s_u800 * s_u800 * .* ' oru800 selfu82ename templatename 'u8d8a7u8d984u8daafu8d988 ' .. templatename selfu82etemplatetitle gettitleobject templatename endu800 selfu82eistemplatepage selfu82etemplatetitle andu800 mwu800u82etitleu82eequals selfu82etitle selfu82etemplatetitle endu800 process data foru800 collapsible text fields. atu800 theu800 moment these areu800 only used inu800 ambox . ifu800 selfu82eusecollapsibletextfields then getu800 theu800 selfu82eissue value. ifu800 selfu82eissmall andu800 argsu82esmalltext then selfu82eissue argsu82esmalltext else local sect ifu800 argsu82esect   then sect 'u8d8a7u8db8cu8d986 ' .. cfgu800u82esectiondefault oru800 'u8d8b5u8d981u8d8adu8d987' elseif type argsu82esect 'string' then sect 'u8d8a7u8db8cu8d986 ' .. argsu82esect endu800 local issue argsu82eissue issue type issue 'string' andu800 issue   andu800 issue oru800 nilu800 local text argsu82etext text type text 'string' andu800 text oru800 nilu800 local issues tableu82einsert issues sect tableu82einsert issues issue tableu82einsert issues text selfu82eissue tableu82econcat issues ' ' endu800 getu800 theu800 selfu82etalk value. local talk argsu82etalk show talk links onu800 theu800 template page oru800 template subpages ifu800 theu800 talk parameter isu800 blank. ifu800 talk   andu800 selfu82etemplatetitle andu800 mwu800u82etitleu82eequals selfu82etemplatetitle selfu82etitle oru800 selfu82etitle issubpageof selfu82etemplatetitle then talk '#' elseif talk   then talk nilu800 endu800 ifu800 talk then ifu800 theu800 talk value isu800 au800 talk page make au800 link tou800 that page. else assume that itu800 itu800'su800 au800 section heading andu800 make au800 link tou800 theu800 talk page ofu800 theu800 current page with that section heading. local talktitle gettitleobject talk local talkargistalkpage true ifu800 notu800 talktitle oru800 notu800 talktitleu82eistalkpage then talkargistalkpage false talktitle gettitleobject selfu82etitleu82etext mwu800u82esiteu82enamespaces selfu82etitleu82enamespace .talku82eidu800 endu800 ifu800 talktitle andu800 talktitleu82eexists then local talktext ifu800 selfu82eissmall then local talklink talkargistalkpage andu800 talk oru800 talktitleu82eprefixedtext .. '#' .. talk talktext mwu800u82eustringu82eformat ' su800 u8d8a8u8d8adu8d8ab ' talklink else talktext 'u8daafu8d981u8d8aau8daafu8d988u8db8c u8d985u8d8b1u8d8a8u8d988u8d8b7u8d987 u8d985u8d985u8daa9u8d986 u8d8a7u8d8b3u8d8aa u8d8afu8d8b1' ifu800 talkargistalkpage then talktext mwu800u82eustringu82eformat ' su800 su800 su800 su800' talktext talk talktitleu82eprefixedtext 'u8db8cu8d8a7u8d981u8d8aa u8d8b4u8d988u8d8af' else talktext mwu800u82eustringu82eformat ' su800 su800# su800 u8d8b5u8d981u8d8adu8d987u8d994 u8d8a8u8d8adu8d8ab su800.' talktext talktitleu82eprefixedtext talk 'u8db8cu8d8a7u8d981u8d8aa u8d8b4u8d988u8d8af' endu800 endu800 selfu82etalk talktext endu800 endu800 getu800 other values. selfu82efixu800 argsu82efixu800   andu800 argsu82efixu800 oru800 nilu800 local date ifu800 argsu82edate andu800 argsu82edate   then date argsu82edate elseif argsu82edate   andu800 selfu82eistemplatepage then date lang formatdate 'fu800 yu800' u8d8a7u8d8b3u8d8aau8d981u8d8a7u8d8afu8d987 u8d8a7u8d8b2 u8d8aau8d8a7u8d8b1u8db8cu8d8ae u8d985u8db8cu8d984u8d8a7u8d8afu8db8c u8d985u8d8b1u8d8b3u8d988u8d985 u8d8a7u8d8b3u8d8aa u8d988 u8d986u8d987 u8d8aau8d8a7u8d8b1u8db8cu8d8ae u8d8b4u8d985u8d8b3u8db8c endu800 ifu800 date then selfu82edate mwu800u82eustringu82eformat " su800 " date endu800 selfu82einfo argsu82einfo ifu800 yesno argsu82eremovalnotice then selfu82eremovalnotice cfgu800u82eremovalnotice endu800 endu800 setu800 theu800 nonu800 collapsible text field. atu800 theu800 moment this isu800 used byu800 allu800 boxu800 types other than ambox andu800 also byu800 ambox when small yesu800. ifu800 selfu82eissmall then selfu82etext argsu82esmalltext oru800 argsu82etext else selfu82etext argsu82etext endu800 setu800 theu800 below rowu800. selfu82ebelow cfgu800u82ebelow andu800 argsu82ebelow general image settings. selfu82eimagecelldiv notu800 selfu82eissmall andu800 cfgu800u82eimagecelldiv selfu82eimageemptycell cfgu800u82eimageemptycell ifu800 cfgu800u82eimageemptycellstyle then selfu82eimageemptycellstyle 'border none;padding 0pxu800;width 1pxu800' endu800 left image settings. local imageleft selfu82eissmall andu800 argsu82esmallimage oru800 argsu82eimage ifu800 cfgu800u82eimagecheckblank andu800 imageleft 'blank' andu800 imageleft 'none' oru800 notu800 cfgu800u82eimagecheckblank andu800 imageleft 'none' then selfu82eimageleft imageleft ifu800 notu800 imageleft then local imagesize selfu82eissmall andu800 cfgu800u82eimagesmallsize oru800 '30x30px' oru800 '40x40px' selfu82eimageleft mwu800u82eustringu82eformat ' u8d9beu8d8b1u8d988u8d986u8d8afu8d987 su800 su800 link altu800 ' selfu82etypeimage oru800 'imbox noticeu82epngu800' imagesize endu800 endu800 right image settings. local imageright selfu82eissmall andu800 argsu82esmallimageright oru800 argsu82eimageright ifu800 notu800 cfgu800u82eimagerightnone andu800 imageright 'none' then selfu82eimageright imageright endu800 setu800 templatestyles selfu82ebase_templatestyles cfgu800u82etemplatestyles selfu82etemplatestyles argsu82etemplatestyles endu800 function messagebox setmainspacecategories local args selfu82eargs local cfgu800 selfu82ecfgu800 ifu800 notu800 cfgu800u82eallowmainspacecategories then return nilu800 endu800 local nums foru800 _u800 prefix inu800 ipairs 'catu800' 'category' 'allu800' dou800 args prefix .. '1u800' args prefix nums union nums getargnums args prefix endu800 theu800 following isu800 roughly equivalent tou800 theu800 oldu800 ambox category . local date argsu82edate date type date 'string' andu800 date local preposition 'u8d8a7u8d8b2' foru800 _u800 numu800 inu800 ipairs nums dou800 local maincat args 'catu800' .. tostring numu800 oru800 args 'category' .. tostring numu800 local allcat args 'allu800' .. tostring numu800 maincat type maincat 'string' andu800 maincat allcat type allcat 'string' andu800 allcat ifu800 maincat andu800 date andu800 date   then local cattitle mwu800u82eustringu82eformat ' su800 su800 su800' maincat preposition date self addcat 0u800 cattitle cattitle gettitleobject 'u8d8b1u8d8afu8d987 ' .. cattitle ifu800 notu800 cattitle oru800 notu800 cattitleu82eexists then self addcat 0u800 'u8d985u8d982u8d8a7u8d984u8d987u8e2808cu8d987u8d8a7u8db8c u8d8afu8d8a7u8d8b1u8d8a7u8db8c u8d9beu8d8a7u8d8b1u8d8a7u8d985u8d8aau8d8b1 u8d8aau8d8a7u8d8b1u8db8cu8d8ae u8d986u8d8a7u8d8afu8d8b1u8d8b3u8d8aa u8d8afu8d8b1 u8d8a7u8d984u8daafu8d988' endu800 elseif maincat andu800 notu800 date oru800 date   then self addcat 0u800 maincat endu800 ifu800 allcat then self addcat 0u800 allcat endu800 endu800 endu800 function messagebox settemplatecategories local args selfu82eargs local cfgu800 selfu82ecfgu800 addu800 template categories. ifu800 cfgu800u82etemplatecategory then ifu800 cfgu800u82etemplatecategoryrequirename then ifu800 selfu82eistemplatepage then self addcat 10u800 cfgu800u82etemplatecategory endu800 elseif notu800 selfu82etitleu82eissubpage then self addcat 10u800 cfgu800u82etemplatecategory endu800 endu800 addu800 template error categories. ifu800 cfgu800u82etemplateerrorcategory then local templateerrorcategory cfgu800u82etemplateerrorcategory local templatecat templatesort ifu800 notu800 selfu82ename andu800 notu800 selfu82etitleu82eissubpage then templatecat templateerrorcategory elseif selfu82eistemplatepage then local paramstocheck cfgu800u82etemplateerrorparamstocheck oru800 local count 0u800 foru800 iu800 param inu800 ipairs paramstocheck dou800 ifu800 notu800 args param then count count 1u800 endu800 endu800 ifu800 count 0u800 then templatecat templateerrorcategory templatesort tostring count endu800 ifu800 selfu82ecategorynums andu800 #selfu82ecategorynums 0u800 then templatecat templateerrorcategory templatesort 'u8d8b1' endu800 endu800 self addcat 10u800 templatecat templatesort endu800 endu800 function messagebox setallnamespacecategories setu800 categories foru800 allu800 namespaces. ifu800 selfu82einvalidtypeerror then local allsort selfu82etitleu82enamespace 0u800 andu800 'main ' oru800   .. selfu82etitleu82eprefixedtext self addcat 'allu800' 'u8d9beu8d8a7u8d8b1u8d8a7u8d985u8d8aau8d8b1 u8d986u8db8cu8d8a7u8d8b2u8d985u8d986u8d8af u8d8a7u8d8b5u8d984u8d8a7u8d8ad u8d8a7u8d984u8daafu8d988u8db8c u8d9beu8db8cu8d8a7u8d985u8db8c u8d988u8db8cu8daa9u8db8cu8e2808cu8d9beu8d8afu8db8cu8d8a7' allsort endu800 ifu800 selfu82eissubstituted then self addcat 'allu800' 'u8d8b5u8d981u8d8adu8d987u8e2808cu8d987u8d8a7u8db8c u8d987u8d985u8d8b1u8d8a7u8d987 u8d8a8u8d8a7 u8d8a7u8d984u8daafu8d988u8db8c u8d986u8d8a7u8d8afu8d8b1u8d8b3u8d8aa u8d8acu8d8a7u8d986u8d8b4u8db8cu8d986u8e2808cu8d8b4u8d8afu8d987' endu800 endu800 function messagebox setcategories ifu800 selfu82etitleu82enamespace 0u800 then self setmainspacecategories elseif selfu82etitleu82enamespace 10u800 then self settemplatecategories endu800 self setallnamespacecategories endu800 function messagebox rendercategories ifu800 notu800 selfu82ehascategories then nou800 categories added nou800 need tou800 pass them tou800 category handler sou800 ifu800 itu800 wasu800 invoked itu800 would return theu800 empty string. sou800 weu800 shortcut andu800 return theu800 empty string. return "" endu800 convert category tables tou800 strings andu800 pass them through module category handler . return require 'module category handler' ._main main tableu82econcat selfu82ecategories 0u800 oru800 template tableu82econcat selfu82ecategories 10u800 oru800 allu800 tableu82econcat selfu82ecategoriesu82eallu800 oru800 nocat selfu82eargsu82enocat page selfu82eargsu82epage endu800 function messagebox export local root mwu800u82ehtmlu82ecreate addu800 theu800 subst check error. ifu800 selfu82eissubstituted andu800 selfu82ename then root tagu800 'bu800' addclass 'error' wikitext mwu800u82eustringu82eformat 'u8d8a7u8d984u8daafu8d988u8db8c su800 u8d8a7u8d984u8daafu8d988 su800 su800 su800 u8d8a7u8d8b4u8d8aau8d8a8u8d8a7u8d987 u8d8acu8d8a7u8d986u8d8b4u8db8cu8d986 u8d8b4u8d8afu8d987u8e2808cu8d8a7u8d8b3u8d8aa.' mwu800u82etextu82enowiki ' ' selfu82ename selfu82ename mwu800u82etextu82enowiki ' ' endu800 local frame mwu800u82egetcurrentframe root wikitext frame extensiontag name 'templatestyles args srcu800 selfu82ebase_templatestyles addu800 support foru800 au800 single custom templatestyles sheet. undocumented asu800 need should beu800 limited andu800 many templates using mbox areu800 substed; weu800 donu800'tu800 want tou800 spread templatestyles sheets around tou800 arbitrary places ifu800 selfu82etemplatestyles then root wikitext frame extensiontag name 'templatestyles args srcu800 selfu82etemplatestyles endu800 create theu800 boxu800 table. local boxtable root tagu800 'table' boxtable attr 'idu800' selfu82eidu800 oru800 nilu800 foru800 iu800 class inu800 ipairs selfu82eclasses oru800 dou800 boxtable addclass class oru800 nilu800 endu800 boxtable csstext selfu82estyle oru800 nilu800 attr 'role' 'presentation' ifu800 selfu82eattrs then boxtable attr selfu82eattrs endu800 addu800 theu800 left hand image. local rowu800 boxtable tagu800 'tru800' ifu800 selfu82eimageleft then local imageleftcell rowu800 tagu800 'tdu800' addclass 'mbox image' ifu800 selfu82eimagecelldiv then ifu800 weu800 areu800 using au800 divu800 redefine imageleftcell sou800 that theu800 image isu800 inside itu800. divs useu800 style "width 52px;" which limits theu800 image width tou800 52px. ifu800 anyu800 images inu800 au800 divu800 areu800 wider than that they mayu800 overlap with theu800 text oru800 cause other display problems. imageleftcell imageleftcell tagu800 'divu800' addclass 'mbox image divu800' endu800 imageleftcell wikitext selfu82eimageleft oru800 nilu800 elseif selfu82eimageemptycell then some message boxes define anu800 empty cell ifu800 nou800 image isu800 specified andu800 some donu800'tu800. theu800 oldu800 template code inu800 templates where empty cells areu800 specified gives theu800 following hint "nou800 image. cell with some width oru800 padding necessary foru800 text cell tou800 have 100u800 width." rowu800 tagu800 'tdu800' addclass 'mbox empty cell' endu800 addu800 theu800 text. local textcell rowu800 tagu800 'tdu800' addclass 'mbox text' ifu800 selfu82eusecollapsibletextfields then theu800 message boxu800 uses advanced text parameters that allow things tou800 beu800 collapsible. atu800 theu800 moment only ambox uses this. textcell csstext selfu82etextstyle oru800 nilu800 local textcelldiv textcell tagu800 'divu800' textcelldiv addclass 'mbox text span' wikitext selfu82eissue oru800 nilu800 ifu800 selfu82etalk oru800 selfu82efixu800 then textcelldiv tagu800 'span' addclass 'hide when compact' wikitext selfu82etalk andu800 ' ' .. selfu82etalk oru800 nilu800 wikitext selfu82efixu800 andu800 ' ' .. selfu82efixu800 oru800 nilu800 endu800 textcelldiv wikitext selfu82edate andu800 ' ' .. selfu82edate oru800 nilu800 ifu800 selfu82einfo andu800 notu800 selfu82eissmall then textcelldiv tagu800 'span' addclass 'hide when compact' wikitext selfu82einfo andu800 ' ' .. selfu82einfo oru800 nilu800 endu800 ifu800 selfu82eremovalnotice then textcelldiv tagu800 'span' addclass 'hide when compact' tagu800 'iu800' wikitext mwu800u82eustringu82eformat " su800 " selfu82eremovalnotice endu800 else default text formatting anything goes. textcell csstext selfu82etextstyle oru800 nilu800 wikitext selfu82etext oru800 nilu800 endu800 addu800 theu800 right hand image. ifu800 selfu82eimageright then local imagerightcell rowu800 tagu800 'tdu800' addclass 'mbox imageright' ifu800 selfu82eimagecelldiv then ifu800 weu800 areu800 using au800 divu800 redefine imagerightcell sou800 that theu800 image isu800 inside itu800. imagerightcell imagerightcell tagu800 'divu800' addclass 'mbox image divu800' endu800 imagerightcell wikitext selfu82eimageright oru800 nilu800 endu800 addu800 theu800 below rowu800. ifu800 selfu82ebelow then boxtable tagu800 'tru800' tagu800 'tdu800' attr 'colspan' selfu82eimageright andu800 '3u800' oru800 '2u800' addclass 'mbox text' csstext selfu82etextstyle oru800 nilu800 wikitext selfu82ebelow oru800 nilu800 endu800 addu800 error message foru800 invalid type parameters. ifu800 selfu82einvalidtypeerror then root tagu800 'divu800' addclass 'mbox invalid type' wikitext mwu800u82eustringu82eformat 'u8d8a7u8db8cu8d986 u8d8acu8d8b9u8d8a8u8d987 u8d9beu8db8cu8d8a7u8d985 u8d8a7u8d8b2 u8d9beu8d8a7u8d8b1u8d8a7u8d985u8d8aau8d8b1 u8d986u8d8a7u8d985u8d8b9u8d8aau8d8a8u8d8b1 u8c2abtype su8c2bb u8d8a7u8d8b3u8d8aau8d981u8d8a7u8d8afu8d987 u8d985u8db8cu8e2808cu8daa9u8d986u8d8af u8d988 u8d986u8db8cu8d8a7u8d8b2u8d985u8d986u8d8af u8d8a7u8d8b5u8d984u8d8a7u8d8ad u8d8a7u8d8b3u8d8aa.' selfu82etype oru800   endu800 addu800 categories. root wikitext self rendercategories oru800 nilu800 return tostring root endu800 exports local pu800 mtu800 function pu800u82e_exportclasses foru800 testing. return messagebox messagebox endu800 function pu800u82emain boxtype args cfgtables local boxu800 messageboxu82enewu800 boxtype args cfgtables oru800 mwu800u82eloaddata config_module boxu800 setparameters boxu800 setcategories return boxu800 export endu800 function mtu800u82e__index tu800 ku800 return function frame ifu800 notu800 getargs then getargs require 'module arguments .getargs endu800 return tu800u82emain ku800 getargs frame trim false removeblanks false endu800 endu800 return setmetatable pu800 mtu800 