#235 [pl][nouns] generator dukatywów

This commit is contained in:
Avris 2021-08-03 19:25:48 +02:00
parent cfc5473f79
commit 1bd173b8a8
6 changed files with 254 additions and 46 deletions

View File

@ -165,3 +165,42 @@ form[disabled] {
.inverted {
filter: invert(1);
}
.list-singular {
padding-inline-start: 0;
list-style: none;
li {
white-space: nowrap;
a:not([href='#']) {
display: none;
}
&:hover a:not([href='#']) {
display: inline;
}
}
>li:before {
content: "";
display: inline-block;
width: $fa-fw-width;
text-align: center;
}
}
.list-plural {
padding-inline-start: 0;
list-style: none;
li {
white-space: nowrap;
a:not([href='#']) {
display: none;
}
&:hover a:not([href='#']) {
display: inline;
}
}
>li:before {
content: "";
display: inline-block;
width: $fa-fw-width;
text-align: center;
}
}

View File

@ -68,6 +68,11 @@
return templates[0];
},
},
watch: {
template() {
this.declensionTemplate = this.template || this.findTemplate();
},
}
};
</script>

View File

@ -307,45 +307,6 @@
<style lang="scss">
@import "assets/variables";
.list-singular {
padding-inline-start: 0;
list-style: none;
li {
white-space: nowrap;
a:not([href='#']) {
display: none;
}
&:hover a:not([href='#']) {
display: inline;
}
}
>li:before {
content: "⋅";
display: inline-block;
width: $fa-fw-width;
text-align: center;
}
}
.list-plural {
padding-inline-start: 0;
list-style: none;
li {
white-space: nowrap;
a:not([href='#']) {
display: none;
}
&:hover a:not([href='#']) {
display: inline;
}
}
>li:before {
content: "⁖";
display: inline-block;
width: $fa-fw-width;
text-align: center;
}
}
tr {
.hover-show {
opacity: 0;

View File

@ -0,0 +1,68 @@
masc fem neutr mascPl femPl neutrPl
b bka bu bi bki by
fob fobka fobu fobowie/fobi fobki foby
wiec wczyni wcu wcy wczynie wcy
ec czyni cu cy czynie cy
niec ńczyni ńcu ńcy ńczynie ńcy
ca czyni cu cy czynie cy
och ocha ochu ochy ochy ochy
ch szka chu chy szki chy
cz czka czu cze czki czy
cz czka czu cze czki czy
d dka du dowie dki dy
da dka du dzi dki dy
graf grafka grafu grafowie grafki grafy
f fka fu fowie fki fy
g żka gu dzy/gowie żki gi
log lożka logu lodzy/logowie lożki logi
j jka ju jowie jki i
j jka ju je jki i
czyk ka ku czycy ki ki
tek tka tku tkowie tki tki
ik iczka iku icy iczki iki
ik iczka/ica iku icy iczki/ice iki
ńczyk nka nku ńczycy nki nki
yk yczka yku ycy yczki yki
ik ica iku icy ice iki
ek ka ku kowie ki ki
ak aczka aku acy aczki aki
ek kini ku kowie kinie ki
uk uczka uku ucy uczki yki
ok oczka oku oki oczki oki
fil filka filu file filki fili
ciel cielka cielu ciele cielki cieli
l lka lu le lki li
ł łka łu łowie łki ły
m mka mu mowie mki my
n nka nu ni nki ny
n nka nu ni nki ny
nin nka nku nie nki nki
p pka pu pi pki py
ar arka aru arzy arki ary
ar arki aru arowie arki ary
er erka eru erzy erki ery
or orka oru orzy orki ory
ur urka uru urzy urki yry
er erka/era eru erzy erki/ery ery
ir irka iru irowie irki iry
ór orka oru ory orki ory
tra trka/tra tru trzy trki/try try
arz arka aru arze arki ary
arz ara aru arze ary ary
mistrz mistrzyni mistrzu mistrzowie mistrzynie mistrzy
erz erka eru erze erki ery
s ska su sy ski sy
s ska su si ski sy
sz szka szu sze szki szy
ś sia siu sie sie si
nt ntka ntu nci ntki nty
t tka tu ci tki ty
sta stka stu ści stki sty
ta tka tu ci tki ty
w wka wu wi wki wy
ły ła łu li łe ły
ny na nu ni ne ny
wy wa wu wi we wy
czy cza czu czy/czowie cze czy
cy ca cu cy ce cy
z zka zu zowie zki zy
1 masc fem neutr mascPl femPl neutrPl
2 b bka bu bi bki by
3 fob fobka fobu fobowie/fobi fobki foby
4 wiec wczyni wcu wcy wczynie wcy
5 ec czyni cu cy czynie cy
6 niec ńczyni ńcu ńcy ńczynie ńcy
7 ca czyni cu cy czynie cy
8 och ocha ochu ochy ochy ochy
9 ch szka chu chy szki chy
10 cz czka czu cze czki czy
11 cz czka czu cze czki czy
12 d dka du dowie dki dy
13 da dka du dzi dki dy
14 graf grafka grafu grafowie grafki grafy
15 f fka fu fowie fki fy
16 g żka gu dzy/gowie żki gi
17 log lożka logu lodzy/logowie lożki logi
18 j jka ju jowie jki i
19 j jka ju je jki i
20 czyk ka ku czycy ki ki
21 tek tka tku tkowie tki tki
22 ik iczka iku icy iczki iki
23 ik iczka/ica iku icy iczki/ice iki
24 ńczyk nka nku ńczycy nki nki
25 yk yczka yku ycy yczki yki
26 ik ica iku icy ice iki
27 ek ka ku kowie ki ki
28 ak aczka aku acy aczki aki
29 ek kini ku kowie kinie ki
30 uk uczka uku ucy uczki yki
31 ok oczka oku oki oczki oki
32 fil filka filu file filki fili
33 ciel cielka cielu ciele cielki cieli
34 l lka lu le lki li
35 ł łka łu łowie łki ły
36 m mka mu mowie mki my
37 n nka nu ni nki ny
38 n nka nu ni nki ny
39 nin nka nku nie nki nki
40 p pka pu pi pki py
41 ar arka aru arzy arki ary
42 ar arki aru arowie arki ary
43 er erka eru erzy erki ery
44 or orka oru orzy orki ory
45 ur urka uru urzy urki yry
46 er erka/era eru erzy erki/ery ery
47 ir irka iru irowie irki iry
48 ór orka oru ory orki ory
49 tra trka/tra tru trzy trki/try try
50 arz arka aru arze arki ary
51 arz ara aru arze ary ary
52 mistrz mistrzyni mistrzu mistrzowie mistrzynie mistrzy
53 erz erka eru erze erki ery
54 s ska su sy ski sy
55 s ska su si ski sy
56 sz szka szu sze szki szy
57 ś sia siu sie sie si
58 nt ntka ntu nci ntki nty
59 t tka tu ci tki ty
60 sta stka stu ści stki sty
61 ta tka tu ci tki ty
62 w wka wu wi wki wy
63 ły ła łu li łe ły
64 ny na nu ni ne ny
65 wy wa wu wi we wy
66 czy cza czu czy/czowie cze czy
67 cy ca cu cy ce cy
68 z zka zu zowie zki zy

View File

@ -61,12 +61,12 @@
<td>
<ul class="list-singular">
<li v-for="w in noun.neutr">
<Declension :word="w" :template="dukajDeclension"/>
<Declension :word="w" :template="noun.declension"/>
</li>
</ul>
<ul class="list-plural">
<li v-for="w in noun.neutrPl">
<Declension :word="w" plural :singularOptions="noun.neutr" :template="dukajDeclension"/>
<Declension :word="w" plural :singularOptions="noun.neutr" :template="noun.declension"/>
</li>
</ul>
</td>
@ -94,6 +94,78 @@
</div>
</details>
<details open class="border mb-3">
<summary class="bg-light p-3">
<h4 class="h5 d-inline">Generator</h4>
</summary>
<div class="border-top p-3">
<p>
Końcówki dukatywów tak regularne, że zamiast pełnego słownika
powinien wystarczyć nawet automatyczny generator.
</p>
<p>
Wpisz poniżej dowolny rzeczownik określający osobę,
<strong>w rodzaju męskim liczby pojedynczej</strong>:
</p>
<div class="form-group">
<input v-model="generatorWord" class="form-control" placeholder="Wpisz rzeczownik w rodzaju męskim liczby pojedynczej"/>
</div>
<table v-if="generatorResult" class="table table-fixed-3">
<thead>
<tr>
<th class="text-nowrap">
<Icon v="mars"/>
<T>nouns.masculine</T>
</th>
<th class="text-nowrap">
<Icon v="venus"/>
<T>nouns.feminine</T>
</th>
<th class="text-nowrap">
<Icon v="neuter"/>
<T>nouns.dukajNouns.label</T>
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<ul class="list-singular">
<li v-for="w in generatorResult.masc">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in generatorResult.mascPl">{{ w }}</li>
</ul>
</td>
<td>
<ul class="list-singular">
<li v-for="w in generatorResult.fem">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in generatorResult.femPl">{{ w }}</li>
</ul>
</td>
<td>
<ul class="list-singular">
<li v-for="w in generatorResult.neutr">
<Declension :word="w" :template="generatorResult.declension"/>
</li>
</ul>
<ul class="list-plural">
<li v-for="w in generatorResult.neutrPl">
<Declension :word="w" :template="generatorResult.declension" plural/>
</li>
</ul>
</td>
</tr>
</tbody>
</table>
<div v-else class="alert alert-warning">
<p class="mb-0">Niestety, podane słowo nie pasuje do żadnego naszego szablonu</p>
</div>
</div>
</details>
<section v-if="sources && Object.keys(sources).length">
<Literature :sources="sources"/>
</section>
@ -104,6 +176,16 @@
import {Noun, NounDeclension, SourceLibrary} from "../../../src/classes";
import {head} from "../../../src/helpers";
import NounsNav from "./NounsNav";
import templates from './dukatywy.tsv';
const dukajDeclension = new NounDeclension({
M: 'u', D: 'u', C: 'u', B: 'u', N: 'um', Msc: 'um', W: 'u',
M_pl: 'y', D_pl: 'ych', C_pl: 'ym', B_pl: 'ych', N_pl: 'ymi', Msc_pl: 'ych', W_pl: 'y',
});
const dukajAdjectiveDeclension = new NounDeclension({
M: 'u', D: 'enu', C: 'ewu', B: 'enu', N: 'um', Msc: 'um', W: 'u',
M_pl: 'y', D_pl: 'ych', C_pl: 'ym', B_pl: 'ych', N_pl: 'ymi', Msc_pl: 'ych', W_pl: 'y',
});
export default {
components: { NounsNav },
@ -114,27 +196,35 @@
id: 'astronauta',
masc: 'astronauta', fem: 'astronautka', neutr: 'astronautu',
mascPl: 'astronauci', femPl: 'astronautki', neutrPl: 'astronauty',
declension: dukajDeclension,
}),
new Noun({
id: 'Europejczyk',
masc: 'Europejczyk', fem: 'Europejka', neutr: 'Europejku',
mascPl: 'Europejczycy', femPl: 'Europejki', neutrPl: 'Europejki',
declension: dukajDeclension,
}),
new Noun({
id: 'przyjaciel',
masc: 'przyjaciel', fem: 'przyjaciółka', neutr: 'przyjaciołu',
mascPl: 'przyjaciele', femPl: 'przyjaciółki', neutrPl: 'przyjacioły',
declension: dukajDeclension,
}),
new Noun({
id: 'twórca',
masc: 'twórca', fem: 'twórczyni', neutr: 'twórcu',
mascPl: 'twórcy', femPl: 'twórczynie', neutrPl: 'twórcy',
declension: dukajDeclension,
}),
new Noun({
id: 'radny',
masc: 'radny', fem: 'radna', neutr: 'radnu',
mascPl: 'radni', femPl: 'radne', neutrPl: 'radny',
declension: dukajAdjectiveDeclension,
}),
],
dukajDeclension: new NounDeclension({
M: 'u', D: 'u', C: 'u', B: 'u', N: 'um', Msc: 'um', W: 'u',
M_pl: 'y', D_pl: 'ych', C_pl: 'ym', B_pl: 'ych', N_pl: 'ymi', Msc_pl: 'ych', W_pl: 'y',
}),
dukajDeclension,
dukajAdjectiveDeclension,
dukajExtendedDeclension: new NounDeclension({
M: 'tenu kosmicznu twórcu',
D: 'tenu kosmicznenu twórcu',
@ -153,6 +243,8 @@
W_pl: 'wy kosmiczny twórcy',
}),
sources: undefined,
templates,
generatorWord: 'fotograf',
}
},
async mounted() {
@ -160,6 +252,48 @@
'': new SourceLibrary(await this.$axios.$get(`/sources?pronoun=dukatywy`)).getForPronoun('dukatywy'),
};
},
computed: {
template() {
let longestMatch = 0;
let matchingTemplates = [];
for (let t of templates) {
if (!this.generatorWord.endsWith(t.masc)) {
continue;
}
if (t.masc.length > longestMatch) {
longestMatch = t.masc.length;
matchingTemplates = [t];
} else if (t.masc.length === longestMatch) {
matchingTemplates.push(t);
}
}
if (!matchingTemplates.length) {
return null;
}
return matchingTemplates[0];
},
generatorResult() {
if (!this.template) {
return null;
}
const root = this.generatorWord.substring(0, this.generatorWord.length - this.template.masc.length);
const result = {id: null};
for (let k in this.template) {
if (!this.template.hasOwnProperty(k)) { continue; }
result[k] = this.template[k].split('/').map(ending => root + ending).join(' / ');
}
result.declension = this.generatorWord.endsWith('y') || this.generatorWord.endsWith('i')
? dukajAdjectiveDeclension
: dukajDeclension;
return new Noun(result);
}
},
head() {
return head({
title: this.$t('nouns.dukajNouns.header'),

View File

@ -566,7 +566,7 @@ export class PronounLibrary {
}
export class Noun {
constructor({id, masc, fem, neutr, mascPl, femPl, neutrPl, sources = null, sourcesData = [], approved = true, base_id = null, author = null}) {
constructor({id, masc, fem, neutr, mascPl, femPl, neutrPl, sources = null, sourcesData = [], approved = true, base_id = null, author = null, declension = null}) {
this.id = id;
this.masc = masc.split('|');
this.fem = fem.split('|');
@ -579,6 +579,7 @@ export class Noun {
this.approved = !!approved;
this.base = base_id;
this.author = author;
this.declension = declension;
}
matches(filter) {