From d88f645e267078572c19cbe37b37acc9798ad532 Mon Sep 17 00:00:00 2001 From: Morgan Date: Tue, 10 Mar 2015 09:29:58 +0000 Subject: [PATCH] factor out pages and util namespaces per #6 --- src/pronouns/pages.clj | 33 +++++++++++++++++++++++++++++++++ src/pronouns/util.clj | 16 ++++++++++++++++ src/pronouns/web.clj | 41 +++++++---------------------------------- 3 files changed, 56 insertions(+), 34 deletions(-) create mode 100644 src/pronouns/pages.clj create mode 100644 src/pronouns/util.clj diff --git a/src/pronouns/pages.clj b/src/pronouns/pages.clj new file mode 100644 index 0000000..f1f8b67 --- /dev/null +++ b/src/pronouns/pages.clj @@ -0,0 +1,33 @@ +(ns pronouns.pages + (:require [clojure.string :as s] + [pronouns.util :as u])) + +(defn format-pronoun-examples + [subject object possessive-determiner possessive-pronoun reflexive] + (s/join "\n" + [(str subject " went to the park") + (str "I went with " object) + (str subject " brought " possessive-determiner " frisbee") + (str "at least I think it was " possessive-pronoun) + (str subject " threw it to " reflexive)])) + +(defn parse-pronouns-with-lookup [pronouns-string pronouns-table] + (let [inputs (s/split pronouns-string #"/") + n (count inputs)] + (if (>= n 5) + (take 5 inputs) + (u/table-lookup inputs pronouns-table)))) + +(defn front [] + (str "pronoun.is is a www site for showing people how to use pronouns")) + +(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 path pronouns-table)] + (if pronouns + (apply format-pronoun-examples pronouns) + (not-found)))) diff --git a/src/pronouns/util.clj b/src/pronouns/util.clj new file mode 100644 index 0000000..1269664 --- /dev/null +++ b/src/pronouns/util.clj @@ -0,0 +1,16 @@ +(ns pronouns.util + (:require [clojure.string :as s])) + +(defn slurp-tabfile [path] + (let [lines (s/split (slurp path) #"\n")] + (map #(s/split % #"\t") lines))) + +(defn table-lookup + [query-key table] + (let [arity (count query-key) + filtered-table (filter #(= query-key (take arity %)) table)] + (first filtered-table))) + +(defn tabfile-lookup + [query-key tabfile] + (table-lookup query-key (slurp-tabfile tabfile))) diff --git a/src/pronouns/web.clj b/src/pronouns/web.clj index 83f25e6..32d0883 100644 --- a/src/pronouns/web.clj +++ b/src/pronouns/web.clj @@ -9,51 +9,24 @@ [ring.middleware.session :as session] [ring.middleware.session.cookie :as cookie] [ring.adapter.jetty :as jetty] - [environ.core :refer [env]])) + [environ.core :refer [env]] + [pronouns.util :as u] + [pronouns.pages :as pages])) (def config {:default-server-port 5000 :pronoun-table-path "resources/pronouns.tab"}) - -(defn slurp-tabfile [path] - (let [lines (s/split (slurp path) #"\n")] - (map #(s/split % #"\t") lines))) - -(defn lookup [inputs] - (let [pronouns-table (slurp-tabfile (:pronoun-table-path config)) - n (count inputs) - filtered-table (filter #(= inputs (take n %)) pronouns-table)] - (first filtered-table))) - -(defn parse-pronouns-with-lookup [pronouns-string] - (let [inputs (s/split pronouns-string #"/") - n (count inputs)] - (if (>= n 5) - (take 5 inputs) - (lookup inputs)))) - -(defn render-examples-page - ([subject object possessive-determiner possessive-pronoun reflexive] - (s/join "\n" - [(str subject " went to the park") - (str "I went with " object) - (str subject " brought " possessive-determiner " frisbee") - (str "at least I think it was " possessive-pronoun) - (str subject " threw it to " reflexive)])) - ([nothing] - (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"))) +(def pronouns-table (u/slurp-tabfile (:pronoun-table-path config))) (defroutes app-routes (GET "/" [] {:status 200 :headers {"Content-Type" "text/plain"} - :body "a blurb explaining how to use this site"}) + :body (pages/front)}) + (GET "/*" {params :params} {:status 200 :headers {"Content-Type" "text/plain"} - :body (let [pronouns (parse-pronouns-with-lookup (:* params))] - (apply render-examples-page (or pronouns [:error])))}) + :body (pages/pronouns (:* params) pronouns-table)}) (ANY "*" [] (route/not-found (slurp (io/resource "404.html")))))