Module:HotlinkVignette

-- local p = {}

local getArgs = require("Dev:Arguments")["getArgs"] local hash = require("Dev:Hash")

-- "switch statement" for path based on crop position

local positions = { top = function (args) if not args["width"] or not args["height"] then return nil end local result = "/top-crop" if not args["upscale"] then result = result .. "-down" end result = result .. "/width/" .. args["width"] .. "/height/" .. args["height"] return result end, center = function (args) if not args["width"] or not args["height"] then return nil end local result = "/zoom-crop" if not args["upscale"] then result = result .. "-down" end result = result .. "/width/" .. args["width"] .. "/height/" .. args["height"] return result end, custom = function (args) if not args["width"] or not args["window width"] or               not args["window height"] then return nil end local result = "/window-crop" if args["fixed"] and args["height"] then result = result .. "-fixed/width/" .. args["width"] .. "/height/" .. args["height"] else result = result .. "/width/" .. args["width"] end result = result .. "/x-offset/" .. (args["x offset"] or 0) .. "/y-offset/" .. (args["y offset"] or 0) .. "/window-width/" .. args["window width"] .. "/window-height/" .. args["window height"] return result end }

-- "switch statement" for path based on mode

local modes = { set = function (args) if not args["width"] or not args["height"] then return nil end local result = "/fixed-aspect-ratio" if not args["upscale"] then result = result .. "-down" end result = result .. "/width/" .. args["width"] .. "/height/" .. args["height"] return result end, width = function (args) if not args["width"] then return nil end local result = "/scale-to-width" if not args["upscale"] then result = result .. "-down" end result = result .. "/" .. args["width"] return result end, height = function (args) if not args["height"] then return nil end return "/scale-to-height-down/" .. args["height"] end, max = function (args) if not args["width"] or not args["height"] then return nil end local result = "/thumbnail" if not args["upscale"] then result = result .. "-down" end result = result .. "/width/" .. args["width"] .. "/height/" .. args["height"] return result end, crop = function (args) if not args["position"] then return nil end return type(positions[args["position"]]) == "function" and positions[args["position"]](args) end }

function p.main(frame) -- attempt to determine if provided with valid frame object local no_frame = not (type(frame.preprocess) == "function") -- - retrieve arguments - if no valid frame object, assume table of arguments -- local raw_args, args if no_frame then raw_args = frame args = mw.clone(frame) for k, v in pairs(args) do           v = v:match("^%s*(.-)%s*$") if v == "" then v = nil end args[k] = v       end else raw_args = getArgs(frame, {trim = false, removeBlanks = false}) args = getArgs(frame) end local image = args["image"] -- output error message if no image was specified if not image then return raw_args["error"] or ("Template error:" ..           " An image has not been specified. ") end -- determine langauge and domain for image URL local language = args["language"] or       mw.language.getContentLanguage:getCode if language == "en" then language = nil end local domain = args["domain"] or       mw.site.server:match("^.*/(.*)%.fandom%.com.*$") or        mw.site.server:match("^.*/(.*)%.wikia%.org.*$") if not args["keep subdomains"] then domain = domain:match("^.-%.?([^%.]*)$") end if args["language subdomains"] and language then domain = language .. "." .. domain language = nil end -- - if neccessary, assume local wiki and use parser function "filepath" to get base image URL - else, contruct base image URL from arguments - reassign "image" variable because we can -- if not (args["domain"] or args["language"]) then -- if no valid frame object, log message and return "nil" if no_frame then mw.log("HotlinkVignette: Not a valid frame object. Cannot" ..               " proceed with retrieving image URL for local wiki.") return nil else image = frame:preprocess("") :match("^(.*/).-$") end else -- determine code for image URL local code = args["code"] if not code or #code < 2 then code = hash.MD5(image).hexdigest end -- contruct base image URL from arguments image = "https://vignette.wikia.nocookie.net/" .. domain .. "/images/" .. mw.ustring.sub(code, 1, 1) .. "/" ..           mw.ustring.sub(code, 1, 2) .. "/" .. mw.uri.encode(image, "WIKI") .. "/revision/" end image = image .. (args["replaced"] or "latest") -- create URI object and, if applicable, add language local url = mw.uri.new(image) if language then url:extend({["path-prefix"] = language}) end local link = args["link"] local result = "" -- - if applicable, construct link open and set as return value - if link specified as non-whitespace, use specified target --- if internal/interwiki format, retrieve full URL - if link not specified, use base image URL -- if link then if link:match("://") then result = "[" .. link else result = "[" .. tostring(mw.uri.fullUrl(link)) end elseif not raw_args["link"] then result = "[" .. tostring(url) end -- add to path based on mode and, if applicable, crop position if args["mode"] then url["path"] = url["path"] .. ((type(modes[args["mode"]]) == "function" and modes[args["mode"]](args)) or "") end -- construct query string if args["query"] then url:extend(mw.uri.parseQueryString(args["query"])) end if args["fill"] then if url["query"] and url.query.fill then if type(url.query.fill) == "table" then table.insert(url.query.fill, args["fill"]) else url.query.fill = {url.query.fill, args["fill"]} end else url:extend({fill = args["fill"]}) end end -- if language is applicable and was overwritten, re-add it to query if language and language ~= url.query["path-prefix"] then if type(url.query["path-prefix"]) == "table" then table.insert(url.query["path-prefix"], language) else url.query["path-prefix"] = {url.query["path-prefix"], language} end end -- concatenate image URL to return value result = result .. " " .. tostring(url) -- if applicable, construct link close and concatenate to return value if link then if link:match("://") then result = result .. "]"       else result = result .. "] "       end elseif not raw_args["link"] then result = result .. "] "   end return result end

return p --