Módulo:Citar periódico

A documentação para este módulo pode ser criada na página Módulo:Citar periódico/doc

local p = require('Módulo:Citação/CS1')

--[[--------------------------< a b s t r a c a o >-----------------------------------

Código em comum às citações de periódico

]]
local abstracao = function(config, A)
    config.usaVolume = true
    config.usaIssue = true
    config.ChapterNaoSuportado = true
    local chap_param
    -- pega o nome do parâmetro de um destes peta-parâmetros relacionados a "chapter"
    if is_set (A.Chapter) then
        chap_param = A:ORIGIN ('Chapter')
    elseif is_set (A.TransChapter) then
        chap_param = A:ORIGIN ('TransChapter')
    elseif is_set (A.ChapterURL) then
        chap_param = A:ORIGIN ('ChapterURL')
    elseif is_set (A.ScriptChapter) then
        chap_param = A:ORIGIN ('ScriptChapter')
    else is_set (A.ChapterFormat)
        chap_param = A:ORIGIN ('ChapterFormat')
    end

     -- se foi encontrado algum...
    if is_set (chap_param) then
        -- ... adiciona mensagem de erro
        table.insert( z.message_tail, { set_error( 'chapter_ignored', {chap_param}, true ) } )
        -- e esvazia para evitar problemas com concatenações
        A.Chapter = ''
        A.TransChapter = '';
        A.ChapterURL = '';
        A.ScriptChapter = '';
        A.ChapterFormat = '';
    end

    local TransTitle = A.TransTitle
    local Title = A.Title
    if is_set(A.TitleLink) and is_set(A.Title) then
        Title = "[[" .. A.TitleLink .. "|" .. Title .. "]]"
    end
    config.TituloFormatado = {}
    if (is_set(Title)) then
        Title = kern_quotes (Title)
        Title = wrap_style ('quoted-title', Title)
        config.TituloFormatado.Title = Title
    end
    if (is_set(TransTitle)) then
        TransTitle= wrap_style ('trans-quoted-title', TransTitle ) -- .. ", "
        config.TituloFormatado.TransTitle = TransTitle
    end

end

--[[--------------------------< p . p e r i o d i c o >----------------------------------

Este é o método principal da predefinição {{citar periódico}}.

]]

p.periodico = function(frame)
    frame.whitelist = { aspas = true,
    					mes = true,
    					["mês"] = true}
    local config, args, A = tratarArgumentos(frame)
    config.CitationClass = ''
    config.permPCMcomoURL = true
    local classe = 'journal'

    -- abstração de códigos que os periódicos têm em comum
    abstracao(config, A)

    if is_set(args.aspas) and args.aspas:lower() == 'não' then
    	config.TituloFormatado = nil
    end
    
    local mes = args.mes or args["mês"]
    if is_set(A.Year) and is_set(mes) then
    	meses = {"janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"}
    	local n = mes:match("^(%d+)$")
    	n = n and tonumber(n)
    	if n and n > 0 and n < 13 then
        	A.Date = meses[n] .. ' de ' .. A.Year
        	A.Year = ''
        else
        	existe = false
        	for _,m in pairs(meses) do
        		if m == tostring(mes) then
	        		existe = true
	        		break
	        	end
	        end
    		if (existe) then
        		A.Date = mes .. ' de ' .. A.Year
	        	A.Year = ''
        	end
        end
    end

    local sepc = set_style (A.Mode:lower())
    local use_lowercase = sepc == ','
    local page, pages = '', ''
    -- mla sempre usa os prefixos p ou pp
    if A.Mode:lower() ~= 'mla' then
        if is_set(A.Page) then
            page = substitute(cfg.messages['j-page(s)'], A.Page)
        elseif is_set(A.Pages) then
            page = substitute (cfg.messages['j-page(s)'], A.Pages)
        end
        if is_set(A.TotalPages) then
            pages = substitute (cfg.messages['total-p'], {sepc, A.TotalPages})
        end
    else
        page, pages = format_pages (A.Page, A.Pages, sepc, A.NoPP, use_lowercase, A.TotalPages)
    end

    local volume = A.Volume
    if ('mla' == A.Mode:lower()) then
        -- mla 8th edition; força letra minúscula
        if is_set (volume) and is_set (A.Issue) then
            volume = wrap_msg ('vol-no', {sepc, volume, A.Issue}, true)
        elseif is_set (volume) then
            volume = wrap_msg ('vol', {sepc, volume}, true)
        else
            volume = ''
        end
    else
        volume = format_volume_issue (volume, A.Issue, sepc, use_lowercase)
    end
    if not is_set(A.Title) and is_set(volume) then
        config.TituloDispensavel = true
        if is_set(A.URL) then
            for i=1,volume:len() do
                if volume:sub(i,i):match(("[^%".. sepc .. "%s]")) then
                    volume = volume:sub(1, i-1) .. '['.. A.URL .. ' '.. volume:sub(i) .. ']'
                    break
                end
            end
            A.URL = ''
        end
	end

    -- Função com o código abstraído
    local B
    A, B = citation0(config, args, A)
    A.Page = page
    A.Pages = pages
    A.Volume = volume

    if is_set(A.Others) then
        A.Others = A.Others .. B.sepc .. " "
    end
    if 'mla' == A.Mode then
        B.tcommon = safe_join( {A.Periodical, A.Format, A.TitleType, A.Series, A.Language
            , A.Edition, B.Publisher, A.Agency, A.Volume}, B.sepc )
    else
        B.tcommon = safe_join( {A.Others, A.Title, A.TitleNote, A.Edition, B.Publisher, A.Periodical
            , A.Format, A.TitleType, A.Series, A.Language, A.Agency, A.Volume}, B.sepc )
    end


    config.CitationClass = classe
    B.config = config

    return textoFinal(A, B)
end


--[[--------------------------< p . j o r n a l >-----------------------------------------

Este é o método principal da predefinição {{citar jornal}}.

]]

p.jornal = function(frame)
    local config, args, A = tratarArgumentos(frame)
    config.CitationClass = ''
    local classe = 'news'

    -- abstração de códigos que os periódicos têm em comum
    abstracao(config, A)

    -- Função com o código abstraído
    local B
    A, B = citation0(config, args, A)

    if ('mla' == A.Mode) then -- caso especial caso estiver no modo MLA
        B.tcommon = safe_join( {A.Periodical, A.Format, A.TitleType, A.Series
            , A.Language, A.Edition, B.Publisher, A.Agency}, B.sepc )
    else
        B.tcommon = safe_join({A.Title, A.TitleNote, A.Periodical, A.Format, A.TitleType
            , A.Series, A.Language, A.Volume, A.Others, A.Edition, B.Publisher, A.Agency}, B.sepc )
    end

    config.CitationClass = classe
    B.config = config

    return textoFinal(A, B)
end


--[[--------------------------< p . r e v i s t a >----------------------------------

Este é o método principal da predefinição {{citar revista}}.

]]

p.revista = function(frame)
    local config, args, A = tratarArgumentos(frame)
    config.CitationClass = ''
    local classe = 'magazine'

    -- abstração de códigos que os periódicos têm em comum
    abstracao(config, A)


    local sepc = set_style (A.Mode:lower())
    local volume = A.Volume
    if is_set (volume) and is_set (A.Issue) then
        volume = wrap_msg ('vol-no', {sepc, volume, A.Issue}, sepc == ',');
    elseif is_set (volume) then
        volume = wrap_msg ('vol', {sepc, volume}, sepc == ',');
    elseif is_set (A.Issue) then
        volume = wrap_msg ('issue', {sepc, A.Issue}, sepc == ',');
    else
        volume = ''
    end

    -- Função com o código abstraído
    local B
    A, B = citation0(config, args, A)
    A.Volume = volume

    config.CitationClass = classe
    B.config = config

    return textoFinal(A, B)
end

return p