Modul:URL

Vorlagenprogrammierung Diskussionen Lua Unterseiten
Modul Deutsch

Modul: Dokumentation

Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus


--[=[ Version: 2022-11-25
	URL-Object
	Author: Vollbracht
Constructor: URL:new(<external link string>)
Fields:
	full:		addressable link string as given in new() parameter
	protocol:	(optional, default: empty) http, ftp, etc.
	server:		(optional, default: empty) de, www, www2, etc.; access default
				server (for https e.g.) at given site if void
	domain:		(mandantory) dns portion of a link string: wikipedia.org e. g.
	TLD:		most significant part of domain
	subdomain:	domain portion (least significant parts only)
	path:		(optional, default: empty, i. e. www root for https e. g.)
				/wiki or /wiki/Wikipedia:Lua/Modul/Wikidata/Time e. g.
	file:		(optional, default: empty, i. e. index.html e. g. depending on
				server configuration) index.php e. g.
	parameters:	(optional, default: empty) portion after ?:
				title=Modul:URL e. g.
	portion:	(optional, default: empty, not in combination with parameters)
				#chapter_5 e.g.
methods:
	relative()	new URL object ### still to be implemented
]=]

-- extend following TLDs to 2nd level: (com.tw is TLD. com.de is not.)
local eTLDs = {'tw', 'uk'}

service = {
	--[[
		URL:toString()
		standard method representing the content
	]]
	toString = function(this)
		return this.full
	end,
	--[[
		URL:short()
		link to full URL address with label reduced to domain as of NIC
	]]
	short = function(this)
		--return '<a href="' .. this.full .. '">' .. this.domain .. '</a>'
		return '[' .. this.full .. ' ' .. this.domain .. ']'
	end,
	--[[
		URL:format(property)
		format link to convenient label
		parameters:
			property	either a known property of a URL as listed above or a
						format string delimiting link label by angle brackets
						or nothing but a label string
		returns:	link to full URL address with label as given by property
	]]
	format = function(this, property)
		local pre, fmt, post = property:match('(.-)(<.*>)(.*)')
		if fmt then
			for k, v in pairs(this) do
				local s, e = fmt:find('<'.. k .. '>')
				if s then
					if e then
						fmt = fmt:sub(1, s - 1) .. v .. fmt:sub(e+1)
					else
						fmt = fmt:sub(1, s - 1) .. v
					end
				end
			end
			if not pre then pre = '' end
			if not post then post = '' end
			return pre .. '[' .. this.full .. ' ' .. fmt .. ']' .. post
		end
		if this[property] then
			return '[' .. this.full .. ' ' .. this[property] .. ']'
		end
		return '[' .. this.full .. ' ' .. property .. ']'
	end
}

--[[
	URL:new()
]]
function service:new(link)
	if not link then return nil end
	local result = {}
	if type(link) == "string" then
		result.full = link:match('^%S+')
		if not result.full then return nil end
		local i = result.full:find('://', nil, true)
		if i then
			result.protocol = result.full:sub(1, i-1)
			link = link:sub(i+3)
		end
		i = link:find('%/')
		local file = ''
		if i then
			if i < 3 then return nil end
			result.server = link:sub(1, i-1)
			link = link:sub(i+1)
			i = link:find('?', nil, true)
			if i then
				result.params = link:sub(i+1)
				result.file = '/' .. link:sub(1, i-1)
			else
				i = link:find('#')
				if i then
					result.portion = link:sub(i+1)
					result.file = '/' .. link:sub(1, i-1)
				else
					result.file = '/' .. link
				end
			end
		else
			i = link:find('?', nil, true)
			if i then
				if i < 3 then return nil end
				result.params = link:sub(i+1)
				result.server = link:sub(1, i-1)
			else
				i = link:find('#')
				if i then
					if i < 3 then return nil end
					result.portion = link:sub(i+1)
					result.server = link:sub(1, i-1)
				else
					if #link < 2 then return nil end
					result.server = link
				end
			end
		end
		local DNPs = mw.text.split(result.server, '%.')
		if not DNPs[2] then return nil
		else
			local TLDi = #DNPs
			result.TLD = DNPs[#DNPs]
			for _, eTLD in ipairs(eTLDs) do
				if eTLD == result.TLD then
					if TLDi == 2 then return nil end
					TLDi = TLDi - 1
					result.TLD = DNPs[TLDi] .. '.' .. result.TLD
					break
				end
			end
			if TLDi == 2 then
				result.domain = result.server
			else
				result.serverName = DNPs[1]
				result.domain = DNPs[TLDi - 1] .. '.' .. result.TLD
				if TLDi > 3 then
					i = 3
					result.subdomain = DNPs[2]
					while i < TLDi-2 do
						result.subdomain = result.subdomain .. '.' .. DNPs[i]
						i = i + 1
					end
				end
			end
		end
	elseif type(link) == 'table' then
		if not link.domain then return nil end
		result = link
		if not link.full then
			link.full = ''
			if link.protocol then
				result.full = link.protocol .. '://'
			end
			if link.server then result.full = result.full .. link.server
			else
				if link.serverName then
					result.full = result.full .. link.serverName .. '.'
					if link.subdomain then
						result.full = result.full .. link.subdomain .. '.'
					end
				end
				result.full = result.full .. link.domain
			end
			if link.file then result.full = result.full .. link.file end
			if link.parameters then
				result.full = result.full .. '?' .. link.parameters
			elseif link.portion then
				result.full = result.full .. '#' .. link.portion
			end
		end
	else
		return nil
	end
	setmetatable(result, self)
	self.__index = self
	return result
end

service.testFormat = function(frame)
	local u = service:new(frame.args.url)
	return u:format(frame.args.fmtStr)
end

service.test = function(frame)
	local p = frame.args[1]
	if not p then
		p = ''
		for k, v in pairs(frame.args) do
			p = p .. k .. '=' .. v
		end
	end
	local u = service:new(p)
	mw.logObject(u, 'test (URL)')
	return u:short()
end

return service

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.