From fe5cd01d4885d29a96f3beef08014c7bb0b38014 Mon Sep 17 00:00:00 2001 From: Avris Date: Wed, 22 Jul 2020 22:19:23 +0200 Subject: [PATCH] init --- .env.dist | 1 + .gitignore | 90 + Makefile | 14 + README.md | 29 + assets/fonts.scss | 52 + assets/style.scss | 68 + components/About.vue | 35 + components/Footer.vue | 17 + components/Homepage.vue | 16 + components/Icon.vue | 11 + components/Literature.vue | 24 + components/LiteratureMenu.vue | 30 + components/NotFound.vue | 15 + components/Separator.vue | 57 + components/Source.vue | 19 + layouts/default.vue | 14 + nuxt.config.js | 66 + package.json | 26 + pages/_.vue | 92 + pages/index.vue | 239 + pages/literatura.vue | 53 + plugins/vue-matomo.js | 10 + server/banner.js | 46 + src/buildTemplate.js | 12 + src/classes.js | 185 + src/compressor.js | 57 + src/data.js | 404 + static/favicon.svg | 1 + .../fonts/nunito-v13-latin-ext_latin-700.eot | Bin 0 -> 38009 bytes .../fonts/nunito-v13-latin-ext_latin-700.svg | 441 + .../fonts/nunito-v13-latin-ext_latin-700.ttf | Bin 0 -> 85472 bytes .../fonts/nunito-v13-latin-ext_latin-700.woff | Bin 0 -> 40412 bytes .../nunito-v13-latin-ext_latin-700.woff2 | Bin 0 -> 32452 bytes .../nunito-v13-latin-ext_latin-regular.eot | Bin 0 -> 37151 bytes .../nunito-v13-latin-ext_latin-regular.svg | 438 + .../nunito-v13-latin-ext_latin-regular.ttf | Bin 0 -> 83756 bytes .../nunito-v13-latin-ext_latin-regular.woff | Bin 0 -> 39772 bytes .../nunito-v13-latin-ext_latin-regular.woff2 | Bin 0 -> 31852 bytes .../quicksand-v21-latin-ext_latin-700.eot | Bin 0 -> 21758 bytes .../quicksand-v21-latin-ext_latin-700.svg | 457 + .../quicksand-v21-latin-ext_latin-700.ttf | Bin 0 -> 47736 bytes .../quicksand-v21-latin-ext_latin-700.woff | Bin 0 -> 23972 bytes .../quicksand-v21-latin-ext_latin-700.woff2 | Bin 0 -> 18960 bytes .../quicksand-v21-latin-ext_latin-regular.eot | Bin 0 -> 23148 bytes .../quicksand-v21-latin-ext_latin-regular.svg | 446 + .../quicksand-v21-latin-ext_latin-regular.ttf | Bin 0 -> 47908 bytes ...quicksand-v21-latin-ext_latin-regular.woff | Bin 0 -> 25344 bytes ...uicksand-v21-latin-ext_latin-regular.woff2 | Bin 0 -> 19924 bytes static/icon.png | Bin 0 -> 11945 bytes yarn.lock | 8293 +++++++++++++++++ 50 files changed, 11758 insertions(+) create mode 100644 .env.dist create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.md create mode 100644 assets/fonts.scss create mode 100644 assets/style.scss create mode 100644 components/About.vue create mode 100644 components/Footer.vue create mode 100644 components/Homepage.vue create mode 100644 components/Icon.vue create mode 100644 components/Literature.vue create mode 100644 components/LiteratureMenu.vue create mode 100644 components/NotFound.vue create mode 100644 components/Separator.vue create mode 100644 components/Source.vue create mode 100644 layouts/default.vue create mode 100644 nuxt.config.js create mode 100644 package.json create mode 100644 pages/_.vue create mode 100644 pages/index.vue create mode 100644 pages/literatura.vue create mode 100644 plugins/vue-matomo.js create mode 100644 server/banner.js create mode 100644 src/buildTemplate.js create mode 100644 src/classes.js create mode 100644 src/compressor.js create mode 100644 src/data.js create mode 100644 static/favicon.svg create mode 100644 static/fonts/nunito-v13-latin-ext_latin-700.eot create mode 100644 static/fonts/nunito-v13-latin-ext_latin-700.svg create mode 100644 static/fonts/nunito-v13-latin-ext_latin-700.ttf create mode 100644 static/fonts/nunito-v13-latin-ext_latin-700.woff create mode 100644 static/fonts/nunito-v13-latin-ext_latin-700.woff2 create mode 100644 static/fonts/nunito-v13-latin-ext_latin-regular.eot create mode 100644 static/fonts/nunito-v13-latin-ext_latin-regular.svg create mode 100644 static/fonts/nunito-v13-latin-ext_latin-regular.ttf create mode 100644 static/fonts/nunito-v13-latin-ext_latin-regular.woff create mode 100644 static/fonts/nunito-v13-latin-ext_latin-regular.woff2 create mode 100644 static/fonts/quicksand-v21-latin-ext_latin-700.eot create mode 100644 static/fonts/quicksand-v21-latin-ext_latin-700.svg create mode 100644 static/fonts/quicksand-v21-latin-ext_latin-700.ttf create mode 100644 static/fonts/quicksand-v21-latin-ext_latin-700.woff create mode 100644 static/fonts/quicksand-v21-latin-ext_latin-700.woff2 create mode 100644 static/fonts/quicksand-v21-latin-ext_latin-regular.eot create mode 100644 static/fonts/quicksand-v21-latin-ext_latin-regular.svg create mode 100644 static/fonts/quicksand-v21-latin-ext_latin-regular.ttf create mode 100644 static/fonts/quicksand-v21-latin-ext_latin-regular.woff create mode 100644 static/fonts/quicksand-v21-latin-ext_latin-regular.woff2 create mode 100644 static/icon.png create mode 100644 yarn.lock diff --git a/.env.dist b/.env.dist new file mode 100644 index 00000000..108b00b6 --- /dev/null +++ b/.env.dist @@ -0,0 +1 @@ +BASE_URL=http://localhost:3000 diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..e8f682ba --- /dev/null +++ b/.gitignore @@ -0,0 +1,90 @@ +# Created by .ignore support plugin (hsz.mobi) +### Node template +# Logs +/logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# Nuxt generate +dist + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless + +# IDE / Editor +.idea + +# Service worker +sw.* + +# macOS +.DS_Store + +# Vim swap files +*.swp diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..16a5c15d --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ +install: + yarn + +run: + yarn dev + +start: + node_modules/.bin/avris-daemonise start webserver yarn dev + +stop: + node_modules/.bin/avris-daemonise stop webserver + +deploy: install + yarn build diff --git a/README.md b/README.md new file mode 100644 index 00000000..b1948141 --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +# Zaimki + +## Build Setup + +```bash +# install dependencies +$ yarn install + +# configure environment +$ cp .env.dist .env +$ nano .env + +# serve with hot reload at localhost:3000 +$ yarn dev + +# build for production and launch server +$ yarn build +$ yarn start + +# generate static project +$ yarn generate +``` + +For detailed explanation on how things work, check out [Nuxt.js docs](https://nuxtjs.org). + +## Copyright + + * **Author:** Andrea Prusinowski [(Avris.it)](https://avris.it) + * **Licence:** [MIT](https://mit.avris.it) diff --git a/assets/fonts.scss b/assets/fonts.scss new file mode 100644 index 00000000..5c1b3fbd --- /dev/null +++ b/assets/fonts.scss @@ -0,0 +1,52 @@ +/* quicksand-regular - latin-ext_latin */ +@font-face { + font-family: 'Quicksand'; + font-style: normal; + font-weight: 400; + src: url('/fonts/quicksand-v21-latin-ext_latin-regular.eot'); /* IE9 Compat Modes */ + src: local('Quicksand'), + url('/fonts/quicksand-v21-latin-ext_latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('/fonts/quicksand-v21-latin-ext_latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ + url('/fonts/quicksand-v21-latin-ext_latin-regular.woff') format('woff'), /* Modern Browsers */ + url('/fonts/quicksand-v21-latin-ext_latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ + url('/fonts/quicksand-v21-latin-ext_latin-regular.svg#Quicksand') format('svg'); /* Legacy iOS */ +} +/* quicksand-700 - latin-ext_latin */ +@font-face { + font-family: 'Quicksand'; + font-style: normal; + font-weight: 700; + src: url('/fonts/quicksand-v21-latin-ext_latin-700.eot'); /* IE9 Compat Modes */ + src: local('Quicksand'), + url('/fonts/quicksand-v21-latin-ext_latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('/fonts/quicksand-v21-latin-ext_latin-700.woff2') format('woff2'), /* Super Modern Browsers */ + url('/fonts/quicksand-v21-latin-ext_latin-700.woff') format('woff'), /* Modern Browsers */ + url('/fonts/quicksand-v21-latin-ext_latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ + url('/fonts/quicksand-v21-latin-ext_latin-700.svg#Quicksand') format('svg'); /* Legacy iOS */ +} +/* nunito-regular - latin-ext_latin */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 400; + src: url('/fonts/nunito-v13-latin-ext_latin-regular.eot'); /* IE9 Compat Modes */ + src: local('Nunito Regular'), local('Nunito-Regular'), + url('/fonts/nunito-v13-latin-ext_latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('/fonts/nunito-v13-latin-ext_latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ + url('/fonts/nunito-v13-latin-ext_latin-regular.woff') format('woff'), /* Modern Browsers */ + url('/fonts/nunito-v13-latin-ext_latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ + url('/fonts/nunito-v13-latin-ext_latin-regular.svg#Nunito') format('svg'); /* Legacy iOS */ +} +/* nunito-700 - latin-ext_latin */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 700; + src: url('/fonts/nunito-v13-latin-ext_latin-700.eot'); /* IE9 Compat Modes */ + src: local('Nunito Bold'), local('Nunito-Bold'), + url('/fonts/nunito-v13-latin-ext_latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('/fonts/nunito-v13-latin-ext_latin-700.woff2') format('woff2'), /* Super Modern Browsers */ + url('/fonts/nunito-v13-latin-ext_latin-700.woff') format('woff'), /* Modern Browsers */ + url('/fonts/nunito-v13-latin-ext_latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ + url('/fonts/nunito-v13-latin-ext_latin-700.svg#Nunito') format('svg'); /* Legacy iOS */ +} diff --git a/assets/style.scss b/assets/style.scss new file mode 100644 index 00000000..3c34b673 --- /dev/null +++ b/assets/style.scss @@ -0,0 +1,68 @@ +@import "fonts"; +$font-family-sans-serif: Nunito, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default; +$headings-font-family: Quicksand, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default; + +$primary: #C71585; +$alert-border-level: -3; + +$container-max-widths: ( + sm: 540px, + md: 768px, + lg: 769px, + xl: 770px +) !default; + + +@import "~bootstrap/scss/functions"; +@import "~bootstrap/scss/variables"; +@import "~bootstrap/scss/mixins"; +@import "~bootstrap/scss/root"; +@import "~bootstrap/scss/reboot"; +@import "~bootstrap/scss/type"; +//@import "~bootstrap/scss/images"; +//@import "~bootstrap/scss/code"; +//@import "~bootstrap/scss/grid"; +//@import "~bootstrap/scss/tables"; +@import "~bootstrap/scss/forms"; +@import "~bootstrap/scss/buttons"; +//@import "~bootstrap/scss/transitions"; +//@import "~bootstrap/scss/dropdown"; +@import "~bootstrap/scss/button-group"; +@import "~bootstrap/scss/input-group"; +@import "~bootstrap/scss/custom-forms"; +//@import "~bootstrap/scss/nav"; +//@import "~bootstrap/scss/navbar"; +@import "~bootstrap/scss/card"; +//@import "~bootstrap/scss/breadcrumb"; +//@import "~bootstrap/scss/pagination"; +//@import "~bootstrap/scss/badge"; +//@import "~bootstrap/scss/jumbotron"; +@import "~bootstrap/scss/alert"; +//@import "~bootstrap/scss/progress"; +//@import "~bootstrap/scss/media"; +//@import "~bootstrap/scss/list-group"; +//@import "~bootstrap/scss/close"; +//@import "~bootstrap/scss/toasts"; +//@import "~bootstrap/scss/modal"; +//@import "~bootstrap/scss/tooltip"; +//@import "~bootstrap/scss/popover"; +//@import "~bootstrap/scss/carousel"; +//@import "~bootstrap/scss/spinners"; +@import "~bootstrap/scss/utilities"; +@import "~bootstrap/scss/print"; + +$fa-font-path: "~@fortawesome/fontawesome-pro/webfonts"; +@import "~@fortawesome/fontawesome-pro/scss/fontawesome"; +@import "~@fortawesome/fontawesome-pro/scss/light"; +//@import "~@fortawesome/fontawesome-pro/scss/brands"; + +body { + //padding-top: 2rem; + //padding-bottom: 2rem; + margin: 2rem auto; + max-width: min(90vw, 768px); +} + +section { + margin: 2*$spacer 0; +} diff --git a/components/About.vue b/components/About.vue new file mode 100644 index 00000000..f7ca16f2 --- /dev/null +++ b/components/About.vue @@ -0,0 +1,35 @@ + diff --git a/components/Footer.vue b/components/Footer.vue new file mode 100644 index 00000000..b1663eaa --- /dev/null +++ b/components/Footer.vue @@ -0,0 +1,17 @@ + diff --git a/components/Homepage.vue b/components/Homepage.vue new file mode 100644 index 00000000..c6364f9b --- /dev/null +++ b/components/Homepage.vue @@ -0,0 +1,16 @@ + + + diff --git a/components/Icon.vue b/components/Icon.vue new file mode 100644 index 00000000..c025ed28 --- /dev/null +++ b/components/Icon.vue @@ -0,0 +1,11 @@ + + + diff --git a/components/Literature.vue b/components/Literature.vue new file mode 100644 index 00000000..126ba1ea --- /dev/null +++ b/components/Literature.vue @@ -0,0 +1,24 @@ + + + diff --git a/components/LiteratureMenu.vue b/components/LiteratureMenu.vue new file mode 100644 index 00000000..209f01f3 --- /dev/null +++ b/components/LiteratureMenu.vue @@ -0,0 +1,30 @@ + + + diff --git a/components/NotFound.vue b/components/NotFound.vue new file mode 100644 index 00000000..1665ff93 --- /dev/null +++ b/components/NotFound.vue @@ -0,0 +1,15 @@ + diff --git a/components/Separator.vue b/components/Separator.vue new file mode 100644 index 00000000..3565a841 --- /dev/null +++ b/components/Separator.vue @@ -0,0 +1,57 @@ + + + + + + diff --git a/components/Source.vue b/components/Source.vue new file mode 100644 index 00000000..a5c6332a --- /dev/null +++ b/components/Source.vue @@ -0,0 +1,19 @@ + + + diff --git a/layouts/default.vue b/layouts/default.vue new file mode 100644 index 00000000..db09dd12 --- /dev/null +++ b/layouts/default.vue @@ -0,0 +1,14 @@ + + + diff --git a/nuxt.config.js b/nuxt.config.js new file mode 100644 index 00000000..8083ff62 --- /dev/null +++ b/nuxt.config.js @@ -0,0 +1,66 @@ +/* + + + + + + + + + + + + + */ + +const title = 'Zaimki.pl'; +const description = 'To narzędzie udostępnia linki do przykładów użycia (w prostych zdaniach oraz w literaturze i prasie) zaimków i innych form płciowych – nie tylko normatywnych „on” i „ona”, lecz także form niebinarnych.'; +const banner = process.env.BASE_URL + '/banner/zaimki.png'; + +export default { + mode: 'universal', + target: 'server', + head: { + title: title, + meta: [ + { charset: 'utf-8' }, + + { hid: 'description', name: 'description', content: description }, + + { name: 'viewport', content: 'width=device-width, initial-scale=1' }, + { hid: 'apple-mobile-web-app-title', name: 'apple-mobile-web-app-title', content: title }, + { hid: 'theme-color', name: 'theme-color', content: '#C71585' }, + + { hid: 'og:type', property: 'og:type', content: 'article' }, + { hid: 'og:title', property: 'og:title', content: title }, + { hid: 'og:description', property: 'og:description', content: description }, + { hid: 'og:site_name', property: 'og:site_name', content: title }, + { hid: 'og:logo', property: 'og:logo', content: banner }, + + { hid: 'twitter:card', property: 'twitter:card', content: 'summary_large_image' }, + { hid: 'twitter:title', property: 'twitter:title', content: title }, + { hid: 'twitter:description', property: 'twitter:description', content: description }, + { hid: 'twitter:site', property: 'twitter:site', content: process.env.BASE_URL }, + { hid: 'twitter:image', property: 'twitter:image', content: banner }, + ], + link: [ + { rel: 'icon', type: 'image/svg', href: '/favicon.svg' } + ], + }, + css: [], + plugins: [ + { src: '~/plugins/vue-matomo.js', ssr: false }, + ], + components: true, + buildModules: [], + modules: [ + '@nuxtjs/pwa', + ], + build: {}, + env: { + baseUrl: process.env.BASE_URL + }, + serverMiddleware: { + '/banner': '~/server/banner.js', + }, +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..24f1ccaa --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "avris-zaimki", + "version": "1.0.0", + "private": true, + "scripts": { + "dev": "nuxt", + "build": "nuxt build", + "start": "nuxt start", + "export": "nuxt export", + "serve": "nuxt serve" + }, + "dependencies": { + "@nuxtjs/pwa": "^3.0.0-beta.20", + "canvas": "^2.6.1", + "nuxt": "^2.13.0", + "vue-matomo": "^3.13.5-0" + }, + "devDependencies": { + "@fortawesome/fontawesome-pro": "git+ssh://git@gitlab.com:Avris/FontAwesomePro.git", + "avris-daemonise": "^0.0.2", + "bootstrap": "^4.5.0", + "clipboard": "^2.0.6", + "sass": "^1.26.10", + "sass-loader": "^9.0.2" + } +} diff --git a/pages/_.vue b/pages/_.vue new file mode 100644 index 00000000..57a42628 --- /dev/null +++ b/pages/_.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/pages/index.vue b/pages/index.vue new file mode 100644 index 00000000..0247672f --- /dev/null +++ b/pages/index.vue @@ -0,0 +1,239 @@ + + + + + diff --git a/pages/literatura.vue b/pages/literatura.vue new file mode 100644 index 00000000..57493ae9 --- /dev/null +++ b/pages/literatura.vue @@ -0,0 +1,53 @@ + + + diff --git a/plugins/vue-matomo.js b/plugins/vue-matomo.js new file mode 100644 index 00000000..0b2cd388 --- /dev/null +++ b/plugins/vue-matomo.js @@ -0,0 +1,10 @@ +import Vue from 'vue' +import VueMatomo from 'vue-matomo' + +export default ({ app }) => { + Vue.use(VueMatomo, { + router: app.router, + host: 'https://matomo.avris.it', + siteId: 20, + }) +} diff --git a/server/banner.js b/server/banner.js new file mode 100644 index 00000000..3d3842aa --- /dev/null +++ b/server/banner.js @@ -0,0 +1,46 @@ +import buildTemplate from "../src/buildTemplate"; +import { createCanvas, registerFont, loadImage } from 'canvas'; + +export default async function (req, res, next) { + if (req.url.substr(req.url.length - 4) !== '.png') { + res.statusCode = 404; + res.write('Not found'); + res.end(); + return; + } + const template = buildTemplate(decodeURIComponent(req.url.substr(1, req.url.length - 5))); + + const width = 1200 + const height = 600 + const mime = 'image/png'; + const imageSize = 200; + const leftRatio = template ? 4 : 5; + + registerFont('static/fonts/quicksand-v21-latin-ext_latin-regular.ttf', { family: 'Quicksand', weight: 'regular'}); + registerFont('static/fonts/quicksand-v21-latin-ext_latin-700.ttf', { family: 'Quicksand', weight: 'bold'}); + + const canvas = createCanvas(width, height) + const context = canvas.getContext('2d') + + context.fillStyle = '#fff' + context.fillRect(0, 0, width, height) + context.fillStyle = '#000' + + const image = await loadImage('node_modules/@fortawesome/fontawesome-pro/svgs/light/tags.svg'); + context.drawImage(image, width / leftRatio - imageSize / 2, height / 2 - imageSize / 1.25 / 2, imageSize, imageSize / 1.25) + + if (template) { + context.font = 'regular 48pt Quicksand' + context.fillText('Moje zaimki to:', width / leftRatio + imageSize / 1.5, height / 2 - 36) + + context.font = 'bold 70pt Quicksand' + context.fillText(template.name(), width / leftRatio + imageSize / 1.5, height / 2 + 72) + } else { + context.font = 'regular 120pt Quicksand' + context.fillText('Zaimki.pl', width / leftRatio + imageSize / 1.5, height / 2 + 48) + } + + res.setHeader('content-type', mime); + res.write(canvas.toBuffer(mime)); + res.end() +} diff --git a/src/buildTemplate.js b/src/buildTemplate.js new file mode 100644 index 00000000..56a60232 --- /dev/null +++ b/src/buildTemplate.js @@ -0,0 +1,12 @@ +import {Template} from "./classes"; +import Compressor from "./compressor"; +import {templates} from "./data"; + +export default (path) => { + const templateStr = path.split(','); + const base = templates[templateStr[0]] + + return templateStr.length === 1 + ? templates[templateStr[0]] + : Template.from(Compressor.uncompress(templateStr, base ? base.toArray() : null)); +} diff --git a/src/classes.js b/src/classes.js new file mode 100644 index 00000000..dfad1908 --- /dev/null +++ b/src/classes.js @@ -0,0 +1,185 @@ +export class ExamplePart { + constructor(variable, str) { + this.variable = variable; + this.str = str; + } + + format(form) { + if (!this.variable) { + return this.str[form.plural]; + } + + return form[this.str[form.plural]]; + } +} + +export class Example { + constructor(singularParts, pluralParts) { + this.parts = { + false: singularParts, + true: pluralParts, + }; + } + + static parse(str) { + const versions = str.split('|'); + return new Example( + Example._parse(versions[0]), + Example._parse(versions[versions.length > 1 ? 1 : 0]) + ); + } + + static _parse(str) { + const parts = []; + let lastPosition = 0; + + for (let m of str.matchAll(/{([a-z_]+)}/g)) { + const textBefore = str.substr(lastPosition, m.index - lastPosition); + if (textBefore.length) { + parts.push(new ExamplePart(false, textBefore)); + } + parts.push(new ExamplePart(true, m[0].substr(1, m[0].length - 2))); + lastPosition = m.index + m[0].length; + } + + const textAfter = str.substr(lastPosition); + if (textAfter.length) { + parts.push(new ExamplePart(false, textAfter)); + } + + return parts; + } + + format(form) { + return Example.ucfirst(this.parts.map(part => part.format(form)).join('')); + } + + static ucfirst(str) { + return str[0].toUpperCase() + str.slice(1); + } +} + +function clone(mainObject) { + let objectCopy = {}; + for (let key in mainObject) { + if (mainObject.hasOwnProperty(key)) { + objectCopy[key] = mainObject[key]; + } + } + return objectCopy; +} + +export class Source { + constructor (author, title, extra, year, fragments = [], comment = null, link = null) { + this.author = author; + this.title = title; + this.extra = extra; + this.year = year; + this.fragments = fragments; + this.comment = comment; + this.link = link; + } + + icon() { + return 'circle'; + } +} + +export class Book extends Source { + icon() { + return 'book-open'; + } +} + +export class Article extends Source { + icon() { + return 'newspaper'; + } +} + +export const morphemes = [ + 'pronoun_n', + 'pronoun_g', + 'pronoun_g_acc', + 'pronoun_d', + 'pronoun_a', + 'pronoun_i', + 'pronoun_l', + 'pronoun_all', + 'adjective_n', + 'adjective_ll', + 'adjective_middle', + 'verb_end', + 'verb_middle', + 'verb_nasal', + 'verb_go', + 'verb_o', + 'honorific', +]; + +const escape = s => { + return (s || '') + .replace(',', '') + .replace('!', '') + .replace('.', '') + //.replace('/', '%2F') + .replace('#', '%23') + .replace('?', '%3F') + .replace('&', '%26'); +} + +export class Template { + constructor (description, morphemes, plural, sources = []) { + this.description = description; + this.morphemes = morphemes + this.plural = plural; + this.sources = sources; + } + + pronoun() { + return this.morphemes['pronoun_n']; + } + + name() { + return this.morphemes['pronoun_n'] + '/' + this.morphemes['pronoun_g']; + } + + clone() { + return new Template(this.description, clone(this.morphemes), this.plural); + } + + equals(other) { + return this.toString() === other.toString(); + } + + toArray() { + return [ + ...Object.values(this.morphemes).map(s => escape(s)), + this.plural ? 1 : 0, + escape(this.description), + ]; + } + + toString() { + return this.toArray().join(','); + } + + static from(data) { + if (data.length !== morphemes.length + 2 + || data[0].length === 0 + || data[data.length - 1].length > 48 + || data[data.length - 2].length === 0 + || ![0, 1].includes(parseInt(data[morphemes.length])) + || data.slice(1, data.length - 2).filter(s => s.length > 7).length + ) { + return null; + } + + const m = {} + for (let i in morphemes) { + m[morphemes[parseInt(i)]] = data[parseInt(i)]; + } + + return new Template(data[data.length - 1], m, parseInt(data[morphemes.length]) === 1) + } +} diff --git a/src/compressor.js b/src/compressor.js new file mode 100644 index 00000000..ad46210c --- /dev/null +++ b/src/compressor.js @@ -0,0 +1,57 @@ +export default class Compressor { + static compress(data, base) { + const dataFirst = data[0]; + const dataRest = data.slice(1); + const baseFirst = base[0]; + const baseRest = base.slice(1); + + if (dataFirst !== baseFirst || dataRest.length !== baseRest.length) { + throw 'Cannot compress data, format does not match the base'; + } + + const compressed = []; + let stack = []; + for (let i in dataRest) { + if (dataRest[i] === baseRest[i]) { + stack.push(dataRest[i]); + continue; + } + + if (stack.length) { + compressed.push('!' + stack.length); + } + stack = []; + compressed.push(dataRest[i]); + } + if (stack.length) { + compressed.push('!' + stack.length); + } + + return [dataFirst, ...compressed]; + } + + static uncompress(data, base) { + if (!base) { + return data; + } + + const uncompressed = []; + let i = 0; + for (let piece of data) { + const m = piece.match(/^!(\d+)$/) + if (!m) { + uncompressed.push(piece); + i++; + continue; + } + + let skipped = parseInt(m[1]); + while(skipped--) { + uncompressed.push(base[i]); + i++; + } + } + + return uncompressed; + } +} diff --git a/src/data.js b/src/data.js new file mode 100644 index 00000000..b44e9053 --- /dev/null +++ b/src/data.js @@ -0,0 +1,404 @@ +import { Article, Book, Example, Template } from './classes' + +export const examples = [ + Example.parse('Myślę, że {pronoun_n} jest bardzo mił{adjective_n}.|Myślę, że {pronoun_n} są bardzo mi{adjective_ll}{adjective_n}'), + Example.parse('Tęsknię za {pronoun_g} śmiechem.'), + Example.parse('Napiszę do {pronoun_g_acc} później'), + Example.parse('Powiedział{verb_middle}m {pronoun_d}, że {pronoun_a} lubię.|Powiedzi{verb_middle}śmy {pronoun_d}, że {pronoun_a} lubimy.'), + Example.parse('Chciał{verb_end}bym pójść do kina.|Chci{verb_middle}byśmy pójść do kina.'), + Example.parse('Czy będziesz grał{verb_end} z nami?|Czy będziecie gra{verb_end} z nami?'), + Example.parse('Kiedy będziesz m{verb_o}gł{verb_end} się z nami spotkać?|Kiedy będziecie m{verb_o}g{verb_end} się z nami spotkać?'), + Example.parse('Gdy był{verb_middle}m w domu, zacz{verb_nasal}ł{verb_middle}m gotować.|Gdy by{verb_end}śmy w domu, zacz{verb_nasal}śmy gotować.'), + Example.parse('Dostał{verb_middle}m wyniki egzaminu i jestem z nich zadowolon{adjective_n}.|Dosta{verb_end}śmy wyniki egzaminu i jesteśmy z nich zadowol{adjective_middle}n{adjective_n}.'), + Example.parse('Po{verb_go}{verb_middle}m z {pronoun_i} do szkoły.|Po{verb_go}śmy z {pronoun_i} do szkoły.'), + Example.parse('Rozmawialiśmy o {pronoun_l} ostatnio.'), + Example.parse('Każd{adjective_n} z nich chciał{verb_end} czego innego.|Wszys{pronoun_all} z nich chci{verb_middle} czego innego.'), + Example.parse('To miło, że nas {honorific} odwiedził{verb_end}.|To miło, że nas {honorific} odwiedzi{verb_end}.'), +]; + +export const templates = { + on: new Template('Rodzaj męski', { + 'pronoun_n': 'on', + 'pronoun_g': 'jego', + 'pronoun_g_acc': 'niego', + 'pronoun_d': 'mu', + 'pronoun_a': 'go', + 'pronoun_i': 'nim', + 'pronoun_l': 'nim', + 'pronoun_all': null, + 'adjective_n': 'y', + 'adjective_ll': null, + 'adjective_middle': null, + 'verb_end': '', + 'verb_middle': 'e', + 'verb_nasal': 'ą', + 'verb_go': 'szedł', + 'verb_o': 'ó', + 'honorific': 'pan', + }, false), + ona: new Template('Rodzaj żeński', { + 'pronoun_n': 'ona', + 'pronoun_g': 'jej', + 'pronoun_g_acc': 'niej', + 'pronoun_d': 'jej', + 'pronoun_a': 'ją', + 'pronoun_i': 'nią', + 'pronoun_l': 'niej', + 'pronoun_all': null, + 'adjective_n': 'a', + 'adjective_ll': null, + 'adjective_middle': null, + 'verb_end': 'a', + 'verb_middle': 'a', + 'verb_nasal': 'ę', + 'verb_go': 'szł', + 'verb_o': 'o', + 'honorific': 'pani', + }, false), + ono: new Template('Rodzaj nijaki', { + 'pronoun_n': 'ono', + 'pronoun_g': 'jego', + 'pronoun_g_acc': 'niego', + 'pronoun_d': 'mu', + 'pronoun_a': 'go', + 'pronoun_i': 'nim', + 'pronoun_l': 'nim', + 'pronoun_all': null, + 'adjective_n': 'e', + 'adjective_ll': null, + 'adjective_middle': null, + 'verb_end': 'o', + 'verb_middle': 'o', + 'verb_nasal': 'ę', + 'verb_go': 'szł', + 'verb_o': 'o', + 'honorific': 'pań', + }, false, [ + new Article( + 'Małgorzata Goślińska', + 'Zrobimy z ciebie mężczyznę', + 'w: „Magazyn TVN24”', + 2019, + [ + 'Milo nie miało myśli erotycznych. Tak boleśnie myślało o własnym ciele, że nie potrafiło myśleć o nim w towarzystwie innych ciał. Ale żeby zmienić ciało, musiało odpowiedzieć u psychologa na pytania: Od kiedy się masturbujesz? Jak to robisz? O czym wtedy myślisz? W jakiej pozycji uprawiasz seks? Jak się całujesz? Milo było rozdarte, nie lubiło kłamać.', + 'Przez jeden dzień Milo się cieszyło. Ale to był krok w bok. Milo nie posunęło się do przodu w kierunku tranzycji prawnej ani medycznej. Uznali imię, nie tożsamość. W dowodzie pozostała literka M. Milo było osobą niebinarną, ale z dwojga złego wolałoby literkę K. Było rozdarte. Nie lubiło swojego męskiego ciała, dlatego postanowiło przejść tranzycję. Ale nie po to wyrwało się z klatki chłopca, żeby wejść w kolejną klatkę. Chciało być sobą.', + ], + 'Milo - historia życia i śmierci', + 'https://tvn24.pl/magazyn-tvn24/zrobimy-z-ciebie-mezczyzne,242,4189' + ), + new Book( + 'Bartek Biedrzycki', + 'Confirmatio Vir Llamki, albo o wizycie Nieziemca Macka Simma na Starej Ziemi', + 'w: „Dzieje się”', + 2018, + ['Usiedli. Vir wskoczyło na łóżko i zainstalowało się tam po turecku, Simm przysiadł na obrotowym krześle przy biurku.\n– Jak dorosnę, to chcę polecieć na Marsa.\n– Przecież już byłoś u mnie dwa razy.\n– Ale ja chcę na stałe'], + ), + new Book( + 'Anna Kańtoch', + 'Niepełnia', + '', + 2017, + ['Ale Sło­neczko oczy­wi­ście chciało, i to bar­dzo. Chciało i bało się jed­no­cze­śnie, ponie­waż wie­rzyło matce. Świat na zewnątrz był piękny, ale też okrutny – zwłasz­cza dla takich jak ono. Bo Sło­neczko, choć nikt ni­gdy nie powie­dział mu tego wyraź­nie, wie­działo, że różni się od zwy­czaj­nych dzieci, a ludzie nie lubią tego, co inne.'], + ), + new Book( + 'Marta Kisiel', + 'Dożywocie', + '', + 2010, + ['Starało się zrobić wrażenie bardzo zasmuconego i stanowczego jednocześnie, aczkolwiek nie wzięło pod uwagę faktu, że wygląd trochę wchodzi mu w paradę. Owszem, peleryna świetnie maskowała skrzydła, ale poza tym była zdecydowanie zbyt wielka na jedno małe Licho.'], + ), + new Book( + 'Marta Kisiel', + 'Małe Licho i tajemnica Niebożątka', + '', + 2018, + ), + new Book( + 'Marta Kisiel', + 'Małe Licho i anioł z kamienia', + '', + 2019, + ), + new Book( + 'Marta Kisiel', + 'Siła niższa', + '', + 2016, + ['– Ja co prawda słabo znam gościa - odparł po kilku chwilach - ale tak sobie myślę, że on to nie lubi nikogo. \n– Nawet swojego człowieka? Przecież jest aniołem stróżem. Ja swoich zawsze lubiłom. Jak miałobym im stróżować bez lubienia?'], + ), + new Book( + 'Maja Lidia Kossakowska', + 'Siewca wiatru', + '', + 2004, + ), + new Book( + 'Yoon Ha Lee', + 'Smocza perła', + 'tłumaczenie: Agnieszka Fulińska i Aleksandra Klęczar', + 2019, + ['– Idzie ci lepiej niż zwykle – oznajmiło w końcu Sujin. Nie zauważyłam, że pogrążone w lekturze książki dotyczącej chemii zwracało na nas w ogóle uwagę.'], + ), + new Book( + 'Stanisław Lem', + 'Maska', + 'w zbiorze „Maska”', + 1976, + ), + new Book( + 'Anna Łagan', + 'Ekonomia to dolina niesamowitości', + 'w: „Skafander i melonik”', + 2018, + ['– Oczywiście – zgodziło się Manu. – Właśnie przeprowadziłom analizę skutków obniżenia moich cen i mimo że widzę wiele niedogodności i nieprzyjemnych konsekwencji, rozumiem, że jak p. powiedział, jest to na ten moment najlepsze rozwiązanie problemu. Zgadzam się na zmianę umowy i obniżenie kosztów… Oto cena, którą p. proponuję.'], + ), + new Book( + 'Ian McDonald', + 'Rzeka bogów', + 'tłumaczenie: Wojciech Próchniewicz', + 2010, + ['Poznali się, ślub, sześć miesięcy później - ja. I zanim zapytasz: nie. Byłom jedynakiem. Moi rodzice byli atrakcją na Chowpatty Beatch. Brali mnie na wszystkie imprezy, byłom prawdziwą ozdobą.'], + ), + new Book( + 'Ada Palmer', + 'Do błyskawicy podobne', + 'tłumaczenie: Michał Jakuszewski', + 2019, + ), + new Book( + 'Ada Palmer', + 'Siedem kapitulacji', + 'tłumaczenie: Michał Jakuszewski', + 2019, + ), + new Book( + 'Joanna Krystyna Radosz', + 'Listopad bez snów', + 'w: „Tęczowe i fantastyczne”', + 2020, + ['Gdy je otwieram, rozlega się zgrzyt zamka w drzwiach, przedpokój zalewa fala światła, a z głębi mieszkania dobiega lekko bełkotliwy głos Mady:\n– ...a ja byłom jak: kupiliśmy trzyosobowy materac, a ty gardzisz!'] + ), + new Book( + 'Aleksandra Stanisz', + 'Ofiara', + 'w: „Umieranie to parszywa robota”', + 2019, + ), + new Book( + 'A. Szydlik', + 'Jak uratować kotka z nawiedzonego domu', + 'w: „Tęczowe i fantastyczne”', + 2020, + ['Znalazłom ten portfel na przystanku, wciśnięty między krzesełka. Podniosłom go, trochę bezmyślnie, trochę dla zabicia czasu. Autobus miał przyjechać za kwadrans. Mogłom co prawda iść piechota ̨, ale było ciemno, zimno i lało, a ja byłom bardzo zmęczone. Usiadłom więc na plastikowym krzesełku i otworzyłom portfel.'], + ), + ]), + onu: new Template('Rodzaj postpłciowy, dukaizmy', { + 'pronoun_n': 'onu', + 'pronoun_g': 'jenu', + 'pronoun_g_acc': 'nienu', + 'pronoun_d': 'nu', + 'pronoun_a': 'nu', + 'pronoun_i': 'num', + 'pronoun_l': 'num', + 'pronoun_all': null, + 'adjective_n': 'u', + 'adjective_ll': null, + 'adjective_middle': null, + 'verb_end': 'u', + 'verb_middle': 'u', + 'verb_nasal': 'ę', + 'verb_go': 'szł', + 'verb_o': 'o', + 'honorific': 'panu', + }, false, [ + new Article( + 'Rozmowa Ewy Tomaszewicz', + 'Magdalenę Stonawską i Loë Fjorsigviss łączy nie tylko miłość, ale też pasja: obie lewicują fanów na konwentach fantastycznych.', + 'w: „Replika” #83', + 2020, + ['– Powiedzcie kilka słów o sobie.\n' + + 'MS: Nazywam się Magdalena Stonawska i lewicuję fanów fantastyki, to znaczy staram się wpuszczać do życia fandomu tematykę tęczowo-równościową, której jest tam moim zdaniem za mało.\n' + + 'LF: Mnie wszyscy znają jako Loë Fjorsigviss. Organizuję konwenty fantastyczne od prawie pięciu lat. Lewicowanie fandomu przyszło mi naturalnie.\n' + + '– Loë, ty osobą niebinarną, prawda?\n' + + 'LF: Tak, nic jestem dziewczynką. I zdecydowanie nie jestem chłopcem\n.' + + '– Jak powinnam do ciebie mówić?\n' + + 'LF: Formy żeńskie są w porządku, używam ich z przyzwyczajenia, ale coraz częściej korzystam też z zaimków „dukajowych”.\n' + + '– Czyli?\n' + + 'LF: Jacek Dukaj w „Perfekcyjnej niedoskonałości” opisał postaci postludzkie (Post Haman Being, phoebe), które nie miały fizycznego ciała i ukazywały się w formie hologramów. Używały neutralnych zaimków. Dukaj nie chciał używać zaimków nijakich, więc stworzył formy z „u”: „onu zrobiłu”, „jenu sprawa” itp. Obecnie to jedna z opcji coraz chętniej wybieranych przez osoby niebinarne w Polsce.\n' + + '– Na pewno zdarzyło ci się dyszeć, że wymyślanie kolejnych form i zaimków to jakaś fanaberia. Dlaczego to, jak się do ciebie zwracają inni, jest ważne?\n' + + 'LF: Od kiedy pamiętam, uwierało mnie mówienie o sobie jako o dziewczynie czy kobiecie. Nie utożsamiałum się z tym. Zorientowałum się, że mogę nie być kobietą, nie ze względu na dysforię płciową, tylko ze względu na euforię. Kiedy dopuściłum do siebie myśl, że są inne opcje, zaczęłum esksperymentować i poprosiłum parę znajomych osób, żeby spróbowały tak się do mnie zwracać. Gdy zaczęły tak do mnie mówić, poczułum ogromną ulgę. Kiedy mówię o sobie, ta inna forma przychodzi mi z trudem, ciągle samu mam z nią problem, ale to uczucie, kiedy inni mówią o mnie w ten sposób, powiedziało mi, że to może być faktycznie dobry kierunek, że nie jestem dziewczyną ani chłopakiem, ale kimś poza tym. I to było naprawdę wspaniałe i wyzwalające uczucie.'], + '', + 'https://replika-online.pl/spis-tresci-83/', + ), + new Book( + 'Jacek Dukaj', + 'Perfekcyjna niedoskonałość', + '', + 2003, + ['– Do Creytona powinniśmy dotrzeć w ciągu trzydziestu ośmiu k-godzin. Nawet zważywszy na utratę krwi pana i stahs McPherson– \n– Chciałuś powiedzieć – przerwał nu Zamoyski – powinniśmy byli tam dotrzeć. Samu twierdzisz, że po odcięciu od Plateau nie wiesz nawet, w którą stronę lecimy. Swoją drogą, zastanawiam się, jak to możliwe. Przecież chyba pamiętasz, gdzie celowałuś.'], + ), + new Book( + 'Ginny Nawrocka', + 'Cierpki zapach kosmosu', + 'w: „Tęczowe i fantastyczne”', + 2020, + ['Ja, Gosia, Ewa i Jacek. Gosia była najmłodsza... Jest najmłodsza. Jacek jest z tego samego roku, co ja, ale onu urodziłu się na początku, a ja pod koniec. A Ewa jest pięć lat starszy ode mnie.'], + 'oprócz tego także postaci niebinarne używające męskich i żeńskich form', + ), + new Book( + 'Artur Nowrot', + 'Smocze dziecko', + 'w: „Tęczowe i fantastyczne”', + 2020, + ['Yare robiłu jednak, co w jenu mocy, by zadowolić rodziców i starszyznę, wykonywać bez zwłoki polecenia, nie zaniedbywać obowiązków i za bardzo nie narzekać.'], + 'przymiotniki w formie nijakiej', // TODO separate? + ), + new Book( + 'Kelly Robson', + 'Interwencja', + 'w: „Nowa Fantastyka” 5/2020; tłumaczenie: Paweł Dembowski', + 2020, + ['Émeraude odpięłu się i pokazału palec lekarce. Przełączału się między dwoma trybami – wszystko albo nic. Kilka miesięcy temu doznału kontuzji, naciągając mocno ścięgno zginacza.'], + ), + ]), + oni: new Template('Formy męskoosobowe liczby mnogiej', { + 'pronoun_n': 'oni', + 'pronoun_g': 'ich', + 'pronoun_g_acc': 'nich', + 'pronoun_d': 'im', + 'pronoun_a': 'ich', + 'pronoun_i': 'nimi', + 'pronoun_l': 'nich', + 'pronoun_all': 'cy', + 'adjective_n': 'i', + 'adjective_ll': 'l', + 'adjective_middle': 'e', + 'verb_end': 'li', + 'verb_middle': 'eli', + 'verb_nasal': 'ęli', + 'verb_go': 'szli', + 'verb_o': 'o', + 'honorific': 'państwo', + }, true, [ + new Book('Karolina Fedyk', 'Skrzydła', '', 2019), + new Book('Weronika Mamuna', 'Obca, która była', 'w: „Tęczowe i fantastyczne”', 2020), + new Book('Agnieszka Żak', 'Dorastanie w czasach cyborgizacji', 'w: „Tęczowe i fantastyczne”', 2020), + ]), + one: new Template('Formy niemęskoosobowe liczby mnogiej', { + 'pronoun_n': 'one', + 'pronoun_g': 'ich', + 'pronoun_g_acc': 'nich', + 'pronoun_d': 'im', + 'pronoun_a': 'je', + 'pronoun_i': 'nimi', + 'pronoun_l': 'nich', + 'pronoun_all': 'tkie', + 'adjective_n': 'e', + 'adjective_ll': 'ł', + 'adjective_middle': 'o', + 'verb_end': 'ły', + 'verb_middle': 'ały', + 'verb_nasal': 'ęły', + 'verb_go': 'szły', + 'verb_o': 'o', + 'honorific': 'państwo', + }, true, [ + new Book('Artur Nowrot', 'Smocze dziecko', 'w: „Tęczowe i fantastyczne”', 2020), + ]), + onx: new Template('Formy z iksem', { + 'pronoun_n': 'onx', + 'pronoun_g': 'jex', + 'pronoun_g_acc': 'nix', + 'pronoun_d': 'jex', + 'pronoun_a': 'jex', + 'pronoun_i': 'nix', + 'pronoun_l': 'nix', + 'pronoun_all': null, + 'adjective_n': 'x', + 'adjective_ll': null, + 'adjective_middle': null, + 'verb_end': 'x', + 'verb_middle': 'x', + 'verb_nasal': 'ę', + 'verb_go': 'szł', + 'verb_o': 'o', + 'honorific': 'panx', + }, false, []), + on_: new Template('Formy z podkreślnikiem', { + 'pronoun_n': 'on_', + 'pronoun_g': 'je_', + 'pronoun_g_acc': 'ni_', + 'pronoun_d': 'je_', + 'pronoun_a': 'je_', + 'pronoun_i': 'ni_', + 'pronoun_l': 'ni_', + 'pronoun_all': null, + 'adjective_n': '_', + 'adjective_ll': null, + 'adjective_middle': null, + 'verb_end': '_', + 'verb_middle': '_', + 'verb_nasal': 'ę', + 'verb_go': 'szł', + 'verb_o': 'o', + 'honorific': 'pan_', + }, false, [ + new Book('R.S. Benedict', 'Moje angielskie imię', 'w: „Nowa Fantastyka 3/2019', 2019), + ]), + vono: new Template('Rodzaj nijaki z neozaimkami vono/viego', { + 'pronoun_n': 'vono', + 'pronoun_g': 'viego', + 'pronoun_g_acc': 'viego', + 'pronoun_d': 'vu', + 'pronoun_a': 'vo', + 'pronoun_i': 'vim', + 'pronoun_l': 'vim', + 'pronoun_all': null, + 'adjective_n': 'e', + 'adjective_ll': null, + 'adjective_middle': null, + 'verb_end': 'o', + 'verb_middle': 'o', + 'verb_nasal': 'ę', + 'verb_go': 'szł', + 'verb_o': 'o', + 'honorific': 'pań', + }, false, [ + new Book( + 'Greg Egan', + 'Stan wyczerpania', + 'tłum. Paweł Wieczorek', + 2003, + ['Kuwale było tylko pół pokolenia młodsze ode mnie i prawdopodobnie mieliśmy wiele podobnych poglądów na świat, vono jednak nieco ekstremalniej wierzyło we wszystko to, w co wierzyliśmy my. Nauka i technologia zdawały się dawać vu wszystko, czego chciało.'], + ), + ]), +}; + +export const otherSources = [ + // niebinarne on + new Book('Ursula K. Le Guin', 'Lewa ręka ciemności', 'tłum. Lech Jęczmyk', 1987, [], 'postać niebinarna używająca form męskich'), + + // niebinarne ona + new Book('Ann Leckie', 'Zabójcza sprawiedliwość', 'tłum. Danuta Górska', 2015, [], 'postać niebinarna używająca form żeńskich'), + new Book('Ann Leckie', 'Zabójczy miecz', 'tłum. Danuta Górska', 2016, [], 'postać niebinarna używająca form żeńskich'), + new Book('Ursula K. Le Guin', 'Królowa Zimy', 'w: „Wszystkie strony świata”', 'tłum. Lech Jęczmyk', 1980, 'postać niebinarna używająca form żeńskich'), + + // neozaimki + new Book( + 'Greg Egan', + 'Diaspora', + 'tłumaczenie: Michał Jakuszewski', + 2015, + ['Yatima przyjrzało się otaczającym polis gwiazdom. Wszystkie emitowały światło o widmie przesuniętym w wyniku efektu Dopplera, tworząc na niebie nieruchome koncentryczne fale koloru - od ekspansji po konwergencję. Ve zastanawiało się, jak powinni się zachować, gdy wreszcie dościgną uciekających.'], + 'rodzaj nijaki z neozaimkami ve/vir', + ), + + // genderfluid + new Book('Rick Riordan', 'Młot Thora', '', 2016, [], 'postać genderfluid o zmiennych zaimkach'), + new Book('Rick Riordan', 'Statek umarłych', '', 2017, [], 'postać genderfluid o zmiennych zaimkach'), + + // inne + new Book('Marta Magdalena Lasik', 'Zwierciadło w dziurce od klucza', 'w: „Skafander i melonik”', 2018), +]; + +// „” diff --git a/static/favicon.svg b/static/favicon.svg new file mode 100644 index 00000000..ddc1a4d9 --- /dev/null +++ b/static/favicon.svg @@ -0,0 +1 @@ + diff --git a/static/fonts/nunito-v13-latin-ext_latin-700.eot b/static/fonts/nunito-v13-latin-ext_latin-700.eot new file mode 100644 index 0000000000000000000000000000000000000000..74c209ca3d0b1d173b803bf9aa48ae6bcfe9c359 GIT binary patch literal 38009 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 literal 0 HcmV?d00001 diff --git a/static/fonts/nunito-v13-latin-ext_latin-700.svg b/static/fonts/nunito-v13-latin-ext_latin-700.svg new file mode 100644 index 00000000..e63f0191 --- /dev/null +++ b/static/fonts/nunito-v13-latin-ext_latin-700.svg @@ -0,0 +1,441 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/fonts/nunito-v13-latin-ext_latin-700.ttf b/static/fonts/nunito-v13-latin-ext_latin-700.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6575a30e570a85924132f509f7b8b5c4755e5c7d GIT binary patch literal 85472 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