Module:CastleLD: Difference between revisions

From Jcastle.info
No edit summary
No edit summary
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
local function escapeForMediaWiki(url)
local p = {}
-- Replace < and > so MW doesn't autolink
 
return url:gsub("<", "&lt;"):gsub(">", "&gt;")
-- Helper to clean text of HTML, wiki syntax, and excess whitespace
local function sanitizeText(input)
if not input then return "" end
-- Remove HTML tags
input = mw.ustring.gsub(input, "<[^>]+>", "")
-- Remove wiki links, preserve visible text
input = mw.ustring.gsub(input, "%[%[([^%]|]+)|([^%]]+)%]%]", "%2")
input = mw.ustring.gsub(input, "%[%[([^%]]+)%]%]", "%1")
-- Decode HTML entities
input = mw.text.decode(input)
-- Collapse whitespace
input = mw.ustring.gsub(input, "\r?\n", " ")
input = mw.ustring.gsub(input, "%s+", " ")
return mw.text.trim(input)
end
end


function p.getJSONLD(frame)
function p.getJSONLD(frame)
local castleData = frame:getParent().args
local castleData = frame:getParent().args
-- Extract lat/lon
local lat, lon = string.match(castleData["GPSLocation"] or "", "([%d%.%-]+)[,%s]+([%d%.%-]+)")
local lat, lon = string.match(castleData["GPSLocation"] or "", "([%d%.%-]+)[,%s]+([%d%.%-]+)")


-- Alternate names
local altNames = {}
local altNames = {}
if castleData["Japanese Name"] then table.insert(altNames, castleData["Japanese Name"]) end
if castleData["Japanese Name"] then table.insert(altNames, castleData["Japanese Name"]) end
Line 13: Line 29:
if castleData["Alternate Names"] then table.insert(altNames, castleData["Alternate Names"]) end
if castleData["Alternate Names"] then table.insert(altNames, castleData["Alternate Names"]) end


local pageUrl = "https://jcastle.info/view/" .. mw.uri.encode(castleData["English Name"] or "", "WIKI")
-- Build main JSON-LD structure
local websiteUrl = castleData["Website"] or ""
local schemaUrl = "https://schema.org"
 
local data = {
local data = {
["@context"] = escapeForMediaWiki(schemaUrl),
["@context"] = "https://schema.org",
["@type"] = "LandmarksOrHistoricalBuildings",
["@type"] = "LandmarksOrHistoricalBuildings",
["@id"] = escapeForMediaWiki(pageUrl),
name = castleData["English Name"] or "",
name = castleData["English Name"] or "",
alternateName = altNames,
alternateName = altNames,
Line 41: Line 53:
},
},
temporalCoverage = castleData["Historical Period"] or "",
temporalCoverage = castleData["Historical Period"] or "",
url = escapeForMediaWiki(pageUrl),
url = "https://jcastle.info/view/" .. mw.uri.encode(castleData["English Name"] or "", "WIKI"),
tourBookingPage = escapeForMediaWiki(websiteUrl),
tourBookingPage = sanitizeText(castleData["Website"]),
additionalProperty = {
additionalProperty = {
{["@type"]="PropertyValue", name="Castle Condition", value=castleData["Castle Condition"] or ""},
{["@type"]="PropertyValue", name="Castle Condition", value=castleData["Castle Condition"] or ""},
Line 52: Line 64:
{["@type"]="PropertyValue", name="Access", value=castleData["Access"] or ""},
{["@type"]="PropertyValue", name="Access", value=castleData["Access"] or ""},
{["@type"]="PropertyValue", name="Visitor Information", value=castleData["Visitor Information"] or ""},
{["@type"]="PropertyValue", name="Visitor Information", value=castleData["Visitor Information"] or ""},
{["@type"]="PropertyValue", name="Time Required", value=castleData["Time Required"] or ""}
{["@type"]="PropertyValue", name="Time Required", value=castleData["Time Required"] or ""},
{["@type"]="PropertyValue", name="Contributor", value=castleData["Contributor"] or ""}
}
}
}
}
local json = mw.text.jsonEncode(data, mw.text.JSON_PRETTY)
 
return json
return mw.text.jsonEncode(data, mw.text.JSON_PRETTY)
end
end
return p

Latest revision as of 00:20, 20 July 2025

Documentation for this module may be created at Module:CastleLD/doc

local p = {}

-- Helper to clean text of HTML, wiki syntax, and excess whitespace
local function sanitizeText(input)
	if not input then return "" end
	-- Remove HTML tags
	input = mw.ustring.gsub(input, "<[^>]+>", "")
	-- Remove wiki links, preserve visible text
	input = mw.ustring.gsub(input, "%[%[([^%]|]+)|([^%]]+)%]%]", "%2")
	input = mw.ustring.gsub(input, "%[%[([^%]]+)%]%]", "%1")
	-- Decode HTML entities
	input = mw.text.decode(input)
	-- Collapse whitespace
	input = mw.ustring.gsub(input, "\r?\n", " ")
	input = mw.ustring.gsub(input, "%s+", " ")
	return mw.text.trim(input)
end

function p.getJSONLD(frame)
	local castleData = frame:getParent().args

	-- Extract lat/lon
	local lat, lon = string.match(castleData["GPSLocation"] or "", "([%d%.%-]+)[,%s]+([%d%.%-]+)")

	-- Alternate names
	local altNames = {}
	if castleData["Japanese Name"] then table.insert(altNames, castleData["Japanese Name"]) end
	if castleData["Romaji Name"] then table.insert(altNames, castleData["Romaji Name"]) end
	if castleData["Alternate Names"] then table.insert(altNames, castleData["Alternate Names"]) end

	-- Build main JSON-LD structure
	local data = {
		["@context"] = "https://schema.org",
		["@type"] = "LandmarksOrHistoricalBuildings",
		name = castleData["English Name"] or "",
		alternateName = altNames,
		description = sanitizeText(castleData["History"]),
		founder = {
			["@type"] = "Person",
			name = castleData["Founder"] or ""
		},
		foundingDate = castleData["Year Founded"] or "",
		geo = {
			["@type"] = "GeoCoordinates",
			latitude = tonumber(lat),
			longitude = tonumber(lon)
		},
		address = {
			["@type"] = "PostalAddress",
			addressLocality = castleData["City"] or "",
			addressRegion = castleData["Prefecture"] or "",
			addressCountry = "Japan"
		},
		temporalCoverage = castleData["Historical Period"] or "",
		url = "https://jcastle.info/view/" .. mw.uri.encode(castleData["English Name"] or "", "WIKI"),
		tourBookingPage = sanitizeText(castleData["Website"]),
		additionalProperty = {
			{["@type"]="PropertyValue", name="Castle Condition", value=castleData["Castle Condition"] or ""},
			{["@type"]="PropertyValue", name="Castle Type", value=castleData["Castle Type"] or ""},
			{["@type"]="PropertyValue", name="Designations", value=castleData["Designations"] or ""},
			{["@type"]="PropertyValue", name="Main Keep Structure", value=castleData["Main Keep Structure"] or ""},
			{["@type"]="PropertyValue", name="Artifacts", value=castleData["Artifacts"] or ""},
			{["@type"]="PropertyValue", name="Features", value=castleData["Features"] or ""},
			{["@type"]="PropertyValue", name="Access", value=castleData["Access"] or ""},
			{["@type"]="PropertyValue", name="Visitor Information", value=castleData["Visitor Information"] or ""},
			{["@type"]="PropertyValue", name="Time Required", value=castleData["Time Required"] or ""},
			{["@type"]="PropertyValue", name="Contributor", value=castleData["Contributor"] or ""}
		}
	}

	return mw.text.jsonEncode(data, mw.text.JSON_PRETTY)
end

return p