יחידה:ReadTd

גרסה מ־23:08, 26 ביוני 2024 מאת יוסף בן מלמד (שיחה | תרומות) (גרסה אחת יובאה)
(הבדל) → הגרסה הקודמת | הגרסה האחרונה (הבדל) | הגרסה הבאה ← (הבדל)

ניתן ליצור תיעוד על היחידה הזאת בדף יחידה:ReadTd/תיעוד

--[[

templatedata services for other modules. 
template-invokable method, testTemplateData() for testing purposes only.


Methods:
	_readTemplateData( templateName )
		internal method. receives a page name, tries to see if it exists, and contains valid templatedata.
		if there is valid templatedata, it extracts the json, and uses mw methods to return a lua table containing the data.
		otherwise, returns nil

	readTemplateData( templateName )
		gets a pagename or an array of names, and cycles through them, trying to get templatedata from this file.
		when it gets a valid structure, it returns it, otherwise keep cycling.
		templateName can be a string or a table. if it's a string, it's assumed to be a template page name, 
		where valid templatedata exists in the page or in a subpage whose name is in the local variable docSubPage

	testTemplateData( templateName ): for testing. invokable from template. dumps templatedata lua object, using mw.dumpObject.
	
	compat( templateName ): backword-compatability for validation module expecting subpage in specific structure. 
]]


local docSubPage = 'תיעוד'

function _readTemplateData( templateName ) 
	local title = mw.title.makeTitle( 0, templateName )  
	local templateContent = title and title.exists and title:getContent() -- template's raw content
	local capture =  templateContent and mw.ustring.match( templateContent, '<templatedata%s*>(.*)</templatedata%s*>' ) -- templatedata as text
--	capture = capture and mw.ustring.gsub( capture, '"(%d+)"', tonumber ) -- convert "1": {} to 1: {}. frame.args uses numerical indexes for order-based params.
	if capture then return pcall( mw.text.jsonDecode, capture ) end
	return false
end

function readTemplateData( templateName )
	if type( templateName ) == 'string' then 
		templateName = { templateName, templateName .. '/' .. docSubPage }
	end
	if type( templateName ) == "table" then
		for _, name in ipairs( templateName ) do
			local td, result = _readTemplateData( name ) 
			if td then return result end
		end
	end
	return nil
end

function testTemplateData( frame )
	local tmplateName = frame.args['שם התבנית'] or frame.args[1]
	local td = readTemplateData( tmplateName )

	return td and mw.dumpObject( td ) or ''
end

function compat( template ) 
	local td = readTemplateData( template )
	if not td or not td['params'] then return nil end
	
	local params = td['params']
	local unnamedCount = #params
	local paramnames = {}
	local required = {}
	
	for paramname, paramobject in pairs( params ) do
		table.insert( paramnames, paramname )
		if paramobject.required then 
			table.insert( required, paramname )	
		end
	end
	return { unnamedCount, paramnames, required, {} }
end


return { 
	['ReadTemplateData'] = readTemplateData,
	['compat'] = compat,
	['בדיקה'] = testTemplateData, 
	['testTemplateData'] = testTemplateData,
	}