Jewiki unterstützen. Jewiki, die größte Online-Enzy­klo­pädie zum Judentum.

Helfen Sie Jewiki mit einer kleinen oder auch größeren Spende. Einmalig oder regelmäßig, damit die Zukunft von Jewiki gesichert bleibt ...

Vielen Dank für Ihr Engagement! (→ Spendenkonten)

How to read Jewiki in your desired language · Comment lire Jewiki dans votre langue préférée · Cómo leer Jewiki en su idioma preferido · בשפה הרצויה Jewiki כיצד לקרוא · Как читать Jewiki на предпочитаемом вами языке · كيف تقرأ Jewiki باللغة التي تريدها · Como ler o Jewiki na sua língua preferida

Modul:CatUtil

Aus Jewiki
Zur Navigation springen Zur Suche springen

--[=[ 2014-12-18 CatUtil

  • count()
  • countYears()

]=]


-- table for export local CatUtil = {} -- limitation with some leeway local MaxQueries = 400


local function fault( alert, frame )

   -- Format message with class="error"
   --     alert  -- string, with message
   --     frame  -- object
   -- Returns message with markup
   local r = alert
   if frame then
       r = string.format( "%s * %s", frame:getTitle(), r )
   end
   r = string.format( "ERROR * %s", r )
   return r

end -- fault()


local function figure( achieve, alike, about )

   -- Count items in categories
   --     achieve  -- table, with category titles
   --     alike    -- string, with type, or nil
   --                 all pages files subcats
   --     about    -- string, with name of calling function
   -- Returns number
   local n = #achieve
   local r = 0
   local scope
   if alike then
       local support = "|all|pages|files|subcats|"
       local seek
       scope = alike:lower()
       seek  = string.format( "|%s|", scope )
       if not support:find( seek, 1, true ) then
           n = -1
           r = string.format( "CatUtil::%s scope='%s'",
                              about, alike )
           r = fault( r )
       end
   else
       scope = "pages"
   end
   for i = 1, n do
       r = r + mw.site.stats.pagesInCategory( achieve[ i ], scope )
   end -- for i
   return r

end -- figure()


local function format( achieve, args, about )

   -- Evaluate and format result
   --     achieve  -- table, with category titles
   --     args     -- table, with options
   --     about    -- string, with name of calling function
   -- Returns number or string
   local r
   if #achieve > MaxQueries then
       r = string.format( "CatUtil:: max cat: %d > %d",
                          #titles, MaxQueries )
   else
       r = figure( achieve, args.scope, about )
       if type( r ) == "number" then
           if r == 0 then
               if args.show0 then
                   r = args.show0
               end
           elseif args.showN or args.show1 then
               if r == 1 and args.show1 then
                   r = args.show1
               elseif args.showN:find( "%d", 1, true ) then
                   r = string.format( args.showN, r )
               else
                   r = args.showN
               end
           end
       end
   end
   return r

end -- format()


CatUtil.count = function ( args )

   local support = "|scope|show0|show1|showN|"
   local titles  = { }
   local r, seek, unknown
   for k, v in pairs( args ) do
       if type( k ) == "number" then
           table.insert( titles, v )
       else
           seek = string.format( "|%s|", k )
           if not support:find( seek, 1, true ) then
               if not unknown then
                   unknown = { }
               end
               table.insert( unknown,  k .. "=" )
           end
       end
   end -- for k, v
   if unknown then
       r = string.format( "'%s' in CatUtil::count",
                          table.concat( unknown, " " ) )
       r = fault( r )
   else
       r = format( titles, args, "count" )
   end
   return r

end -- .count()


CatUtil.countYears = function ( args )

   local support = "|scope|serial|show0|show1|showN|since|stop|"
   local r, seek, unknown
   for k, v in pairs( args ) do
       if type( k ) == "number" then
           k = tostring( k )
       end
       seek = string.format( "|%s|", k )
       if not support:find( seek, 1, true ) then
           if not unknown then
               unknown = { }
           end
           table.insert( unknown,  k .. "=" )
       end
   end -- for k, v
   if unknown then
       r = string.format( "'%s' in CatUtil::countYears",
                          table.concat( unknown, " " ) )
       r = fault( r )
   else
       local min, max
       if args.serial then
           if args.serial:find( "%d", 1, true ) then
               if args.since then
                   if args.since:match( "^%d+$" ) then
                       local jump
                       min = tonumber( args.since )
                       if args.stop then
                           if args.stop:match( "^%d+$" ) then
                               max = args.stop
                           elseif args.stop:match( "^[%+%-]%d+$" ) then
                               jump = tonumber( args.stop )
                           else
                               r = string.format( "stop=???%s???",
                                                  args.stop )
                           end
                       end
                       if not r then
                           if not max then
                               max = os.date( "%Y" )
                           end
                           max = tonumber( max )
                           if jump then
                               max = max + jump
                           end
                           if min >= max then
                               r = string.format( "%s %d < %d",
                                                  "stop > since !!",
                                                  min, max )
                           elseif max - min  >  MaxQueries then
                               r = string.format( ">max: %d-%d > %d",
                                                  max, min, MaxQueries )
                           end
                       end
                   else
                       r = string.format( "since=???%s???",
                                          args.since )
                   end
               else
                   r = "since=???"
               end
           else
               r = "serial=...'%d'"
           end
       else
           r = "serial=???"
       end
       if r then
           r = string.format( "CatUtil::countYears %s", r )
           r = fault( r )
       else
           local titles  = { }
           for i = min, max do
               table.insert( titles,
                             string.format( args.serial, i ) )
           end -- for i
           r = format( titles, args, "countYears" )
       end
   end
   return r

end -- .countYears()


-- Export local p = { }

p.execute = function ( activate, args )

   local r
   if CatUtil[ activate ] then
       local lucky
       lucky, r = pcall( CatUtil[ activate ], args )
   else
       r = "ERROR  CatUtil::execute() activate=" .. tostring( activate )
   end
   return r

end

p.count = function ( frame )

   local lucky, r = pcall( CatUtil.count, frame:getParent().args )
   if not lucky then
       r = fault( r, frame )
   end
   return r

end

p.countYears = function ( frame )

   local lucky, r = pcall( CatUtil.countYears, frame:getParent().args )
   if not lucky then
       r = fault( r, frame )
   end
   return r

end

function p.CatUtil()

   return CatUtil

end

return p