diff options
Diffstat (limited to 'src/pronouns/pages.clj')
-rw-r--r-- | src/pronouns/pages.clj | 145 |
1 files changed, 94 insertions, 51 deletions
diff --git a/src/pronouns/pages.clj b/src/pronouns/pages.clj index 3e63437..60175c9 100644 --- a/src/pronouns/pages.clj +++ b/src/pronouns/pages.clj @@ -1,9 +1,30 @@ +;; pronoun.is - a website for pronoun usage examples +;; Copyright (C) 2014 - 2016 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 +;; published by the Free Software Foundation, either version 3 of the +;; License, or (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; 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/> + (ns pronouns.pages (:require [clojure.string :as s] + [pronouns.config :refer [*pronouns-table*]] [pronouns.util :as u] [hiccup.core :refer :all] [hiccup.util :refer [escape-html]])) +(defn href + [url text] + [:a {:href url} text]) + (defn wrap-pronoun [pronoun] [:b pronoun]) @@ -38,68 +59,75 @@ ".")) (defn title-block [title] - [:div {:class "title"} + [:div {:class "section title"} [:h1 title]]) (defn examples-block [subject object possessive-determiner possessive-pronoun reflexive] - [:div {:class "examples"} - [:p [:h2 "Here are some usage examples for my pronouns:"]] - (subject-example subject) - (object-example object) - (posessive-determiner-example subject possessive-determiner) - (possessive-pronoun-example possessive-pronoun) - (reflexive-example subject reflexive)]) + (let [sub-obj (str subject "/" object) + header-str (str "Here are some usage examples for my " + sub-obj + " pronouns")] + [:div {:class "section examples"} + [:h2 header-str] + [:p (subject-example subject) + (object-example object) + (posessive-determiner-example subject possessive-determiner) + (possessive-pronoun-example possessive-pronoun) + (reflexive-example subject reflexive)]])) (defn about-block [] - [:div {:class "about"} + [:div {:class "section about"} [:p "Full usage: " - [:tt "http://pronoun.is/subject-pronoun/object-pronoun/possessive-determiner/possessive-pronoun/reflexive"] - " displays examples of your pronouns."] + [:tt "http://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."]]) (defn contact-block [] - (let [twitter-name (fn [handle] [:a {:href (str "https://www.twitter.com/" handle)} (str "@" handle)])] - [:div {:class "contact"} - [:p - "Written by " - (twitter-name "morganastra") - ", whose " - [:a {:href "http://pronoun.is/ze/zir"} "pronoun.is/ze/zir"] - ". " - "Visit the project on " [:a {:href "https://github.com/witch-house/pronoun.is"} "github!"]]])) - + (let [twitter-name (fn [handle] (href (str "https://www.twitter.com/" handle) + (str "@" handle)))] + [:div {:class "section contact"} + [:p "Written by " + (twitter-name "morganastra") + ", whose " + (href "http://pronoun.is/ze/zir?or=she" "pronoun.is/ze/zir?or=she")] + [:p "pronoun.is is free software under the " + (href "https://www.gnu.org/licenses/agpl.html" "AGPLv3") + "! visit the project on " + (href "https://github.com/witch-house/pronoun.is" "github")] + [:p "<3"]])) + +(defn footer-block [] + [:footer (about-block) (contact-block)]) (defn format-pronoun-examples - [subject object possessive-determiner possessive-pronoun reflexive] + [pronoun-declensions] (let [title "Pronoun Island: English Language Examples"] - (html - [:html - [:head - [:title title] - [:meta {:name "viewport" :content "width=device-width"}] - [:link {:rel "stylesheet" :href "/pronouns.css"}]] - [:body - (title-block title) - (examples-block subject object possessive-determiner possessive-pronoun reflexive) - (about-block) - (contact-block)]]))) - - -(defn parse-pronouns-with-lookup [pronouns-string pronouns-table] + (html + [:html + [:head + [:title title] + [:meta {:name "viewport" :content "width=device-width"}] + [:link {:rel "stylesheet" :href "/pronouns.css"}]] + [:body + (title-block title) + (map #(apply examples-block %) pronoun-declensions) + (footer-block)]]))) + +(defn lookup-pronouns [pronouns-string] (let [inputs (s/split pronouns-string #"/") n (count inputs)] (if (>= n 5) (take 5 inputs) - (u/table-lookup inputs pronouns-table)))) + (u/table-lookup inputs *pronouns-table*)))) (defn make-link [path] (let [link (str "/" path) label path] - [:li [:a {:href link} label]])) + [:li (href link label)])) -(defn front [pronouns-table] - (let [abbreviations (u/abbreviate pronouns-table) +(defn front [] + (let [abbreviations (u/abbreviate *pronouns-table*) links (map make-link abbreviations) title "Pronoun Island"] (html @@ -110,19 +138,34 @@ [:link {:rel "stylesheet" :href "/pronouns.css"}]] [:body (title-block title) - [:div {:class "table"} - [:p "pronoun.is is a www site for showing people how to use pronouns in English."] + [: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]]] - (contact-block)]))) + (footer-block)]))) (defn not-found [] - (str "We couldn't find those pronouns in our database, please ask us to " - "add them, or issue a pull request at " - "https://github.com/witch-house/pronoun.is/blob/master/resources/pronouns.tab")) - -(defn pronouns [path pronouns-table] - (let [pronouns (parse-pronouns-with-lookup (escape-html path) pronouns-table)] - (if pronouns - (apply format-pronoun-examples pronouns) + (let [title "Pronoun Island: English Language Examples"] + (html + [:html + [:head + [:title title] + [:meta {:name "viewport" :content "width=device-width"}] + [:link {:rel "stylesheet" :href "/pronouns.css"}]] + [:body + (title-block title) + [:div {:class "section examples"} + [:p [:h2 (str "We couldn't find those pronouns in our database." + "If you think we should have them, please reach out!")]]] + (footer-block)]]))) + +(defn pronouns [params] + (let [path (params :*) + alts (or (params "or") []) + pronouns (concat [path] (u/vec-coerce alts)) + pronoun-declensions (filter some? (map #(lookup-pronouns + (escape-html %)) + pronouns))] + (if (seq pronoun-declensions) + (format-pronoun-examples pronoun-declensions) (not-found)))) |