This repository has been archived on 2024-07-22. You can view files and clone it, but cannot push or open issues or pull requests.
Zaimki/pages/index.vue

376 lines
16 KiB
Vue
Raw Normal View History

2020-07-22 13:19:23 -07:00
<template>
<div class="container">
<h1>
<Icon v="tags"/>
Zaimki.pl
</h1>
<section>
<About/>
<p>
2020-08-05 13:10:37 -07:00
<nuxt-link to="/literatura" class="btn btn-outline-primary">
<Icon v="books"/>
2020-08-25 00:43:21 -07:00
Niebinarna polszczyzna w tekstach kultury
</nuxt-link>
</p>
<p>
2020-08-05 13:10:37 -07:00
<nuxt-link to="/neutratywy" class="btn btn-outline-nouns">
<Icon v="atom-alt"/>
Słownik neutratywów
</nuxt-link>
2020-08-25 00:47:28 -07:00
tutaj zbieramy neutralne formy rzeczowników
</p>
2020-07-22 13:19:23 -07:00
</section>
<Separator icon="link"/>
<section>
<p>
Wybierz sposród najpopularniejszych:
</p>
2020-09-08 09:10:04 -07:00
<ul class="list-group">
<li v-for="[group, groupTemplates] in templateLibrary.split()" class="list-group-item">
<p class="h5">
{{ group.name }}
</p>
<div class="small my-1" v-if="group.description">
<Icon v="info-circle"/>
<em>{{ group.description }}</em>
</div>
<ul class="list-unstyled">
<li v-for="template in groupTemplates" :key="template.canonicalName">
<nuxt-link v-if="typeof template === 'string'" :to="'/' + template">
<strong>{{template.replace(/&/g, ' lub ')}}</strong>
</nuxt-link>
<nuxt-link v-else :to="addSlash('/' + template.canonicalName)">
<strong>{{template.name()}}</strong>
<small>{{template.description}}</small>
</nuxt-link>
</li>
</ul>
</li>
</ul>
2020-07-22 13:19:23 -07:00
</section>
2020-07-26 05:52:01 -07:00
<section>
<p>
Wybierz formy wymienne:
</p>
2020-08-06 08:19:13 -07:00
<a v-if="!customiseMultiple" href="#" @click.prevent="customiseMultiple = true" class="btn btn-outline-primary btn-block">
2020-07-26 05:52:01 -07:00
<Icon v="sliders-h-square"/>
Wybierz formy wymienne
</a>
<div v-else class="card mb-5">
<div class="card-header">
<Icon v="sliders-h-square"/>
Formy wymienne:
</div>
<div class="card-body">
<div class="card-title">
<ul class="list-inline d-inline mb-0">
<li class="list-inline-item" v-for="(template, pronoun) in templates">
<button :class="['btn', multiple.includes(pronoun) ? 'btn-primary' : 'btn-outline-primary', 'btn-sm', 'my-1']"
@click="toggleMultiple(pronoun)"
>
{{template.name()}}
</button>
</li>
</ul>
</div>
</div>
<div class="card-footer" v-if="linkMultiple">
<LinkInput :link="linkMultiple"/>
</div>
</div>
</section>
2020-07-22 13:19:23 -07:00
<section>
<p>
Lub dopasuj bardziej szczegółowo:
</p>
2020-08-06 08:19:13 -07:00
<a v-if="!customise" href="#" @click.prevent="customise = true" class="btn btn-outline-primary btn-block">
2020-07-22 13:19:23 -07:00
<Icon v="sliders-h-square"/>
Kreator
</a>
<div v-else class="card mb-5">
<div class="card-header">
<Icon v="sliders-h-square"/>
Kreator
</div>
2020-07-26 05:52:01 -07:00
<div class="card-body">
2020-07-22 13:19:23 -07:00
<div class="card-title border-bottom pb-3">
<ul class="list-inline d-inline mb-0">
<li class="list-inline-item pt-1 h5">
Sugestie:
</li>
<li class="list-inline-item" v-for="(template, pronoun) in templates">
2020-07-26 05:52:01 -07:00
<button :class="['btn', template.name() === selectedTemplate.name() ? 'btn-primary' : 'btn-outline-primary', 'btn-sm', 'my-1']"
2020-07-22 13:19:23 -07:00
@click="selectedTemplate = templates[pronoun].clone()"
>
{{template.name()}}
2020-07-22 13:19:23 -07:00
</button>
</li>
</ul>
</div>
<div class="alert alert-primary">
<p class="h3 mb-0 text-center">
{{ selectedTemplate.name() }}
<br/>
<input v-model="selectedTemplate.description"
class="form-control form-input p-0 form-control-sm"
:size="selectedTemplate.description.length + 3"
maxlength="48"
/>
</p>
</div>
<p>
Przykłady użycia w zdaniu:
</p>
<template v-for="isHonorific in [false, true]">
<ul>
<li v-for="example in examples" v-if="example.isHonorific === isHonorific">
<span v-for="part in example[(isHonorific ? selectedTemplate.pluralHonorific : selectedTemplate.plural) ? 'pluralParts' : 'singularParts']">
<input v-if="part.variable" v-model="selectedTemplate.morphemes[part.str]"
:class="['form-control form-input p-0', {'active': selectedMorpheme === part.str}]"
:size="selectedTemplate.morphemes[part.str] ? selectedTemplate.morphemes[part.str].length : 0"
2020-07-26 05:52:01 -07:00
maxlength="12"
@focus="selectedMorpheme = part.str"
@blur="selectedMorpheme = ''"
/>
<span v-else>{{part.str}}</span>
</span>
</li>
</ul>
<div class="my-3">
<div class="custom-control custom-switch" v-if="isHonorific">
<input type="checkbox" class="custom-control-input" id="pluralHonorific" v-model="selectedTemplate.pluralHonorific">
<label class="custom-control-label" for="pluralHonorific">Liczba mnoga <Icon v="level-up"/></label>
</div>
<div class="custom-control custom-switch" v-else>
<input type="checkbox" class="custom-control-input" id="plural" v-model="selectedTemplate.plural">
<label class="custom-control-label" for="plural">Liczba mnoga <Icon v="level-up"/></label>
</div>
2020-07-22 13:19:23 -07:00
</div>
</template>
2020-07-26 05:52:01 -07:00
<p class="small">
<Icon v="info-circle"/>
Możesz tu również wpisać formy wymienne w każdym polu z osobna, np. <code>jego&jej</code> = jego lub jej.
</p>
<div class="alert alert-warning">
<p class="mb-0 small">
<Icon v="exclamation-triangle"/>
Strona jest w wersji βeta!
Przykłady, formy gramatyczne i linki mogą się jeszcze mocno zmienić!
Jeśli masz jakieś sugestie lub uwagi, daj mi proszę znać
<a href="https://twitter.com/AvrisIT" target="_blank" rel="noopener">na Twitterze</a>
lub
<a href="mailto:andrea@avris.it" target="_blank" rel="noopener">przez maila</a>.
</p>
</div>
2020-07-22 13:19:23 -07:00
</div>
2020-07-26 05:52:01 -07:00
<div class="card-footer" v-if="link">
2020-07-26 04:17:10 -07:00
<LinkInput :link="link"/>
2020-07-22 13:19:23 -07:00
</div>
<div class="card-body border-top" v-if="Object.keys(sources).length">
<Literature :sources="sources"/>
2020-07-22 13:19:23 -07:00
</div>
</div>
</section>
<Separator icon="bookmark"/>
<section>
<h2 class="h3 mb-3">
<Icon v="bookmark"/>
Dodatkowe materiały:
</h2>
<ul class="list-unstyled">
<li class="my-2">
<Icon v="books"/>
<nuxt-link to="/literatura">
2020-08-25 00:43:21 -07:00
Niebinarna polszczyzna w tekstach kultury
2020-07-22 13:19:23 -07:00
</nuxt-link>
przykłady zebrane przez Pawła Dembowskiego.
</li>
2020-07-28 02:46:32 -07:00
<li class="my-2">
2020-07-29 08:01:15 -07:00
<Icon v="globe-europe"/>
<a href="https://pronoun.is/" target="_blank" rel="noopener">
Pronoun.is
</a>
anglojęzyczna inspiracja dla tej strony.
</li>
<li class="my-2">
2020-07-28 02:46:32 -07:00
<Icon v="newspaper"/>
<a href="https://queer.pl/artykul/204685/zaimkipl-strona-jezyk-polski-niebinarnosc" target="_blank" rel="noopener">
Zaimki.pl: powstała strona ułatwiająca dostosowanie języka polskiego osobom niebinarnym. Rozmawialiśmy z jej twórcą i twórczynium
</a>
</li>
2020-08-25 14:38:43 -07:00
<li class="my-2">
<Icon v="radio"/>
<a href="https://pod.co/haloradio/joanna-frejus-2020-08-23-17-00" target="_blank" rel="noopener">
2020-08-25 14:40:04 -07:00
Osoby redaktorskie Słownika Neutratywów u Joanny Frejus w Halo.Radio
2020-08-25 14:38:43 -07:00
</a>
</li>
2020-07-22 13:19:23 -07:00
<li class="my-2">
<Icon v="comment-alt-edit"/>
<a href="https://avris.it/blog/czemu-ka%C5%BCdy-powinien-mie%C4%87-zaimki-w-bio" target="_blank" rel="noopener">
Czemu KAŻDY powinien mieć zaimki w bio
</a>
</li>
<li class="my-2">
<Icon v="comment-alt-edit"/>
<a href="https://avris.it/blog/genderneutralizacja-polszczyzny" target="_blank" rel="noopener">
Genderneutralizacja polszczyzny?
</a>
2020-09-01 07:28:18 -07:00
artykuł opisujący, dlaczego język neutralny płciowo jest ważny,
2020-07-22 13:19:23 -07:00
i zbierający pomysły na stworzenie takiego.
</li>
<li class="my-2">
<Icon v="comment-alt-edit"/>
<a href="https://www.przemyslenia-maniaka.pl/2019/11/maniak-marudzi-27-niebinarne-tumaczenia.html" target="_blank" rel="noopener">
Maniak marudzi #27: Niebinarne tłumaczenia
</a>
2020-07-27 09:27:07 -07:00
artykuł pokazujący, że nie da się przetłumaczyć they/them na polski to tylko wymówka.
2020-07-22 13:19:23 -07:00
</li>
2020-08-23 04:43:59 -07:00
<li class="my-2">
<Icon v="play-circle"/>
<a href="https://www.youtube.com/watch?v=YOEB6Ixp048" target="_blank" rel="noopener">
Nie-binarny język polski seminarium naukowe (Queer UW)
</a>
</li>
<li class="my-2">
<Icon v="facebook" set="b"/>
<a href="https://facebook.com/neutratywy" target="_blank" rel="noopener">
Słownik Neutratywów Języka Polskiego
</a>
</li>
<li class="my-2">
<Icon v="facebook" set="b"/>
<a href="https://facebook.com/slownikempatyczny" target="_blank" rel="noopener">
Słownik Empatyczny Języka Polskiego
</a>
</li>
2020-07-22 13:19:23 -07:00
</ul>
</section>
2020-09-04 08:51:26 -07:00
<ScrollButton/>
2020-07-22 13:19:23 -07:00
</div>
</template>
<script>
2020-09-08 09:10:04 -07:00
import { examples, templates, getSources, templateLibrary } from "~/src/data";
2020-07-22 13:19:23 -07:00
import Compressor from "../src/compressor";
2020-07-24 09:50:33 -07:00
import { getTemplate } from "../src/buildTemplate";
2020-07-22 13:19:23 -07:00
export default {
data() {
return {
examples: examples,
templates: templates,
2020-07-24 09:50:33 -07:00
getTemplate: getTemplate,
2020-09-08 09:10:04 -07:00
templateLibrary: templateLibrary,
2020-07-22 13:19:23 -07:00
selectedTemplate: templates['on'].clone(),
selectedMorpheme: '',
2020-07-26 05:52:01 -07:00
customiseMultiple: false,
multiple: ['on', 'ona'],
2020-07-26 05:52:01 -07:00
2020-07-22 13:19:23 -07:00
customise: false,
}
},
computed: {
usedBase() {
2020-07-24 09:50:33 -07:00
const name = this.selectedTemplate.name();
for (let key in this.templates) {
if (this.templates.hasOwnProperty(key)) {
if (key === name) {
return key;
}
for (let alias of this.templates[key].aliases) {
if (alias === name) {
return key;
}
}
}
}
return null;
},
usedBaseEquals() {
2020-07-24 10:33:46 -07:00
return this.usedBase && this.templates[this.usedBase].equals(this.selectedTemplate);
2020-07-22 13:19:23 -07:00
},
longLink() {
const base = this.templates[this.selectedTemplate.morphemes.pronoun_n];
return base
? Compressor.compress(this.selectedTemplate.toArray(), base.toArray()).join(',')
: this.selectedTemplate.toString();
},
link() {
if (!this.selectedTemplate.pronoun()) {
return null;
}
return this.addSlash(process.env.baseUrl + '/' + (this.usedBaseEquals ? this.usedBase : this.longLink));
2020-07-22 13:19:23 -07:00
},
2020-07-26 05:52:01 -07:00
linkMultiple() {
if (!this.multiple.length) {
return null;
}
return this.addSlash(process.env.baseUrl + '/' + this.multiple.join('&'));
2020-07-26 05:52:01 -07:00
},
sources() {
return getSources(this.selectedTemplate);
},
2020-07-26 05:52:01 -07:00
},
methods: {
toggleMultiple(name) {
const index = this.multiple.indexOf(name);
if (index > -1) {
this.multiple.splice(index, 1);
} else {
this.multiple.push(name);
}
},
addSlash(link) {
return link + (link.substr(link.length - 1) === '*' ? '/' : '');
2020-07-26 05:52:01 -07:00
}
2020-07-22 13:19:23 -07:00
},
}
</script>
<style lang="scss">
@import "assets/style";
.form-input {
text-align: center;
&.active {
@include alert-variant(
theme-color-level('primary', $alert-bg-level),
theme-color-level('primary', $alert-border-level),
theme-color-level('primary', $alert-color-level)
);
}
&.form-control {
width: auto;
display: inline;
}
&[size="0"] {
width: .5rem !important;
}
}
@include media-breakpoint-up('md', $grid-breakpoints) {
.btn-md-lg {
@include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);
}
}
2020-07-22 13:19:23 -07:00
</style>