Modul:Begrep

Fra Termportalen
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)
function p.createMediawikiLinkNS( value )
	if  value and value ~= "" then return mw.getCurrentFrame():callParserFunction( '#arraymap:'.. value, felles.separator, 'x', "[[".. felles.namespace .. ':x' .. "]]", " , ", " og " )
    else
end
end
function p.createMediawikiLink( value )
if  value and value ~= "" then return mw.getCurrentFrame():callParserFunction( '#arraymap:'.. value, felles.separator, 'x', "[[" .. 'x' .. "]]", ", ", " og " )
else
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

-- add namespace to value -https://phabricator.wikimedia.org/T254624
 function p.smwpropertyns( property, value ) 
    if (value == "" or value == nul)
    	then return ""
       	else
     		local newvalue = mw.getCurrentFrame():callParserFunction( '#arraymap:'.. value, felles.separator, 'x', felles.namespace .. ':x', felles.separator )

       		return p.smwproperty( property, newvalue ) 
   	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	
function p.smwproperty( property, value )
	local resultvalue = value or ""
	return property .. "=" .. resultvalue 
end

function p.smwlangproperty( property, value, lang )
	if (value and lang) then resultvalue = (value .. "@" .. lang ) 
	else resultvalue = ""
	end
	return property .. "=" .. resultvalue 
end

function p.smwwritetriples( relasjoner )
	local result
	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

function p.smwwritesubobjects( relasjoner, uri )
	local result
	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

-- global vars

-- Write triples for template Begrep

-- Begin Triples for form Begrep

-- Write triples for template relasjon
function p.relasjon ( frame )
	local relasjon = mw.getCurrentFrame():getParent()
	local relasjontripler = {
        p.smwpropertyns("Skos:related", relasjon.args.assosiativ),
       felles.sep,
        p.smwpropertyns("Xkos:generalizes", relasjon.args.generisk ),
        felles.sep,
        p.smwpropertyns("Xkos:hasPart", relasjon.args.partitiv ),
        felles.sep,
        p.smwproperty('Rdfs:seeAlso', relasjon.args.seogsa),
        felles.sep,
        p.smwpropertyns('Dct:replaces', relasjon.args.erstatter),
        felles.sep,
        -- replacedBy is not tokens
       p.smwpropertyns('Dct:replacedBy', relasjon.args.erstattetav )
    }
    p.smwwritetriples( relasjontripler )
    
    -- infobox
    -- infobox
    hasrelasjon = false
--    for i, v in ipairs(relasjon) do
    for k, v in next, relasjon do
      if (v ~= nul and v ~= "") 
      then hasrelasjon = true
      	break;
      end
    end
    if (hasrelasjon)
    then
    terminfobox =	capiunto.create( {
	    bodyStyle = "width:60em;background:#f3f3f3; margin: 0 0 0 0;"
} )
   :addHeader( "RELASJON", "mw-infobox-capiunto-title-1" )
	terminfobox = addOptionalRow( terminfobox, 'assosiativ', p.createMediawikiLinkNS( relasjon.args.assosiativ ) )
	terminfobox = addOptionalRow( terminfobox, 'generisk', p.createMediawikiLinkNS( relasjon.args.generisk ) )
	terminfobox = addOptionalRow( terminfobox, 'partitiv', p.createMediawikiLinkNS( relasjon.args.partitiv ) )
	terminfobox = addOptionalRow( terminfobox, 'se også', p.createMediawikiLink (relasjon.args.seogsa) )
	terminfobox = addOptionalRow( terminfobox, 'erstatter', p.createMediawikiLinkNS( relasjon.args.erstatter ) )
	terminfobox = addOptionalRow( terminfobox, 'erstattet av', p.createMediawikiLinkNS( relasjon.args.erstattetav ) )
		:getHtml()
   return tostring(terminfobox)
   else
   	-- don't write infobox if no values are set
   end

end

-- Write triples for template begrep
function p.begrep ( frame )
    local begrep = mw.getCurrentFrame():getParent()

	local begreptripler = {
		p.smwproperty("Dct:modified",  frame:preprocess( "{{CURRENTTIMESTAMP}}" )),
		p.smwproperty( "Skosp:memberOf",  begrep.args.medlem ),
		p.smwproperty( "Skos:scopeNote", begrep.args.kommentar ),
		p.smwproperty( "Dct:subject",begrep.args['bruksområde'] ),
		felles.sep,
		p.smwproperty( "Dct:identifier",begrep.args.identifikator ),
		p.smwproperty( "Skosp:previousIdentifier",begrep.args['tidligere id'] )
		}
    p.smwwritetriples( begreptripler )
    
    -- infobox
    
    -- infobox
    terminfobox =	capiunto.create( {
	    bodyStyle = "width:60em;background:#f3f3f3; margin: 0 0 0 0;"
} )
   :addHeader( "INFORMASJON", "mw-infobox-capiunto-title-1" )
	terminfobox = addOptionalRow( terminfobox, 'kommentar',  begrep.args.kommentar )
	terminfobox = addOptionalRow( terminfobox, 'referanse', begrep.args["kommentar:referanse"] )
	terminfobox = addOptionalRow( terminfobox, 'bruksområde', begrep.args["bruksområde"] )
	: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 ~= nul)
    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 } )
     return
     else return
end
end

-- Termseksjon
function p.termseksjon( lc, lcname )
   	local luaframe = mw.getCurrentFrame() 
    local termseksjon = mw.getCurrentFrame():getParent()
    local lc = luaframe.args.lc
    local lcname = luaframe.args.lcname
    assert(lc and lcname,"alle termseksjon må ha en en lc og tittel" .. lcname )
    
--	local spraakkode = termseksjon.args['språkkode']
	
    if (termseksjon.args.definisjon ~= nul)
    then 
    	p.definisjon( termseksjon, lc )
    else  -- error(tostring(termseksjon.args.definisjon))
    
    end
 -- infobox
    terminfobox =	capiunto.create( {
	    bodyStyle = "width:60em;background:#f3f3f3; margin: 0 0 0 0;"
} )
   :addHeader( lcname, "mw-infobox-capiunto-title-1" )
	terminfobox = addOptionalRow( terminfobox, 'merknad', termseksjon.args.merknad )
	terminfobox = addOptionalRow( terminfobox, 'referanse', termseksjon.args["merknad:referanse"] )
	terminfobox = addOptionalRow( terminfobox, 'godkjent', termseksjon.args.godkjent )
	terminfobox = addOptionalRow( terminfobox, 'definisjon', termseksjon.args.definisjon )
	terminfobox = addOptionalRow( terminfobox, 'definisjon:referanse', termseksjon.args["definisjon:referanse"] )
	terminfobox = addOptionalRow( terminfobox, 'referanse', termseksjon.args["referanse"] )
	:getHtml()
   return tostring(terminfobox)
end

function p.definisjon(termseksjon, spraakkode)
  if (not(termseksjon and spraakkode))
  then error ('definisjon og spraakkode må være satt')
  else
	local slug = 'definisjon ' .. spraakkode
    local begreptripler = {
  	p.smwproperty("Skosno:definisjon", felles.fullpagename ..'#'.. slug )
  }
   p.smwwritetriples( begreptripler )
   -- definisjon subobject -- uri er original # + slug. samme som brukes til definisjon
   local defref = termseksjon.args['definisjon:referanse']
   
   -- håndter nøstet referanse på definisjon
   if (defref)
   then 
	local definisjonrefslug = slug .. " referanse"
	local definisjonref = felles.fullpagename .. definisjonrefslug
	definisjonsreftripler = {
		p.smwlangproperty("Skosp:label", defref, spraakkode )
	}
   local result = mw.smw.subobject( definisjonsreftripler, definisjonrefslug )
   else
   end
   local definisjontripler = 
   {
   	p.smwproperty( "@category","Skosno:Definisjon" ),
   	p.smwlangproperty("Skosp:label",termseksjon.args['definisjon'],spraakkode),
   	p.smwproperty("Dct:source", definisjonref )
   	
   }
   -- andre parameter er (relativ ) uri å bruke som navn for subobject, appender # og slug på sidenavn
   result = mw.smw.subobject( definisjontripler, slug ) 
  return
  end
  end

--return
--end

function p.term( frame )
	local luaframe = mw.getCurrentFrame() 
	local term = mw.getCurrentFrame():getParent()
	local langcode = luaframe.args['lc']
	local relasjon = luaframe.args.relasjon
	local sourceful = ""
    local slug = nul
    local sourceslug = nul
	
	assert (langcode ~= nul, "named param lc must be set when invoking module begrep:term")
	assert ( relasjon ~= nul , "named param relasjon must be set when invoking module begrep:term" )
	if (term.args.term )
	then
	--	langcode = term.args['språkkode']
		-- forventer alltid å få inn en en relasjon på type prefix:tekst
		local relasjonslug = mw.ustring.match(luaframe.args.relasjon, ":(.*)")
		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 termtripler = {
			p.smwlangproperty("Skosxl:literalForm",term.args['term'], langcode ),
			p.smwproperty("Dct:source", felles.fullpagename .. sourceslug ),
			p.smwproperty("@category", "Skosxl:Label" )
		}
	local result = mw.smw.subobject( termtripler, slug ) 
	
	-- function 
    if (relasjonslug == "prefLabel") then
    	p.displaytitle( term.args.term )
	end
	
	local relasjonstripler = {
		p.smwproperty(relasjon, felles.fullpagename .. "#" .. slug)
	}
	result = p.smwwritetriples(relasjonstripler)
	
	--  

	if (term.args.term and term.args["term:referanse"] )
	then 
		kildetripler = {
		p.smwlangproperty("Rdfs:label",term.args['term:referanse'],langcode),
		p.smwlangproperty("Skos:scopeNote",term.args['kommentar'], langcode)
	}
	result = mw.smw.subobject( definisjontripler, sourceslug  ) 
	end
		

terminfobox =	capiunto.create( {
	bodyStyle = "width:60em;background:#f3f3f3; margin: 0 0 0 0;"
} )
:addHeader( felles.languagetable[relasjon], "mw-infobox-capiunto-title-2" )
:addRow( 'term',term.args.term )

terminfobox = addOptionalRow( terminfobox, 'referanse', term.args['term:referanse'] )
terminfobox = addOptionalRow( terminfobox, 'kontekst', term.args.kontekst )
terminfobox = addOptionalRow( terminfobox, 'kortform',term.args.kortform )
terminfobox = addOptionalRow( terminfobox, 'kommentar',term.args.kommentar )
terminfobox = addOptionalRow( terminfobox, 'kollokasjon', term.args.kollokasjon )
terminfobox = addOptionalRow( terminfobox, 'andre referanser',term.args['andre referanser'] )
:getHtml()

return tostring(terminfobox)
	else end
    
--  error ((string.match(property, ":(.*)$")) .. " " ..spraakkode)
--	return error (string.match(property, ":(.*)$") .. term.args.spraakkode)
end

-- return
-- end


--function p.term( )
--return 
--end


return p