Modul:Zeichenfolge
SimpleStruct |
SimpleDataAccess |
Vorlagenprogrammierung | Diskussionen | Lua | Unterseiten | |||
Modul | Deutsch | English
|
Modul: | Dokumentation |
Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus
--[=[ Zeichenfolge 2022-07-03
Data Management Module for Access from Within Templates and Other Modules
providing infos for sign sequences usually using unicode for display
Author: Vollbracht
* data() Wikidata information for current sign sequence in table form
]=]
--Module globals
local p = {service = {}}
local _, Parser = pcall(require, "Modul:SimpleStruct")
local _, Limited = pcall(require, "Modul:SimpleDataAccess")
--[[
sequenceCPs(qual)
returns a table of unicode codepoints of symbols in a sequence given by qual
]]
local sequenceCPs = function(qual)
local source = Limited.qualifiersLineup(qual, "P527")
local result = {}
for _, cq in ipairs(source) do
table.insert(result,Limited.indirectMSValue(cq, "P1299 P4213"))
end
return result
end
--[[
short(qual)
parameter:
qual wikiData qualifier of an item with either
a P1299(depicted by) containing a unicode item, or
a sequence of P527(has part or parts) containing character items
character items ought to have one P1299 property each
returns two elements:
1. Sitelink (or Label if Sitelink unavailable)
2. table of unicode codepoints
]]
p.service.short = function(qual)
local rawChar = mw.wikibase.getSitelink(qual)
if rawChar == nil then
rawChar = mw.wikibase.getLabel(qual)
end
if rawChar == nil then
return "Fehler", {"20; Bitte nur für Zeichenbeschreibung mit Wikidata einsetzen! [[Kategorie:Wikipedia:Qualitätssicherung Vorlageneinbindung fehlerhaft]] "}
end
local codepoint = Limited.indirectMSValue(qual, "P1299 P4213")
if codepoint == "" then
local cpl = sequenceCPs(qual)
if cpl == {} then
return "Fehler", {"20; Bitte nur für Zeichenbeschreibung mit Wikidata einsetzen! [[Kategorie:Wikipedia:Qualitätssicherung Vorlageneinbindung fehlerhaft]] "}
end
return rawChar, cpl
end
return rawChar, {codepoint}
end
--[[
{{Zeichen|short|qual|charStyle}}
returns a set of 2 <td> elements containing Sitelink or Label and character
or characters defined by <qual>
]]
p.service.shortTDs = function(qual, charStyle)
local link, cpl = p.service.short(qual)
local chS = charStyle
if chS == nil then chS = "" end
local result = "<td " .. chS .. ">&#x"
for i, cp in ipairs(cpl) do
if i > 1 then result = result .. '; &#x' end
local c=cp
if c == "" then c = "0020" end
result = result .. c
end
return result .. ";</td><td>[[" .. link .. "]]</td>"
end
--[[
shortList(qList, charStyle)
returns a table of 2 columns of short(qual, charStyle) listing all
occurences of Wikidata qualifiers within qList string currently devided by
an additional empty column
]]
local shortList = function(qList, charStyle)
local list = {}
for qual in qList:gmatch('[qQ]%d+') do
table.insert(list, p.service.shortTDs(qual, charStyle))
end
if list[1] == nil then
return ""
end
local delims = {
'</tr><tr>',
'<td> </td>',
'',
'<td> </td><td></td><td></td>'
}
local result = '<table style="width:100%;"><tr>'
for i, v in ipairs(list) do
result = result .. v
if i == #list then
result = result .. delims[i%2+3]
else
result = result .. delims[i%2+1]
end
end
return result .. '</tr></table>'
end
--[[
listOfShortLists(structureCode)
returns a structure of pairs of list labels and list data strings
structureCode may be:
list of character qualifiers:
Q1234 Q4567 Q7891
labels altering with qualifier lists
{label row} {label row} {Q1234 Q4567 Q7891}
{label row} {Q1234 Q4567 Q7891}
pairs of label and list where label may be given by qualifier
{{Q147}, {Q1234 Q4567 Q7891}}
{{Q258}, {Q1234 Q4567 Q7891}}
{{label},{Q1234 Q4567 Q7891}}
lists with labels (unpredictable order of lists; however each list is
inernally ordered predictably)
label1{Q1234 Q4567 Q7891}
label2{Q1234 Q4567 Q7891}
result is a list
{
{label, "Q1234 Q4567 Q7891"},
{label, "Q1234 Q4567 Q7891"},
{label, "Q1234 Q4567 Q7891"}
}
wherein label may be empty.
]]
p.service.listOfShortLists = function(structureCode)
local lists = Parser.parse(structureCode)
if lists[1] == structureCode then
return {{"", structureCode}}
end
local result = {}
local head = ""
for i, pair in ipairs(lists) do
t = type(pair) -- should be {{label} {list}}
if t == "string" then
-- no pair but single string instead
-- handle {label row} and {list} elements (preffered syntax)
if pair:find('[qQ]%d+') == nil then
-- string is label
if head == "" then
-- string is first label part
head = pair
else
-- add an additional label row
head = head .. '<br />' .. pair
end
else
-- string ("pair") is a list
table.insert(result, {head, pair})
-- empty head for next list
head = ""
end
elseif t == "table" then
if pair[1] == nil then
-- handle table of label{list} elements (no preffered syntax)
for label, list in pairs(pair) do
table.insert(result, {label, list})
end
else
-- handle {{label} {list}} elements
local labelQ = pair[1]:match('[qQ]%d+')
if labelQ == "" then
table.insert(result, pair)
else
table.insert(result, {mw.wikibase.getLabel(labelQ), pair[2]})
end
end
end
end
return result
end
--[[
{{Zeichen|listOfShortLists
|structureCode| tableStyles| thStyles| charStyles)}}
returns an html table with rows prepared by service.listOfShortListsCore
service.listOfShortListsCore: build html table rows
params:
structureCode: string representation of source
thStyles: css style information for <th> elements in a string like
style="[..]"
class="[..]"
class="[..]" style="[..]"
charStyles: css style information for the <td> elements containing the
actual single characters in a string as described for thStyles
source representated by structureCode is a table containing
{label, list} elements wherein list is a string containing atleast one
substring starting with a 'Q' followed by decimal digits
returns:
table rows in a sequence of
<tr><th colspan="5" thStyles>label</th></tr>
folowed by a number ( >= 1 ) of rows containing 1 or 2
<td charStyles>char</td><td>link</td>
]]
p.service.listOfShortListsCore = function(structureCode, thStyles, charStyles)
if structureCode == nil then return "" end
local source = p.service.listOfShortLists(structureCode)
if #source == 0 then return "" end
local thS = thStyles
if thS == nil then thS = "" end
local chS = charStyles
if chS == nil then thS = "" end
local result = ""
for i, pair in ipairs(source) do
-- handle label
if pair[1] ~= "" then
result = result .. '<tr><th colspan="2" ' .. thS .. '>'
result = result .. pair[1] .. '</th></tr>'
end
-- hanle list
result = result .. '<tr><td colspan="2">'
result = result .. shortList(pair[2], chS) .. '</td></tr>'
end
return result
end
-- now surround this for export:
p.listOfShortLists = function(frame)
local sc = frame.args.structureCode
if sc == nil then return "" end
local tableS = frame.args.tableStyles
if tableS == nil then tableS = "" end
local thS = frame.args.thStyles
if thS == nil then thS = "" end
local charS = frame.args.charStyles
if charS == nil then charS = "" end
local core = p.service.listOfShortListsCore(sc, thS, charS)
if core == "" then return "" end
return '<table ' .. tableS .. '>' .. core .. '</table>'
end
--[[
data() / service.data()
returns wikidata information for current page containing qualifier lineup
of P527(has part or parts)
]]
p.service.data = function()
local result = {}
result.label = mw.wikibase.getLabel()
result.description = mw.wikibase.getDescription()
local character = mw.wikibase.getEntity()
if character == nil then
result.sequence = {"Q29485"}
else
result.sequence = Limited.qualifiersLineup(character, "P527")
end
return result
end
--[[
language specific function returning table with German headers
description in German:
Zeichen|data|<Parameter>
gibt in eine Tabelle wikidata-Informationen zur aktuellen Seite zurück
Parameter:
tableStyles=<string>
Zeichenkette nach dem Schema 'class="<Liste>" style="<styles>"'
optional
thStyles=<string>
Zeichenkette nach dem Schema 'class="<Liste>" style="<styles>"'
optional
charStyles=<string>
Zeichenkette nach dem Schema 'class="<Liste>" style="<styles>"'
optional, default: 'style="font-size:250%;"'
addRows=<Liste>
eine Liste von zusätzlichen Zeilen nach dem Schema
'Name{<Wert>}'
die Elemente können durch Leerzeichen, Zeilenumbrüche, etc.
separiert sein. Werte dürfen keine geschweiften Klammern
enthalten.
rvStyles=<string>
Zeichenkette nach dem Schema 'class="<Liste>" style="<styles>"'
für die Werte der addRows
optional
]]
p.data = function(frame)
-- collect data
local source = p.service.data()
if source.sequence == {"Q29485"} then
return "Fehler: Bitte nur auf Seiten zur Zeichenfolgenbeschreibung mit Wikidata einsetzen! [[Kategorie:Wikipedia:Qualitätssicherung Vorlageneinbindung fehlerhaft]]"
end
local charStyles = 'style="font-size:250%;"'
if frame.args.charStyles then
charStyles = frame.args.charStyles
end
local ths = ""
if frame.args.thStyles ~= nil then
ths = frame.args.thStyles
end
local list = p.service.listOfShortListsCore(frame.args.addList, ths, charStyles)
-- build result table
local result = '<table '
if frame.args.tableStyles then
result = result .. frame.args.tableStyles
else
result = result .. 'class="float-right infobox toptextcells toccolours"'
result = result .. ' cellspacing="5"'
if list == "" then
result = result .. ' style="width:240px;"'
else
result = result .. ' style="width:300px;"'
end
end
result = result .. '><tr><th colspan="2" ' .. ths .. '>'
result = result .. source.label .. ':<br />' .. source.description
result = result .. '</th></tr><tr>'
if source.sequence == {} then
result = result .. '<td colspan="2">(kein Folge)'
else
local charSeq = ""
local cpSeq = ""
local linkSeq = "[["
local codeBlock = ""
for i, chQ in ipairs(source.sequence) do
local cp = Limited.indirectMSValue(chQ, "P1299 P4213")
local cb = Limited.indirectMSValue(chQ, "P1299 P5522")
local link = mw.wikibase.getSitelink(chQ)
if link == nil then
link = mw.wikibase.getLabel(chQ)
end
if i > 1 then
charSeq = charSeq .. " "
cpSeq = cpSeq .. " "
linkSeq = linkSeq .. "]]<br />[["
if codeBlock ~= cb then codeBlock = "" end
else
codeBlock = cb
end
charSeq = charSeq .. "&#x" .. cp .. ";"
cpSeq = cpSeq .. "U+" .. cp
linkSeq = linkSeq .. link
end
result = result .. '<td style="vertical-align: middle;">Zeichen:</td>'
result = result .. '<td ' .. charStyles .. '>' .. charSeq
result = result .. '</td></tr><tr><td>Codepunkte:</td>'
result = result .. '<td>' .. cpSeq
result = result .. '</td></tr><tr><td>Einzelzeichen:</td><td>'
result = result .. frame:preprocess(linkSeq .. ']]') .. '</td></tr>'
if codeBlock ~= "" then
result = result .. '<tr><td>Codeblock:</td><td>'
result = result .. frame:preprocess('[[' .. codeBlock .. ']]')
end
end
result = result .. '</td></tr>'
if frame.args.addRows then
local rows = Parser.altParse(frame.args.addRows)
if rows ~= nil then
for _, v in ipairs(rows) do
result = result .. '<tr><td style="vertical-align: middle;">'
result = result .. v[1]
result = result .. '</td><td ' .. frame.args.rvStyles .. '>'
result = result .. v[2] .. '</td></tr>'
end
end
end
if list ~= "" then
if frame.args.addListTitle then
result = result .. '<tr><th colspan="2" '
if frame.args.thStyles ~= nil then
result = result .. frame.args.thStyles
end
result = result .. '>' .. frame.args.addListTitle .. '</th></tr>'
end
result = result .. list
end
result = result .. '</table>'
return result
end
return p