Modul:Begrep
Hopp til navigering
Hopp til søk
Dokumentasjon for denne modulen kan opprettes på Modul:Begrep/dok
local capiunto = require 'capiunto' local p = {} --p stands for package local felles = mw.loadData( 'Module:Felles' ) -- one function for values which are in their own namespace (i.e autocompleted from namespace) local function createMediawikiLinkNS( value ) if value and value ~= "" then return mw.getCurrentFrame() :callParserFunction( '#arraymap:'.. value, felles.separator, 'x', "[[".. felles.namespace .. ':x' .. "]]", " , ", " og " ) end end local function createMediawikiLink( value ) if value and value ~= "" then return mw.getCurrentFrame() :callParserFunction( '#arraymap:'.. value, felles.separator, 'x', "[[" .. 'x' .. "]]", ", ", " og " ) end end local function createMediawikiLinkOrLinkNS( value, relasjonsheading ) if value and value ~= "" then local i,_ = string.find(value, felles.namespace .. ":") if i == 1 or relasjonsheading == "Se også" then return createMediawikiLink( value ) else return createMediawikiLinkNS( value ) end end end local function addOptionalRow ( t, label, value, ... ) -- error ( " label" .. label .. "v: " .. value ) if value and value ~= "" then return t:addRow(label, value, ...) else return t end end -- For å skrive smwproperties som wikitext som kan listes til SemanticScribunto -- se dataStoreType2 https://github.com/SemanticMediaWiki/SemanticScribunto/blob/master/docs/mw.smw.set.md local function smwproperty( property, value ) local resultvalue = value or "" return property .. "=" .. resultvalue end -- add namespace to value -https://phabricator.wikimedia.org/T254624 local function smwpropertyns( property, value ) if (value == "" or value == nil) then return "" else local newvalue = mw.getCurrentFrame():callParserFunction( '#arraymap:'.. value, felles.separator, 'x', felles.namespace .. ':x', felles.separator ) return smwproperty( property, newvalue ) end end local function smwlangproperty( property, value, lang ) local resultvalue if (value and lang) then resultvalue = ( value .. "@" .. lang ) else resultvalue = "" end return property .. "=" .. resultvalue end local function smwwritetriples( relasjoner ) local result = mw.smw.set( relasjoner ) if result == true then -- everything ok else error( tostring(result.error) ) -- error message to be found in result.error end return end local function splitstring (inputstr, sep) if sep == nil then sep = "%s" end local t={} for str in string.gmatch(inputstr, "([^"..sep.."]+)") do table.insert(t, str) end return t end local function uppercasefirstchar(str) return (str:gsub("^%l", string.upper)) end local function dump(o) if type(o) == 'table' then local s = '{ ' for k,v in pairs(o) do if type(k) ~= 'number' then k = '"'..k..'"' end s = s .. '['..k..'] = ' .. dump(v) .. ',' end return s .. '} ' else return tostring(o) end end local function getsamlingproperty(namespace, property, defaultvalue) local query = {} table.insert( query, '[[Category:Skos:Collection]]') table.insert( query, '?dct:identifier=id') table.insert( query, '?' .. property) local result = mw.smw.ask( query ) local value = defaultvalue for _, v in pairs(result) do if v["id"] == namespace then value = v[property] break; end end return value end local function getskillevalue(namespace, property) -- build query local query = {} table.insert( query, '[[Category:Skos:Collection]]') table.insert( query, '?dct:identifier=id') table.insert( query, '?' .. property .. '=skille') local result = mw.smw.ask( query ) local skille = false for _, v in pairs(result) do if v["id"] == namespace then skille = v["skille"] break; end end return skille end -- global vars -- Write triples for template Begrep -- Begin Triples for form Begrep -- Write triples for template relasjon function p.relasjonsseksjon ( frame ) local relasjon = frame:getParent() local relasjontripler = { smwpropertyns("Skos:semanticRelation", relasjon.args["semantisk relasjon"]), felles.sep, } smwwritetriples( relasjontripler ) -- infobox local hasrelasjon = false for k, v in pairs( relasjon.args ) do if (k == "semantisk relasjon") and v then hasrelasjon = true break; elseif k then hasrelasjon = true break; end end if (hasrelasjon) then local terminfobox = capiunto.create( { bodyStyle = "width:60em; background:#f3f3f3; margin: 0 0 0 0; margin-top: 25px;" } ) :addHeader( "RELASJON", "mw-infobox-capiunto-title-1" ) terminfobox = addOptionalRow( terminfobox, 'Merknad (intern)', relasjon.args["merknad internt"] ) terminfobox = addOptionalRow( terminfobox, 'Semantisk relasjon', createMediawikiLinkNS( relasjon.args["semantisk relasjon"] ) ) :getHtml() return tostring(terminfobox) end end -- Write triples for relasjon template function p.relasjon( frame ) local args = frame.args local relasjonsheading = args.relasjonsheading local relasjonargs = frame:getParent().args assert ( relasjonsheading ~= nil, "named param 'relasjonsheading' must be set when invoking begrep:relasjon" ) local skille = false if args.namespace then local namespace = args.namespace skille = getskillevalue(namespace, "skosp:skilleGeneriskPartitiv") end local relasjonstype = relasjonargs.type if relasjonstype == nil then relasjonstype = "" end if ( relasjonargs.begrep ) then -- flat triple local relasjonskey = nil if skille then relasjonskey = relasjonsheading .. relasjonstype else relasjonskey = relasjonsheading end local i,_ = string.find(relasjonargs.begrep, felles.namespace .. ":") if i == 1 or relasjonskey == "Se også" then -- for rdfs:seeAlso, namespace is part of link defined in form smwwritetriples( smwproperty( felles.relasjonstable[relasjonskey], relasjonargs.begrep ) ) else smwwritetriples( smwpropertyns( felles.relasjonstable[relasjonskey], relasjonargs.begrep ) ) end -- qualification triples: TODO Adapt to new Version of skosno; with skille if ( relasjonstype ~= "" or relasjonargs.inndelingskriterium or relasjonargs.merknad ) then local relasjonslug = mw.ustring.match(felles.relasjonstable[relasjonskey], ":(.*)") local urivarname = relasjonslug .. "termCounter" local LuaVarTermCounter = mw.ext.VariablesLua.var( urivarname ) local counter = (LuaVarTermCounter and LuaVarTermCounter ~= '') and LuaVarTermCounter or 1 mw.ext.VariablesLua.vardefine(urivarname, tonumber(counter) + 1) local slug = relasjonskey .. " " .. counter -- local sourceslug = slug .. "source" local id_subobject = felles.fullpagename .. "#" .. slug -- from subobject local qualification_triples = { smwproperty("@category", "skosp:Relation"), -- smwproperty("Dct:source", felles.fullpagename .. sourceslug ), smwpropertyns("skosp:begrep", relasjonargs.begrep), smwproperty("skosno:inndelingskriterium", relasjonargs.inndelingskriterium ), felles.sep, smwlangproperty("skos:note", relasjonargs.merknad, "nb"), } -- subobject id duplicates pagename TODO mw.smw.subobject( qualification_triples, id_subobject ) -- to subobject, adapt to new version of skosno smwwritetriples( smwproperty( "skosp:qualifiedRelation", id_subobject ) ) end -- terminfobox if relasjonargs then local terminfobox = capiunto.create( { bodyStyle = "width:60em; background:#f3f3f3; margin: 0 0 0 0;" } ) :addHeader( relasjonsheading, "mw-infobox-capiunto-title-2" ) :addRow( 'Begrep', createMediawikiLinkOrLinkNS( relasjonargs.begrep, relasjonsheading ) ) if skille then terminfobox = addOptionalRow( terminfobox, "Type", relasjonargs.type ) end terminfobox = addOptionalRow( terminfobox, "Inndelingskriterium", relasjonargs.inndelingskriterium ) terminfobox = addOptionalRow( terminfobox, "Merknad", relasjonargs.merknad ) :getHtml() return tostring(terminfobox) end end end -- Write triples for template begrep function p.begrep ( frame ) local begrep = frame:getParent() local domene_value = nil if begrep.args.domene then -- workaround for present but problmatic domain info if ( begrep.args.medlem == "NOJU" or begrep.args.medlem == "NOJU:NOJU" ) then domene_value = felles.domenens .. ":Rett" elseif ( begrep.args.medlem == "OKADM" or begrep.args.medlem == "OKADM:OKADM" ) then domene_value = felles.domenens .. ":OkonomiAdministrasjon" else domene_value = felles.domenens .. ":" .. begrep.args.domene end end local begreptripler = { smwproperty( "Dct:modified", frame:preprocess( "{{#time: Y-m-d'T'H:i:s|{{REVISIONTIMESTAMP}}}}{{#time:P|{{REVISIONTIMESTAMP}}|nb|true}}" )), smwproperty( "Dct:created", begrep.args.inndato), smwproperty( "Skosp:memberOf", begrep.args.medlem ), smwlangproperty( "Skos:scopeNote", begrep.args.kommentar, "nb" ), smwproperty( "Dct:subject", begrep.args['bruksområde'] ), felles.sep, smwproperty( "Skosp:domene", domene_value ), smwproperty( "euvoc:status", begrep.args.status ), smwproperty( "Skosp:publisere", begrep.args.publisere ), smwproperty( "Dct:identifier", begrep.args.identifikator ), smwproperty( "Skosp:previousIdentifier", begrep.args['tidligere id'] ) } smwwritetriples( begreptripler ) -- infobox -- infobox local terminfobox = capiunto.create( { bodyStyle = "width:60em;background:#f3f3f3; margin: 0 0 0 0;" } ) :addHeader( "INFORMASJON", "mw-infobox-capiunto-title-1" ) terminfobox = addOptionalRow( terminfobox, 'Referanse', begrep.args["kommentar:referanse"] ) -- obsolete? -- terminfobox = addOptionalRow( terminfobox, 'domene', createMediawikiLink(domene_value) ) TODO, add when domains in place if begrep.args.domene then terminfobox = addOptionalRow( terminfobox, 'Domene', createMediawikiLink("DOMENE:" .. begrep.args.domene) ) end terminfobox = addOptionalRow( terminfobox, 'Bruksområde', begrep.args["bruksområde"] ) terminfobox = addOptionalRow( terminfobox, 'Merknad', begrep.args.kommentar ) terminfobox = addOptionalRow( terminfobox, 'Merknad (intern)', begrep.args["merknad internt"] ) terminfobox = addOptionalRow( terminfobox, 'Status', begrep.args.status ) terminfobox = addOptionalRow( terminfobox, 'Publisere', begrep.args.publisere ) :getHtml() return tostring(terminfobox) end -- Coalesce on displaytitle from prefLabel function p.displaytitle( term ) -- local prefixedtitle = mw.title.getCurrentTitle().prefixedText -- local term = mw.getCurrentFrame():getParent().args.term -- local currentdisplaytitle = mw.ext.displaytitle.get(prefixedtitle) local isset = mw.getCurrentFrame():callParserFunction( '#var', { 'dtisset' } ) -- om term finnes og display title er tittel med namespace, sett displaytitle if (isset == "" and term ~= nil) then mw.ext.displaytitle.set(term) -- sett info om at at term finnes via wiki parserfuncstions siden en ikke kan ha state mellom invocations i LUA mw.getCurrentFrame():callParserFunction( '#vardefine', { 'dtisset', term } ) end return end function p.symbol ( frame ) local args = frame:getParent().args if ( args.symbol ) then local urivarname = "symbolCounter" local LuaVarSymbolCounter = mw.ext.VariablesLua.var( urivarname ) local counter = (LuaVarSymbolCounter and LuaVarSymbolCounter ~= '') and LuaVarSymbolCounter or 1 mw.ext.VariablesLua.vardefine(urivarname, tonumber(counter) + 1) local slug = "_symbol_" .. counter smwwritetriples( smwproperty( "skos:notation", felles.fullpagename .. "#" .. slug ) ) local reified_tripler = { smwproperty( "skosp:nonLinguisticLabel", args.symbol ), smwlangproperty( "skos:note", args["symbol:merknad"], "nb" ), smwproperty( "@category", "skosxl:Label" ) } mw.smw.subobject( reified_tripler, slug ) local terminfobox = capiunto.create( { bodyStyle = "width:60em;background:#f3f3f3; margin: 0 0 0 0;" } ) :addHeader( "Symbol", "mw-infobox-capiunto-title-2" ) :addRow("Symbol", args.symbol) terminfobox = addOptionalRow( terminfobox, 'Merknad', args["symbol:merknad"] ) return tostring(terminfobox) end end function p.bilde( frame ) local bildeargs = frame:getParent().args if ( bildeargs.file_name ) then local slug = "_bilde" smwwritetriples( smwproperty( "skos:notation", felles.fullpagename .. "#" .. slug ) ) local filenamehash = mw.hash.hashValue("md5", uppercasefirstchar(bildeargs.file_name)) local dir1 = string.sub(filenamehash, 1, 1) local dir2 = string.sub(filenamehash, 1, 2) local imagepath = "wiki.terminologi.no/images/" .. dir1 .. "/" .. dir2.. "/" .. uppercasefirstchar(bildeargs.file_name) local bildetripler = { smwproperty( "prov:value", imagepath ), smwlangproperty( "dct:description", bildeargs["beskrivelse nb"], "nb" ), smwlangproperty( "dct:description", bildeargs["beskrivelse nn"], "nn" ), smwlangproperty( "dct:description", bildeargs["beskrivelse en"], "en" ), smwproperty( "@category", "dct:Image" ), smwproperty( "@category", "prov:Entity" ) } mw.smw.subobject( bildetripler, slug ) local terminfobox = capiunto.create( { bodyStyle = "width:60em;background:#f3f3f3; margin: 0 0 0 0;" } ) terminfobox = addOptionalRow( terminfobox, 'Beskrivelse (bokmål)', bildeargs["beskrivelse nb"] ) terminfobox = addOptionalRow( terminfobox, 'Beskrivelse (nynorsk)', bildeargs["beskrivelse nn"] ) terminfobox = addOptionalRow( terminfobox, 'Beskrivelse (engelsk)', bildeargs["beskrivelse en"] ) :addImage("[[File:" .. bildeargs.file_name .. "|400px]]" ) :getHtml() return tostring(terminfobox) end end -- Termseksjon function p.termseksjon( frame ) local args = frame.args local seksjonargs = frame:getParent().args local lc = args.lc local lcname = args.lcname local ns = args.namespace assert(lc and lcname and ns, "Alle termseksjon må ha en lc, tittel og namespace" .. lcname ) local hasspraak = false for k, v in pairs( seksjonargs ) do if (k == "ekvivalens") then hasspraak = false elseif (k == "ekvivalens merknad") and v then hasspraak = true break; elseif k then hasspraak = true break; end end -- infobox if hasspraak then local terminfobox = capiunto.create( { bodyStyle = "width:60em;background:#f3f3f3; margin: 0 0 0 0; margin-top: 25px;" } ) :addHeader( lcname, "mw-infobox-capiunto-title-1" ) -- check if starting language is the same as termsection language if not (getsamlingproperty( ns , "skosp:opprinneligSpraak", "") == lc) then terminfobox = addOptionalRow( terminfobox, 'Ekvivalens', seksjonargs.ekvivalens ) terminfobox = addOptionalRow( terminfobox, 'Ekvivalensmerknad', seksjonargs.merknad ) end terminfobox = addOptionalRow( terminfobox, 'Merknad (intern)', seksjonargs["merknad intern"] ) :getHtml() return tostring(terminfobox) end end function p.kontekst(frame) local args = frame.args local lc = args.lc local kontekstargs = frame:getParent().args assert (lc ~= nil, "named param lc must be set when invoking function begrep:kontekst") if kontekstargs.kontekst then local urivarname = "kontekstCounter" local LuaVarKontekstCounter = mw.ext.VariablesLua.var( urivarname ) local counter = (LuaVarKontekstCounter and LuaVarKontekstCounter ~= '') and LuaVarKontekstCounter or 1 mw.ext.VariablesLua.vardefine(urivarname, tonumber(counter) + 1) local slug = 'kontekst_' .. lc .. "_" .. counter local konteksttripler = { smwlangproperty( "rdfs:label", kontekstargs.kontekst, lc ), smwproperty( "dct:subject", kontekstargs["kontekst av"] ), smwproperty( "Skosp:dctSource", kontekstargs["referanse object"] ), smwproperty( "dct:source", kontekstargs.referanse ), smwproperty( "@category", "euvoc:XlNote" ) } mw.smw.subobject( konteksttripler, slug ) smwwritetriples( smwproperty( "skosp:hasUsage", felles.fullpagename .. "#" .. slug ) ) end -- infobox local terminfobox = capiunto.create( { bodyStyle = "width:60em;background:#f3f3f3; margin: 0 0 0 0;" } ) :addHeader( "Kontekst", "mw-infobox-capiunto-title-2" ) :addRow( 'Kontekst til', kontekstargs['kontekst av'] ) :addRow( 'Kontekst', kontekstargs.kontekst ) terminfobox = addOptionalRow( terminfobox, 'Referanse', createMediawikiLink(kontekstargs["referanse object"]) ) terminfobox = addOptionalRow( terminfobox, 'Referanse (fritekst)', kontekstargs.referanse ) :getHtml() return tostring(terminfobox) end function p.definisjon(frame) local args = frame.args local lc = args.lc local definisjonargs = frame:getParent().args assert (lc ~= nil, "named param lc must be set when invoking function begrep:definisjon") if (definisjonargs.definisjon) then local slug = 'definisjon_' .. lc -- local sourceslug = slug .. "source" local deftripler = { smwlangproperty("Rdfs:label", definisjonargs.definisjon, lc ), smwproperty( "Skosp:dctSource", definisjonargs["referanse object"] ), smwproperty("Dct:source", definisjonargs.referanse), smwlangproperty("Skos:scopeNote", definisjonargs.merknad, lc ), -- smwproperty("Dct:source", felles.fullpagename .. sourceslug ), smwproperty("@category", "Skosno:Definisjon" ) } mw.smw.subobject( deftripler, slug ) local begreptripler = { smwproperty("Skosno:definisjon", felles.fullpagename ..'#'.. slug ), } smwwritetriples( begreptripler ) -- infobox local terminfobox = capiunto.create( { bodyStyle = "width:60em;background:#f3f3f3; margin: 0 0 0 0;" } ) :addHeader( "Definisjon", "mw-infobox-capiunto-title-2" ) :addRow( 'Definisjon', definisjonargs.definisjon ) terminfobox = addOptionalRow( terminfobox, 'Referanse', createMediawikiLink(definisjonargs["referanse object"]) ) terminfobox = addOptionalRow( terminfobox, 'Referanse (fritekst)', definisjonargs.referanse ) terminfobox = addOptionalRow( terminfobox, 'Merknad', definisjonargs.merknad ) :getHtml() return tostring(terminfobox) end end function p.term( frame ) local args = frame.args local termargs = frame:getParent().args local langcode = args.lc local heading = args.heading local skille = false if args.namespace then local namespace = args.namespace skille = getskillevalue(namespace, "skosp:skilleForkortelsestyper") end assert ( langcode ~= nil, "named param lc must be set when invoking module begrep:term") assert ( heading ~= nil , "named param heading must be set when invoking module begrep:term" ) if ( termargs.term ) then -- langcode = term.args['språkkode'] -- forventer alltid å få inn en en relasjon på type prefix:tekst local relasjonslug = mw.ustring.match(felles.languagetable[heading], ":(.*)") local urivarname = relasjonslug .. "termCounter" .. langcode local LuaVarTermCounter = mw.ext.VariablesLua.var( urivarname ) -- error(type(LuaVarTermCounter)) local counter = (LuaVarTermCounter and LuaVarTermCounter ~= '') and LuaVarTermCounter or 1 mw.ext.VariablesLua.vardefine(urivarname, tonumber(counter) + 1) local slug = relasjonslug .. " " .. langcode .. " " .. counter -- local sourceslug = slug .. "source" local abbrev = "" if termargs.forkortelsep == "Ja" then abbrev = "skosp:Abbreviation" end local termtripler = { smwlangproperty("Skosxl:literalForm", termargs.term, langcode ), smwproperty( "Skosp:dctSource", termargs["referanse object"]), smwproperty( "dct:source", termargs.referanse ), -- smwproperty("Dct:source", felles.fullpagename .. sourceslug ), -- smwlangproperty( "skosp:isCollocatedWith", termargs.kollokasjon, langcode), -- felles.sep, smwproperty("skosp:isAbbreviationOf", termargs["forkortelse av"]), smwproperty("skosp:isOfAbbreviationType", termargs.forkortelsestype ), smwlangproperty("skos:note", termargs.kommentar, langcode ), smwproperty("@category", "skosxl:Label" ), smwproperty("@category", abbrev ) } mw.smw.subobject( termtripler, slug ) if ( termargs.kollokasjon ) then local collocations = splitstring(termargs.kollokasjon, felles.sep) for _, col in ipairs(collocations) do mw.smw.subobject( smwlangproperty( "skosp:isCollocatedWith", col, langcode) , slug ) end end if (relasjonslug == "prefLabel") then p.displaytitle( termargs.term ) end local relasjonstripler = { smwproperty(felles.languagetable[heading], felles.fullpagename .. "#" .. slug) } smwwritetriples(relasjonstripler) -- if (termargs.term and termargs["term:referanse"] ) then local kildetripler = { smwlangproperty("Rdfs:label", termargs['term:referanse'], langcode), smwlangproperty("Skos:scopeNote", termargs['kommentar'], langcode) } -- result = mw.smw.subobject( definisjontripler, sourceslug ) end local terminfobox = capiunto.create( { bodyStyle = "width:60em;background:#f3f3f3; margin: 0 0 0 0;" } ) :addHeader( heading, "mw-infobox-capiunto-title-2" ) :addRow( 'Term',termargs.term ) terminfobox = addOptionalRow( terminfobox, 'Referanse', createMediawikiLink( termargs["referanse object"] ) ) terminfobox = addOptionalRow( terminfobox, 'Referanse (fritekst)', termargs['term:referanse'] ) terminfobox = addOptionalRow( terminfobox, 'Referanse (fritekst)', termargs['referanse'] ) terminfobox = addOptionalRow( terminfobox, 'Kollokasjon', termargs.kollokasjon ) if termargs.forkortelsep == "Ja" then terminfobox = addOptionalRow( terminfobox, 'Forkortelse av', termargs['forkortelse av'] ) if skille then terminfobox = addOptionalRow( terminfobox, 'Forkortelsestype', termargs.forkortelsestype ) end if not termargs['forkortelse av'] and not termargs.forkortelsestype then terminfobox = addOptionalRow( terminfobox, 'Forkortelse', tostring(termargs.forkortelsep) ) end end terminfobox = addOptionalRow( terminfobox, 'Merknad', termargs.kommentar ) terminfobox = addOptionalRow( terminfobox, 'Merknad', termargs.merknad ) :getHtml() return tostring(terminfobox) end -- error ((string.match(property, ":(.*)$")) .. " " ..spraakkode) -- return error (string.match(property, ":(.*)$") .. term.args.spraakkode) end return p