Merge branch 'master' into feature/slash-or
This commit is contained in:
commit
4ec5220185
42
.circleci/config.yml
Normal file
42
.circleci/config.yml
Normal 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
|
2
COPYING
2
COPYING
@ -2,7 +2,7 @@
|
||||
|
||||
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
|
||||
changing it is not allowed. Preamble
|
||||
|
||||
|
83
README.md
83
README.md
@ -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
|
||||
|
||||
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
|
||||
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
|
||||
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
|
||||
we'll add them. Alternatively you could add them yourself and submit a
|
||||
pull request (see the next section for details)
|
||||
@ -18,38 +18,89 @@ pull request (see the next section for details)
|
||||
|
||||
### The database
|
||||
|
||||
The pronouns "database" is a tab-delimited file with fields and
|
||||
example values as follows:
|
||||
The pronouns "database" is a tab-delimited file located in [resources/pronouns.tab][pronoun-database] with fields and example values as follows:
|
||||
|
||||
subject|object|possessive-determiner|possessive-pronoun|reflexive
|
||||
-------|------|---------------------|------------------|---------
|
||||
they | them | their | theirs | themselves
|
||||
|
||||
If you edit it 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>
|
||||
The top 6 pronouns are displayed on the front page. Please don't edit these
|
||||
without talking to me, they've been hand-curated based on usage frequency.
|
||||
Below the top 6, the remaining pronouns are sorted in alphabetical order by
|
||||
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
|
||||
|
||||
You can launch the app on your own computer by running the following
|
||||
command:
|
||||
First, install [leiningen](https://leiningen.org/). Then you can launch the app
|
||||
on your own computer by running the following command:
|
||||
|
||||
```
|
||||
$ 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
|
||||
|
||||
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
|
||||
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
|
||||
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.
|
||||
|
||||
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/>
|
||||
|
||||
|
23
project.clj
23
project.clj
@ -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"
|
||||
:url "http://pronoun.is"
|
||||
:url "https://pronoun.is"
|
||||
:license "GNU Affero General Public License 3.0"
|
||||
:dependencies [[org.clojure/clojure "1.6.0"]
|
||||
[compojure "1.1.8"]
|
||||
[ring/ring-jetty-adapter "1.2.2"]
|
||||
[ring.middleware.logger "0.5.0"]
|
||||
[ring/ring-devel "1.2.2"]
|
||||
[environ "0.5.0"]
|
||||
[hiccup "1.0.5"]]
|
||||
:dependencies [[compojure "1.6.1"]
|
||||
[environ "1.1.0"]
|
||||
[hiccup "1.0.5"]
|
||||
[lambdaisland/ring.middleware.logger "0.5.1"]
|
||||
[org.clojure/clojure "1.9.0"]
|
||||
[ring/ring-devel "1.7.1"]
|
||||
[ring/ring-jetty-adapter "1.7.1"]]
|
||||
:min-lein-version "2.0.0"
|
||||
:plugins [[environ/environ.lein "0.2.1"]
|
||||
[lein-ring "0.9.7"]]
|
||||
:hooks [environ.leiningen.hooks]
|
||||
:uberjar-name "pronouns-standalone.jar"
|
||||
:profiles {:production {:env {:production true}}
|
||||
:dev {:dependencies [[midje "1.6.3"]]}}
|
||||
;; FIXME morgan.astra <2018-11-14 Wed>
|
||||
;; Is this production profile used for anything?
|
||||
:profiles {:production {:env {:production true}}}
|
||||
:ring {:handler pronouns.web/app})
|
||||
|
@ -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 |
@ -1,33 +1,40 @@
|
||||
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
|
||||
ze hir hir hirs hirself
|
||||
ze zir zir zirs zirself
|
||||
xey xem xyr xyrs xemself
|
||||
sie hir hir hirs hirself
|
||||
it it its its itself
|
||||
ey em eir eirs eirself
|
||||
ae aer aer aers aerself
|
||||
e em eir eirs emself
|
||||
hu hum hus hus humself
|
||||
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
|
||||
ey em eir eirs eirself
|
||||
fae faer faer faers faerself
|
||||
zie hir hir hirs hirself
|
||||
si hyr hyr hyrs hyrself
|
||||
fey fem feir feirs feirself
|
||||
hu hum hus hus humself
|
||||
it it its its itself
|
||||
jee jem jeir jeirs jemself
|
||||
kit kit kits kits kitself
|
||||
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
|
||||
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
|
||||
|
@ -1,5 +1,5 @@
|
||||
;; 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
|
||||
;; it under the terms of the GNU Affero General Public License as
|
||||
@ -12,7 +12,7 @@
|
||||
;; GNU Affero General Public License for more details.
|
||||
|
||||
;; 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
|
||||
(:require [pronouns.util :as u]))
|
||||
|
@ -1,5 +1,5 @@
|
||||
;; 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
|
||||
;; it under the terms of the GNU Affero General Public License as
|
||||
@ -12,7 +12,7 @@
|
||||
;; GNU Affero General Public License for more details.
|
||||
|
||||
;; 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
|
||||
(:require [clojure.string :as s]
|
||||
@ -34,6 +34,8 @@
|
||||
[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
|
||||
[pronoun]
|
||||
[:b pronoun])
|
||||
@ -71,7 +73,7 @@
|
||||
|
||||
(defn header-block [header]
|
||||
[:div {:class "section title"}
|
||||
(href "/" [:h1 (e/image "/purple-flag64.png" "flag logo") header])])
|
||||
(href "/" [:h1 header])])
|
||||
|
||||
(defn examples-block
|
||||
[subject object possessive-determiner possessive-pronoun reflexive]
|
||||
@ -90,7 +92,9 @@
|
||||
(defn usage-block []
|
||||
[:div {:class "section 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."]
|
||||
[:p "This is a bit unwieldy. If we have a good guess we'll let you use"
|
||||
" just the first one or two."]])
|
||||
@ -102,11 +106,7 @@
|
||||
[:p "Written by "
|
||||
(twitter-name "morganastra")
|
||||
", whose "
|
||||
(href "http://pronoun.is/ze/zir?or=she" "pronoun.is/ze/zir?or=she")]
|
||||
[:p "Want to support this and similar websites? "
|
||||
"Join us on "
|
||||
(href "https://www.patreon.com/user?u=5238484" "Patreon")
|
||||
"!"]
|
||||
(href "https://pronoun.is/she" "pronoun.is/she")]
|
||||
[:p "pronoun.is is free software under the "
|
||||
(href "https://www.gnu.org/licenses/agpl.html" "AGPLv3")
|
||||
"! visit the project on "
|
||||
@ -116,13 +116,6 @@
|
||||
(defn footer-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
|
||||
[pronoun-declensions]
|
||||
(let [sub-objs (map #(s/join "/" (take 2 %)) pronoun-declensions)
|
||||
@ -156,7 +149,7 @@
|
||||
[:li (href link label)]))
|
||||
|
||||
(defn front []
|
||||
(let [abbreviations (u/abbreviate *pronouns-table*)
|
||||
(let [abbreviations (take 6 (u/abbreviate *pronouns-table*))
|
||||
links (map make-link abbreviations)
|
||||
title "Pronoun Island"]
|
||||
(html
|
||||
@ -170,6 +163,24 @@
|
||||
[: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*)
|
||||
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 "All pronouns the site knows about:"]
|
||||
[:ul links]]]
|
||||
(footer-block)])))
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
;; 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
|
||||
;; it under the terms of the GNU Affero General Public License as
|
||||
@ -12,15 +12,14 @@
|
||||
;; GNU Affero General Public License for more details.
|
||||
|
||||
;; 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
|
||||
(:require [clojure.string :as s]))
|
||||
|
||||
(defn print-and-return "for debugging" [x] (println x) x)
|
||||
|
||||
(defn slurp-tabfile [path]
|
||||
"read a tabfile from a filesystem <path> as a table"
|
||||
(defn slurp-tabfile
|
||||
"Read a tabfile from a filesystem <path> as a table"
|
||||
[path]
|
||||
(let [lines (s/split (slurp path) #"\n")]
|
||||
(map #(s/split % #"\t") lines)))
|
||||
|
||||
@ -98,10 +97,11 @@
|
||||
[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
|
||||
<x> is already in a sequence for which vector? is false, this will add
|
||||
another layer of nesting."
|
||||
[x]
|
||||
(if (vector? x) x [x]))
|
||||
|
||||
(defn strip-markup [form]
|
||||
|
@ -1,5 +1,5 @@
|
||||
;; 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
|
||||
;; it under the terms of the GNU Affero General Public License as
|
||||
@ -12,7 +12,7 @@
|
||||
;; GNU Affero General Public License for more details.
|
||||
|
||||
;; 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
|
||||
(:require [compojure.core :refer [defroutes GET PUT POST DELETE ANY]]
|
||||
@ -20,13 +20,13 @@
|
||||
[compojure.route :as route]
|
||||
[clojure.string :as s]
|
||||
[clojure.java.io :as io]
|
||||
[ring.adapter.jetty :as jetty]
|
||||
[ring.middleware.logger :as logger]
|
||||
[ring.middleware.stacktrace :as trace]
|
||||
[ring.middleware.params :as params]
|
||||
[ring.middleware.resource :refer [wrap-resource]]
|
||||
[ring.middleware.content-type :refer [wrap-content-type]]
|
||||
[ring.middleware.not-modified :refer [wrap-not-modified]]
|
||||
[ring.adapter.jetty :as jetty]
|
||||
[environ.core :refer [env]]
|
||||
[pronouns.util :as u]
|
||||
[pronouns.pages :as pages]))
|
||||
@ -37,6 +37,12 @@
|
||||
:headers {"Content-Type" "text/html"}
|
||||
:body (pages/front)})
|
||||
|
||||
(GET "/all-pronouns" []
|
||||
{:status 200
|
||||
:headers {"Content-Type" "text/html"}
|
||||
:body (pages/all-pronouns)})
|
||||
|
||||
|
||||
(GET "/pronouns.css" []
|
||||
{:status 200
|
||||
:headers {"Content-Type" "text/css"}
|
||||
@ -50,6 +56,11 @@
|
||||
(ANY "*" []
|
||||
(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]
|
||||
(fn [req]
|
||||
(try (handler req)
|
||||
@ -61,11 +72,14 @@
|
||||
|
||||
(def app
|
||||
(-> 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-not-modified
|
||||
logger/wrap-with-logger
|
||||
wrap-error-page
|
||||
wrap-gnu-natalie-nguyen
|
||||
trace/wrap-stacktrace
|
||||
params/wrap-params))
|
||||
|
||||
|
@ -1,10 +1,12 @@
|
||||
(ns pronouns.pages-test
|
||||
(: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"
|
||||
(pages/prose-comma-list ["foo"]) => "foo"
|
||||
(pages/prose-comma-list ["foo" "bar"]) => "foo and bar"
|
||||
(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 []) => "")
|
||||
(deftest prose-comma-list
|
||||
(testing "prose-comma-list turns a list of strings into a prose list"
|
||||
(are [call result] (= call result)
|
||||
(pages/prose-comma-list ["foo"]) "foo"
|
||||
(pages/prose-comma-list ["foo" "bar"]) "foo and bar"
|
||||
(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 []) "")))
|
||||
|
12
test/pronouns/resource_test.clj
Normal file
12
test/pronouns/resource_test.clj
Normal 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"))))
|
32
test/pronouns/util_test.clj
Normal file
32
test/pronouns/util_test.clj
Normal 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"]))
|
||||
|
Loading…
Reference in New Issue
Block a user