Module:Citation

Úr Wikipediu, frjálsa alfræðiritinu
Jump to navigation Jump to search

Þessi skrifta inniheldur kóða fyrir svokölluð CS1 (Citication style 1) snið. Þau snið eru cite book, cite journal, cite news, cite thesis og cite web. Skriftan styður gildi sem eru úreld a ensku wikipediu en er enn verið að nota hérna, til dæmis gildin accessmonthday og month.

Notkun í sniðum[breyta frumkóða]

Sniðin tengja í þessa skriftu á þennan hátt:

{{#invoke:citation|citation |CitationClass=(tegund tilvísunar, þ.e.a.s. book, journal, news o.s.frv.) |fullpagename={{FULLPAGENAME}} |periodical = {{{gildi fyrir verk}}} }}


local z = {}

function hideinprint(content)
	local hide = mw.html.create("span")
	hide
			:addClass("noprint")
			:wikitext(content)
			:done()
	return tostring(hide)
end

function onlyinprint(content)
	return ""
end

function externallinkid(args)
    local sep = args.separator or " "
    args.suffix = args.suffix or ""
    if args.id and string.find(args.id, "-") then
		extid = tostring(string.gsub(args.id, "-", ""))
	elseif args.id then
		extid = args.id
	else
		extid = ""
	end
    local t0 = onlyinprint(args.label .. sep .. extid)
    local t1 = hideinprint("[[" .. args.link .. "|" .. args.label .. "]]" .. sep .. "[" .. args.prefix .. mw.uri.encode(extid) .. args.suffix .. " " .. args.id .. "]")
    return t0 .. t1
end

function doi(frame, id, broken, inactive, nocat)
	if id ~= nil and string.find(id, "doi") == nil then
		id = "doi:" ..id
	end
	local text = "[[" .. id .. "]]"
    local cat = ""
    if ( inactive ~= nil ) then
        inactive = " (inactive " .. inactive .. ")"
        cat = cat .. "[[Category:Pages with DOIs inactive since " .. inactive .. "]]"
    else
        inactive = ""
    end
    if ( nocat and nocat ~= "" ) then cat = "" end
    return text .. inactive .. cat
 end

function url(id)
    local t0 = onlyinprint(id)
    local t1 = hideinprint("[" .. id .. " " .. id .. "]")
    return t0 .. t1
end

function openlibrary(id)
    local cat = ""
    local prefix = ""
    local code = id:sub(-1,-1)
    if ( code == "A" ) then
        prefix = "http://openlibrary.org/authors/OL"
    elseif ( code == "M" ) then
        prefix = "http://openlibrary.org/books/OL"
    elseif ( code == "W" ) then
        prefix = "http://openlibrary.org/works/OL"
    else
        prefix = "http://openlibrary.org/OL"
        cat = cat .. "[[Category:Pages with OL errors]]"
    end
    local text = externallinkid({link="Open Library",label="OL",prefix=prefix,id=id})
    return text .. cat
end

function reducetoinitials(first)
    local initials = {}
    for word in string.gmatch(first, "%S+") do
        table.insert(initials, string.sub(word,1,1)) -- Vancouver format does not include full stops.
    end
    return table.concat(initials) -- Vancouver format does not include spaces.
end

function listpeople(control, people)
    local sep = control.sep
    local amp = control.amp
    local namesep = control.namesep
    local format = control.format
    local maximum = control.maximum
    local text = {}
    for i,person in ipairs(people) do
        if (person.last ~= nil) then
            local mask = person.mask
            local one
            if ( maximum ~= nil and i == maximum + 1 ) then
                one = "et al."
            elseif ( maximum ~= nil and i > maximum + 1 ) then
                break
            elseif (mask ~= nil) then
                local n = tonumber(mask)
                if (n ~= nil) then
                    one = string.rep("—",n)
                else
                    one = mask
                end
            else
                one = person.last
                local first = person.first
                if (first ~= nil) then
                    if ( "vanc" == format ) then first = reducetoinitials(first) end
                    one = one .. namesep .. first
                end
                if (person.link ~= nil) and (person.link and "" < person.link) then
                	one = "[[" .. person.link .. "|" .. one .. "]]"
            	end
            end
            table.insert(text, one)
        end
    end
    local result = mw.text.listToText(text, sep, amp) -- construct list
    if ( "scap" == format ) then
    	local result = mw.html.create("span")
    	result
    			:wikitext( contents )
    			:addClass( "smallcaps" )
    			:css("font-variant", "small-caps")
    			:done()
    end -- if necessary wrap result in <span> tag to format in Small Caps
    return tostring(result)
end

function anchorid(args)
    local P1 = args[1] or ""
    local P2 = args[2] or ""
    local P3 = args[3] or ""
    local P4 = args[4] or ""
    local P5 = args[5] or ""
    return "CITEREF" .. P1 .. P2 .. P3 .. P4 .. P5
end

function refid(args)
    local p = args.p or ""
    local pp = args.pp or ""
    local loc = args.loc or ""
    return anchorid(args) .. p .. pp .. loc
end

function name(args)
    local P1 = args[1] or ""
    if ( args[5] ~= nil) then
        return P1 .. " et al."
    else
        local P2 = args[2] or ""
        local P3 = args[3] or ""
        local P4 = args[4] or ""
        if ( args[4] ~= nil ) then
            P4 = " " .. P4
            P3 = ", & " .. P3
            P2 = ", " .. P2
        elseif ( args[3] ~= nil ) then
            P3 = " " .. P3
            P2 = " & " .. P2
        elseif ( args[2] ~= nil ) then
            P2 = " " .. P2
        end
        return P1 .. P2 .. P3 .. P4
    end
end

function crossref(frame, args)
    local config = frame.args -- the arguments passed BY the template, in the wikitext of the template itself
    local LB = config.BracketLeft or ""
    local RB = config.BracketRight or ""
    local anchor = args.ref or args.Ref or anchorid(args)
    local text = name(args)
    local loc = args.loc
    local page = args.p or args.page
    local pages = args.pp or args.pages
    if nil == loc then loc = "" else loc = " " .. loc end
    if ( page ~= nil ) then
        local pagesep = config.PageSep or ", p. "
        loc = loc .. pagesep .. page
    end
    if ( pages ~= nil ) then
        local pagessep = config.PagesSep or ", pp. "
        loc = loc .. pagessep .. pages
    end
    local pagename = args.pagename or ""
    local ps = args.Postscript or ""
    return LB .. "[[" .. pagename .. "#" .. anchor .. "|" .. text .. "]]" .. loc .. RB .. ps
end

function extractauthor(args, i)
    local last = args["author" .. i .. "-last"] or args["author-last" .. i] or args["last" .. i] or args["surname" .. i] or args["Author" .. i] or args["author" .. i]
    if ( last and "" < last ) then -- just in case someone passed in an empty parameter
        return {
            last = last,
            first = args["author" .. i .. "-first"] or args["author-first" .. i] or args["first" .. i] or args["given" .. i],
            link = args["author" .. i .. "-link"] or args["author-link" .. i] or args["author" .. i .. "link"] or args["authorlink" .. i],
            mask = args["author" .. i .. "-mask"] or args["author-mask" .. i] or args["author" .. i .. "mask"] or args["authormask" .. i]
        }
    else
        return nil
    end
end

function extracteditor(args, i)
    local last = args["editor" .. i .. "-last"] or args["editor-last" .. i] or args["EditorSurname" .. i] or args["Editor" .. i] or args["editor" .. i]
    if ( last and "" < last ) then -- just in case someone passed in an empty parameter
        return {
            last = last,
            first = args["editor" .. i .. "-first"] or args["editor-first" .. i] or args["EditorGiven" .. i],
            link = args["editor" .. i .. "-link"] or args["editor-link" .. i] or args["editor" .. i .. "link"] or args["editorlink" .. i],
            mask = args["editor" .. i .. "-mask"] or args["editor-mask" .. i] or args["editor" .. i .. "mask"] or args["editormask" .. i]
        }
    else
        return nil
    end
end

function citation0(frame, args)
    local config = frame.args -- the arguments passed BY the template, in the wikitext of the template itself

    local PPrefix = config.PPrefix or "bls:&nbsp;"
    local PPPrefix = config.PPPrefix or "bls:&nbsp;"
    if ( nil ~= args.nopp ) then PPPrefix = "" PPrefix = "" end

    -- Transfer unnumbered arguments to numbered arguments if necessary.
    args["author1"] = args["author"] or args["author1"]
    args["author1-last"] = args["last"]
    args["author1-first"] = args["first"]
    args["author1-link"] = args["author1-link"] or args["author-link"]
    args["author1-mask"] = args["author-mask"] or args["authormask"]
    args["author1link"] = args["authorlink"]
    args["editor1"] = args["editor"] or args["editor1"]
    args["editor1-last"] = args["editor1-last"] or args["editor-last"]
    args["editor1-first"] = args["editor1-first"] or args["editor-first"]
    args["editor1-link"] = args["editor1-link"] or args["editor-link"]
    args["editor1-mask"] = args["editor1-mask"] or args["editor-mask"]
    args["editor1link"] = args["editor1link"] or args["editorlink"]

    -- Pick out the relevant fields from the arguments.  Different citation templates define different field names for the same underlying things.
    local Authors = args.authors
    local i
    local a = {}
    i = 1
    while true do
        a[i] = extractauthor(args, i)
        if ( nil == a[i]) then break end
        i = i + 1
    end
    local Coauthors = args.coauthors or args.coauthor
    local Others = args.others
    local EditorMask = args.editormask or args["editor-mask"]
    local EditorFormat = args["editor-format"] or args.editorformat
    local Editors = args.editors
    local e = {}
    i = 1
    while true do
        e[i] = extracteditor(args, i)
        if ( nil == a[i]) then break end
        i = i + 1
    end
    local Year = args.year
    local PublicationDate = args.publicationdate
    local OrigYear = args.origyear
    local Date = args.date or args.month
    local LayDate = args.laydate
    local Title = args.title
    local BookTitle = args.booktitle
    local Conference = args.conference
    local TransTitle = args["trans-title"] or args.trans_title
    local TitleNote = args.department
    local TitleLink = args.titlelink or args.episodelink
    local Chapter = args.chapter or args.article or args.contribution
    local ChapterLink = args.chapterlink
    local TransChapter = args.trans_chapter
    local TitleType = args.type or args.degree
    local ArchiveURL = args.archiveurl
    local URL = args.url
    local ChapterURL = args.chapterurl or args["chapter-url"]
    local ConferenceURL = args["conference-url"] or args.conferenceurl
    local Periodical = args.work or config.periodical -- args.journal or args.journal or args.magazine
    local Series = args.series
    local Volume = args.volume
    local Issue = args.issue
    local Position = nil
    local Page = args.page
    local Pages = args.pages
    local PP = args.pp
    local At = args.at
    local Edition = args.edition
    local PublicationPlace = args.location or args.place or args["publication-place"]
    local Location = PublicationPlace
    local PublisherName = args.publisher
    local SubscriptionRequired = args.subscription
    local Via = args.via
    local AccessDate = args.accessdate or args["access-date"] or args.accessmonthday
    local AccessYear = args.accessyear
    local ArchiveDate = args.archivedate
    local Agency = args.agency
    local DeadURL = args.deadurl
    local Language = args.language or args["in"]
    local Format = args.format
    local Ref = args.ref or args.Ref
    local ARXIV = args.arxiv
    local ASIN = args.asin or args.ASIN
    local ASINTLD = args["ASIN-TLD"]
    local BIBCODE = args.bibcode
    local DOI = args.doi or args.DOI
    local DoiBroken = args.doi_inactivedate or args.doi_brokendate
    local ID = args.id or args.ID or args.docket
    local ISBN = args.ISBN or args.isbn
    local ISSN = args.issn or args.ISSN
    local JFM = args.jfm or args.JFM
    local JSTOR = args.jstor or args.JSTOR
    local LCCN = args.lccn or args.LCCN
    local MR = args.mr or args.MR
    local OCLC = args.oclc or args.OCLC
    local OL = args.ol or args.OL
    local OSTI = args.osti or args.OSTI
    local PMC = args.pmc or args.PMC
    local PMID = args.pmid or args.PMID
    local RFC = args.rfc or args.RFC
    local SSRN = args.ssrn or args.SSRN
    local ZBL = args.zbl
    local Quote = args.quote or args.quotes
    local PostScript = args.postscript
    local LaySummary = args.laysummary
    local LaySource = args.laysource
    local Transcript = args.transcript
    local TranscriptURL = args["transcript-url"] or args.transcripturl

    -- At this point fields may be nil if they weren't specified in the template use.  We can use that fact.

    -- Account for the oddity that is {{cite conference}}, before generation of COinS data.
    if ( BookTitle ) then
        Chapter = Title
        ChapterLink = TitleLink
        TransChapter = TransTitle
        Title = BookTitle
        TitleLink = nil
        TransTitle = nil
    end
    -- Account for the oddity that is {{cite episode}}, before generation of COinS data.
    if config.CitationClass == "episode" then
        local AirDate = args.airdate
        local SeriesLink = args.serieslink
        local Season = args.season
        local SeriesNumber = args.seriesnumber or args.seriesno
        local Network = args.network
        local Station = args.station
        local s = {}
        if Issue ~= nil then table.insert(s, "episode " .. Issue) Issue = nil end
        if Season ~= nil then table.insert(s, "season " .. Season) end
        if SeriesNumber ~= nil then table.insert(s, "series " .. SeriesNumber) end
        local n = {}
        if Network ~= nil then table.insert(n, Network) end
        if Station ~= nil then table.insert(n, Station) end
        Date = Date or AirDate
        Chapter = Title
        ChapterLink = TitleLink
        TransChapter = TransTitle
        Title = Series
        TitleLink = SeriesLink
        TransTitle = nil
        local Sep = args["series-separator"] or args["separator"] or ". "
        Series = table.concat(s, Sep)
        ID = table.concat(n, Sep)
    end

    -- Now perform various field substitutions.
    -- We also add leading spaces and surrounding markup and punctuation to the various parts of the citation, but only when they are non-nil.
    if ( Authors == nil ) then
        local AuthorNameSep = args["author-name-separator"] or args["name-separator"] or "&#44; "
        local AuthorSep = args["author-separator"] or args["separator"] or "&#59; "
        local AuthorFormat = args["author-format"] or args.authorformat
        local AuthorMaximum = tonumber(args["display-authors"] or args.displayauthors) or 8
        local control = { sep = AuthorSep, namesep = AuthorNameSep, format = AuthorFormat, maximum = AuthorMaximum }
        Authors = listpeople(control, a)
    end
    if ( Editors == nil ) then
        local EditorNameSep = args["editor-name-separator"] or args["name-separator"] or "&#44; "
        local EditorSep = args["editor-separator"] or args["separator"] or "&#59; "
        local EditorFormat = args["editor-format"] or args.editorformat
        local EditorMaximum = tonumber(args["display-editors"] or args.displayeditors) or 3
        local control = { sep = EdithorSep, namesep = EditorNameSep, format = EditorFormat, maximum = EditorMaximum }
        Editors = listpeople(control, e)
    end
    if ( Date == nil ) then
      if (Year ~= nil ) then
        Date = "(" .. Year .. ")"
      end
      if ( Date ~= nil ) then
        local Month = args.month
        if ( Month ~= nil ) then
          Date = Month .. " " .. Date
          local Day = args.day
          if ( Day ~= nil ) then Date = Day .. " " .. Date end
        end
      end
    else
      Date = ConvertDateFormatToIcelandic(Date)
    end
    if ( PublicationDate == Date or PublicationDate == Year ) then PublicationDate = nil end
    if ( ArchiveURL and "" < ArchiveURL ) then
        local temp = URL
        URL = ArchiveURL
    end
    if ( TransTitle and "" < TransTitle ) then TransTitle = " [" .. TransTitle .. "]" else TransTitle = "" end
    if ( TransChapter and "" < TransChapter ) then TransChapter = " [" .. TransChapter .. "]." else TransChapter = "" end
    if ( Chapter and "" < Chapter ) then
        if ( ChapterLink and "" < ChapterLink ) then Chapter = "[[" .. ChapterLink .. "|" .. Chapter .. "]]" end
        if ( Periodical and "" < Periodical ) then
            Chapter = "<i>" .. Chapter .. "</i>"
        else
            Chapter = "\„" .. Chapter .. "\""
        end
        Chapter = Chapter .. TransChapter
        if ( ChapterLink == nil ) then
            if ( ChapterURL and "" < ChapterURL ) then
                Chapter = "[" .. ChapterURL .. " " .. Chapter .. "]"
            elseif ( URL and "" < URL ) then
                Chapter = "[" .. URL .. " " .. Chapter .. "]"
                URL = nil
            end
        end
        Chapter = Chapter .. ". " -- with end-space
    else
        Chapter = ""
    end
    if ( Title and "" < Title ) then
        if ( TitleLink and "" < TitleLink ) then
            Title = "[[" .. TitleLink .. "|" .. Title .. "]]" end
        if ( Periodical and "" < Periodical ) then
            Title = "\„" .. Title .. "\""
        elseif ( config.CitationClass == "web"
              or config.CitationClass == "news" ) then
            Title = "\„" .. Title .. "\""
        else
            Title = "<i>[[" .. Title .. "]]</i>"
        end
        Title = Title .. TransTitle
        if ( TitleLink == nil and URL and "" < URL ) then
            Title = "[" .. URL .. " " .. Title .. "]"
            URL = nil
        end
        Title = Title .. "." -- with end-dot
    else
        Title = ""
    end
    if ( Conference ~= nil ) then
        if ( ConferenceURL ~= nil ) then
            Conference = "[" .. ConferenceURL .. " " .. Conference .. "]"
        end
        Conference = " " .. Conference
    else
        Conference = ""
    end
    if ( nil ~= Position or nil ~= Page or nil ~= Pages ) then At = nil end
    if ( nil == Position ) then
        local Minutes = args.minutes
        if ( nil ~= Minutes ) then
            Position = " " .. Minutes .. " mínútur liðnar"
        else
            local Time = args.time
            if ( nil ~= Time ) then
                local TimeCaption = args.timecaption or "atburður hefst"
                Position = " " .. TimeCaption .. " " .. Time
            else
                Position = ""
            end
        end
    else
        Position = " " .. Position
    end
    if ( nil == Page or Page == "") then
        Page = ""
    elseif ( Periodical ~= nil ) then
        Page = ": " .. Page .. "."
    else
        Page = " " .. PPrefix .. Page .. "."
    end
    if ( nil == Pages ) then
        Pages = ""
    elseif ( Periodical ~= nil ) then
        Pages = ": " .. Pages .. "."
    else
        if ( tonumber(Pages) ~= nil ) then
          Pages = " " .. PPrefix .. Pages .. "."
        else Pages = " " .. PPPrefix .. Pages .. "."
        end
    end
    if ( At ~= nil ) then At = " " .. At .. "."
    else At = "" end
    if ( Coauthors ~= nil ) then
      if ( Authors ~= nil ) then Coauthors = "; " .. Coauthors end
      if ( Date == nil ) then Coauthors = Coauthors .. "." end
    else Coauthors = "" end
    if ( Others ~= nil ) then Others = " " .. Others .. "." else Others = "" end
    if ( TitleType ~= nil ) then
    	if args.degree ~= nil and TitleType == args.degree then
    		TitleType = " (" .. TitleType .. " gráða)."
		else
			TitleType = " (" .. TitleType .. ")."
		end
	else
		TitleType = ""
	end
    if ( TitleNote ~= nil ) then TitleNote = " (" .. TitleNote .. ")." else TitleNote = "" end
    if ( PublicationPlace ~= nil ) then PublicationPlace = PublicationPlace .. ": " else PublicationPlace = "" end
    if ( Language ~= nil ) then Language = " (" .. Language .. ")" else Language = "" end
    if ( Edition ~= nil ) then Edition = " (" .. Edition .. " útgáfa)" else Edition = "" end
    if ( Volume ~= nil ) then Volume = " " .. Volume else Volume = "" end
    if ( Issue ~= nil ) then Issue = " (" .. Issue .. ")" else Issue = "" end
    if ( Series ~= nil ) then Series = " " .. Series .. "." else Series = "" end
    if ( Format ~= nil ) then Format = " (" .. Format .. ")" else Format = "" end
    if ( Work ~= nil ) then
    	if ( Authors ~= nil ) then Work = " <i>" .. Work .. "</b>"
    	else
    		Work = " (" .. Work .. ")."
    	end
	  else Work = "" end
    if ( OrigYear ~= nil ) then OrigYear = " [" .. OrigYear .. "]" else OrigYear = "" end
    if ( Agency ~= nil ) then Agency = " " .. Agency .. "." else Agency = "" end
    if ( Date ~= nil ) then Date = Date else Date = "" end
    if ( Via ~= nil and Via ~= '') then Via = " &mdash; um " .. Via else Via = "" end
    if ( AccessDate ~= nil ) then
    	if ( AccessYear ~= nil ) then
    		AccessDate = " Skoðað " .. AccessDate ..  AccessYear .. "."
    	else
				 AccessDate = " Skoðað " .. ConvertDateFormatToIcelandic(AccessDate) ..  "."
	    end
	  else
		  AccessDate = ""
	  end
    if ( SubscriptionRequired ~= nil ) then
        local SubscriptionRequired = mw.html.create("span")
        SubscriptionRequired
        		:wikitext(" (þarfnast áskriftar)")
        		:css({
        			["font-size"] = "0.95em",
        			["font-size"] = "90%",
        			color = "#555"
        			})
        		:done()
    else
        SubscriptionRequired = ""
    end
    if ( ARXIV ~= nil and "" < ARXIV ) then ARXIV = " " .. externallinkid({label="arXiv",link="arXiv",prefix="http://arxiv.org/abs/",id=ARXIV,separator=":"}) else ARXIV = "" end
    if ( ASIN ~= nil and "" < ASIN ) then ASIN = " " .. externallinkid({link="Amazon Standard Identification Number",label="ASIN",prefix="//www.amazon.co.uk/dp/",id=ASIN}) else ASIN = "" end
    if ( BIBCODE ~= nil and "" < BIBCODE ) then BIBCODE = " " .. externallinkid({label="Bibcode",link="Bibcode",prefix="http://adsabs.harvard.edu/abs/",id=BIBCODE,separator=":"}) else BIBCODE = "" end
    if ( DOI ~= nil and "" < DOI ) then DOI = " " .. doi(frame, DOI, DoiBroken) else DOI = "" end
    if ( ID ~= nil and "" < ID ) then ID = " " .. ID else ID = "" end
    if ( ISBN ~= nil and "" < ISBN ) then ISBN = " ISBN " .. ISBN else ISBN = "" end
    if ( ISSN ~= nil and "" < ISSN ) then ISSN = " " .. externallinkid({label="ISSN",link="ISSN",prefix="//www.worldcat.org/issn/",id=ISSN}) else ISSN = "" end
    if ( JFM ~= nil and "" < JFM ) then JFM = " " .. externallinkid({label="JFM",link="Jahrbuch über die Fortschritte der Mathematik",prefix="http://www.zentralblatt-math.org/zmath/en/search/?format=complete&q=an:",id=JFM}) else JFM = "" end
    if ( JSTOR ~= nil and "" < JSTOR ) then JSTOR = " " .. externallinkid({label="JSTOR",link="JSTOR",prefix="http://www.jstor.org/stable/",id=JSTOR}) else JSTOR = "" end
    if ( LCCN ~= nil and "" < LCCN ) then LCCN = " " .. externallinkid({label="LCCN",link="Library of Congress Control Number",prefix="http://lccn.loc.gov/",id=LCCN}) else LCCN = "" end
    if ( MR ~= nil and "" < MR ) then MR = " " .. externallinkid({label="MR",link="Mathematical Reviews",prefix="http://www.ams.org/mathscinet-getitem?mr=",id=MR}) else MR = "" end
    if ( OCLC ~= nil and "" < OCLC ) then OCLC = " " .. externallinkid({label="OCLC",link="Online Computer Library Center",prefix="//www.worldcat.org/oclc/",id=OCLC}) else OCLC = "" end
    if ( OL ~= nil and "" < OL ) then OL = " " .. openlibrary(OL) else OL = "" end
    if ( OSTI ~= nil and "" < OSTI ) then OSTI = " " .. externallinkid({label="OSTI",link="Office of Scientific and Technical Information",prefix="http://www.osti.gov/energycitations/product.biblio.jsp?osti_id=",id=OSTI}) else OSTI = "" end
    if ( PMC ~= nil and "" < PMC ) then PMC = " " .. externallinkid({label="PMC",link="PubMed Central",prefix="//www.ncbi.nlm.nih.gov/pmc/articles/PMC",suffix="/?tool=pmcentrez",id=PMC}) else PMC = "" end
    if ( PMID ~= nil and "" < PMID ) then PMID = " " .. externallinkid({label="PMID",link="PubMed Identifier",prefix="//www.ncbi.nlm.nih.gov/pubmed/",id=PMID}) else PMID = "" end
    if ( RFC ~= nil and "" < RFC ) then RFC = " " .. externallinkid({label="RFC",link="Request for Comments",prefix="//tools.ietf.org/html/rfc",id=RFC}) else RFC = "" end
    if ( SSRN ~= nil and "" < SSRN ) then SSRN = " " .. externallinkid({label="SSRN",link="Social Science Research Network",prefix="http://ssrn.com/abstract=",id=SSRN}) else SSRN = "" end
    if ( URL ~= nil and "" < URL ) then URL = " " .. url(URL) else URL = "" end
    if ( ZBL ~= nil and "" < ZBL ) then ZBL = " " .. externallinkid({label="ZBL",link="Zentralblatt MATH",prefix="http://www.zentralblatt-math.org/zmath/en/search/?format=complete&q=an:",id=ZBL}) else ZBL = "" end
    if ( Quote ~= nil and "" < Quote ) then
        Quote = " \„" .. Quote .. "\""
        PostScript = ""
    else
        if ( PostScript ~= nil ) then PostScript = " " .. PostScript else PostScript = "" end
        Quote = ""
    end
    local Archived
    if ( nil ~= ArchiveURL ) then
      if ( ArchiveDate ~= nil ) then
        ArchiveDate = " " .. ConvertDateFormatToIcelandic(ArchiveDate)
      else ArchiveDate = "" end
      if ( "no" == DeadURL ) then
        Archived = " [" .. ArchiveURL .. "  Geymt] frá upphaflegu greininni " .. ArchiveDate .. "."
      else
        Archived = " Geymt frá [" .. args.url .. " upphaflegu greininni] " .. ArchiveDate .. "."
      end
    else
      Archived = ""
    end
    local Lay
    if ( nil ~= LaySummary ) then
        if ( LayDate ~= nil ) then LayDate = " (" .. LayDate .. ")" else LayDate = "" end
        if ( LaySource ~= nil ) then LaySource = " &ndash; <i>" .. LaySource .. "</i>" else LaySource = "" end
        Lay = " [" .. LaySummary .. " lay summary]" .. LaySource .. LayDate
    else
        Lay = ""
    end
    if ( nil ~= Transcript ) then
        if ( TranscriptURL ~= nil ) then Transcript = "[" .. TranscriptURL .. Transcript .. "]" end
    else
        Transcript = ""
    end
    local Publisher
    if ( Periodical ~= nil ) then
        if ( PublicationDate ~= nil ) then PublicationDate = " " .. PublicationDate else PublicationDate = "" end
        if ( PublisherName ~= nil ) then
            Publisher = " (" .. PublicationPlace .. PublisherName .. PublicationDate .. ")."
        else
            if (Location ~=nil) then Publisher= " (" .. Location .. ")."
            else Publisher = "" end
        end
        Edition = ""
    else
        if ( PublicationDate ~= nil ) then PublicationDate = " (gefið út " .. PublicationDate .. ")" else PublicationDate = "" end
        if ( PublisherName ~= nil ) then Publisher = " " .. PublicationPlace .. PublisherName .. PublicationDate .. "." else Publisher = "" end
    end
    -- Several of the above rely upon detecting this as nil, so do it last.
    if ( Periodical ~= nil ) then Periodical = " <i>" .. Periodical .. "</i>."
    else Periodical = "" end

    -- Piece all bits together at last.  At this point, all should be non-nil.
    -- We build things this way because it is more efficient in LUA not to keep reassigning to the same string variable over and over.
    local idcommon = ARXIV .. ASIN .. BIBCODE .. DOI .. ID .. ISBN .. ISSN .. JFM .. JSTOR .. LCCN .. MR .. OCLC .. OL .. OSTI .. PMC .. PMID .. RFC .. SSRN .. ZBL .. URL .. Archived .. AccessDate .. Via .. SubscriptionRequired .. Lay .. Quote .. PostScript
    local tcommon = Title .. TitleNote .. Format .. TitleType .. Periodical .. Conference  .. Series .. Language .. Volume .. Issue .. Edition .. Position .. At
    -- DEBUG: tcommon = "/Title="..Title .. "/TitleType="..TitleType .. "/TitleNote="..TitleNote .. "/Format="..Format .. "/Edition="..Edition .. "/Language="..Language .. "/Conference="..Conference .. "/Periodical="..Periodical .. "/Series="..Series .. "/Volume="..Volume .. "/Issue="..Issue .. "/Position="..Position .. Page .. Pages .. At

    Date = Date .. OrigYear
    local text
    if ( "" ~= Authors ) then
        if ( "" ~= Date ) then Date = ""..Date..", "
        else Authors = Authors .. ". " end
        if ( "" ~= Editors ) then Editors = " in " .. Editors .. "." end
        text = Authors .. Coauthors .. " "..Date .. Chapter .. Others .. Editors .. tcommon .. Publisher .. Agency .. Page .. Pages .. idcommon
    elseif ( "" ~= Editors) then
        Editors = Editors .. " (eds.)"
        if ( "" ~= Date ) then Date = " (" .. Date .. "). "
        else Editors = Editors .. ". " end
        text = Editors .. Date .. Chapter .. tcommon .. Publisher .. Agency .. Page .. Pages .. idcommon
    else
        if ( "" ~= Date ) then Date = " " .. Date .. "." end
        text = Chapter .. tcommon .. Publisher .. Agency .. Date .. Page .. Pages .. idcommon
    end

    -- Now enclose the whole thing in a <span/> element
    if ( Year == nil ) then Year = "" end
    local args = { class="citation " .. (config.CitationClass or "") }
    if ( Ref ~= nil ) then
        local id = Ref
        if ( "harv" == Ref ) then
            local names = {}
            if ( "" ~= Authors ) then
                for i,v in ipairs(a) do names[i] = v.last end
            elseif ( "" ~= Editors ) then
                for i,v in ipairs(e) do names[i] = v.last end
            end
            if ( names[1] == nil ) then
                names[1] = Year
            elseif ( names[2] == nil ) then
                names[2] = Year
            elseif ( names[3] == nil ) then
                names[3] = Year
            elseif ( names[4] == nil ) then
                names[4] = Year
            else
                names[5] = Year
            end
            id = anchorid(names)
        end
        args.id = id;
    end
    local texttag = mw.html.create("span")
    texttag
    		:wikitext(text)
    		:addClass(args.class)
    		:attr("id", args.id)
    		:done()

    return tostring(texttag)
end

function r0(frame, name, group, page)
    if ( name == nil ) then return "" end
    if ( group == nil ) then group = "" end
    local p = ""
    if ( page ~= nil ) then
        local contents = ":" .. page
        p = mw.text.tag{name="sup",content=contents, attrs={class="reference",style="white-space:nowrap;"}}
    end
    return mw.text.tag{name="ref",content="",attrs={name=name,group=group}} .. p
end

function reflist0(frame, config, args)
    local contents = args.refs or ""
    local liststyle = args.liststyle
    local count = args[1]
    local width = args.colwidth
    local group = args.group or config.default_group
    if ( nil == tonumber(count) and nil == width ) then
        width = count
        count = nil
    end
    if ( nil == liststyle ) then
        if ( "upper-alpha" == group or "lower-alpha" == group or "upper-roman" == group or "lower-roman" == group or "upper-greek" == group or "lower-greek" == group ) then
            liststyle = group
        else
            liststyle = config.default_liststyle
        end
    end
    local params = {}
    params.class = {}
    table.insert(params.class, "reflist")
    params.style = {}
    table.insert(params.style, "list-style-type", liststyle )
    if ( nil ~= count ) then
        table.insert(params.class, "references-column-count references-column-count-", count)
        table.insert(params.style, "-moz-column-count", count)
        table.insert(params.style, "-webkit-column-count", count)
        table.insert(params.style, "column-count", count)
    end
    if ( nil ~= width ) then
    	table.insert(params.class, " references-column-width")
    	table.insert(params.style, "-moz-column-width", width )
    	table.insert(params.style, "-webkit-column-width", width )
    	table.insert(params.style, "column-width", width )
    	table.insert(params.style, columnwidthstyle )
    end
    local references = mw.text.tag{name="references",content=contents,attrs={group=group}}
    local reflist = mw.html.create("div")
    reflist
    		:wikitext(references)
    		:addClass(params.class)
    		:css(params.style)
    		:done()
    return tostring(reflist)
end

function refbegin0(frame, config, args)
    local liststyle = args.liststyle
    local indent = args.indent
    local indentsize = args.indentsize
    local count = args[1]
    local width = args.colwidth
    if ( nil == tonumber(count) and nil == width ) then
        width = count
        count = nil
    end
    if ( nil == liststyle ) then
        if ( "upper-alpha" == group or "lower-alpha" == group or "upper-roman" == group or "lower-roman" == group or "upper-greek" == group or "lower-greek" == group ) then
            liststyle = group
        else
            liststyle = config.default_liststyle
        end
    end
    local params = {}
    params.class = {}
    table.insert(params.class, "refbegin")
    params.style = {}
    table.insert(params.style, "list-style-type", liststyle)
    if ( nil ~= count ) then
        table.insert(params.class, "references-column-count references-column-count-", count)
        table.insert(params.style, "-moz-column-count", count)
        table.insert(params.style, "-webkit-column-count", count)
        table.insert(params.style, "column-count", count)
    end
    if ( nil ~= width ) then
    	table.insert(params.class, "references-column-width")
        table.insert(params.style, "-moz-column-width", width)
        table.insert(params.style, "-webkit-column-width", width)
        table.insert(params.style, "column-width", width)
    end
    local dlopen
    if ( nil ~= indent ) then
        local dlopen = mw.html.create("dl")
        dlopen
        		:attr("text-ident", (identsize or "3.2") .. "em")
        		:done()
    else
        dlopen = ""
    end
    local refbegin = mw.html.create("div")
    refbegin
    	:addClass(params.class)
    	:css(params.style)
    	:done()
    return refbegin .. tostring(dlopen)
end

function refend0(frame, config, args)
    local indent = args.indent
    local dlclose
    if ( nil ~= indent ) then
        dlclose = "</dl>"
    else
        dlclose = ""
    end
    return dlclose .. "</div>"
end

-- Converts ISO dates or English dates into Icelandic dates, e.g. "13. febrúar 2017"
function ConvertDateFormatToIcelandic(input)
  if ( input == nil) then return "" end
  local output = input
  -- ISO date format "2017-02-13"
  if string.find(input, "%d%d%d%d%-%d%d%-%d%d") then
    year = string.match(input, "%d%d%d%d")
    first = string.match(input, "-%d%d")
    firstloc = string.find(input, "-%d%d") + 3
    if tonumber(first) < - 12 then
      day = string.sub(first, 2, - 1)
    else
      month = string.sub(first, 2, - 1)
    end
    second = string.match(input, "-%d%d", firstloc)
    if tonumber(second) > 12 and month == nil then
      month = string.sub(second, 2, - 1)
    else
      day = string.sub(second, 2, - 1)
    end
    month = os.date(tostring(month) )
    output = mw.getContentLanguage():formatDate( "j. F Y", year .. "-" .. month .. "-" .. day, is)
  -- English date format string "13 February 2017"
  elseif string.find(input, "%d?%d [A-Z][a-z]+ %d%d%d%d") then
    local day, month, year = input:match("(%d?%d) ([A-Z][a-z]+) (%d%d%d%d)")
    MONTH_NAMES = {January = 1, February = 2, March = 3, April = 4, May = 5, June = 6, July = 7, August = 8, September = 9, October = 10, November = 11, December = 12}
    month = MONTH_NAMES[month]
    if month ~= nil then
      output = mw.getContentLanguage():formatDate( "j. F Y", year .. "-" .. month .. "-" .. day, is)
    end
  end
  return output
end

-- This is used by {{doi}} to create DOI links in the style used in citations.
function z.doi(frame)
    local pframe = frame:getParent()
    local id = pframe.args.id or pframe.args[1] or ""
    return doi(frame, id)
end

-- This is used by {{ISSN}} to create ISSN links in the style used in citations.
function z.ISSN(frame)
    local pframe = frame:getParent()
    local Name = pframe.args[1] or ""
    return hideinprint("[[ISSN]]&nbsp;[http://www.worldcat.org/search?fq=x0:jrnl&q=n2:" .. Name .. " " .. Name .. "]")
end

-- This is used by templates such as {{SfnRef}} to create the (encoded) anchor name for a Harvard cross-reference hyperlink.
function z.SFNID(frame)
    local pframe = frame:getParent()
    return anchorid(pframe.args)
end

-- This is used by templates such as {{Harvard citation}} to create the Harvard cross-reference text.
function z.Harvard(frame)
    local pframe = frame:getParent()
    return crossref(frame, pframe.args)
end

-- This is used by templates such as {{cite book}} to create the actual citation text.
function z.citation(frame)
    local pframe = frame:getParent()
    return citation0(frame, pframe.args)
end

-- This is used by templates such as {{sfn}} to create the entire cross-reference.
function z.sfn(frame)
    local pframe = frame:getParent()
    local content = crossref(frame, pframe.args)
    local args = { name = refid(pframe.args) }
    return mw.text.tag{name = "ref", content = content, attrs = args}
end

-- This is used by template {{r}}.
function z.r(frame)
    local pframe = frame:getParent()
    local config = frame.args -- the arguments passed BY the template, in the wikitext of the template itself
    local args = pframe.args -- the arguments passed TO the template, in the wikitext that instantiates the template
    args.page1 = args.page1 or args.page
    local text = ""
    -- This would be shorter using ipairs(), but that doesn't work on an arguments table supplied to a template.
    local index = 1
    while args[index] ~= nil do
        local arg = args[index]
        local t = r0(frame, arg, args.group, args["page" .. index])
        text = text .. t
        index = index + 1
    end
    return text
end

-- This is used by template {{ref label}}.
function z.reflabel(frame)
    local pframe = frame:getParent()
    local config = frame.args -- the arguments passed BY the template, in the wikitext of the template itself
    local args = pframe.args -- the arguments passed TO the template, in the wikitext that instantiates the template
    local P1 = args[1] or ""
    local P2 = args[2] or ""
    local P3 = args[3] or ""
    local id = nil
    local contents = "[[#endnote_" .. P1 .. P3 .. "|&#91;" .. P2 .. "&#93;]]"
    if ( args.noid == nil or args.noid == "" ) then params.id = "ref_" .. P1 .. P3 end
    local ref = mw.html.create("sup")
    ref
    	:addClass("reference")
    	:wikitext( contents )
    	:done()
    return tostring( ref )
end

-- This is used by template {{note label}}.
function z.notelabel(frame)
    local pframe = frame:getParent()
    local config = frame.args -- the arguments passed BY the template, in the wikitext of the template itself
    local args = pframe.args -- the arguments passed TO the template, in the wikitext that instantiates the template
    local id = args[1] or ""
    local arrow = args[3] or ""
    local postscript = args[4] or ""
    local contents
    if arrow ~= "" then
        local sup_arrow = mw.html.create( "sup" )
        sup_arrow
        		:wikitext( arrow )
        		:done()
        contents = "[[#ref_" .. id .. arrow .. "|<b>" .. tostring(sup_arrow) .. "</b>]]" .. postscript
        if "none" == arrow then arrow = "^" end -- Change this AFTER using it in the ID parameter and the contents.
    else
        contents = (args[2] or "") .. postscript
    end
    local params = { class="citation wikicite" }
    if id ~= "" and ( args.noid == nil or args.noid == "" ) then
        params.id = mw.uri.anchorEncode("endnote_" .. id .. arrow)
    end
    local note = mw.html.create( "span" )
    note
    		:wikitext( contents )
    		:attr("id", params.id )
    		:addClass( params.class )
    		:done()
    return tostring( note )
end

-- This is used by templates {{reflist}} and {{notelist}}.
function z.reflist(frame)
    local pframe = frame:getParent()
    local config = frame.args -- the arguments passed BY the template, in the wikitext of the template itself
    local args = pframe.args -- the arguments passed TO the template, in the wikitext that instantiates the template
    return reflist0(frame, config, args)
end

-- This is used by template {{refbegin}}.
function z.refbegin(frame)
    local pframe = frame:getParent()
    local config = frame.args -- the arguments passed BY the template, in the wikitext of the template itself
    local args = pframe.args -- the arguments passed TO the template, in the wikitext that instantiates the template
    return refbegin0(frame, config, args)
end

-- This is used by template {{refend}}.
function z.refend(frame)
    local pframe = frame:getParent()
    local config = frame.args -- the arguments passed BY the template, in the wikitext of the template itself
    local args = pframe.args -- the arguments passed TO the template, in the wikitext that instantiates the template
    return refend0(frame, config, args)
end

-- This is used by template {{efn}}.
function z.efn(frame)
    local pframe = frame:getParent()
    local config = frame.args -- the arguments passed BY the template, in the wikitext of the template itself
    local args = pframe.args -- the arguments passed TO the template, in the wikitext that instantiates the template
    return mw.text.tag{name="ref",content=(args[1] or ""),attrs={name=args.name,group=config.default_group}}
end

return z