Skip to content

Commit

Permalink
Deployment and fixes Officium parvum
Browse files Browse the repository at this point in the history
1. Further deployment of Cistercian versions

2. Fixed for standard versions:
- `setupstring`:  new conjunction `nisi` (+ description in `technical.html`)
- fixing Benedictine Officium Parvum
- fixing Officium Parvum in Festo Annuntiationis and Paschal tide (Roman and Benedictine)
- reducing "Incompleteness warning" for M1617 and M1930 to Matins
-
  • Loading branch information
FAJ-Munich committed Jan 9, 2025
1 parent 62be35a commit 8e2d072
Show file tree
Hide file tree
Showing 522 changed files with 4,529 additions and 492 deletions.
2 changes: 2 additions & 0 deletions web/cgi-bin/DivinumOfficium/RunTimeOptions.pm
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ use constant LEGACY_MISSA_VERSION_NAMES => {
'Monastic Tridentinum 1617' => 'Tridentine - 1570',
'Monastic Divino 1930' => 'Divino Afflatu - 1954',
'Monastic - 1963' => 'Rubrics 1960 - 1960',
'Monastic Tridentinum Cisterciensis 1951' => 'Tridentine - 1910',
'Monastic Tridentinum Cisterciensis Altovadensis' => 'Reduced - 1955',
'Tridentine - 1888' => 'Tridentine - 1910',
'Tridentine - 1906' => 'Tridentine - 1910',
'Ordo Praedicatorum - 1962' => 'Ordo Praedicatorum Dominican 1962',
Expand Down
14 changes: 11 additions & 3 deletions web/cgi-bin/DivinumOfficium/SetupString.pl
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@
communi => sub { our $version },
'die' => \&get_dayname_for_condition,
feria => sub { our $dayofweek + 1 },
commune => sub {$commune},
commune => sub { our $commune },
votiva => sub { our $votive },
officio => sub { $dayname[1]; },
);
my %predicates = (
Expand Down Expand Up @@ -222,7 +223,12 @@ ($)

# aut binds tighter than et
AUTEM: for (split /\baut\b/, $condition) {
for (split /\bet\b/) {
my $negation = 0; # the first condition always has to be true

for (split /\b(et|nisi)\b/) {
$negation = 1 if /nisi/; # everthing after 'nisi' has to be false until the next 'aut'
next if /et|nisi/; # don't evaluate the captured seperator

s/^\s*(.*?)\s*$/$1/;

# Normalise whitespace.
Expand All @@ -247,8 +253,10 @@ ($)
my $predicate_text = $predicate;
$predicate = $predicates{lc($predicate)} || sub { shift =~ /$predicate_text/i };
$subject = $subjects{lc($subject)};
next AUTEM unless $subject && &$predicate(&$subject());

next AUTEM unless $subject && (&$predicate(&$subject()) xor $negation);
}

return ($vero = 1);
}
return ($vero = 0);
Expand Down
4 changes: 3 additions & 1 deletion web/cgi-bin/horas/horas.pl
Original file line number Diff line number Diff line change
Expand Up @@ -725,9 +725,11 @@ (\$$)
# Performs necessary adjustments to a short responsory.
sub postprocess_short_resp(\@$) {
my ($capit, $lang) = @_;
our (@dayname, $votive);

s/&Gloria1?/&Gloria1/ for (@$capit);

if ($dayname[0] =~ /Pasc/i) {
if (alleluia_required($dayname[0], $votive)) {
my $rlines = 0;

for (@$capit) {
Expand Down
73 changes: 41 additions & 32 deletions web/cgi-bin/horas/horascommon.pl
Original file line number Diff line number Diff line change
Expand Up @@ -355,15 +355,21 @@ sub occurrence {
}
}

if ($version =~ /Trid/i
&& (($trank[2] < 5.1 && $trank[2] > 4.2 && $trank[0] =~ /Dominica/i) || $trank[0] =~ /infra octavam Corp/i))
{
if (
$version =~ /Trid/i
&& (($trank[2] < 5.1 && $trank[2] > 4.2 && $trank[0] =~ /Dominica/i && $version !~ /altovadensis/i)
|| $trank[0] =~ /infra octavam Corp/i)
) {

# before Divino: Dominica minor and infra 8vam CC is outranked by any Duplex
$trank[2] = 2.9;
} # before Divino: Dominica minor and infra 8vam CC is outranked by any Duplex
elsif ($version =~ /divino/i && ($trank[2] < 5.1 && $trank[0] =~ /Dominica/i)) {
$trank[2] = 4.9;
} elsif ($version =~ /196/ && $tname =~ /Nat1/i && $day > 28)
{ # commemoration of the Christmas Octave according to the rubrics
} elsif ($version =~ /divino|altovadensis/i && ($trank[2] < 5.1 && $trank[0] =~ /Dominica/i)) {

# Divino: Dominica minor raised to beat Duplex majus / Cistercian 1957: to beat MM. min
$trank[2] = $version =~ /divino/i ? 4.9 : 3.9;
} elsif ($version =~ /196/ && $tname =~ /Nat1/i && $day > 28) {

# commemoration of the Christmas Octave according to the rubrics
$sname = subdirname('Tempora', $version) . "Nat$day";
%saint = %{setupstring('Latin', $sname)};
$srank = $saint{Rank};
Expand Down Expand Up @@ -734,14 +740,14 @@ sub concurrence {

# before 1955, Ash Wednesday gave way at 2nd Vespers in concurrence to a Duplex
$rank = $wrank[2] = 2.99;
} elsif ($dayname[0] =~ /Quad[0-5]|Quadp|Adv/ && $dayofweek == 0 && $version =~ /trident/i) {
} elsif ($dayname[0] =~ /Quad[0-5]|Quadp|Adv/ && $dayofweek == 0 && $version =~ /trident(?!.*altovadensis)/i) {

# before Divino Afflatu, the Sundays from Septuag to Judica gave way at 2nd Vespers in concurrence to a Duplex
$rank = $wrank[2] = 2.99;
} elsif ($dayname[0] =~ /Quad[0-5]|Quadp|Adv/ && $dayofweek == 0 && $version =~ /divino/i) {
} elsif ($dayname[0] =~ /Quad[0-5]|Quadp|Adv/ && $dayofweek == 0 && $version =~ /divino|altovadensis/i) {

# after Divino Afflatu, the Sundays from Septuag to Judica gave way at 2nd Vespers in concurrence to a Duplex II. cl.
$rank = $wrank[2] = 4.9;
# after Divino Afflatu, the Sundays from Septuag to Judica gave way at 2nd Vespers in concurrence to a Duplex II. cl. (Cist: MM. maj.)
$rank = $wrank[2] = $version =~ /divino/i ? 4.9 : 3.9;
}

if ( $cwrank[0] =~ /Dominica/i
Expand All @@ -751,21 +757,27 @@ sub concurrence {
{

# before 1955, even Major Sundays gave way at I Vespers to a Duplex (or Duplex II. cl.)
$cwrank[2] = $crank = $version =~ /trident/i ? 2.9 : 4.9;
$cwrank[2] = $crank = $version =~ /altovadensis/i ? 3.9 : $version =~ /trident/i ? 2.9 : 4.9;
}

if ( $cwrank[0] =~ /in.*octava/i
&& ($wrank[0] =~ /Dominica/i || ($winner =~ /Sancti/ && $wrank !~ /in.*octava/i))
&& $version =~ /divino/i)
{
$octvespera = 1; # Commemoration of resumed Octave on Sunday from 1st Vespers (Divino only)

# Commemoration of resumed Octave on Sunday from 1st Vespers (Divino only)
$octvespera = 1;
} elsif ($cwrank[0] =~ /Dominica/i && $trank[0] =~ /in.*octava/i
|| ($cwrank[0] =~ /infra.*octav/i && $version =~ /Trident/))
{
$octvespera = 3; # Commemoration of Octave on Saturday from 2nd Vespers

# Commemoration of Octave on Saturday from 2nd Vespers
$octvespera = 3;
}

if ($ctrank[0] =~ /Dominica/i && !($version =~ /19(?:55|6)/ && $ctrank[0] =~ /Dominica Resurrectionis/i)) {
if ($ctrank[0] =~ /Dominica/i
&& !($version =~ /19(?:55|6)|altovadensis/i && $ctrank[0] =~ /Dominica Resurrectionis/i))
{

# if tomorrow is a Sunday, get rid of today's tempora completely; necessary Commemorations are handled in the Sunday database file
if ($sanctoraloffice && $srank[0] !~ /infra octavam Nat/i) {
Expand Down Expand Up @@ -813,7 +825,7 @@ sub concurrence {
|| ($cwinner{Rank} =~ /C10/i && $winner{Rank} =~ /C1[01]/i)

# no 1st Vespers of Easter after 1955
|| ($version =~ /19(?:55|6)/ && $cwinner{Rank} =~ /Dominica Resurrectionis|Patrocinii S. Joseph/i)
|| ($version =~ /19(?:55|6)|altovadensis/i && $cwinner{Rank} =~ /Dominica Resurrectionis|Patrocinii S. Joseph/i)

# TODO: last condition should be made obsolete and handled via database
|| ($version =~ /19(?:55|6)/
Expand Down Expand Up @@ -912,17 +924,20 @@ sub concurrence {

# before DA, more Semiduplex and Duplex where treated as "A capitulo"
# In Cisterciense, even MM. maj is A capitulo in concurrence with Dom. I. classis
# In Altovadensis, even MM. min is A capitulo in concurrence with any Sunday
my $flrank =
($version =~ /cist/i && $cwinner{Rank} =~ /Dominica/i && $tomorrowname[0] =~ /Adv1|Quad[156]/)
? ($rank < 4.9 ? 2 : $rank)
($version =~ /cist/i && $cwinner{Rank} =~ /Dominica/i)
? ($rank < ($tomorrowname[0] =~ /Adv1|Quad[156]/ ? 4.9 : $version =~ /altovadensis/i ? 3.9 : 2.9) ? 2 : $rank)
: $version =~ /trident/i ? (
($rank < 2.9 && !($rank == 2.1 && $winner{Rank} !~ /infra Octavam/i)) ? 2
: ($rank >= 3 && $rank < 4.9 && $rank != 4 && $rank != 3.2) ? 3
: ($rank >= 3 && $rank < 4.9 && $rank != 4 && $rank != 3.9 && $rank != 3.2) ? 3
: $rank
)
: $rank;
my $flcrank =
$version =~ /trident/i
$version =~ /cist/i && $cwinner{Rank} =~ /Dominica/i
? 2
: $version =~ /trident/i
? ($crank < 2.91 ? 2 : ($cwinner{Rank} =~ /Dominica/i ? 2.99 : ($crank < 4.9 && $crank != 4) ? 3 : $crank))
: ($version =~ /divino/i && $cwinner{Rank} =~ /Dominica/i) ? 4.9
: $crank;
Expand Down Expand Up @@ -1579,22 +1594,14 @@ sub precedence {
}

if (my $vtv = $votive ne 'Hodie' ? $votive : '') {
if ($vtv =~ /C12/i) {
if ($vtv =~ /C12/i && $version !~ /cist/i) {
if ( ($month == 12 && ($day == 24 && $hora =~ /Vespera|Completorium/ || ($day > 24)))
|| $month == 1
|| ($month == 2 && $day < 3))
{
$vtv = 'C12N';
} elsif ($dayname[0] =~ /adv/i) {
} elsif ($dayname[0] =~ /adv/i || $winner =~ /03-25/) {
$vtv = 'C12A';
} elsif ($dayname[0] =~ /Pasc/i) {
$vtv = 'C12P';
} elsif (
$month == 3
&& (($day == 24 && $hora =~ /(Vespera|Completorium)/i)
|| $day == 25)
) {
$vtv = 'C12';
} elsif ($dayname[0] =~ /(Quadp|Quad)/i) {
$vtv = 'C12Q';
}
Expand Down Expand Up @@ -1824,8 +1831,9 @@ sub nooctnat {
# Latin spelling variety in versions
sub spell_var {
my $t = shift;
our $version;

if (our $version =~ /196/) {
if ($version =~ /196/) {

# substitute i for j
# but not in html tags!
Expand All @@ -1841,6 +1849,7 @@ sub spell_var {
} else {
$t =~ s/Génetrix/Génitrix/g;
$t =~ s/\bco(t[ií]d[ií])/quo$1/g;
$t =~ s/(allelú)ja/$1ia/gi if $version =~ /cist/i;
}
return $t;
}
Expand Down
5 changes: 4 additions & 1 deletion web/cgi-bin/horas/officium_html.pl
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,10 @@ sub headline {
# add warning for uncompleted versions
$output .=
"<H2><FONT COLOR='RED' SIZE='+1'>Please note that the database for this version ($vers) is still incomplete and under construction.</FONT></H2>\n"
if $vers =~ /1617|1930|1962|Cist/;
if $vers =~ /1962|Cist/;
$output .=
"<H2><FONT COLOR='RED'>Please note that 'Ad Matutinum' for this version ($vers) is still incomplete and under construction.</FONT></H2>\n"
if $vers =~ /1617|1930/ && $hora =~ /Matutinum/;

if ($variant eq 'P') {
$output .= par_c(<< "PrintTag");
Expand Down
15 changes: 13 additions & 2 deletions web/cgi-bin/horas/specials.pl
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,8 @@ sub specials {
}

# Omit this section if the rule says so.
my $ite = substr($item, 1, index($item, ' '));
$item =~ /\#(.+?)(\s|$)/;
my $ite = $1;

if (
$rule =~ /Omit.*? $ite/i
Expand Down Expand Up @@ -134,6 +135,12 @@ sub specials {
next;
}

if ($item =~ /Commemoratio officii parvi/) {
my %mariae = %{setupstring($lang, 'CommuneM/C12.txt')};
push(@s, $item, $mariae{"COP $hora"});
next;
}

# Preces:
if ($item =~ /preces/i) {
$skipflag = !preces($item); # check if Preces Feriales or Dominicales are to be said
Expand Down Expand Up @@ -663,6 +670,7 @@ sub setbuild {
# versions 1956 and 1960 exclude from Ordinarium
sub checksuffragium {
our $collectcount;
my $ranklimit = ($version =~ /cist/i ? 4 : 3); # Roman: Duplex; Cist: MM. maj.
return 0
if $rule =~ /no suffragium/i
Expand All @@ -685,7 +693,10 @@ sub checksuffragium {
|| ($octavcount || $commemoratio{Rank} =~ /octav/i)
# Cistercian: minor Feasts of Apostles
|| $version =~ /cist/i && $commune =~ /C1a?$/i;
|| $version =~ /cist/i && $commune =~ /C1a?$/i
# Altovadensis: max 3. collects
|| $version =~ /altovadensis/i && $collectcount > 2;
if ($commemoratio && $seasonalflag) {
my @r = split(';;', $commemoratio{Rank});
Expand Down
17 changes: 15 additions & 2 deletions web/cgi-bin/horas/specials/orationes.pl
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ sub oratio {
$datafolder, $cvespera, $precesferiales, $largefont, $redfont, $label,
);

our $collectcount = 1;
my $addconclusio;
my %w = columnsel($lang) ? %winner : %winner2;
my $ind = $hora eq 'Vespera' ? $vespera : 2;
Expand Down Expand Up @@ -153,14 +154,15 @@ sub oratio {
# no dominus vobiscum after Te decet
if ($version !~ /Monastic/ || $hora ne 'Matutinum' || $rule !~ /12 lectiones/) {
if (
$version =~ /Monastic/
$version =~ /Monastic/ && ($winner !~ /C12/ || $version !~ /cist/i)
|| ( $version =~ /Ordo Praedicatorum/
&& ($rank < 3 || $dayname[1] =~ /Vigil/)
&& $winner !~ /12-24|Pasc|01-0[2-5]/)
)
{ # OP ferial office
if ($horamajor && $version !~ /Ordo Praedicatorum/) {
push(@s, '$Kyrie', '$Pater noster Et', "_");
push(@s, '$Kyrie');
push(@s, '$Pater noster Et', "_") unless $winner =~ /C12/;
} else {
push(@s, '$Kyrie', '$pater secreto', "_");
}
Expand Down Expand Up @@ -200,6 +202,8 @@ sub oratio {
my $octavestring = '!.*?(O[ckt]ta|' . &translate("Octava", $lang) . ')';
my $sundaystring = 'Dominic[aæ]|' . &translate("Dominica", $lang);

%w = columnsel($lang) ? %winner : %winner2; # prevent "contamination" from Oratio Dominica

if ($horamajor && $rank < 7) {

our $cwinner;
Expand Down Expand Up @@ -516,6 +520,7 @@ sub oratio {
my $ostr;
($ostr, $addconclusio) = delconclusio($cc{$key}, $addconclusio);
push(@s, $ostr);
$collectcount++;
}
}

Expand Down Expand Up @@ -742,6 +747,14 @@ sub getsuffragium {
: $dayname[0] =~ /pasc/i ? 2
: 1;
$suffr = $comment > 2 ? $suffr{"Suffragium $hora"} : $suffr{'Suffragium'};

if ($version =~ /altovadensis/i && $collectcount == 2 && $commune !~ /C1[012]/) {
$suffr =~ s/\n\!.*//s;
my $conclBMV = $suffr{'Suffragium ConclusioBMV'};
$suffr =~ s/$/~\n$conclBMV/s;
setbuild1('Suffragium altovadense:', "limited to three collects total");
}

if ($churchpatron) { $suffr =~ s/r\. N\./$churchpatron/; }
($suffr, $comment);
}
Expand Down
13 changes: 7 additions & 6 deletions web/cgi-bin/horas/specials/psalmi.pl
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ sub psalmi {

if ($hora =~ /^(?:Laudes|Vespera)$/i) {
$psalmi = psalmi_major($lang);
$duplexf ||= $duplex > 2;
$duplexf ||= $duplex > 2 && $winner !~ /C12/;
} else {
$psalmi = psalmi_minor($lang);
}
Expand Down Expand Up @@ -133,17 +133,17 @@ sub psalmi_minor {
if ($winner =~ /tempora/i || $testmode =~ /seasonal/i || $dayname[0] =~ /pasc/i) {

my $ind =
$hora eq 'Prima' ? 0
: $hora eq 'Tertia' ? 1
: $hora eq 'Sexta' ? 2
$hora eq 'Prima' ? ($version =~ /cist/i ? 1 : 0)
: $hora eq 'Tertia' ? ($version =~ /cist/i ? 2 : 1)
: $hora eq 'Sexta' ? ($version =~ /cist/i ? 3 : 2)
: $hora eq 'Nona' ? 4
: -1;
my $name = gettempora('Psalmi minor');

if ($name eq 'Adv') {
$name = $dayname[0];

if ($day > 16 && $day < 24 && $dayofweek) {
if ($day > 16 && $day < 24 && $dayofweek && $version !~ /cist/i) {
my $i = $dayofweek + 1;

if ($dayofweek == 6 && $version =~ /trident|monastic.*divino/i) { # take ants from feria occuring Dec 21st
Expand Down Expand Up @@ -434,7 +434,8 @@ sub psalmi_major {

if ( $version =~ /Monastic/
&& $hora eq 'Vespera'
&& ($winner !~ /C(?:9|12)/)
&& ($winner !~ /C9/)
&& ($winner !~ /C12/ || $version =~ /cist/i)
&& ($commune !~ /C9/)
&& ($dayname[0] !~ /Quad6/ || $dayofweek < 4))
{
Expand Down
Loading

0 comments on commit 8e2d072

Please sign in to comment.