Skip to content

Commit 147cfbd

Browse files
authored
Merge pull request #900 from szentjozsefhackathon/master
to Prod
2 parents 207f64d + aebd9f9 commit 147cfbd

64 files changed

Lines changed: 2499 additions & 220 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/elasticsearch-data.yaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@ jobs:
1313
build:
1414
runs-on: ubuntu-latest
1515
permissions:
16-
contents: read
16+
# #886: a `Create GitHub Release` lépéshez `contents: write` kell. `read` mellett
17+
# a lépés 403-mal elhasalt („Resource not accessible by integration"), és ezzel a
18+
# futás pirosra váltott — nyolc hét óta minden hétfőn. A kép közben rendben
19+
# elkészült és fel is került; csak a release nem jött létre hozzá.
20+
contents: write
1721
packages: write
1822

1923
steps:

calendar/src/app/data/mass-definitions-export.ts

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,18 @@ export interface MassDefinitionJsonExport {
1212
defaultRite?: Rite;
1313
description: string;
1414
specialUsage?: 'EASTER' | 'CHRISTMAS' | null;
15+
aliases?: string[];
16+
}
17+
18+
/**
19+
* #896: kategóriánként összefűzött aliasok — a szabad szöveges felismerés szótára.
20+
*
21+
* A PHP oldal ezt olvassa (`MassDefinitions::aliasesByCategory()`), és ugyanezt használja
22+
* az Angular is. Azért kategória szerint csoportosítva, mert a felismerés kimenete a
23+
* kategória; a definíció-kulcs ehhez nem kell.
24+
*/
25+
export interface AliasesByCategory {
26+
[category: string]: string[];
1527
}
1628

1729
/**
@@ -55,6 +67,7 @@ export interface MassDefinitionsJsonOutput {
5567
definitions: MassDefinitionJsonExport[];
5668
titlesByCategory: TitlesByCategory;
5769
titlesByRite: TitlesByRite;
70+
aliasesByCategory: AliasesByCategory;
5871
}
5972

6073
/**
@@ -68,13 +81,20 @@ export function generateMassDefinitionsJson(): MassDefinitionsJsonOutput {
6881

6982
// Initialize category index
7083
const titlesByCategory: TitlesByCategory = {};
84+
85+
// #896: a szabad szöveges alakok ugyanígy, kategóriánként
86+
const aliasesByCategory: AliasesByCategory = {};
7187

7288
// Initialize rite index
7389
const titlesByRite: TitlesByRite = {};
7490

7591
// Build category index
7692
MASS_DEFINITIONS_DATA.categories.forEach((cat: CategoryDefinition) => {
7793
titlesByCategory[cat.key] = [];
94+
95+
// #896: a kategória saját aliasai (keresztelő, esküvő, temetés) — ezekhez nincs
96+
// definíció, mert nem szabad felkínálni őket a naptárszerkesztőben.
97+
aliasesByCategory[cat.key] = cat.aliases ? [...cat.aliases] : [];
7898
});
7999

80100
// Build rite index
@@ -90,6 +110,15 @@ export function generateMassDefinitionsJson(): MassDefinitionsJsonOutput {
90110
if (titlesByCategory[def.category]) {
91111
titlesByCategory[def.category].push(exportKey);
92112
}
113+
114+
// #896: az aliasok kategóriánként, ismétlődés nélkül
115+
if (aliasesByCategory[def.category] && def.aliases) {
116+
def.aliases.forEach((alias) => {
117+
if (!aliasesByCategory[def.category].includes(alias)) {
118+
aliasesByCategory[def.category].push(alias);
119+
}
120+
});
121+
}
93122

94123
// Add to rite index (for each rite this definition belongs to)
95124
def.rites.forEach((rite) => {
@@ -117,10 +146,13 @@ export function generateMassDefinitionsJson(): MassDefinitionsJsonOutput {
117146
return {
118147
_generator: 'mass-definitions-export.ts',
119148
_warning: 'Auto-generated from calendar/src/app/data/mass-definitions.ts during Angular build',
120-
categories: MASS_DEFINITIONS_DATA.categories,
149+
// A kategória-aliasok az `aliasesByCategory`-ban vannak; itt csak a kulcs és a szín,
150+
// hogy ugyanaz az adat ne szerepeljen két helyen a kimenetben.
151+
categories: MASS_DEFINITIONS_DATA.categories.map(({ key, color }) => ({ key, color })),
121152
rites: ritesWithMasstypes,
122153
definitions: exportDefinitions,
123154
titlesByCategory,
124-
titlesByRite
155+
titlesByRite,
156+
aliasesByCategory
125157
};
126158
}

calendar/src/app/data/mass-definitions.ts

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,24 @@ export interface MassDefinition {
2323

2424
/** Speciális felhasználás (pl. Easter, Christmas) */
2525
specialUsage?: 'EASTER' | 'CHRISTMAS' | null;
26+
27+
/**
28+
* #896: a szabad szöveges alakok, ragozott formák és ismert elgépelések, amikről ez a
29+
* definíció felismerhető egy naptárcímben.
30+
*
31+
* Eddig ez az adat egy PHP-osztály privát konstansában élt (`IcalEventProperties`),
32+
* ezért a böngésző-oldal nem is látta: az Angular csak a lefordított kanonikus címekre
33+
* tudott illeszteni, a PHP viszont ezekre is. Ugyanarra a címre így két válasz
34+
* születhetett. Innentől egy helyen van, és mindkét oldal ezt olvassa.
35+
*
36+
* Szabályok:
37+
* - kisbetűvel, mert az illesztés kisbetűs címen fut;
38+
* - az ékezetes ÉS az ékezet nélküli alak is kell (a normalizálás nem ejt ékezetet);
39+
* - tő is lehet („szentségimád"), hogy a ragozott alakok is illeszkedjenek;
40+
* - de csak akkor, ha nem fog mást: a puszta „szertartás" például NEM szerepelhet,
41+
* mert a temetési szertartásból is misét csinálna.
42+
*/
43+
aliases?: string[];
2644
}
2745

2846
/**
@@ -32,16 +50,26 @@ export interface MassDefinition {
3250
export interface CategoryDefinition {
3351
key: MassTitleCategory;
3452
color: string;
53+
54+
/**
55+
* #896: kategória-szintű aliasok — olyan alkalmak, amikhez nem tartozik definíció.
56+
*
57+
* Azért nem definíció, mert az megjelenne a naptárszerkesztő cím-választójában. L. a
58+
* `MASS_CATEGORY_DEFINITIONS` megjegyzését.
59+
*/
60+
aliases?: string[];
3561
}
3662

3763
/**
3864
* Kategóriák automatikus generálása a MASTER SOURCE OF TRUTH-ból
3965
* MASS_CATEGORY_DEFINITIONS az egyetlen hely az értékek definiálásához!
4066
*/
4167
const generateCategories = (): CategoryDefinition[] => {
42-
return MASS_CATEGORY_DEFINITIONS.map(({ key, color }) => ({
43-
key: key as MassTitleCategory,
44-
color
68+
return MASS_CATEGORY_DEFINITIONS.map((def) => ({
69+
key: def.key as MassTitleCategory,
70+
color: def.color,
71+
// `as const` miatt readonly a forrás; másolat kell, hogy a típus egyezzen.
72+
aliases: 'aliases' in def ? [...(def.aliases as readonly string[])] : []
4573
}));
4674
};
4775

@@ -76,6 +104,12 @@ export const MASS_DEFINITIONS_DATA: MassDefinitionsData = {
76104

77105
{
78106
key: 'HOLY_MASS',
107+
// A szóösszetételeknek saját alak kell: az illesztés SZÓ ELEJÉN keres, ezért az
108+
// „újmiséje" végén álló „misé" magától nem illeszkedne.
109+
aliases: ['szentmise', 'szentmisé', 'szentmsie', 'szentmse', 'sztmise', 'mise', 'misé',
110+
'újmis', 'ujmis', 'gyászmis', 'gyaszmis', 'diákmis', 'diakmis', 'ifimis',
111+
'emlékmis', 'emlekmis', 'aranymis', 'ezüstmis', 'ezustmis',
112+
'szentáldozás', 'szentaldozas', 'mass', 'eucharist'],
79113
category: MassTitleCategory.MASS,
80114
rites: [Rite.ROMAN_CATHOLIC],
81115
description: 'Roman Catholic Sunday/weekday Mass',
@@ -84,6 +118,7 @@ export const MASS_DEFINITIONS_DATA: MassDefinitionsData = {
84118

85119
{
86120
key: 'LITURGY_OF_THE_WORD',
121+
aliases: ['igeliturgia', 'igeliturgi'],
87122
category: MassTitleCategory.MASS,
88123
rites: [Rite.ROMAN_CATHOLIC],
89124
description: 'Liturgy of the Word',
@@ -92,6 +127,7 @@ export const MASS_DEFINITIONS_DATA: MassDefinitionsData = {
92127

93128
{
94129
key: 'DIVINE_LITURGY',
130+
aliases: ['szent liturgia', 'liturgia'],
95131
category: MassTitleCategory.MASS,
96132
rites: [Rite.GREEK_CATHOLIC],
97133
defaultRite: Rite.GREEK_CATHOLIC,
@@ -101,6 +137,7 @@ export const MASS_DEFINITIONS_DATA: MassDefinitionsData = {
101137

102138
{
103139
key: 'LITURGY_OF_THE_PRESANCTIFIED_GIFTS',
140+
aliases: ['előre megszentelt', 'elore megszentelt'],
104141
category: MassTitleCategory.MASS,
105142
rites: [Rite.GREEK_CATHOLIC],
106143
description: 'Greek Catholic Liturgy of Presanctified Gifts',
@@ -109,6 +146,7 @@ export const MASS_DEFINITIONS_DATA: MassDefinitionsData = {
109146

110147
{
111148
key: 'MASS_OF_THE_LORD_S_SUPPER',
149+
aliases: ['nagycsütörtöki szertartás', 'nagycsutortoki szertartas', 'utolsó vacsora', 'utolso vacsora'],
112150
category: MassTitleCategory.MASS,
113151
rites: [
114152
Rite.ROMAN_CATHOLIC,
@@ -120,6 +158,7 @@ export const MASS_DEFINITIONS_DATA: MassDefinitionsData = {
120158

121159
{
122160
key: 'GOOD_FRIDAY_LITURGY',
161+
aliases: ['nagypénteki szertartás', 'nagypenteki szertartas'],
123162
category: MassTitleCategory.MASS,
124163
rites: [
125164
Rite.ROMAN_CATHOLIC,
@@ -131,6 +170,7 @@ export const MASS_DEFINITIONS_DATA: MassDefinitionsData = {
131170

132171
{
133172
key: 'EASTER_VIGIL',
173+
aliases: ['húsvét vigíliája', 'husvet vigiliaja', 'húsvéti vigília', 'husveti vigilia', 'feltámadási szertartás', 'feltamadasi szertartas', 'easter vigil', 'eastern vigil'],
134174
category: MassTitleCategory.MASS,
135175
rites: [
136176
Rite.ROMAN_CATHOLIC,
@@ -142,6 +182,7 @@ export const MASS_DEFINITIONS_DATA: MassDefinitionsData = {
142182

143183
{
144184
key: 'TRADITIONAL_LATIN_MASS',
185+
aliases: ['régi rítusú mise', 'regi ritusu mise', 'tridenti', 'usus antiquior'],
145186
category: MassTitleCategory.MASS,
146187
rites: [Rite.TRADITIONAL],
147188
defaultRite: Rite.TRADITIONAL,
@@ -154,6 +195,7 @@ export const MASS_DEFINITIONS_DATA: MassDefinitionsData = {
154195

155196
{
156197
key: 'ADORATION',
198+
aliases: ['szentségimád', 'szentsegimad', 'adorác', 'adorac', 'adoration'],
157199
category: MassTitleCategory.ADORATION,
158200
rites: [Rite.ROMAN_CATHOLIC],
159201
description: 'Eucharistic Adoration',
@@ -164,6 +206,7 @@ export const MASS_DEFINITIONS_DATA: MassDefinitionsData = {
164206

165207
{
166208
key: 'CONFESSION',
209+
aliases: ['gyóntat', 'gyontat', 'szentgyónás', 'szentgyonas', 'gyónás', 'gyonas', 'gyónási', 'gyonasi', 'confession'],
167210
category: MassTitleCategory.CONFESSION,
168211
rites: [
169212
Rite.ROMAN_CATHOLIC,
@@ -177,6 +220,7 @@ export const MASS_DEFINITIONS_DATA: MassDefinitionsData = {
177220

178221
{
179222
key: 'BREVIARY',
223+
aliases: ['zsolozsma', 'esti dicséret', 'esti dicseret', 'imaóra', 'imaora', 'breviárium', 'breviarium'],
180224
category: MassTitleCategory.OTHER,
181225
rites: [Rite.ROMAN_CATHOLIC],
182226
description: 'Liturgy of the Hours (Breviary)',
@@ -185,6 +229,7 @@ export const MASS_DEFINITIONS_DATA: MassDefinitionsData = {
185229

186230
{
187231
key: 'ROSARY',
232+
aliases: ['rózsafüzér', 'rozsafuzer'],
188233
category: MassTitleCategory.OTHER,
189234
rites: [Rite.ROMAN_CATHOLIC],
190235
description: 'Rosary recitation',
@@ -193,6 +238,7 @@ export const MASS_DEFINITIONS_DATA: MassDefinitionsData = {
193238

194239
{
195240
key: 'LITANY',
241+
aliases: ['litánia', 'litania'],
196242
category: MassTitleCategory.OTHER,
197243
rites: [Rite.ROMAN_CATHOLIC],
198244
description: 'Litany service',
@@ -204,6 +250,7 @@ export const MASS_DEFINITIONS_DATA: MassDefinitionsData = {
204250
// elvetette ("Jó lenne minél lejjebb tartani a szertartástípusok számát"), a
205251
// keresztutat viszont jóváhagyta.
206252
key: 'STATIONS_OF_THE_CROSS',
253+
aliases: ['keresztút', 'keresztut'],
207254
category: MassTitleCategory.OTHER,
208255
rites: [Rite.ROMAN_CATHOLIC],
209256
description: 'Stations of the Cross (Way of the Cross) devotion',
@@ -212,6 +259,7 @@ export const MASS_DEFINITIONS_DATA: MassDefinitionsData = {
212259

213260
{
214261
key: 'MATINS',
262+
aliases: ['utrenye'],
215263
category: MassTitleCategory.OTHER,
216264
rites: [Rite.GREEK_CATHOLIC],
217265
description: 'Greek Catholic Matins service',
@@ -220,6 +268,7 @@ export const MASS_DEFINITIONS_DATA: MassDefinitionsData = {
220268

221269
{
222270
key: 'VESPRES',
271+
aliases: ['vecsernye'],
223272
category: MassTitleCategory.OTHER,
224273
rites: [Rite.GREEK_CATHOLIC],
225274
description: 'Greek Catholic Vespres service',

calendar/src/app/enum/mass-categories.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,25 @@ export const MASS_CATEGORY_DEFINITIONS = [
2222
{
2323
key: 'OTHER',
2424
color: '#A8B8D0',
25+
26+
/*
27+
* #896: olyan alkalmak, amiket FEL kell ismerni, de NEM szabad felkínálni.
28+
*
29+
* borazslo döntése: a keresztelő, az esküvő és a temetés csak importból kerül be
30+
* („a szerkesztő felületen keresztül nem akarunk ilyet állítani"), a keresőben
31+
* viszont az „egyéb" jó nekik — a teljes elrejtésük már átverés lenne.
32+
*
33+
* Ezért KATEGÓRIA-szintű aliasok, nem definíciók: egy új definíció (BAPTISM,
34+
* WEDDING, …) megjelenne a naptárszerkesztő cím-választójában is, tehát pont azt
35+
* csinálná, amit nem akarunk. Így viszont a felismerés tud róluk, a szerkesztő nem.
36+
*/
37+
aliases: [
38+
'keresztel', // keresztelő, keresztelõ, keresztelője, keresztelés
39+
'esküvő', 'eskuvo',
40+
'temetés', 'temetes',
41+
'requiem',
42+
'gyászszertartás', 'gyaszszertartas',
43+
],
2544
}
2645
] as const;
2746

calendar/src/app/util/mass-title-category-config.spec.ts

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,70 @@ describe('MassTitleCategoryConfig', () => {
296296
});
297297
});
298298

299+
/**
300+
* #896: a közös alias-szótár.
301+
*
302+
* A lényeg nem az, hogy több címet ismerünk fel, hanem hogy UGYANAZT ismerjük fel,
303+
* mint a PHP oldal. A szótár egy helyen van (`mass-definitions.ts` -> `aliases`), és a
304+
* szabály is közös: a szövegben legkorábban előforduló alias nyer.
305+
*/
306+
describe('getCategoryByTitle – közös alias-szótár (#896)', () => {
307+
it('a szöveg sorrendje dönt, nem a kategóriáké', () => {
308+
// Ez a három a régi, kategória-sorrendes illesztéssel mind MASS lett volna.
309+
expect(MassTitleCategoryConfig.getCategoryByTitle('Szentmise, utána szentségimádás'))
310+
.toBe(MassTitleCategory.MASS);
311+
expect(MassTitleCategoryConfig.getCategoryByTitle('Szentségimádás a szentmise után'))
312+
.toBe(MassTitleCategory.ADORATION);
313+
expect(MassTitleCategoryConfig.getCategoryByTitle('Gyóntatás a szentmise előtt'))
314+
.toBe(MassTitleCategory.CONFESSION);
315+
});
316+
317+
it('felismeri a valódi adatból vett címeket, TranslateService nélkül is', () => {
318+
expect(MassTitleCategoryConfig.getCategoryByTitle('Nagypénteki szertartás (P. Szőcs)'))
319+
.toBe(MassTitleCategory.MASS);
320+
expect(MassTitleCategoryConfig.getCategoryByTitle('Szentmsie'))
321+
.toBe(MassTitleCategory.MASS);
322+
expect(MassTitleCategoryConfig.getCategoryByTitle('Kollégistáink szentmiséje (P. Szőcs)'))
323+
.toBe(MassTitleCategory.MASS);
324+
expect(MassTitleCategoryConfig.getCategoryByTitle('Csendes szentségimádás'))
325+
.toBe(MassTitleCategory.ADORATION);
326+
expect(MassTitleCategoryConfig.getCategoryByTitle('Keresztút a kálvárián'))
327+
.toBe(MassTitleCategory.OTHER);
328+
});
329+
330+
it('#896: a keresztelő, esküvő, temetés EGYÉB — de nem választható cím', () => {
331+
expect(MassTitleCategoryConfig.getCategoryByTitle('Keresztelő (P. Vértesaljai)'))
332+
.toBe(MassTitleCategory.OTHER);
333+
expect(MassTitleCategoryConfig.getCategoryByTitle('Esküvő (Alácsi Ervin atya)'))
334+
.toBe(MassTitleCategory.OTHER);
335+
expect(MassTitleCategoryConfig.getCategoryByTitle('BOHAN BÉLA ATYA TEMETÉSE 12 ÓRAKOR'))
336+
.toBe(MassTitleCategory.OTHER);
337+
338+
// A mise marad mise: a korábbi találat nyer.
339+
expect(MassTitleCategoryConfig.getCategoryByTitle('10 misén keresztelő, Mária Teodóra'))
340+
.toBe(MassTitleCategory.MASS);
341+
342+
// És egyikük sem jelenhet meg a szerkesztő cím-választójában.
343+
const cimek = Object.values(MassTitleCategoryConfig.CATEGORY_TITLES).flat();
344+
for (const kulcs of cimek) {
345+
expect(kulcs.toLowerCase()).not.toContain('keresztel');
346+
expect(kulcs.toLowerCase()).not.toContain('wedding');
347+
expect(kulcs.toLowerCase()).not.toContain('funeral');
348+
}
349+
});
350+
351+
it('a szótár mind a négy kategóriára ad alakokat', () => {
352+
const aliases = MassTitleCategoryConfig.CATEGORY_ALIASES;
353+
354+
for (const category of [MassTitleCategory.MASS, MassTitleCategory.ADORATION,
355+
MassTitleCategory.CONFESSION, MassTitleCategory.OTHER]) {
356+
expect(aliases[category].length).toBeGreaterThan(0);
357+
}
358+
expect(aliases[MassTitleCategory.MASS]).toContain('szentmise');
359+
expect(aliases[MassTitleCategory.CONFESSION]).toContain('gyóntat');
360+
});
361+
});
362+
299363
describe('getAllCategories', () => {
300364
it('should return all category values', () => {
301365
const categories = MassTitleCategoryConfig.getAllCategories();

0 commit comments

Comments
 (0)