Module:Book
From Eli's Software Encyclopedia
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')
:add{ mw.html.create('td'):wikitext(authorLabel) }
:add{ mw.html.create('td'):wikitext(authorLinks) }
return tr:plain()
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
row:tag('td'):wikitext('Title'):done()
:tag('td'):wikitext(booktitle)
if authors ~= '' then
authorRow(buildAuthorOutput(authors))
end
if publisher ~= '' then
row:tag('td'):wikitext('Publisher'):done()
:tag('td'):wikitext(publisher)
end
if releaseDate ~= '' then
row:tag('td'):wikitext('Release Date'):done()
:tag('td'):wikitext(releaseDate)
end
if genre ~= '' then
row:tag('td'):wikitext('Genre'):done()
:tag('td'):wikitext(genre)
end
if isbn ~= '' then
row:tag('td'):wikitext('ISBN'):done()
:tag('td'):wikitext(isbn)
end
if lcc ~= '' then
row:tag('td'):wikitext('LCC'):done()
:tag('td'):wikitext(lcc)
end
if bookformat ~= '' then
row:tag('td'):wikitext('Format'):done()
:tag('td'):wikitext(bookformat)
end
if country ~= '' then
row:tag('td'):wikitext('Country'):done()
:tag('td'):wikitext(country)
end
if language ~= '' then
row:tag('td'):wikitext('Language'):done()
:tag('td'):wikitext(language)
end
return html
end
return p
