| Modul ini dilindungi. Modul ini sangat mencolok yang digunakan oleh banyak halaman, atau sangat sering disubstitusikan. Karena vandalisme atau kesalahan akan mempengaruhi banyak halaman, dan suntingan kecil dapat memberi beban besar pada server, modul ini dilindungi dari penyuntingan. |
| Modul ini menggunakan Lua: |
| Modul ini menggunakan TemplateStyles: |
Modul untuk templat {{gallery}}
Dokumentasi di atas ditransklusikan dari Modul:Gallery/doc. (sunting | riwayat)
Penyunting dapat melakukan uji coba pada halaman bak pasir (buat | cermin) dan kasus uji (buat) modul ini.
Subhalaman modul ini.
Penyunting dapat melakukan uji coba pada halaman bak pasir (buat | cermin) dan kasus uji (buat) modul ini.
Subhalaman modul ini.
-- This module implements {{gallery}} by wrapping the <gallery> core extension tag. localp={} localtemplatestyles='Module:Gallery/styles.css' localyesno=require('Module:Yesno') localplaintextModule=require('Module:Plain text') localfunctionplaintext(text) -- stips out external links without labels, -- and then passes to the Plain_text module to clean the rest returnplaintextModule.main({args={ text:gsub("([^%[])%[([^%[%]%s]+)%]",'%1') ,encode="no"}}) end localfunctiontrim(s) returnmw.ustring.gsub(mw.ustring.gsub(sor'','%s',' '),'^%s*(.-)%s*$','%1') end localtracking,preview localfunctionisImage(file) localfile=trim(file):lower()-- Case insensitive check -- Check if it starts with "File:", "Image:", or "Media:" localprefix=file:match("^(%a+):") ifprefixand(prefix=="file"orprefix=="image"orprefix=="media")then returntrue end localvalid_extensions={ "apng","djvu","flac","gif","jfi","jfif","jif","jpe","jpeg","jpg", "m1a","m1v","m2a","m2v","mid","mp1","mp2","mp3","mpa","mpe","mpeg","mpg", "mpv","oga","ogg","ogv","opus","pdf","png","stl","svg","svgz","tif","tiff", "wav","wave","webm","webp","xcf" } -- Extract file extension, of 3 or 4 characters only localext=file:match("%.(%w%w%w%w?)$") -- Check if the extension is in the valid list ifextthen for_,valid_extinipairs(valid_extensions)do ifext==valid_extthen table.insert(tracking,'[[Kategori:Halaman yang menggunakan galeri tanpa awalan ruangnama media]]') returntrue end end end returnfalse end localfunctioncheckarg(k,v) ifkandtype(k)=='string'then ifk=='align'ork=='state'ork=='style'ork=='title'or k=='width'ork=='height'ork=='lines'ork=='whitebg'or k=='mode'ork=='footer'ork=='perrow'ork=='noborder'or k:match('^alt%d+$')ork:match('^class%d+$')ork:match('^%d+$')then -- valid elseifk=='captionstyle'then ifnotv:match('^text%-align%s*:%s*center[;%s]*$')then table.insert(tracking,'[[Kategori:Halaman yang menggunakan galeri dengan parameter captionstyle]]') end else -- invalid localvlen=mw.ustring.len(k) k=mw.ustring.sub(k,1,(vlen<25)andvlenor25) k=mw.ustring.gsub(k,'[^%w%-_ ]','?') table.insert(tracking,'[[Kategori:Halaman yang menggunakan galeri dengan parameter tidak diketahui|'..k..']]') table.insert(preview,'"'..k..'"') end end end functionp.gallery(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. localorigArgs=(type(frame.getParent)=='function')andframe:getParent().argsorframe -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{gallery}}, change any empty arguments to nil, so Lua will consider -- them false too. localargs={} tracking,preview={},{} fork,vinpairs(origArgs)do ifv~=''then args[k]=v checkarg(k,v) end end if(args.modeor'')=='packed'and(args.alignor'')==''then args.align='center' end if(args.alignor'')=='centre'then args.align='center' end localtbl=mw.html.create('div') tbl:addClass('mod-gallery') ifargs.statethen tbl :addClass('mod-gallery-collapsible') :addClass('collapsible') :addClass(args.state) end ifargs.stylethen tbl:cssText(args.style) else tbl:addClass('mod-gallery-default') end ifargs.alignthen tbl:addClass('mod-gallery-'..args.align:lower()) end ifargs.titlethen tbl:tag('div') :addClass('title') :tag('div') :wikitext(args.title) end localgargs={} gargs['class']='nochecker'..(args.noborderand''or' bordered-images') gargs['widths']=tonumber(args.width)or180 gargs['heights']=tonumber(args.height)or180 gargs['style']=args.captionstyle gargs['perrow']=args.perrow gargs['mode']=args.mode ifyesno(args.whitebgor'yes')then gargs['class']=gargs['class']..' whitebg' end localvirtualgallery={} localgallery={} localimageCount=0 localzwsp=string.char(0xE2,0x80,0x8B)-- U+200B Zero Width Space localzwnj=string.char(0xE2,0x80,0x8C)-- U+200C Zero Width Non-Joiner -- create a coding to identify classes -- using unicode non-printing characters -- this is a workaround until we get the class arg in the <gallery> tag -- https://phabricator.wikimedia.org/T344784 localskininvert=zwsp..zwsp..zwsp; localbgtransparent=zwsp..zwsp..zwnj; fori=1,#argsdo localcurrentfield=trim(args[i])or'' ifcurrentfield==''then -- Skip empty fields elseifisImage(currentfield)then imageCount=imageCount+1 virtualgallery[imageCount]={currentfield} elseifimageCount>0andvirtualgallery[imageCount][2]==nilthen -- In case of multiple captions, use the first and ignore the laters virtualgallery[imageCount][2]=currentfield end end localaltCount=0; -- Run through virtualgallery and builds gallery forn=1,#virtualgallerydo localimg=virtualgallery[n][1] localcaption=virtualgallery[n][2]or'' localalt=trim(args['alt'..n]or'') localclass=trim(args['class'..n]or'') -- we count alt text only before any modification ifalt~=''then altCount=altCount+1 else -- if alt is empty, we use the caption as a alt text. -- It is necessary because we add classes codes in the next step, -- we do not want to let the alt empty with just the non-printing characters. alt=(caption~='')andplaintext(caption)or'' end -- we attach the non-printing code to the end of the alt text ifmw.ustring.find(class,'skin%-invert')then-- this matches both skin-invert and skin-invert-image alt=alt..skininvert end -- as it is possible to combine multiple classes, we use find instead of == ifmw.ustring.find(class,'bg%-transparent')then alt=alt..bgtransparent end -- Some space between the arguments and the pipe to prevent unexpected behaviors. -- for example: in some cases the parser interpret the pipe as part of urls table.insert(gallery,img.. (alt~=''and(' |alt='..alt)or'').. (caption~=''and(' |'..caption)or'')) end -- For tracking and verifying during migration to the new algorimth. -- It can be removed once everything is verified ifmath.ceil(#args/2)>imageCountthen ifaltCount>0then table.insert(tracking,'[[Kategori:Halaman yang menggunakan galeri dengan potensi ketidaksesuaian teks alt]]') --else -- table.insert(tracking, '[[Kategori:Halaman yang menggunakan galeri dengan kolom kosong tambahan]]') end end tbl:tag('div') :addClass('main') :tag('div') :wikitext( frame:extensionTag{name='gallery',content='\n'..table.concat(gallery,'\n'),args=gargs} ) ifargs.footerthen tbl:tag('div') :addClass('footer') :tag('div') :wikitext(args.footer) end localtrackstr=(#tracking>0)andtable.concat(tracking,'')or'' if#preview>0then trackstr=require('Modul:If preview')._warning({ 'Parameter tidak diketahui '..table.concat(preview,'; ')..'.' })..trackstr end returnframe:extensionTag{name='templatestyles',args={src=templatestyles}}..tostring(tbl)..trackstr end returnp