module FeastFast::Calculator

Public Class Methods

build_data(year) click to toggle source
# File lib/feast_fast/calculator.rb, line 5
def self.build_data(year)

  year = year.to_i
  easter = Date.easter(year)

  hash = Hash.new do |h, day|
    h[day] = {
      :feasts => [],
      :fast => [3,5].include?(day.wday) ? Fast.new(:status => Fast::STATUS::COMMON) : Fast.new(:status => Fast::STATUS::NO)
    }
  end

  # Пасха

  hash[easter][:feasts]           << Feast.new(:status => Feast::STATUS::EASTER, :text => "Воскресение Христово. Пасха")

  # Непереходящие праздники

  hash[Date.new(year, 1, 7)][:feasts]   << Feast.new(:status => Feast::STATUS::TWELVE, :text => "Рождество Христово")
  hash[Date.new(year, 1, 14)][:feasts]  << Feast.new(:status => Feast::STATUS::GREAT, :text => "Обрезание Господне")
  hash[Date.new(year, 1, 19)][:feasts]  << Feast.new(:status => Feast::STATUS::TWELVE, :text => "Крещение Господне")
  hash[Date.new(year, 2, 15)][:feasts]  << Feast.new(:status => Feast::STATUS::TWELVE, :text => "Сретение Господне")
  hash[Date.new(year, 4, 7)][:feasts]   << Feast.new(:status => Feast::STATUS::TWELVE, :text => "Благовещение Пресвятой Богородицы")
  hash[Date.new(year, 5, 21)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Апостола и евангелиста Иоанна Богослова")
  hash[Date.new(year, 5, 22)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Святителя Николая, архиепископа Мир Ликийских, чудотворца")
  hash[Date.new(year, 7, 7)][:feasts]   << Feast.new(:status => Feast::STATUS::GREAT, :text => "Рождество Иоанна Предтечи")
  hash[Date.new(year, 7, 12)][:feasts]  << Feast.new(:status => Feast::STATUS::GREAT, :text => "Святых перв. апостолов Петра и Павла")
  hash[Date.new(year, 8, 19)][:feasts]  << Feast.new(:status => Feast::STATUS::TWELVE, :text => "Преображение Господне")
  hash[Date.new(year, 8, 28)][:feasts]  << Feast.new(:status => Feast::STATUS::TWELVE, :text => "Успение Пресвятой Богородицы")
  hash[Date.new(year, 9, 11)][:feasts]  << Feast.new(:status => Feast::STATUS::GREAT, :text => "Усекновение главы Иоанна Предтечи")
  hash[Date.new(year, 9, 21)][:feasts]  << Feast.new(:status => Feast::STATUS::TWELVE, :text => "Рождество Пресвятой Богородицы")
  hash[Date.new(year, 9, 27)][:feasts]  << Feast.new(:status => Feast::STATUS::TWELVE, :text => "Воздвижение Креста Господня")
  hash[Date.new(year, 10, 9)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Апостола и евангелиста Иоанна Богослова")
  hash[Date.new(year, 10, 14)][:feasts] << Feast.new(:status => Feast::STATUS::GREAT, :text => "Покров Пресвятой Богородицы")
  hash[Date.new(year, 12, 4)][:feasts]  << Feast.new(:status => Feast::STATUS::TWELVE, :text => "Введение во храм Пресвятой Богородицы")
  hash[Date.new(year, 12, 19)][:feasts] << Feast.new(:status => Feast::STATUS::COMMON, :text => "Святителя Николая, архиепископа Мир Ликийских, чудотворца")

  # Переходящие праздники

  hash[Date.new(year, 2, 7).next_sunday][:feasts] << Feast.new(:status => Feast::STATUS::COMMON, :text => "Собор новомучеников и исповедников Российских")
  
  hash[easter.weeks_ago(11)][:feasts] << Feast.new(:status => Feast::STATUS::COMMON, :text => "Неделя о Закхее-мытаре")
  hash[easter.weeks_ago(10)][:feasts] << Feast.new(:status => Feast::STATUS::COMMON, :text => "Неделя о мытаре и фарисее")
  hash[easter.weeks_ago(9)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Неделя о блудном сыне")
  hash[easter.weeks_ago(8)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Неделя о Страшном Суде")
  hash[easter.weeks_ago(7)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Воспоминание Адамова изгнания. Прощеное воскресенье")
  hash[easter.weeks_ago(6)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Торжество Православия")
  hash[easter.weeks_ago(5)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Неделя 2-я Великого поста, свт. Григория Паламы, архиеп. Солунского")
  hash[easter.weeks_ago(4)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Неделя 3-я Великого поста, Крестопоклонная")
  hash[easter.weeks_ago(3)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Неделя 4-я Великого поста, прп. Иоанна Лествичника")
  hash[easter.weeks_ago(2)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Неделя 5-я Великого поста, прп. Марии Египетской")
  hash[easter.week_ago.prev_date][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Лазарева суббота")
  hash[easter.week_ago][:feasts]      << Feast.new(:status => Feast::STATUS::TWELVE, :text => "Вход Господень в Иерусалим")
  
  hash[easter.prev_date(6)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Великий Понедельник")
  hash[easter.prev_date(5)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Великий Вторник")
  hash[easter.prev_date(4)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Великая Среда")
  hash[easter.prev_date(3)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Великий Четверг. Тайная Вечеря")
  hash[easter.prev_date(2)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Великая Пятница. Распятие Христа")
  hash[easter.prev_date][:feasts]     << Feast.new(:status => Feast::STATUS::COMMON, :text => "Великая Суббота. Сошествие Христа во ад")

  hash[easter.week_since][:feasts]      << Feast.new(:status => Feast::STATUS::COMMON, :text => "Неделя 2-я по Пасхе (Антипасха). Воспоминание уверения ап. Фомы")
  hash[easter.weeks_since(2)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Неделя 3-я по Пасхе, святых жен-мироносиц")
  hash[easter.weeks_since(3)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Неделя 4-я по Пасхе, о расслабленном")
  hash[easter.weeks_since(4)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Неделя 5-я по Пасхе, о самарянке")
  hash[easter.weeks_since(5)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Неделя 6-я по Пасхе, о слепом")
  hash[easter.next_date(39)][:feasts]   << Feast.new(:status => Feast::STATUS::TWELVE, :text => "Вознесение Господне (40-й день по Пасхе)")
  hash[easter.weeks_since(6)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Неделя 7-я по Пасхе, свв. отцев I Вселенского Собора")
  hash[easter.next_date(49)][:feasts]   << Feast.new(:status => Feast::STATUS::TWELVE, :text => "Пятидесятница. День Святой Троицы (50-й день по Пасхе)")
  hash[easter.next_date(50)][:feasts]   << Feast.new(:status => Feast::STATUS::COMMON, :text => "День Святого Духа (первый понедельник по Пятидесятнице)")
  hash[easter.weeks_since(8)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Неделя 1-я по Пятидесятнице, всех святых")
  hash[easter.weeks_since(9)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Неделя 2-я по Пятидесятнице, всех святых, в земле Российской просиявших")

  # Дни особого поминовения усопших

  hash[easter.weeks_ago(8).prev_date][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Вселенская родительская суббота (суббота перед неделей о Страшном Суде)")
  hash[easter.weeks_ago(5).prev_date][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Вселенская родительская суббота 2-й недели Великого поста")
  hash[easter.weeks_ago(4).prev_date][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Вселенская родительская суббота 3-й недели Великого поста")
  hash[easter.weeks_ago(3).prev_date][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "Вселенская родительская суббота 4-й недели Великого поста")
  hash[easter.week_since.next_date(2)][:feasts] << Feast.new(:status => Feast::STATUS::COMMON, :text => "Радоница (вторник 2-й седмицы по Пасхе)")      
  hash[easter.next_date(48)][:feasts]           << Feast.new(:status => Feast::STATUS::COMMON, :text => "Троицкая родительская суббота (суббота перед Троицей)")
  hash[Date.new(year, 5, 9)][:feasts]           << Feast.new(:status => Feast::STATUS::COMMON, :text => "Поминовение усопших воинов")
  hash[Date.new(year, 11, 7).prev_sunday.prev_date][:feasts] << Feast.new(:status => Feast::STATUS::COMMON, :text => "Дмитриевская родительская суббота (суббота перед 8 ноября)")

  # Контрабанда

  hash[Date.new(year, 11, 12)][:feasts] << Feast.new(:status => Feast::STATUS::COMMON, :text => "День памяти Преподобной Елены Сербской")
  hash[Date.new(year, 1, 21)][:feasts]  << Feast.new(:status => Feast::STATUS::COMMON, :text => "День памяти Преподобного Илии Египетского")

  # ПОСТЫ

  # Рождественский пост

  (Date.new(year, 11, 28)..Date.new(year, 12, 31)).each do |date|
    if date.wday == 3 or date.wday == 5
      hash[date][:fast] = Fast.new(:status => Fast::STATUS::STRICT)
    else
      hash[date][:fast] = Fast.new(:status => Fast::STATUS::COMMON)
    end
  end

  (Date.new(year, 1, 1)..Date.new(year, 1, 6)).each do |date|
    if date.day == 6
      hash[date][:fast] = Fast.new(:status => Fast::STATUS::STRICT, :text => "Рождественский сочельник")
    elsif date.wday == 3 or date.wday == 5
      hash[date][:fast] = Fast.new(:status => Fast::STATUS::STRICT)
    else
      hash[date][:fast] = Fast.new(:status => Fast::STATUS::COMMON)
    end
  end


  hash[Date.new(year, 12, 4)][:fast]  = Fast.new(:status => Fast::STATUS::COMMON) # Введение во храм Пресвятой Богородицы
  hash[Date.new(year, 12, 19)][:fast] = Fast.new(:status => Fast::STATUS::COMMON) # Святителя Николая

  # Святки
  (Date.new(year, 1, 7)..Date.new(year, 1, 17)).each do |date|
    hash[date][:fast] = Fast.new(:status => Fast::STATUS::NO)
  end
  hash[Date.new(year, 1, 18)][:fast]  = Fast.new(:status => Fast::STATUS::STRICT, :text => "Крещенский сочельник")
  hash[Date.new(year, 1, 19)][:fast]  = Fast.new(:status => Fast::STATUS::NO) # Крещение Господне или Богоявление

  # Успенский пост
  hash[Date.new(year, 8, 14)][:fast]  = Fast.new(:status => Fast::STATUS::STRICT, :text => "Начало Успенского поста")
  (Date.new(year, 8, 15)..Date.new(year, 8, 27)).each do |date|
    hash[date][:fast] = Fast.new(:status => Fast::STATUS::STRICT)
  end
  hash[Date.new(year, 8, 19)][:fast]  = Fast.new(:status => Fast::STATUS::COMMON) # Преображение Господне

  hash[Date.new(year, 9, 11)][:fast]  = Fast.new(:status => Fast::STATUS::STRICT) # Усекновение главы Иоанна Предтечи
  hash[Date.new(year, 9, 27)][:fast]  = Fast.new(:status => Fast::STATUS::STRICT) # Воздвижение Креста Господня


  # Седмица после Недели о мытаре и фарисее - сплошная, пост в среду и пятницу отменяется.
  (easter.weeks_ago(10).next_date..easter.weeks_ago(9)).each do |date|
    hash[date][:fast] = Fast.new(:status => Fast::STATUS::NO)
  end

  # Седмица сырная (масленица)
  hash[easter.prev_date(55)][:fast] = Fast.new(:status => Fast::STATUS::LOOSE, :text => "Седмица сырная (масленица)")
  (easter.prev_date(54)..easter.prev_date(49)).each do |date|
    hash[date][:fast] = Fast.new(:status => Fast::STATUS::LOOSE)
  end

  # Великий пост
  hash[easter.prev_date(48)][:fast] = Fast.new(:status => Fast::STATUS::STRICT, :text => "Начало Великого поста")
  (easter.prev_date(47)..easter.prev_date).each do |date|
    hash[date][:fast] = Fast.new(:status => Fast::STATUS::STRICT)
  end

  hash[easter.week_ago][:fast] = Fast.new(:status => Fast::STATUS::COMMON) # Вход Господень в Иерусалим
  
  # Светлая седмица
  (easter.next_date..easter.week_since).each do |date|
    hash[date][:fast] = Fast.new(:status => Fast::STATUS::NO)
  end

  # Сплошная неделя после пятидесяинцы
  (easter.next_date(50)..easter.next_date(56)).each do |date|
    hash[date][:fast] = Fast.new(:status => Fast::STATUS::NO)
  end

  # Петров пост
  hash[easter.next_date(57)][:fast] = Fast.new(:status => Fast::STATUS::STRICT, :text => "Начало Петрова поста")
  (easter.next_date(58)..Date.new(year, 7, 11)).each do |date|
    if date.wday == 3 || date.wday == 5
      hash[date][:fast] = Fast.new(:status => Fast::STATUS::STRICT)
    else
      hash[date][:fast] = Fast.new(:status => Fast::STATUS::COMMON)
    end
  end
  
  # Рождество Иоанна Предтечи
  unless hash[Date.new(year, 7, 7)][:fast].status == Fast::STATUS::NO
    hash[Date.new(year, 7, 7)][:fast] = Fast.new(:status => Fast::STATUS::COMMON)
  end

  # Благовещение Пресвятой Богородицы
  date = Date.new(year, 4, 7)
  unless hash[date][:fast].status == Fast::STATUS::NO
    unless (easter.prev_date(6)..easter.prev_date).include?( date )
      hash[date][:fast] = Fast.new(:status => Fast::STATUS::COMMON)
    end
  end
  
  return easter, hash
end
Also aliased as: easter_and_days
easter_and_days(year)
Alias for: build_data