Module:Book

From Eli's Software Encyclopedia
Revision as of 13:14, August 19, 2025 by WikiVisor (talk | contribs)

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

local p = {}

local function splitAndTrim(raw)
  local t = {}
  for part in raw:gmatch("[^,]+") do
    part = part:match("^%s*(.-)%s*$")
    if part ~= '' then
      table.insert(t, part)
    end
  end
  return t
end

local function buildAuthorOutput(rawAuthors)
	local authors = splitAndTrim(rawAuthors)
	local authorLabel = (#authors > 1) and 'Authors' or 'Author'
	local linkParts = {}
	for _, name in ipairs(authors) do
    	table.insert(linkParts, string.format('[[%s]]', name))
	end
	local authorLinks = table.concat(linkParts, ', ')
	return authorLabel, authorLinks
end

local function authorRow(authorLabel, authorLinks)
  local tr = mw.html.create('tr')
    tr:tag('td'):wikitext(authorLabel)
    tr:tag('td'):wikitext(authorLinks)

  return tr
end

local function addLabelValue(row, label, value)
  if not value or value == '' then return end 
  row:tag('td'):wikitext(label):done()
      :tag('td'):wikitext(value)
end

function p.semanticStore(frame)

	local titleObj    = mw.title.getCurrentTitle()
	local args        = frame:getParent().args or {}
	-- Get infobox helper params
	local collapsible = args['collapsible'] or 'no'
	local state       = args['state'] or 'autocollapse'
	local showImage   = args['show image'] or 'no'
	local title       = titleObj.text 
	-- Get semantic properties
	local image       = args['image'] or ''
	local imageCaption= args['caption'] or ''
	local booktitle   = args['booktitle'] or title
	local authors     = args['author'] or ''
	local publisher	  = args['publisher'] or ''
	local releaseDate = args['released'] or args['release date']  or ''
	local genre		  = args['genre']  or ''
	local isbn        = args['ISBN']  or ''
	local lcc         = args['LCC']  or ''
	local bookformat  = args['format']  or ''
	local country     = args['country']  or ''
	local language	  = args['language']  or ''
	-- Set properties
    local data = {
    	'Has Title=' .. booktitle,
    	'Author=' .. authors,
    	'+sep=,',
    	'Publisher=' .. publisher,
    	'Release Date=' .. releaseDate,
    	'Genre=' .. genre,
    	'ISBN=' .. isbn,
    	'LCC=' .. lcc,
    	'Book Format=' .. bookformat,
    	'Country=' .. country,
    	'Language=' .. language
	}
	mw.smw.set( data )
	-- Infobox variables
	local infoboxClass = 'chameleon-infobox smwtable-clean d-table w-100 w-md-30 d-md-flex float-none float-md-right border shadow-sm ml-md-4 mb-4 text-left'
	local pad = ''
	if collapsible == 'yes' then
		infoboxClass = infoboxClass .. ' collapsible ' .. state
		pad = frame:preprocess('{{pad|5em}}')
	end
	local infoboxImage = frame:preprocess('{{PAGENAME:' .. image .. '}}')
	-- Build infobox
	local html = mw.html.create()
	local infobox = html:tag('table'):addClass(infoboxClass):css('font-size', '90%'):attr('cellpadding', '0'):attr('cellspacing', '0')
	local row = infobox:tag('tr')
		row:tag('td'):attr('colspan', '2')
			:tag('div'):addClass('summary text-center font-italic'):css('font-size', '110%')
				:wikitext(pad .. title)
	if image ~= '' and showImage == 'yes' then
		row:tag('td'):attr('colspan', '2'):addClass('text-center px-0')
			:wikitext(string.format('[[File:%s|class=img-fluid|%s]]', infoboxImage, imageCaption))
		if imageCaption ~= '' then
			row:tag('td'):attr('colspan', '2'):addClass('text-center px-0')
				:wikitext(imageCaption)
		end
	end
	
	addLabelValue('Title', booktitle)
	
	if authors ~= '' then
		authorRow(buildAuthorOutput(authors))
	end
	
	addLabelValue('Publisher', publisher)
	addLabelValue('Release Date', releaseDate)
	addLabelValue('Genre', genre)
	addLabelValue('ISBN', isbn)
	addLabelValue('LCC', lcc)
	addLabelValue('Format', bookformat)
	addLabelValue('Country', country)
	addLabelValue('Language', language)
	
	return html
end

return p