diff --git a/src/pronouns/pages.clj b/src/pronouns/pages.clj index 3e63437..2aaf964 100644 --- a/src/pronouns/pages.clj +++ b/src/pronouns/pages.clj @@ -43,13 +43,17 @@ (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 "examples"} + [:p [:h2 header-str]] + (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"} @@ -71,22 +75,22 @@ (defn format-pronoun-examples - [subject object possessive-determiner possessive-pronoun reflexive] + [pronoun-declension alternates] (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)]]))) + (html + [:html + [:head + [:title title] + [:meta {:name "viewport" :content "width=device-width"}] + [:link {:rel "stylesheet" :href "/pronouns.css"}]] + [:body + (title-block title) + (apply examples-block pronoun-declension) + (map #(apply examples-block %) alternates) + (about-block) + (contact-block)]]))) - -(defn parse-pronouns-with-lookup [pronouns-string pronouns-table] +(defn lookup-pronouns [pronouns-string pronouns-table] (let [inputs (s/split pronouns-string #"/") n (count inputs)] (if (>= n 5) @@ -121,8 +125,14 @@ "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) +(defn pronouns [params pronouns-table] + (let [path (params :*) + ors (u/vec-coerce (params "or")) + pronoun-declension (lookup-pronouns (escape-html path) + pronouns-table) + alternates (map #(lookup-pronouns (escape-html %) + pronouns-table) + ors)] + (if pronoun-declension + (format-pronoun-examples pronoun-declension alternates) (not-found)))) diff --git a/src/pronouns/util.clj b/src/pronouns/util.clj index 4d4f928..3a4bf10 100644 --- a/src/pronouns/util.clj +++ b/src/pronouns/util.clj @@ -29,3 +29,6 @@ "given a list of pronoun rows, return a list of minimum unabiguous paths" [pronouns-table] (map (partial minimum-unambiguous-path pronouns-table) pronouns-table)) + +(defn vec-coerce [x] + (if (vector? x) x [x])) diff --git a/src/pronouns/web.clj b/src/pronouns/web.clj index 23ac603..cb5e6c9 100644 --- a/src/pronouns/web.clj +++ b/src/pronouns/web.clj @@ -6,8 +6,7 @@ [clojure.string :as s] [ring.middleware.logger :as logger] [ring.middleware.stacktrace :as trace] - [ring.middleware.session :as session] - [ring.middleware.session.cookie :as cookie] + [ring.middleware.params :as params] [ring.adapter.jetty :as jetty] [environ.core :refer [env]] [pronouns.util :as u] @@ -23,7 +22,7 @@ :headers {"Content-Type" "text/html"} :body (pages/front pronouns-table)}) - (GET "/pronouns.css" {params :params} + (GET "/pronouns.css" [] {:status 200 :headers {"Content-Type" "text/css"} :body (slurp (io/resource "pronouns.css"))}) @@ -31,7 +30,7 @@ (GET "/*" {params :params} {:status 200 :headers {"Content-Type" "text/html"} - :body (pages/pronouns (:* params) pronouns-table)}) + :body (pages/pronouns params pronouns-table)}) (ANY "*" [] (route/not-found (slurp (io/resource "404.html"))))) @@ -48,7 +47,8 @@ (-> app-routes logger/wrap-with-logger wrap-error-page - trace/wrap-stacktrace)) + trace/wrap-stacktrace + params/wrap-params)) (defn -main [] (let [port (Integer. (:port env