Broken/Footnotes

Izvor: Hrvatska internetska enciklopedija
Inačica 640280 od 12. siječanj 2026. u 10:06 koju je unio WikiSysop (razgovor | doprinosi)
Prijeđi na navigaciju Prijeđi na pretraživanje

-- Modul:Harvard -- Hrvatska verzija harvardskih citata (sfn, harvard, itd.) -- s osnovnom validacijom i tracking kategorijama

require('strict')

local mHarv = {}


-- KONFIGURACIJA


local cfg = {

   -- skrivena kategorija za probleme
   cat_error = ,
   -- maksimalan broj pozicijskih parametara (autori + godina)
   max_params = 5,
   -- minimalno: autor + godina
   min_positional = 2,

}


-- POMOĆNE FUNKCIJE


local function trim(str)

   if not str then return  end
   str = mw.text.trim(str)
   -- makni završnu točku da ne dupliramo
   return str:gsub('%.$', )

end

local function is_set(v)

   return v ~= nil and trim(v) ~= 

end

local function error_tag(msg)

   return string.format(
       '%s',
       msg
   )

end

local function add_tracking()

   return cfg.cat_error

end

local function build_citeref_key(args)

   -- ENWIKI koristi sofisticiraniji algoritam; ovdje pojednostavljena verzija:
   -- spajamo autore i godinu bez razmaka
   local parts = {}
   if is_set(args.P1) then table.insert(parts, args.P1) end
   if is_set(args.P2) then table.insert(parts, args.P2) end
   if is_set(args.P3) then table.insert(parts, args.P3) end
   if is_set(args.P4) then table.insert(parts, args.P4) end
   if is_set(args.P5) then table.insert(parts, args.P5) end
   return table.concat(parts, )

end


-- VALIDACIJA


local function validate_args(args)

   local errors = {}
   -- broj pozicijskih parametara
   local count = 0
   for i = 1, cfg.max_params do
       if is_set(args['P' .. i]) then
           count = count + 1
       end
   end
   if count < cfg.min_positional then
       table.insert(errors, 'Premalo parametara: potrebno je barem ime autora i godina.')
   end
   -- očekivanje da je jedan od parametara godina (P2 ili P3 ili P4 ili P5)
   -- (ne strogo, samo upozorenje ako su svi očito imena)
   -- ovo ostavljamo mekano – radije manje lažnih pozitivnih
   return errors

end

local function format_errors(errors)

   if #errors == 0 then
       return 
   end
   local out = {}
   for _, e in ipairs(errors) do
       table.insert(out, '• ' .. e)
   end
   return error_tag(table.concat(out, '
')) .. add_tracking()

end


-- JEZGRA FORMATIRANJA


local function core(args)

   local result
   -- osnovni obrazac: autori + godina
   if is_set(args.P5) then
       -- P1 + " et al." + P5 (godina)
       result = args.P1 .. ' et al. ' ..
           args.bracket_year_left .. args.P5 .. args.bracket_year_right
   elseif is_set(args.P4) then
       -- P1, P2 i P3 + P4 (godina)
       result = args.P1 .. ', ' .. args.P2 .. ' i ' .. args.P3 .. ' ' ..
           args.bracket_year_left .. args.P4 .. args.bracket_year_right
   elseif is_set(args.P3) then
       -- P1 i P2 + P3 (godina)
       result = args.P1 .. ' i ' .. args.P2 .. ' ' ..
           args.bracket_year_left .. args.P3 .. args.bracket_year_right
   else
       -- P1 + P2
       result = trim(args.P1 .. ' ' .. args.bracket_year_left .. args.P2 .. args.bracket_year_right)
   end
   -- REF / CITEREF logika
   if args.ref ~= 'none' then
       if is_set(args.ref) then
           result = string.format('%s', mw.uri.anchorEncode(args.ref), result)
       else
           local key = build_citeref_key(args)
           result = string.format('%s', mw.uri.anchorEncode(key), result)
       end
   end
   -- stranice
   if is_set(args.page) then
       result = result .. args.page_sep .. args.page
   elseif is_set(args.pages) then
       result = result .. args.pages_sep .. args.pages
   end
   -- lokacija
   if is_set(args.location) then
       result = result .. ', ' .. args.location
   end
   result = args.bracket_left .. result .. args.bracket_right .. (args.postscript or )
   return result

end


-- DEFAULT ARGUMENTI


local function default_args()

   return {
       bracket_left = ,
       bracket_right = ,
       bracket_year_left = ,
       bracket_year_right = ,
       postscript = ,
       page = ,
       pages = ,
       location = ,
       page_sep = ', str. ',
       pages_sep = ', str. ',
       ref = ,
       P1 = ,
       P2 = ,
       P3 = ,
       P4 = ,
       P5 = ,
   }

end


-- JAVNE FUNKCIJE


function mHarv.harvard_core(frame)

   local pframe = frame:getParent()
   local args = default_args()
   args.bracket_left = pframe.args.BracketLeft or 
   args.bracket_right = pframe.args.BracketRight or 
   args.bracket_year_left = pframe.args.BracketYearLeft or 
   args.bracket_year_right = pframe.args.BracketYearRight or 
   args.postscript = pframe.args.Postscript or 
   if args.postscript == 'none' then
       args.postscript = 
   end
   args.page = pframe.args.Page or 
   args.pages = pframe.args.Pages or 
   args.location = pframe.args.Location or 
   args.page_sep = pframe.args.PageSep or args.page_sep
   args.pages_sep = pframe.args.PagesSep or args.pages_sep
   args.ref = pframe.args.REF or 
   args.P1 = trim(pframe.args.P1)
   args.P2 = trim(pframe.args.P2)
   args.P3 = trim(pframe.args.P3)
   args.P4 = trim(pframe.args.P4)
   args.P5 = trim(pframe.args.P5)
   local errors = validate_args(args)
   local base = core(args)
   return format_errors(errors) .. base

end

function mHarv.harvard_citation(frame)

   local pframe = frame:getParent()
   local args = default_args()
   args.bracket_left = '('
   args.bracket_right = ')'
   args.page = pframe.args.p or pframe.args.page or 
   args.pages = pframe.args.pp or pframe.args.pages or 
   args.location = pframe.args.loc or 
   args.ref = pframe.args.ref or pframe.args.Ref or 
   args.P1 = trim(pframe.args[1])
   args.P2 = trim(pframe.args[2])
   args.P3 = trim(pframe.args[3])
   args.P4 = trim(pframe.args[4])
   args.P5 = trim(pframe.args[5])
   local errors = validate_args(args)
   local base = core(args)
   return format_errors(errors) .. base

end

function mHarv.harvard_citation_no_bracket(frame)

   local pframe = frame:getParent()
   local args = default_args()
   args.page = pframe.args.p or pframe.args.page or 
   args.pages = pframe.args.pp or pframe.args.pages or 
   args.location = pframe.args.loc or 
   args.ref = pframe.args.ref or pframe.args.Ref or 
   args.P1 = trim(pframe.args[1])
   args.P2 = trim(pframe.args[2])
   args.P3 = trim(pframe.args[3])
   args.P4 = trim(pframe.args[4])
   args.P5 = trim(pframe.args[5])
   local errors = validate_args(args)
   local base = core(args)
   return format_errors(errors) .. base

end

function mHarv.sfn(frame)

   local pframe = frame:getParent()
   local args = default_args()
   -- override s #invoke args
   for k, v in pairs(frame.args) do
       args[k] = v
   end
   args.postscript = pframe.args.postscript or pframe.args.ps or '.'
   if args.postscript == 'none' then
       args.postscript = 
   end
   args.page = pframe.args.p or pframe.args.page or 
   args.pages = pframe.args.pp or pframe.args.pages or 
   args.location = pframe.args.loc or 
   args.ref = pframe.args.ref or pframe.args.Ref or 
   args.P1 = trim(pframe.args[1])
   args.P2 = trim(pframe.args[2])
   args.P3 = trim(pframe.args[3])
   args.P4 = trim(pframe.args[4])
   args.P5 = trim(pframe.args[5])
   local errors = validate_args(args)
   local base = core(args)
   local name = 'FOOTNOTE' ..
       args.P1 .. args.P2 .. args.P3 .. args.P4 .. args.P5 ..
       args.page .. args.pages .. args.location
   local ref = frame:extensionTag{
       name = 'ref',
       args = { name = name },
       content = base
   }
   return format_errors(errors) .. ref

end

-- alias za main (ako netko pozove |main) mHarv.main = mHarv.sfn

return mHarv