Module:Book: Difference between revisions

From Eli's Software Encyclopedia
mNo edit summary
mNo edit summary
Line 85: Line 85:
local html = mw.html.create()
local html = mw.html.create()
local infobox = html:tag('table'):addClass(infoboxClass):css('font-size', '90%'):attr('cellpadding', '0'):attr('cellspacing', '0')
local infobox = html:tag('table'):addClass(infoboxClass):css('font-size', '90%'):attr('cellpadding', '0'):attr('cellspacing', '0')
local row = infobox:tag('tr')
local dataRow = infobox:tag('tr')
row:tag('td'):attr('colspan', '2')
dataRow:tag('td'):attr('colspan', '2')
:tag('div'):addClass('summary text-center font-italic'):css('font-size', '110%')
:tag('div'):addClass('summary text-center font-italic'):css('font-size', '110%')
:wikitext(pad .. title)
:wikitext(pad .. title)
if image ~= '' and showImage == 'yes' then
if image ~= '' and showImage == 'yes' then
row:tag('td'):attr('colspan', '2'):addClass('text-center px-0')
dataRow:tag('td'):attr('colspan', '2'):addClass('text-center px-0')
:wikitext(string.format('[[File:%s|class=img-fluid|%s]]', infoboxImage, imageCaption))
:wikitext(string.format('[[File:%s|class=img-fluid|%s]]', infoboxImage, imageCaption))
if imageCaption ~= '' then
if imageCaption ~= '' then
row:tag('td'):attr('colspan', '2'):addClass('text-center px-0')
dataRow:tag('td'):attr('colspan', '2'):addClass('text-center px-0')
:wikitext(imageCaption)
:wikitext(imageCaption)
end
end
end
end
addLabelValue('Title', booktitle)
addLabelValue(dataRow, 'Title', booktitle)
if authors ~= '' then
if authors ~= '' then
Line 104: Line 104:
end
end
addLabelValue('Publisher', publisher)
addLabelValue(dataRow, 'Publisher', publisher)
addLabelValue('Release Date', releaseDate)
addLabelValue(dataRow, 'Release Date', releaseDate)
addLabelValue('Genre', genre)
addLabelValue(dataRow, 'Genre', genre)
addLabelValue('ISBN', isbn)
addLabelValue(dataRow, 'ISBN', isbn)
addLabelValue('LCC', lcc)
addLabelValue(dataRow, 'LCC', lcc)
addLabelValue('Format', bookformat)
addLabelValue(dataRow, 'Format', bookformat)
addLabelValue('Country', country)
addLabelValue(dataRow, 'Country', country)
addLabelValue('Language', language)
addLabelValue(dataRow, 'Language', language)
return html
return html

Revision as of 13:16, August 19, 2025

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 dataRow = infobox:tag('tr')
		dataRow: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
		dataRow:tag('td'):attr('colspan', '2'):addClass('text-center px-0')
			:wikitext(string.format('[[File:%s|class=img-fluid|%s]]', infoboxImage, imageCaption))
		if imageCaption ~= '' then
			dataRow:tag('td'):attr('colspan', '2'):addClass('text-center px-0')
				:wikitext(imageCaption)
		end
	end
	
	addLabelValue(dataRow, 'Title', booktitle)
	
	if authors ~= '' then
		authorRow(buildAuthorOutput(authors))
	end
	
	addLabelValue(dataRow, 'Publisher', publisher)
	addLabelValue(dataRow, 'Release Date', releaseDate)
	addLabelValue(dataRow, 'Genre', genre)
	addLabelValue(dataRow, 'ISBN', isbn)
	addLabelValue(dataRow, 'LCC', lcc)
	addLabelValue(dataRow, 'Format', bookformat)
	addLabelValue(dataRow, 'Country', country)
	addLabelValue(dataRow, 'Language', language)
	
	return html
end

return p