From 6fbeda34b41dac1801f4a6fe566bc675c913b31a Mon Sep 17 00:00:00 2001 From: Bapham12 Date: Mon, 5 Oct 2026 22:33:43 +0700 Subject: [PATCH] =?UTF-8?q?Th=C3=AAm=20m=C3=B4=20=C4=91un=20Wide=20Image?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Wide image/main.lua | 147 ++++++++++++++++++++++++++++++++++++++++++ Wide image/styles.css | 9 +++ 2 files changed, 156 insertions(+) create mode 100644 Wide image/main.lua create mode 100644 Wide image/styles.css diff --git a/Wide image/main.lua b/Wide image/main.lua new file mode 100644 index 0000000..1660bc7 --- /dev/null +++ b/Wide image/main.lua @@ -0,0 +1,147 @@ +-- This module implements [[template:wide image]] and [[template:panorama]] +local p = {} + +local function getfilename(s) + s = mw.ustring.gsub(s or '', '^%s*[Ff][Ii][Ll][Ee]%s*:%s*', '') + s = mw.ustring.gsub(s or '', '^%s*[Ii][Mm][Aa][Gg][Ee]%s*:%s*', '') + return s +end + +local function getwidth(s, w, h) + w = mw.ustring.gsub(w or '0', '^%s*(%d+)%s*[Pp][Xx]*%s*$', '%1') + h = mw.ustring.gsub(h or '0', '^%s*(%d+)%s*[Pp][Xx]*%s*$', '%1') + w = tonumber(w) or 0 + h = tonumber(h) or 0 + if w > 0 then + return w + end + + local file = s and mw.title.new('File:' .. mw.uri.decode(mw.ustring.gsub(s,'%|.*$',''), 'WIKI')) + file = file and file.file or {width = 0, height = 0} + + if h > 0 then + w = math.floor(h * (tonumber(file.width) or 0)/(tonumber(file.height) or 1) + 0.5) + if w > 0 then + return w + end + end + + w = tonumber(file.width) or 0 + return w +end + +local function getimage(s, w, a, c, rtl) + if c == 'thumb' or c == 'thumbnail' or c == 'frame' or c == 'border' then + c = s + elseif rtl and c ~= '' then + c = '‪' .. c .. '‬' + end + return '[[File:' .. (s or '') .. '|' .. (w or '') .. '|alt=' .. (a or '') + .. '|' .. mw.text.unstrip(c or '') .. ']]' +end + +local function getcontainers(noborder, float, width, maxwidth) + local r = mw.html.create('div') + if noborder then + if float == 'left' then + r:addClass('floatleft') + elseif float == 'right' then + r:addClass('floatright') + elseif float == 'none' then + r:addClass('floatnone') + else -- center is default + r:addClass('floatnone') + r:css('margin-left', 'auto') + r:css('margin-right', 'auto') + r:css('overflow', 'hidden') + end + else + r:addClass('thumb') + if float == 'left' then + r:addClass('floatleft') + elseif float == 'right' then + r:addClass('floatright') + elseif float == 'none' then + r:addClass('tnone') + else -- center is default + r:addClass('tnone') + r:css('margin-left', 'auto') + r:css('margin-right', 'auto') + r:css('overflow', 'hidden') + end + end + r:css('width', width) + r:css('max-width', maxwidth) + local d = noborder and r or r:tag('div'):addClass('thumbinner') + + return r,d +end + +function wideimage(image, width, height, caption, boxwidth, float, alt, border, capalign, dir, bgtype) + if image then + image = getfilename(image) + local iwidth = getwidth(image, width or '0', height or '0') + if width == nil then + width = iwidth .. 'px' + end + local rtl = dir and dir == 'rtl' or nil + local noborder = border and border == 'no' or nil + + local maxwidth = noborder and (iwidth .. 'px') or ((iwidth + 10) .. 'px') + + local r,d = getcontainers(noborder, float or '', boxwidth or 'auto', maxwidth) + + if tonumber(width) then + width = width .. 'px' + end + + cclass = 'noresize ' + + if not (border == 'no') then + cclass = cclass .. 'thumbimage' + end + + if (bgtype == 'norm') then + cclass = cclass .. ' wide-image-normbg' + elseif (bgtype == 'none') then + cclass = cclass .. ' wide-image-nobg' + end + + d:tag('div') + :addClass(cclass) + :css('overflow', 'auto') + :css('direction', rtl and 'rtl' or nil) + :wikitext(getimage(image,width,alt,caption or '',rtl)) + if caption then + d = d:tag('div') + :addClass('thumbcaption') + :css('text-align', capalign) + if noborder == nil then + d:tag('div') + :addClass('magnify') + :wikitext('[[:File:' .. image .. '| ]]') + end + d:wikitext(caption) + end + return tostring(r) + end + return '' +end + +function p.main(frame) + local getArgs = require('Module:Arguments').getArgs + local args = getArgs(frame) + local styles = frame:extensionTag{ + name = 'templatestyles', + args = { src = 'Module:Wide image/styles.css' }, + } + + return styles .. wideimage( + args['image'] or args[1], args[2] or nil, -- width + args['height'] or nil, args['caption'] or args[3], + args['width'] or args[4], args['align'] or args[5], + args['alt'], args['border'], args['align-cap'], args['dir'], args['bgtype'] + ) +end + +return p diff --git a/Wide image/styles.css b/Wide image/styles.css new file mode 100644 index 0000000..270b233 --- /dev/null +++ b/Wide image/styles.css @@ -0,0 +1,9 @@ +.wide-image-normbg, .thumbimage.wide-image-normbg { + background: var(--background-color-neutral-subtle, #f8f9fa); + color: inherit; +} + +.wide-image-nobg, .thumbimage.wide-image-nobg { + background: transparent; + color: inherit; +}