Moduuli:Verkkoviite
Siirry navigaatioon
Siirry hakuun
host_from_url()
Funktio palauttaa url-osoitteen host-osan {{verkkoviite}}-mallineessa käytettäväksi.. Mikäli palautettava teksti alkaa sanalla "www.", niin tämä poistetaan palautettavasta tekstistä.
- Parametrit
- url = url-osoite, josta palautettava arvo luetaan jos
site
taipublisher
-parametreja ei ole määritelty - site = teksti joka näytetään jos se on määritelty
- publisher = mikäli tässä on jokin arvo, niin ei yritetä hakea automaattista arvoa url-parametrista
Esimerkit
- url-parametri täytetty, site ja publisher tyhjiä
{{#invoke:verkkoviite|host_from_url|url=https://fi.wikipedia.org/wiki/Moduuli:Verkkoviite|site=|publisher=}}
- →
fi.wikipedia.org
- url-alkaa tekstillä www
{{#invoke:verkkoviite|host_from_url|url=https://www.wikipedia.org/wiki/Moduuli:Verkkoviite|site=|publisher=}}
- →
wikipedia.org
- url ja site -parametrit täytetty, publisher tyhjä
{{#invoke:verkkoviite|host_from_url|url=https://fi.wikipedia.org/wiki/Moduuli:Verkkoviite|site=site-arvo|publisher=}}
- →
site-arvo
- url, site ja publisher -parametrit täytetty
{{#invoke:verkkoviite|host_from_url|url=https://fi.wikipedia.org/wiki/Moduuli:Verkkoviite|site=site-arvo|publisher=publisher-arvo}}
- →
site-arvo
- url on tyhjä, mutta site-parametri on määritelty
{{#invoke:verkkoviite|host_from_url|url=|site=site-arvo|publisher=}}
- →
site-arvo
- url ja publisher -parametrit täytetty. Site-parametri on tyhjä
{{#invoke:verkkoviite|host_from_url|url=https://fi.wikipedia.org/wiki/Moduuli:Verkkoviite|site=|publisher=publisher-arvo}}
- →
- url ja site ovat tyhjiä
{{#invoke:verkkoviite|host_from_url|url=|site=|publisher=}}
- →
- url on virheellinen
{{#invoke:verkkoviite|host_from_url|url=https:www.wikipedia.org/wiki/Moduuli:Verkkoviite|site=|publisher=}}
- →
local t={}
-- Palauttaa url-osoitteen perusteella arvon sivusto-parametrille
local function get_host_from_url(url, site, publisher)
-- Mikäli site on määritelty, niin käytetään sitä
if site ~= "" then
return site
end
-- Mikäli publisher on määritelty, niin ei tarvita host:ia kertomaan lähdettä
if publisher ~= "" then
-- varmaankin ideana oli palauttaa publisher tässä
-- vai onko se jätetty pois jostain mystisestä syystä? bugi vai feature?
return ""
end
if url == "" then
return ""
end
local u = mw.uri.new(url)
-- poistetaan "www" alusta
local ret = ""
if u.host ~= nil then
ret = string.gsub( u.host, "^www.", "", 1 )
end
return ret
end
-- public interface for currently existing template usage
function t.host_from_url(frame)
local url=frame.args.url or "";
local site=frame.args.site or "";
local publisher=frame.args.publisher or ""
return get_host_from_url(url, site, publisher)
end
-- patterns copied from template Onko päiväys ISO 8601 -muodossa?
local function istimeinISO( datestring )
if not datestring then
return false
end
local result
result = mw.ustring.match( datestring, "^%s*-?%d%d%d%d%-%d%d%-%d%d%s*$", 1 ) -- 2016-05-05
if result then
return true
end
result = mw.ustring.match( datestring, "^%s*-?%d%d%d%d%-%d%d%-%d%dT%d%d:%d%d:%d%d?Z%s*$", 1 ) -- 2016-05-05T10:09:04Z
if result then
return true
end
result = mw.ustring.match( datestring, "^%s*-?%d%d%d%d%d%d%d%dT%d%d%d%d%d%d?Z%s*$", 1 ) -- 20160505T100904Z
if result then
return true
end
return false
end
local function localizedate( datestring )
local tmp = datestring
-- check for non-breakable spaces
tmp = tmp:gsub( '\194\160', ' ' ):gsub( ' ', ' ' )
local lang = mw.language.getContentLanguage()
-- same as #time parser
return lang:formatDate( "j.n.Y", tmp, true )
end
local function encbrackets( s )
local tmp = s
if mw.ustring.find(tmp, '%]') then
tmp = mw.ustring.gsub( tmp, '%]', "]" )
end
if mw.ustring.find(tmp, '%[') then
tmp = mw.ustring.gsub( tmp, '%[', "[" )
end
return tmp
end
local function formatpubmedid( pmid )
-- some extra validation that id is a number
local num = tonumber(pmid)
if num ~= nil then
return "PubMed:[https://pubmed.ncbi.nlm.nih.gov/".. pmid .. " " .. pmid .."]"
end
-- could just give error instead?
return "PubMed: <span class='error'>Virheellinen PMID: ".. pmid .."</span> [[Luokka:Sivut, joissa on virheellinen PubMed-tunniste]]"
end
local function formatpubmedcentral( pmcid )
-- should be plain number after PMC?
local pmc_num = mw.ustring.sub( pmcid, 1, 3 )
if pmc_num == "PMC" then
-- begins with PMC
pmc_num = mw.ustring.sub( pmcid, 4 )
else
-- plain number given
pmc_num = pmcid
end
-- add PMC to url if there isn't,
-- check there are only numbers in string
local num = tonumber(pmc_num)
if num ~= nil then
return "[[PubMed Central]]:[https://www.ncbi.nlm.nih.gov/pmc/articles/PMC".. pmc_num .. " " .. pmc_num .."]"
end
return "PubMed Central: <span class='error'>Virheellinen PMC: ".. pmc_num .."</span> [[Luokka:Sivut, joissa on virheellinen PMC-tunniste]]"
end
local function formatbibcode( bibcode )
local CheckBibcode = require('Moduuli:Check bibcode')
local err = CheckBibcode._verify_bibcode(bibcode)
if err == nil then
local url = 'http://adsabs.harvard.edu/abs/' .. mw.uri.encode( bibcode )
local htmlenc = mw.text.encode(bibcode)
return "[[Bibcode]]:[" .. url .. " " .. htmlenc .."]" -- .. err
end
return "Bibcode:<span class='error'>Virheellinen Bibcode: ".. bibcode ..", ".. err .."</span> [[Luokka:Sivut, joissa on virheellinen Bibcode-tunniste]]"
end
local function formatdoi( doiid )
local url = '//dx.doi.org/' .. mw.uri.encode( doiid )
local htmlenc = mw.text.encode(doiid)
if mw.ustring.find(htmlenc, '%]') then
-- check: what was this case for? should just give error?
htmlenc = mw.ustring.gsub( htmlenc, '%]', "]" )
end
return "[[Digital object identifier|doi]]:[" .. url .. " " .. htmlenc .."]"
end
local function formathdl( hdlid )
local url = 'https://hdl.handle.net/' .. mw.uri.encode( hdlid )
local htmlenc = mw.text.encode(hdlid)
return "HDL:[" .. url .. " " .. htmlenc .."]"
end
-- Semantic Scholar Corpus ID
local function formats2cid( s2cid )
-- just a number
local num = tonumber(s2cid)
if num ~= nil then
return "S2CID:[https://api.semanticscholar.org/CorpusID:".. s2cid .. " " .. s2cid .."]"
end
-- could just give error instead?
return "S2CID:<span class='error'>Virheellinen S2CID: ".. s2cid .."</span> [[Luokka:Sivut, joissa on virheellinen S2CID-tunniste]]"
end
local function formatarxiv(arxiv)
local arxivid = mw.uri.encode( arxiv )
return '[[Arxiv|arXiv]]:[https://arxiv.org/abs/' .. arxivid .. ' ' .. arxiv .. ']'
end
local function formatjstor(jstor)
-- should be number only?
local jstorid = mw.uri.encode( jstor )
return '[[JSTOR]]:[http://www.jstor.org/stable/' .. jstorid .. ' ' .. jstorid .. ']'
end
local function formatisbn(isbn)
local Isxn = require('Moduuli:ISxN')
if Isxn._check_isbn(isbn) then
return '[[Toiminnot:Kirjalähteet/' .. isbn .. '|ISBN ' .. isbn ..']]'
end
return "<span class='error'>Virhe: Virheellinen ISBN-tunniste</span> [[Luokka:Sivut, joissa on virheellinen ISBN-tunniste]]"
end
local function formatissn(issn)
return '[http://www.worldcat.org/issn/' .. issn .. ' ISSN ' .. issn ..']'
--return '[[Toiminnot:Kirjalähteet/' .. issn .. ' ISSN ' .. issn ..']]'
end
local function formateissn(eissn)
local Isxn = require('Moduuli:ISxN')
if Isxn._check_issn(eissn) then
return '[http://www.worldcat.org/issn/' .. eissn .. ' E-ISSN ' .. eissn ..']'
end
return "<span class='error'>Virhe: Virheellinen ISSN-tunniste</span> [[Luokka:Sivut, joissa on virheellinen ISSN-tunniste]]"
end
local function formatismn(ismn)
-- TODO: hakupalvelu?
return 'ISMN:' .. ismn
end
local function formatoclc( oclc )
local oclcid = mw.uri.encode( oclc )
return '[[OCLC]]:[http://www.worldcat.org/oclc/' .. oclcid .. ' ' .. oclc .. ']'
end
local function formatlanguagecode( kielinimi )
return '<span style="font-size: 0.95em;">(' .. kielinimi .. ')</span>'
end
-- expecting two- or three-character code for language as input
local function getlanguagenamebycode( kieli )
local Langue = require('Module:Fr:Langue')
-- check the code is ok
local kielikoodi = Langue.getCodeLangue3fin( kieli )
if kielikoodi ~= "" then
-- get localized name for language
return Langue.getLanguageName(kielikoodi)
end
return ""
end
local function verkkoviite( args )
local wiki = {}
local function insert( value )
wiki[#wiki+1] = value
end
insert('<span class="verkkoviite" title="Verkkoviite">')
local author = args['Tekijä'] or args['author'] or args['tekijä'] or ""
if author ~= "" then
insert(author)
insert(": ")
else
local numeroton = false
local sukunimi = args['Sukunimi'] or args['sukunimi'] or args['last'] or ""
local etunimi = args['Etunimi'] or args['etunimi'] or args['first'] or ""
if sukunimi ~= "" and etunimi ~= "" then
insert(sukunimi)
insert(", ")
insert(etunimi)
numeroton = true
elseif sukunimi ~= "" then
insert(sukunimi)
numeroton = true
elseif etunimi ~= "" then
insert(etunimi)
numeroton = true
end
-- numeroidut rivit (jos käännös toisenkielistä wikistä)
local numeroitu = false
local rivinro = 1
while (rivinro <= 9) do
local nro = tostring(rivinro)
sukunimi = args['Sukunimi' .. nro] or args['sukunimi' .. nro] or args['last' .. nro] or ""
etunimi = args['Etunimi' .. nro] or args['etunimi' .. nro] or args['first' .. nro] or ""
if sukunimi ~= "" and etunimi ~= "" then
if (numeroton == true or rivinro > 1) then
-- päätä edellinen ennen seuraavaa nimeä
insert('; ')
end
insert(sukunimi)
insert(", ")
insert(etunimi)
numeroitu = true
end
rivinro = rivinro +1
end
if (numeroton == true or numeroitu == true) then
-- päätä tekijä(t)
insert(": ")
end
end
local url = args['Osoite'] or args['url'] or args['osoite'] or args['URL'] or ""
local archiveurl = args['Arkisto'] or args['arkisto'] or args['archiveurl'] or args['archive-url'] or ""
local title = args['Nimeke'] or args['Nimike'] or args['title'] or args['Otsikko'] or args['nimeke'] or args['nimike'] or args['otsikko'] or args['Title'] or ""
if url ~= "" then
if title ~= "" then
insert('[')
insert(url)
insert(' ')
insert(title)
insert(']')
else
insert("<span style='color:red; font-weight:bold;'>Määritä nimeke!</span>[[Luokka:Sivut, joiden viitemallineissa on virheitä]]")
end
elseif archiveurl ~= "" then
-- archived url without a live url
if title ~= "" then
insert(title)
else
insert("<span style='color:red; font-weight:bold;'>Määritä nimeke!</span>[[Luokka:Sivut, joiden viitemallineissa on virheitä]]")
end
else
insert("<span style='color:red; font-weight:bold;'>Määritä osoite!</span>[[Luokka:Sivut, joiden viitemallineissa on virheitä]]")
end
-- hyödyllinen joillakin sivuilla, esimerkiksi kun viitataan PDF-dokumenttiin
local sivut = args['Sivut'] or args['sivut'] or args['pages'] or ""
if sivut ~= "" then
insert(' s. ')
insert(sivut)
insert('. ')
end
local tiedostomuoto = args['Tiedostomuoto'] or args['format'] or args['tiedostomuoto'] or ""
if tiedostomuoto ~= "" then
insert(" <small>(")
insert(tiedostomuoto)
insert(")</small>")
end
local selite = args['Selite'] or args['selite'] or ""
if selite ~= "" then
insert(" (")
insert(selite)
insert(")")
end
-- same conditions as earlier
local sitehost = args['Julkaisu'] or args['Sivusto'] or args['site'] or args['work'] or args['julkaisu'] or args['sivusto'] or ""
local julkaisija = args['Julkaisija'] or args['publisher'] or args['julkaisija'] or ""
local publisherfromurl = get_host_from_url(url, sitehost, julkaisija)
if publisherfromurl ~= "" then
insert(" <i>")
insert(publisherfromurl)
insert("</i>.")
end
local ajankohta = args['Ajankohta'] or args['date'] or args['ajankohta'] or ""
if ajankohta ~= "" then
if istimeinISO(ajankohta) then
ajankohta = localizedate(ajankohta)
end
insert('  ' .. ajankohta .. '.')
end
local julkaisupaikka = args['Julkaisupaikka'] or args['julkaisupaikka'] or ""
if julkaisupaikka ~= "" then
insert(" ")
insert(julkaisupaikka)
-- semicolon if place is followed by publisher, otherwise dot
if julkaisija ~= "" then
insert(": ")
else
insert(".")
end
end
-- publisher
if julkaisija ~= "" then
insert(" ")
insert(julkaisija)
insert(".")
end
if archiveurl ~= "" then
insert(" [")
insert(archiveurl)
insert(' Arkistoitu]')
local arkistoaika = args['Arkistoitu'] or args['archivedate'] or args['arkistoitu'] or args['archive-date'] or ""
if arkistoaika ~= "" then
if istimeinISO(arkistoaika) then
arkistoaika = localizedate(arkistoaika)
end
insert(' ' .. arkistoaika)
insert('.')
end
end
local lainaus = args['Lainaus'] or args['quote'] or args['lainaus'] or ""
if lainaus ~= "" then
--<span class="citation">...</span>
insert(' ”')
insert(lainaus)
insert('”')
end
local pmid = args['Pmid'] or args['pmid'] or args['PMID'] or ""
if pmid ~= "" then
local pubmedlink = formatpubmedid(pmid)
if pubmedlink ~= "" then
insert(" ")
insert(pubmedlink)
--insert('.')
insert(' ')
end
end
local pmc = args['PMC'] or args['Pmc'] or args['pmc'] or ""
if pmc ~= "" then
local pmclink = formatpubmedcentral(pmc)
if pmclink ~= "" then
insert(" ")
insert(pmclink)
--insert('.')
insert(' ')
end
end
local doi = args['Doi'] or args['doi'] or args['DOI'] or ""
if doi ~= "" then
local doilink = formatdoi(doi)
if doilink ~= "" then
insert(" ")
insert(doilink)
--insert('.')
insert(' ')
end
end
local hdl = args['Hdl'] or args['hdl'] or args['HDL'] or ""
if hdl ~= "" then
local hdllink = formathdl(hdl)
if hdllink ~= "" then
insert(" ")
insert(hdllink)
--insert('.')
insert(' ')
end
end
local bibcode = args['Bibcode'] or args['bibcode'] or ""
if bibcode ~= "" then
local bibcodelink = formatbibcode(bibcode)
if bibcodelink ~= "" then
insert(" ")
insert(bibcodelink)
--insert('.')
insert(' ')
end
end
local jstor = args['Jstor'] or args['jstor'] or args['JSTOR'] or ""
if jstor ~= "" then
local jstorlink = formatjstor(jstor)
if jstorlink ~= "" then
insert(" ")
insert(jstorlink)
--insert('.')
insert(' ')
end
end
local s2cid = args['S2CID'] or args['S2cid'] or args['s2cid'] or ""
if s2cid ~= "" then
local s2cidlink = formats2cid(s2cid)
if s2cidlink ~= "" then
insert(" ")
insert(s2cidlink)
--insert('.')
insert(' ')
end
end
local arxiv = args['Arxiv'] or args['arxiv'] or args['arXiv'] or ""
if arxiv ~= "" then
local arxivlink = formatarxiv(arxiv)
if arxivlink ~= "" then
insert(" ")
insert(arxivlink)
--insert('.')
insert(' ')
end
end
local oclc = args['Oclc'] or args['oclc'] or ""
if oclc ~= "" then
local oclclink = formatoclc(oclc)
if oclclink ~= "" then
insert(" ")
insert(oclclink)
--insert('.')
insert(' ')
end
end
local isbn = args['Isbn'] or args['ISBN'] or ""
if isbn ~= "" then
local isbnlink = formatisbn(isbn)
if isbnlink ~= "" then
insert(" ")
insert(isbnlink)
--insert('.')
insert(' ')
end
end
local issn = args['Issn'] or args['ISSN'] or args['issn'] or ""
if issn ~= "" then
local issnlink = formatissn(issn)
if issnlink ~= "" then
insert(" ")
insert(issnlink)
--insert('.')
insert(' ')
end
end
local eissn = args['Eissn'] or args['EISSN'] or args['eissn'] or ""
if eissn ~= "" then
local eissnlink = formateissn(eissn)
if eissnlink ~= "" then
insert(" ")
insert(eissnlink)
--insert('.')
insert(' ')
end
end
local ismn = args['Ismn'] or args['ISMN'] or args['ismn'] or ""
if ismn ~= "" then
local ismnlink = formatismn(ismn)
if ismnlink ~= "" then
insert(" ")
insert(ismnlink)
--insert('.')
insert(' ')
end
end
local viitattu = args['Viitattu'] or args['Luettu'] or args['accessdate'] or args['access-date'] or args['viitattu'] or args['luettu'] or ""
if viitattu ~= "" then
if istimeinISO(viitattu) then
viitattu = localizedate(viitattu)
end
insert(' Viitattu ' .. viitattu)
insert('.')
end
local kieli = args['Kieli'] or args['language'] or args['kieli'] or ""
local ietfkielikoodi = args['ietf-kielikoodi'] or ""
if kieli ~= "" then
-- already expanded to <span>lang</span> from a template
local isexpanded = false
if mw.ustring.find(kieli, "span") then
isexpanded = true
end
if (isexpanded == true) then
-- as-is
insert(' ')
insert(kieli)
else
-- might need conversion of language code?
-- plain two-letter code?
local kielinimi = getlanguagenamebycode(kieli)
if kielinimi ~= "" then
-- format to correct tag
insert(' ')
insert(formatlanguagecode(kielinimi))
else
-- language code not recognized -> can't give language name
-- could give error of unknown language code?
--
--insert("<span class='error'>")
insert(' ')
insert(kieli)
--insert("</span>")
end
end
elseif ietfkielikoodi ~= "" then
-- only use ietf-field if the normal way of giving language hasn't been used:
-- some wiki-tools use this field instead of the normal and use different format
ietfkielikoodi = ietfkielikoodi:lower()
if ietfkielikoodi == "fi" or ietfkielikoodi == "fin" or ietfkielikoodi == "fi-fi" then
-- |fi|fin|fi-fi = -> no change, omitted
elseif ietfkielikoodi == "en" or ietfkielikoodi == "en-en" then
-- |en|en-en = {{en}}
insert(" ")
insert(formatlanguagecode('englanniksi'))
elseif ietfkielikoodi == "sv" or ietfkielikoodi == "sv-sv" then
-- |sv|sv-sv = {{sv}}
insert(" ")
insert(formatlanguagecode('ruotsiksi'))
else
-- might need conversion of language code?
-- plain two-letter code?
local kielinimi = getlanguagenamebycode(ietfkielikoodi)
if kielinimi ~= "" then
-- format to correct tag
insert(' ')
insert(formatlanguagecode(kielinimi))
else
-- language code not recognized -> can't give language name
-- could give error of unknown language code?
--
--insert("<span class='error'>")
insert(' ')
insert(ietfkielikoodi)
--insert("</span>")
end
end
end
insert('</span>')
return table.concat( wiki )
end
function t.main( frame )
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
local args = {}
for k, v in pairs( origArgs ) do
if type( k ) == 'number' or v ~= '' then
args[ k ] = v
end
end
return verkkoviite( args )
end
return t;