Merge branch 'master' into feature/slash-or

This commit is contained in:
Morgan Astra 2018-11-15 12:19:10 -08:00 committed by GitHub
commit 4ec5220185
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 264 additions and 204 deletions

42
.circleci/config.yml Normal file
View File

@ -0,0 +1,42 @@
# Clojure CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-clojure/ for more details
#
version: 2
jobs:
build:
docker:
# specify the version you desire here
- image: circleci/clojure:lein-2.7.1
# Specify service dependencies here if necessary
# CircleCI maintains a library of pre-built images
# documented at https://circleci.com/docs/2.0/circleci-images/
# - image: circleci/postgres:9.4
working_directory: ~/repo
environment:
LEIN_ROOT: "true"
# Customize the JVM maximum heap limit
JVM_OPTS: -Xmx3200m
steps:
- checkout
# Download and cache dependencies
- restore_cache:
keys:
- v1-dependencies-{{ checksum "project.clj" }}
# fallback to using the latest cache if no exact match is found
- v1-dependencies-
- run: lein deps
- save_cache:
paths:
- ~/.m2
key: v1-dependencies-{{ checksum "project.clj" }}
# run tests!
- run: lein test

View File

@ -2,7 +2,7 @@
Version 3, 19 November 2007 Version 3, 19 November 2007
Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/> Everyone is Copyright © 2007 Free Software Foundation, Inc. <https://fsf.org/> Everyone is
permitted to copy and distribute verbatim copies of this license document, but permitted to copy and distribute verbatim copies of this license document, but
changing it is not allowed. Preamble changing it is not allowed. Preamble

View File

@ -1,15 +1,15 @@
**[pronoun.is](http://pronoun.is) is a website for personal pronoun usage examples** **[pronoun.is](https://pronoun.is) is a website for personal pronoun usage examples**
## For users ## For users
You can use any pronouns you like simply by filling them into the You can use any pronouns you like simply by filling them into the
url path. For example, http://pronoun.is/ze/zir/zir/zirs/zirself url path. For example, https://pronoun.is/ze/zir/zir/zirs/zirself
That's pretty unwieldy! Fortunately you can also give it only the That's pretty unwieldy! Fortunately you can also give it only the
first pronoun or two: http://pronoun.is/she/her or http://pronoun.is/they first pronoun or two: https://pronoun.is/she/her or https://pronoun.is/they
Automatically filling in the rest from only one or two forms only Automatically filling in the rest from only one or two forms only
works for pronouns in the [database](resources/pronouns.tab). If the works for pronouns in the [database][pronoun-database]. If the
pronouns you or a friend uses aren't supported, please let us know and pronouns you or a friend uses aren't supported, please let us know and
we'll add them. Alternatively you could add them yourself and submit a we'll add them. Alternatively you could add them yourself and submit a
pull request (see the next section for details) pull request (see the next section for details)
@ -18,38 +18,89 @@ pull request (see the next section for details)
### The database ### The database
The pronouns "database" is a tab-delimited file with fields and The pronouns "database" is a tab-delimited file located in [resources/pronouns.tab][pronoun-database] with fields and example values as follows:
example values as follows:
subject|object|possessive-determiner|possessive-pronoun|reflexive subject|object|possessive-determiner|possessive-pronoun|reflexive
-------|------|---------------------|------------------|--------- -------|------|---------------------|------------------|---------
they | them | their | theirs | themselves they | them | their | theirs | themselves
If you edit it with a text editor, make sure your editor inputs real The top 6 pronouns are displayed on the front page. Please don't edit these
tab characters in that file (a thing your editor might normally be without talking to me, they've been hand-curated based on usage frequency.
configured not to do!) In Emacs, you can input real tabs by doing Below the top 6, the remaining pronouns are sorted in alphabetical order by
Ctrl+q <tab> subject and then in roughly frequency order for sets that have the same subject
pronoun. If you're adding a set that shares the same object pronoun as other
set(s) already in the database, please insert it immediately below those ones.
If you edit the database with a text editor, make sure your editor inputs real
tab characters in that file (a thing your editor might normally be configured
not to do!) In Emacs, you can input real tabs by doing Ctrl+q <tab>.
In Vi you can use Ctrl+v <tab>.
[pronoun-database]: resources/pronouns.tab
### The code
The top-level logic for running the server lives in [`pronouns.web`](src/pronouns/web.clj)
Page rendering markup is in [`pronouns.pages`](src/pronouns/pages.clj), it uses
[hiccup](https://github.com/weavejester/hiccup) for rendering HTML from Clojure
datastructures.
[`pronouns.config`](src/pronouns/config.clj) is currently used only for loading
the [pronouns database][pronoun-database]
The unfortunately-named [`pronouns.util`](src/pronouns/util.clj) includes both
actual utility functions used elsewhere in the code, but also what you might
think of as "controllers" if you're used to the MVC model of web design - code
that does the computations necessary for the `pages` (analogous to "views")
to render themselves. We should probably break up `util` into (at least) two
namespaces and be a little more deliberate about where everything currently
in that namespace should live!
### Tests
Run the suite with `lein test`
Test coverage is not great but getting better. Please run the tests and
confirm that everything passes before merging changes, and please include
tests with any new logic you introduce in a PR!
Goals for the future include setting up automated CI to run the tests for
us on every PR branch
### Running the app in a dev environment ### Running the app in a dev environment
You can launch the app on your own computer by running the following First, install [leiningen](https://leiningen.org/). Then you can launch the app
command: on your own computer by running the following command:
``` ```
$ lein ring server $ lein ring server
``` ```
This will launch a server running the app and open your default web browser to the index page. The server will automatically reload files as you edit them. This will launch a server running the app and open your default web browser to
the index page. The server will automatically reload files as you edit them -
with the unfortunate exception of `pronouns.tab`, which is loaded as a resource
and requires an app restart to reload.
### The git repo
For most of this project's history we had separate `master` and `develop`
branches but that's proven to be more trouble than it's worth. Going
forward we'll be doing all development in feature branches off of `master`,
and PRs should be issued against `master`.
Please follow [this guide](https://chris.beams.io/posts/git-commit/)
for writing good commit messages :)
## Philosophy on pronoun inclusion ## Philosophy on pronoun inclusion
Pronoun.is aims foremost and exclusively to be a useful resource for people to communicate the personal pronoun they use for themselves. Pronoun.is aims foremost and exclusively to be a useful resource for people to communicate the personal pronoun they use for themselves.
It is possible to use these example sentences to demonstrate the usage of words that are not personal pronouns, or even cleverly insert an [entire story](http://pronoun.is/she/or%20they,%20those%20ships%20who%20were%20docked%20and%20still%20equipped%20with%20ancillaries,%20arranged%20to%20share%20the%20duty%20of%20monitoring%20our%20guest%20as%20it%20fit%20into%20their%20routines;%20that%20was%20the%20agreement,%20despite%20it%20being%20less%20convenient%20for%20me%20to%20participate%20at%20all,%20on%20the%20grounds%20that%20certain%20visitors%20might%20prefer%20a%20constant%20individual%20companion%20to%20what%20might%20seem,%20depending%20on%20their%20past%20experiences,%20to%20be%20undue%20attention%20from%20every%20soldier%20they%20passed.%20As%20usual,%20then,%20I%20took%20the%20first%20shift/the%20one%20possession%20of%20hers%20that%20Station%20Security%20hadn't%20confiscated,%20a/knowingly%20left%20with%20her.%20What%20a%20Presger%20frisbee%20might%20do%20or%20even%20look%20like%20I%20couldn't%20say.%20She%20hadn't%20seemed%20the%20sort%20to%20have%20alien%20technology,%20but,%20then%20again,%20neither%20had%20I/another%20unremarkable%20stranger,%20quite%20a%20ways%20down%20the%20concourse,%20who%20caught%20it%20with%20a%20degree%20of%20coordination%20that%20most%20would%20have%20overlooked.%20It%20did%20not%20escape%20my%20notice,%20however.%20"Cousin,"%20I%20said,%20enough%20to%20convey%20-%20unless%20our%20visitor%20were%20quite%20ignorant,%20but,%20of%20course,%20at%20this%20point%20I%20was%20certain%20that%20she%20couldn't%20be%20-%20both%20that%20I%20knew%20what%20she%20was%20not%20and%20that%20I%20was%20giving%20her%20the%20benefit%20of%20the%20doubt%20as%20to%20what,%20or%20who,%20she%20was)! However, as a policy we will not include such entries in the database. It is possible to use these example sentences to demonstrate the usage of words that are not personal pronouns, or even cleverly insert an [entire story](https://pronoun.is/she/or%20they,%20those%20ships%20who%20were%20docked%20and%20still%20equipped%20with%20ancillaries,%20arranged%20to%20share%20the%20duty%20of%20monitoring%20our%20guest%20as%20it%20fit%20into%20their%20routines;%20that%20was%20the%20agreement,%20despite%20it%20being%20less%20convenient%20for%20me%20to%20participate%20at%20all,%20on%20the%20grounds%20that%20certain%20visitors%20might%20prefer%20a%20constant%20individual%20companion%20to%20what%20might%20seem,%20depending%20on%20their%20past%20experiences,%20to%20be%20undue%20attention%20from%20every%20soldier%20they%20passed.%20As%20usual,%20then,%20I%20took%20the%20first%20shift/the%20one%20possession%20of%20hers%20that%20Station%20Security%20hadn't%20confiscated,%20a/knowingly%20left%20with%20her.%20What%20a%20Presger%20frisbee%20might%20do%20or%20even%20look%20like%20I%20couldn't%20say.%20She%20hadn't%20seemed%20the%20sort%20to%20have%20alien%20technology,%20but,%20then%20again,%20neither%20had%20I/another%20unremarkable%20stranger,%20quite%20a%20ways%20down%20the%20concourse,%20who%20caught%20it%20with%20a%20degree%20of%20coordination%20that%20most%20would%20have%20overlooked.%20It%20did%20not%20escape%20my%20notice,%20however.%20"Cousin,"%20I%20said,%20enough%20to%20convey%20-%20unless%20our%20visitor%20were%20quite%20ignorant,%20but,%20of%20course,%20at%20this%20point%20I%20was%20certain%20that%20she%20couldn't%20be%20-%20both%20that%20I%20knew%20what%20she%20was%20not%20and%20that%20I%20was%20giving%20her%20the%20benefit%20of%20the%20doubt%20as%20to%20what,%20or%20who,%20she%20was)! However, as a policy we will not include such entries in the database.
## License ## License
Copyright © 2014-2017 Morgan Astra <m@morganastra.me> Copyright © 2014-2018 Morgan Astra <m@morganastra.me>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as it under the terms of the GNU Affero General Public License as
@ -62,5 +113,5 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/> along with this program. If not, see <https://www.gnu.org/licenses/>

View File

@ -1,19 +1,20 @@
(defproject witch-house/pronouns "1.11.0-SNAPSHOT" (defproject witch-house/pronouns "1.12.0-SNAPSHOT"
:description "Pronoun.is is a website for personal pronoun usage examples" :description "Pronoun.is is a website for personal pronoun usage examples"
:url "http://pronoun.is" :url "https://pronoun.is"
:license "GNU Affero General Public License 3.0" :license "GNU Affero General Public License 3.0"
:dependencies [[org.clojure/clojure "1.6.0"] :dependencies [[compojure "1.6.1"]
[compojure "1.1.8"] [environ "1.1.0"]
[ring/ring-jetty-adapter "1.2.2"] [hiccup "1.0.5"]
[ring.middleware.logger "0.5.0"] [lambdaisland/ring.middleware.logger "0.5.1"]
[ring/ring-devel "1.2.2"] [org.clojure/clojure "1.9.0"]
[environ "0.5.0"] [ring/ring-devel "1.7.1"]
[hiccup "1.0.5"]] [ring/ring-jetty-adapter "1.7.1"]]
:min-lein-version "2.0.0" :min-lein-version "2.0.0"
:plugins [[environ/environ.lein "0.2.1"] :plugins [[environ/environ.lein "0.2.1"]
[lein-ring "0.9.7"]] [lein-ring "0.9.7"]]
:hooks [environ.leiningen.hooks] :hooks [environ.leiningen.hooks]
:uberjar-name "pronouns-standalone.jar" :uberjar-name "pronouns-standalone.jar"
:profiles {:production {:env {:production true}} ;; FIXME morgan.astra <2018-11-14 Wed>
:dev {:dependencies [[midje "1.6.3"]]}} ;; Is this production profile used for anything?
:profiles {:production {:env {:production true}}}
:ring {:handler pronouns.web/app}) :ring {:handler pronouns.web/app})

View File

@ -1,112 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg2"
sodipodi:docname="antifascist-action-red.svg"
viewBox="0 0 847.19 847.85"
version="1.1"
inkscape:version="0.92.1 r"
width="903.66931"
height="904.37329">
<defs
id="defs72" />
<sodipodi:namedview
id="base"
bordercolor="#666666"
inkscape:pageshadow="2"
inkscape:window-y="14"
fit-margin-left="0"
pagecolor="#ffffff"
inkscape:window-height="1426"
inkscape:window-maximized="0"
inkscape:zoom="0.35"
inkscape:window-x="0"
showgrid="true"
borderopacity="1.0"
inkscape:current-layer="layer1"
inkscape:cx="1059.3962"
inkscape:cy="231.88159"
fit-margin-top="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="2560"
inkscape:pageopacity="0.0"
inkscape:document-units="px">
<inkscape:grid
type="xygrid"
id="grid3896" />
</sodipodi:namedview>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(300.74,2.9901)"
style="display:inline">
<g
id="layer1-4"
transform="translate(-248.4,-65.648)"
style="display:inline"
inkscape:label="layer1-4">
<g
id="g2844"
transform="translate(591.43,-22.857)"
style="display:inline"
inkscape:export-filename="/home/morgan/purple-antifa.png"
inkscape:export-xdpi="13.16275"
inkscape:export-ydpi="13.16275">
<path
style="display:inline;fill:#441650;stroke-width:1.0666666"
d="m 452.93359,0 c -32.7392,0 -76.3332,5.5336609 -110.25,13.994141 C 181.71293,54.143473 53.679087,182.17431 13.732422,342.93164 2.9588756,386.28951 -1.8818978,434.80054 0.66796875,473.85547 3.5170353,517.4896 9.4941306,550.76056 21.216797,588.26562 35.544263,634.10136 60.679082,683.01508 89.738281,721.59961 151.44495,803.53134 235.9611,861.08483 334.6875,888.4043 c 29.28533,8.10346 66.26027,13.58111 104,15.4082 v 0.008 c 3.52,0.17041 7.59974,0.39795 9.06641,0.50586 5.44426,0.40064 43.66587,-2.0326 57.0664,-3.63281 63.36,-7.56587 123.73282,-28.1417 178.13281,-60.70703 119.7344,-71.68 199.50098,-193.50399 217.00391,-331.44531 4.97173,-39.18507 4.95718,-72.39455 -0.0469,-112.81055 C 887.68616,296.96781 842.62357,205.08233 771.48438,133.8418 762.09771,124.44233 748.89706,112.13975 742.15039,106.50391 676.44373,51.618575 598.93304,16.941328 514.95117,4.8613281 499.53997,2.6445815 465.80826,0 452.93359,0 Z m -0.99023,79.412109 c 17.71293,-0.008 35.36016,0.64903 44.87109,1.972657 65.2256,9.077333 116.91799,29.064654 169.33399,65.478514 18.1152,12.58667 31.64788,24.06424 49.95508,42.37891 60.82559,60.81066 97.11922,136.94968 107.33789,225.15234 2.03087,17.54133 1.71722,61.65641 -0.57227,80.5332 -10.54933,86.93333 -49.2038,164.93918 -111.80859,225.58985 -58.50667,56.68266 -130.9428,91.64734 -212.39453,102.52734 l -0.006,-0.008 c -14.9792,2.00016 -66.86526,2.94976 -79.70899,1.45898 -18.1792,-2.11018 -27.75033,-3.48347 -37.65625,-5.40625 -38.8704,-7.54346 -78.73449,-22.21952 -112.21289,-41.30859 -95.20839,-54.28247 -162.56442,-147.23093 -183.337749,-252.992 -5.442347,-27.70773 -6.44336,-38.97587 -6.44336,-72.5332 0,-34.35413 1.010435,-45.21451 6.986328,-75.05664 22.026671,-109.96266 96.829801,-207.46963 198.197271,-258.33789 39.75679,-19.953068 76.4746,-31.200562 122.19726,-37.435549 9.77067,-1.332373 27.54879,-2.005645 45.26172,-2.013672 z"
transform="matrix(0.93750003,0,0,0.93750003,-643.77,85.5149)"
id="path2842"
inkscape:connector-curvature="0" />
<path
id="path2838"
style="display:inline;fill:#440055"
inkscape:connector-curvature="0"
d="m -207.89,837.3 c -5.1627,-0.4682 -9.9894,-1.1886 -10.726,-1.6009 -1.3981,-0.7824 -0.67608,-2.1126 28.603,-52.697 7.0037,-12.1 22.745,-39.325 34.98,-60.5 12.235,-21.175 26.083,-45.025 30.773,-53 4.6897,-7.975 9.8972,-16.975 11.572,-20 1.675,-3.025 7.2342,-12.62 12.354,-21.322 l 9.3084,-15.822 -1.6179,-3.1782 c -0.88987,-1.748 -3.2198,-5.4282 -5.1776,-8.1782 -20.999,-29.495 -49.249,-43.679 -94.486,-47.436 -17.446,-1.4492 -35.251,-1.3275 -67.196,0.45919 -54.969,3.0744 -64.467,3.4592 -85.605,3.4681 -53.988,0.0226 -91.809,-7.1507 -127.82,-24.242 -25.855,-12.273 -47.999,-29.036 -69,-52.234 l -6.3236,-6.9852 0.6444,-7.0148 c 0.89957,-9.7926 6.0692,-34.518 10.115,-48.38 15.053,-51.571 40.075,-95.111 76.901,-133.82 9.6865,-10.18 29.975,-28.359 38.195,-34.223 l 3.3677,-2.4024 9.7603,9.9933 c 31.285,32.032 69.391,46.287 123.76,46.298 26.683,0.005 50.245,-2.5668 114.5,-12.499 51.119,-7.9016 75.315,-10.083 101.5,-9.1517 35.249,1.2541 59.006,7.9246 82.528,23.173 10.45,6.774 27.996,24.711 36.185,36.991 7.3856,11.076 15.72,27.867 21.213,42.736 l 3.5966,9.7364 -5.8674,10.264 c -3.227,5.645 -12.073,21.064 -19.657,34.264 -7.5845,13.2 -14.555,25.35 -15.491,27 -3.6231,6.3902 -24.958,43.116 -38.341,66 -7.7197,13.2 -15.452,26.475 -17.182,29.5 -6.1405,10.733 -42.194,72.514 -66.236,113.5 -8.9544,15.265 -41.094,70.555 -44.468,76.5 -1.405,2.475 -8.5307,14.85 -15.835,27.5 -7.3041,12.65 -15.186,26.375 -17.516,30.5 -10.378,18.375 -13.403,23.576 -14.351,24.674 -0.55748,0.64576 -3.6152,1.4499 -6.7951,1.787 -3.1798,0.33711 -6.9065,0.74228 -8.2815,0.90038 -1.375,0.15809 -6.724,-0.0956 -11.887,-0.56384 z" />
<path
id="path2834"
style="display:inline;fill:#440055"
inkscape:connector-curvature="0"
d="m -318.25,822.21 c -9.2125,-1.1324 -16.75,-2.4701 -16.75,-2.9726 0,-0.50247 16.237,-32.636 36.082,-71.409 19.845,-38.772 35.846,-70.732 35.556,-71.021 -0.90422,-0.90422 -12.694,-3.1167 -25.166,-4.7226 -15.132,-1.9485 -31.447,-3.1691 -67.973,-5.0852 -45.969,-2.4115 -66.404,-4.8472 -88.337,-10.529 -65.525,-16.975 -97.683,-60.834 -106.66,-145.47 -2.3545,-22.204 -3.4922,-21.599 11.744,-6.2436 39.823,40.134 85.237,59.474 152.25,64.835 17.913,1.4332 64.877,0.64751 95.5,-1.5978 30.813,-2.2591 65.509,-2.9705 79.165,-1.6231 14.394,1.4202 28.444,4.901 36.913,9.1448 9.8945,4.9583 9.7003,3.7696 2.7542,16.858 -10.389,19.575 -33.785,62.219 -62.34,113.63 -26.68,48.033 -51.838,93.87 -60.51,110.25 -2.4022,4.5375 -4.6185,8.1974 -4.9251,8.133 -0.30657,-0.0643 -8.0949,-1.0435 -17.307,-2.176 z" />
</g>
</g>
</g>
<metadata
id="metadata69">
<rdf:RDF>
<cc:Work>
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<cc:license
rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
<dc:publisher>
<cc:Agent
rdf:about="http://openclipart.org/">
<dc:title>Openclipart</dc:title>
</cc:Agent>
</dc:publisher>
<dc:title></dc:title>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
</svg>

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -1,33 +1,40 @@
ze hir hir hirs hirself
ze zir zir zirs zirself
she her her hers herself she her her hers herself
he him his his himself he him his his himself
they them their theirs themselves they them their theirs themselves
they them their theirs themself ze hir hir hirs hirself
ze zir zir zirs zirself
xey xem xyr xyrs xemself xey xem xyr xyrs xemself
sie hir hir hirs hirself ae aer aer aers aerself
it it its its itself
ey em eir eirs eirself
e em eir eirs emself e em eir eirs emself
hu hum hus hus humself ey em eir eirs eirself
peh pehm peh's peh's pehself
per per per pers perself
thon thon thons thons thonself
jee jem jeir jeirs jemself
ve ver vis vis verself
xe xem xyr xyrs xemself
zie zir zir zirs zirself
ze zem zes zes zirself
zie zem zes zes zirself
ze mer zer zers zemself
se sim ser sers serself
zme zmyr zmyr zmyrs zmyrself
ve vem vir virs vemself
zee zed zeta zetas zedself
fae faer faer faers faerself fae faer faer faers faerself
zie hir hir hirs hirself fey fem feir feirs feirself
si hyr hyr hyrs hyrself hu hum hus hus humself
it it its its itself
jee jem jeir jeirs jemself
kit kit kits kits kitself kit kit kits kits kitself
ne nem nir nirs nemself ne nem nir nirs nemself
fey feym feir feirs feirself peh pehm peh's peh's pehself
per per per pers perself
sie hir hir hirs hirself
se sim ser sers serself
shi hir hir hirs hirself
si hyr hyr hyrs hyrself
they them their theirs themself
thon thon thons thons thonself
ve ver vis vis verself
ve vem vir virs vemself
vi ver ver vers verself
vi vim vir virs vimself
vi vim vim vims vimself
xie xer xer xers xerself xie xer xer xers xerself
xe xem xyr xyrs xemself
xey xem xeir xeirs xemself
yo yo yos yos yosself
ze zem zes zes zirself
ze mer zer zers zemself
zee zed zeta zetas zedself
zie zir zir zirs zirself
zie zem zes zes zirself
zie hir hir hirs hirself
zme zmyr zmyr zmyrs zmyrself

View File

@ -1,5 +1,5 @@
;; pronoun.is - a website for pronoun usage examples ;; pronoun.is - a website for pronoun usage examples
;; Copyright (C) 2014 - 2017 Morgan Astra ;; Copyright (C) 2014 - 2018 Morgan Astra
;; This program is free software: you can redistribute it and/or modify ;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU Affero General Public License as ;; it under the terms of the GNU Affero General Public License as
@ -12,7 +12,7 @@
;; GNU Affero General Public License for more details. ;; GNU Affero General Public License for more details.
;; You should have received a copy of the GNU Affero General Public License ;; You should have received a copy of the GNU Affero General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/> ;; along with this program. If not, see <https://www.gnu.org/licenses/>
(ns pronouns.config (ns pronouns.config
(:require [pronouns.util :as u])) (:require [pronouns.util :as u]))

View File

@ -1,5 +1,5 @@
;; pronoun.is - a website for pronoun usage examples ;; pronoun.is - a website for pronoun usage examples
;; Copyright (C) 2014 - 2017 Morgan Astra ;; Copyright (C) 2014 - 2018 Morgan Astra
;; This program is free software: you can redistribute it and/or modify ;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU Affero General Public License as ;; it under the terms of the GNU Affero General Public License as
@ -12,7 +12,7 @@
;; GNU Affero General Public License for more details. ;; GNU Affero General Public License for more details.
;; You should have received a copy of the GNU Affero General Public License ;; You should have received a copy of the GNU Affero General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/> ;; along with this program. If not, see <https://www.gnu.org/licenses/>
(ns pronouns.pages (ns pronouns.pages
(:require [clojure.string :as s] (:require [clojure.string :as s]
@ -34,6 +34,8 @@
[url text] [url text]
[:a {:href url} text]) [:a {:href url} text])
;; FIXME morgan.astra <2018-11-14 Wed>
;; use a div for this instead of a plain bold tag
(defn wrap-pronoun (defn wrap-pronoun
[pronoun] [pronoun]
[:b pronoun]) [:b pronoun])
@ -71,7 +73,7 @@
(defn header-block [header] (defn header-block [header]
[:div {:class "section title"} [:div {:class "section title"}
(href "/" [:h1 (e/image "/purple-flag64.png" "flag logo") header])]) (href "/" [:h1 header])])
(defn examples-block (defn examples-block
[subject object possessive-determiner possessive-pronoun reflexive] [subject object possessive-determiner possessive-pronoun reflexive]
@ -90,7 +92,9 @@
(defn usage-block [] (defn usage-block []
[:div {:class "section usage"} [:div {:class "section usage"}
[:p "Full usage: " [:p "Full usage: "
[:tt "http://pronoun.is/subject-pronoun/object-pronoun/possessive-determiner/possessive-pronoun/reflexive"] ;; FIXME morgan.astra <2018-11-14 Wed>
;; This looks really ugly in the browser
[:tt "https://pronoun.is/subject-pronoun/object-pronoun/possessive-determiner/possessive-pronoun/reflexive"]
" displays examples of your pronouns."] " displays examples of your pronouns."]
[:p "This is a bit unwieldy. If we have a good guess we'll let you use" [:p "This is a bit unwieldy. If we have a good guess we'll let you use"
" just the first one or two."]]) " just the first one or two."]])
@ -102,11 +106,7 @@
[:p "Written by " [:p "Written by "
(twitter-name "morganastra") (twitter-name "morganastra")
", whose " ", whose "
(href "http://pronoun.is/ze/zir?or=she" "pronoun.is/ze/zir?or=she")] (href "https://pronoun.is/she" "pronoun.is/she")]
[:p "Want to support this and similar websites? "
"Join us on "
(href "https://www.patreon.com/user?u=5238484" "Patreon")
"!"]
[:p "pronoun.is is free software under the " [:p "pronoun.is is free software under the "
(href "https://www.gnu.org/licenses/agpl.html" "AGPLv3") (href "https://www.gnu.org/licenses/agpl.html" "AGPLv3")
"! visit the project on " "! visit the project on "
@ -116,13 +116,6 @@
(defn footer-block [] (defn footer-block []
[:footer (usage-block) (contact-block)]) [:footer (usage-block) (contact-block)])
;; <meta name="twitter:card" content="summary" />
;; <meta name="twitter:site" content="@flickr" />
;; <meta name="twitter:title" content="Small Island Developing States Photo Submission" />
;; <meta name="twitter:description" content="View the album on Flickr." />
;; <meta name="twitter:image" content="https://farm6.staticflickr.com/5510/14338202952_93595258ff_z.jpg" />
;; not all of these are required!
(defn format-pronoun-examples (defn format-pronoun-examples
[pronoun-declensions] [pronoun-declensions]
(let [sub-objs (map #(s/join "/" (take 2 %)) pronoun-declensions) (let [sub-objs (map #(s/join "/" (take 2 %)) pronoun-declensions)
@ -156,6 +149,25 @@
[:li (href link label)])) [:li (href link label)]))
(defn front [] (defn front []
(let [abbreviations (take 6 (u/abbreviate *pronouns-table*))
links (map make-link abbreviations)
title "Pronoun Island"]
(html
[:html
[:head
[:title title]
[:meta {:name "viewport" :content "width=device-width"}]
[:link {:rel "stylesheet" :href "/pronouns.css"}]]
[:body
(header-block title)
[:div {:class "section table"}
[:p "pronoun.is is a website for personal pronoun usage examples"]
[:p "here are some pronouns the site knows about:"]
[:ul links]
[:p [:small (href "all-pronouns" "see all pronouns in the database")]]]]
(footer-block)])))
(defn all-pronouns []
(let [abbreviations (u/abbreviate *pronouns-table*) (let [abbreviations (u/abbreviate *pronouns-table*)
links (map make-link abbreviations) links (map make-link abbreviations)
title "Pronoun Island"] title "Pronoun Island"]
@ -168,9 +180,8 @@
[:body [:body
(header-block title) (header-block title)
[:div {:class "section table"} [:div {:class "section table"}
[:p "pronoun.is is a website for personal pronoun usage examples"] [:p "All pronouns the site knows about:"]
[:p "here are some pronouns the site knows about:"] [:ul links]]]
[:ul links]]]
(footer-block)]))) (footer-block)])))
(defn not-found [] (defn not-found []
@ -184,7 +195,7 @@
[:body [:body
(header-block title) (header-block title)
[:div {:class "section examples"} [:div {:class "section examples"}
[:p [:h2 (str "We couldn't find those pronouns in our database." [:p [:h2 (str "We couldn't find those pronouns in our database. "
"If you think we should have them, please reach out!")]]] "If you think we should have them, please reach out!")]]]
(footer-block)]]))) (footer-block)]])))

View File

@ -1,5 +1,5 @@
;; pronoun.is - a website for pronoun usage examples ;; pronoun.is - a website for pronoun usage examples
;; Copyright (C) 2014 - 2017 Morgan Astra ;; Copyright (C) 2014 - 2018 Morgan Astra
;; This program is free software: you can redistribute it and/or modify ;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU Affero General Public License as ;; it under the terms of the GNU Affero General Public License as
@ -12,15 +12,14 @@
;; GNU Affero General Public License for more details. ;; GNU Affero General Public License for more details.
;; You should have received a copy of the GNU Affero General Public License ;; You should have received a copy of the GNU Affero General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/> ;; along with this program. If not, see <https://www.gnu.org/licenses/>
(ns pronouns.util (ns pronouns.util
(:require [clojure.string :as s])) (:require [clojure.string :as s]))
(defn print-and-return "for debugging" [x] (println x) x) (defn slurp-tabfile
"Read a tabfile from a filesystem <path> as a table"
(defn slurp-tabfile [path] [path]
"read a tabfile from a filesystem <path> as a table"
(let [lines (s/split (slurp path) #"\n")] (let [lines (s/split (slurp path) #"\n")]
(map #(s/split % #"\t") lines))) (map #(s/split % #"\t") lines)))
@ -98,10 +97,11 @@
[table] [table]
(map (partial shortest-unambiguous-path table) table)) (map (partial shortest-unambiguous-path table) table))
(defn vec-coerce [x] (defn vec-coerce
"wrap a value <x> in a vector if it is not already in one. note that if "wrap a value <x> in a vector if it is not already in one. note that if
<x> is already in a sequence for which vector? is false, this will add <x> is already in a sequence for which vector? is false, this will add
another layer of nesting." another layer of nesting."
[x]
(if (vector? x) x [x])) (if (vector? x) x [x]))
(defn strip-markup [form] (defn strip-markup [form]

View File

@ -1,5 +1,5 @@
;; pronoun.is - a website for pronoun usage examples ;; pronoun.is - a website for pronoun usage examples
;; Copyright (C) 2014 - 2017 Morgan Astra ;; Copyright (C) 2014 - 2018 Morgan Astra
;; This program is free software: you can redistribute it and/or modify ;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU Affero General Public License as ;; it under the terms of the GNU Affero General Public License as
@ -12,7 +12,7 @@
;; GNU Affero General Public License for more details. ;; GNU Affero General Public License for more details.
;; You should have received a copy of the GNU Affero General Public License ;; You should have received a copy of the GNU Affero General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/> ;; along with this program. If not, see <https://www.gnu.org/licenses/>
(ns pronouns.web (ns pronouns.web
(:require [compojure.core :refer [defroutes GET PUT POST DELETE ANY]] (:require [compojure.core :refer [defroutes GET PUT POST DELETE ANY]]
@ -20,13 +20,13 @@
[compojure.route :as route] [compojure.route :as route]
[clojure.string :as s] [clojure.string :as s]
[clojure.java.io :as io] [clojure.java.io :as io]
[ring.adapter.jetty :as jetty]
[ring.middleware.logger :as logger] [ring.middleware.logger :as logger]
[ring.middleware.stacktrace :as trace] [ring.middleware.stacktrace :as trace]
[ring.middleware.params :as params] [ring.middleware.params :as params]
[ring.middleware.resource :refer [wrap-resource]] [ring.middleware.resource :refer [wrap-resource]]
[ring.middleware.content-type :refer [wrap-content-type]] [ring.middleware.content-type :refer [wrap-content-type]]
[ring.middleware.not-modified :refer [wrap-not-modified]] [ring.middleware.not-modified :refer [wrap-not-modified]]
[ring.adapter.jetty :as jetty]
[environ.core :refer [env]] [environ.core :refer [env]]
[pronouns.util :as u] [pronouns.util :as u]
[pronouns.pages :as pages])) [pronouns.pages :as pages]))
@ -37,6 +37,12 @@
:headers {"Content-Type" "text/html"} :headers {"Content-Type" "text/html"}
:body (pages/front)}) :body (pages/front)})
(GET "/all-pronouns" []
{:status 200
:headers {"Content-Type" "text/html"}
:body (pages/all-pronouns)})
(GET "/pronouns.css" [] (GET "/pronouns.css" []
{:status 200 {:status 200
:headers {"Content-Type" "text/css"} :headers {"Content-Type" "text/css"}
@ -50,6 +56,11 @@
(ANY "*" [] (ANY "*" []
(route/not-found (slurp (io/resource "404.html"))))) (route/not-found (slurp (io/resource "404.html")))))
(defn wrap-gnu-natalie-nguyen [handler]
(fn [req]
(when-let [resp (handler req)]
(assoc-in resp [:headers "X-Clacks-Overhead"] "GNU Natalie Nguyen"))))
(defn wrap-error-page [handler] (defn wrap-error-page [handler]
(fn [req] (fn [req]
(try (handler req) (try (handler req)
@ -61,11 +72,14 @@
(def app (def app
(-> app-routes (-> app-routes
(wrap-resource "images") ;; FIXME morgan.astra <2018-11-14 Wed>
;; use this resource or delete it
;; (wrap-resource "images")
wrap-content-type wrap-content-type
wrap-not-modified wrap-not-modified
logger/wrap-with-logger logger/wrap-with-logger
wrap-error-page wrap-error-page
wrap-gnu-natalie-nguyen
trace/wrap-stacktrace trace/wrap-stacktrace
params/wrap-params)) params/wrap-params))

View File

@ -1,10 +1,12 @@
(ns pronouns.pages-test (ns pronouns.pages-test
(:require [pronouns.pages :as pages] (:require [pronouns.pages :as pages]
[midje.sweet :refer :all])) [clojure.test :refer [deftest testing is are]]))
(fact "prose-comma-list turns a list of strings into a prose list with commas" (deftest prose-comma-list
(pages/prose-comma-list ["foo"]) => "foo" (testing "prose-comma-list turns a list of strings into a prose list"
(pages/prose-comma-list ["foo" "bar"]) => "foo and bar" (are [call result] (= call result)
(pages/prose-comma-list ["foo" "bar" "baz"]) => "foo, bar, and baz" (pages/prose-comma-list ["foo"]) "foo"
(pages/prose-comma-list ["foo" "bar" "baz" "bobble"]) => "foo, bar, baz, and bobble" (pages/prose-comma-list ["foo" "bar"]) "foo and bar"
(pages/prose-comma-list []) => "") (pages/prose-comma-list ["foo" "bar" "baz"]) "foo, bar, and baz"
(pages/prose-comma-list ["foo" "bar" "baz" "bobble"]) "foo, bar, baz, and bobble"
(pages/prose-comma-list []) "")))

View File

@ -0,0 +1,12 @@
(ns pronouns.resource-test
(:require [pronouns.util :as util]
[clojure.test :refer [deftest testing is]]))
(deftest valid-pronouns-table
(let [table (util/slurp-tabfile "resources/pronouns.tab")]
(is table "pronouns.tab exists and is non-empty")
(doseq [row table]
(is (= (count row) 5)
"row has five elements")
(is (re-matches #".*sel(f|ves)$" (last row))
"final element is reflexive"))))

View File

@ -0,0 +1,32 @@
(ns pronouns.util-test
(:require [pronouns.util :as util]
[clojure.test :refer [deftest testing is are]]))
(def test-table [["ze" "hir" "hir" "hirs" "hirself"]
["ze" "zir" "zir" "zirs" "zirself"]
["she" "her" "her" "hers" "herself"]
["he" "him" "his" "his" "himself"]
["they" "them" "their" "theirs" "themselves"]
["they" "them" "their" "theirs" "themself"]])
(deftest table-filters
(testing "table-front-filter"
(are [arg return] (= (util/table-front-filter arg test-table) return)
["she"] [["she" "her" "her" "hers" "herself"]]
["ze"] [["ze" "hir" "hir" "hirs" "hirself"]
["ze" "zir" "zir" "zirs" "zirself"]]
["ze" "zir"] [["ze" "zir" "zir" "zirs" "zirself"]]))
(testing "table-end-filter"
(are [arg return] (= (util/table-end-filter arg test-table) return)
["themself"] [["they" "them" "their" "theirs" "themself"]]
["themselves"] [["they" "them" "their" "theirs" "themselves"]])))
(deftest table-lookup
(are [arg return] (= (util/table-lookup arg test-table) return)
["she"] ["she" "her" "her" "hers" "herself"]
["ze"] ["ze" "hir" "hir" "hirs" "hirself"]
["ze" "zir"] ["ze" "zir" "zir" "zirs" "zirself"]
["they"] ["they" "them" "their" "theirs" "themselves"]
["they" "..." "themself"] ["they" "them" "their" "theirs" "themself"]))