|
|
|
|
(ns NoteHub.settings
|
|
|
|
|
(:require [clojure.contrib.string :as ccs])
|
|
|
|
|
(:refer-clojure :exclude [replace reverse])
|
|
|
|
|
(:use [clojure.string]))
|
|
|
|
|
|
|
|
|
|
; Loads and parses any file with each line consisting a key and
|
|
|
|
|
; a value separated by a "=", and returns a corresponding key-value map.
|
|
|
|
|
(defn- get-pairs-map [file]
|
|
|
|
|
(let [file-content (slurp file)
|
|
|
|
|
pairs (map #(map trim (split % #"=" 2))
|
|
|
|
|
(remove ccs/blank? (ccs/split-lines file-content)))]
|
|
|
|
|
(apply hash-map
|
|
|
|
|
(mapcat #(list (keyword (first %)) (second %)) pairs))))
|
|
|
|
|
|
|
|
|
|
; Loads the setting file to a map
|
|
|
|
|
(def settings-map
|
|
|
|
|
(get-pairs-map "settings"))
|
|
|
|
|
|
|
|
|
|
; Loads the messages file to a map
|
|
|
|
|
(def messages-map
|
|
|
|
|
(get-pairs-map "messages"))
|
|
|
|
|
|
|
|
|
|
(defn get-message [key]
|
|
|
|
|
"Returns messages used in layouts. Every key should be a keyword, e.g. (get-message :title)."
|
|
|
|
|
(messages-map key))
|
|
|
|
|
|
|
|
|
|
(defn get-setting
|
|
|
|
|
"Takes a settings key, a converter function and a default value, and returns a corresponding
|
|
|
|
|
setting value. The default value is returned back when no setting value was found.
|
|
|
|
|
The converter function can be provided to convert the setting from string to a needed type.
|
|
|
|
|
This function is not applied to the specified default value!
|
|
|
|
|
Every specified key should be a keyword, e.g. (get-setting :page-width)."
|
|
|
|
|
[key & more]
|
|
|
|
|
(let [converter (first more)
|
|
|
|
|
default (second more)
|
|
|
|
|
value (settings-map key)
|
|
|
|
|
; Through this hack we can read security-critical settings from (previously
|
|
|
|
|
; set) shell variables without commiting their content to CVS
|
|
|
|
|
value (if value value
|
|
|
|
|
(System/getenv
|
|
|
|
|
(upper-case
|
|
|
|
|
(replace (name key) #"-" ""))))]
|
|
|
|
|
(if value
|
|
|
|
|
(if (fn? converter) (converter value) value)
|
|
|
|
|
default)))
|