Use cljx, change cljsbuild names
authorJoel Holdbrooks <cjholdbrooks@gmail.com>
Tue, 20 Aug 2013 07:23:59 +0000 (00:23 -0700)
committerJoel Holdbrooks <cjholdbrooks@gmail.com>
Tue, 20 Aug 2013 07:23:59 +0000 (00:23 -0700)
project.clj
src/clj/frak/cli.clj [deleted file]
src/cljs/frak/cli.cljs [deleted file]
src/cljx/frak.cljx [moved from src/clj/frak.clj with 94% similarity]
src/cljx/frak/cli.cljx [new file with mode: 0644]

index 53a91864a28ebe186ae23f1643175e928b538bb2..e82e39a238a871a5ea711d77ad55e35a496ddbcf 100644 (file)
@@ -3,26 +3,31 @@
   :url "http://github.com/noprompt/frak"
   :license {:name "Eclipse Public License"
             :url "http://www.eclipse.org/legal/epl-v10.html"}
+  :jar-exclusions [#"(?:\.(?:cljx|sw[onp])|cli\.cljs?)"]
   :dependencies [[org.clojure/clojure "1.5.1"]]
-  :plugins [[lein-cljsbuild "0.3.2"]]
-  :source-paths ["src/clj"]
-  :profiles {:dev {:dependencies [[criterium "0.4.1"]]}}
-  :cljsbuild {:crossovers [frak]
-              :crossover-path "crossovers"
-              :crossover-jar true
-              :builds [{:id "dev"
-                        :source-paths ["src/clj" "src/cljs"]
-                        :compiler {:output-to "bin/frak.dev.js"
-                                   :optimizations :simple
-                                   :pretty-print true
-                                   :target :nodejs}}
-                       
-                       {:id "prod"
-                        :source-paths ["src/clj" "src/cljs"]
-                        :compiler {:output-to "bin/frak.prod.js"
+  :plugins [[lein-cljsbuild "0.3.2"]
+            [com.keminglabs/cljx "0.3.0"]]
+  :source-paths ["src/cljx"]
+  :profiles {:dev {:dependencies [[criterium "0.4.1"]
+                                  [com.keminglabs/cljx "0.3.0"]]
+                   :repl-options {:nrepl-middleware [cljx.repl-middleware/wrap-cljx]}}}
+  :cljx {:builds [{:source-paths ["src/cljx"]
+                   :output-path "target/classes"
+                   :rules :clj}
+                  {:source-paths ["src/cljx"]
+                   :output-path "target/classes"
+                   :rules :cljs}]}
+  :cljsbuild {:builds [{:id "browser"
+                        :source-paths ["target/classes"]
+                        :compiler {:output-to "resources/frak.min.js"
+                                   :optimizations :advanced 
+                                   :pretty-print false}}
+                       {:id "node"
+                        :source-paths ["target/classes"]
+                        :compiler {:output-to "bin/frak"
                                    :externs ["resources/externs/process.js"]
                                    :optimizations :advanced
                                    :pretty-print false
-                                   :target :nodejs}}]}
+                                   :target :nodejs}}]} 
   :main frak.cli
   :repl-options {:init-ns frak})
diff --git a/src/clj/frak/cli.clj b/src/clj/frak/cli.clj
deleted file mode 100644 (file)
index 05d6354..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-(ns frak.cli
-  (:require [frak]))
-
-(defn -main
-  "Passes arguments to frak/pattern"
-  [& args]
-  (println (str (frak/pattern args)))
-  (System/exit 0))
diff --git a/src/cljs/frak/cli.cljs b/src/cljs/frak/cli.cljs
deleted file mode 100644 (file)
index 953f3f9..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-(ns frak.cli
-  (:require [clojure.string :as s]
-            [frak]))
-
-(def FLAGS
-  [[["-e" "--exact"] "Generated pattern requires an exact match"]
-   [["-c" "--capture"] "Generated pattern captures"]
-   [["-h" "--help"] "Display this help message"]])
-
-(def flag-re (frak/pattern (mapcat first FLAGS)))
-
-(defn parse-args [args]
-  (split-with #(re-matches flag-re %) args))
-
-(defn flag-val [s]
-  (condp re-seq s
-    #"-(?:e|-exact)" {:exact? true}
-    #"-(?:c|-capture)" {:capture? true}
-    #"-(?:h|-help)" {:help? true}
-    {}))
-
-(defn flags->opts [flags]
-  (reduce
-   (fn [m flag]
-     (merge m (flag-val flag)))
-   {}
-   flags))
-
-(def summary 
-  (reduce
-   (fn [message [flags info]]
-     (format "%s\t%s\t%s\n" message (s/join ", " flags) info))
-   "Usage: frak <flags*> <strings+>\n\n"
-   FLAGS))
-
-(defn exit [code]
-  (.exit js/process code))
-
-(defn help []
-  (.error js/console summary)
-  (exit 0))
-
-(defn start
-  [& args]
-  (let [[flags words] (parse-args args)
-        opts (flags->opts flags)]
-    (if (or (empty? args) (:help? opts))
-      (help)
-      (let [pat (str (frak/pattern words opts))]
-        (.log js/console (subs pat 1 (dec (count pat))))))))
-
-(set! *main-cli-fn* start)
similarity index 94%
rename from src/clj/frak.clj
rename to src/cljx/frak.cljx
index 102138b2038b8bd5b5c736772b6491c7b4ba0554..f6410bd54e9fd6fc7f32ee07b1d08bd5324bc74f 100644 (file)
@@ -92,7 +92,7 @@
   ([chars]
      (re-char-set chars false))
   ([chars optional?]
-     (when (seq chars)
+     (when-let [chars (and (seq chars) (map escape chars))]
        (str 
         (if (= 1 (count chars))
           (first chars)
 
 (defmethod render-trie ::single-char
   [{:keys [char]}]
-  (str char))
+  (escape char))
 
 (defmethod render-trie ::single-child-terminal
   [{:keys [char children]}]
   (let [child (first children)]
     (str
-     char
+     (escape char)
      (if (and (:terminal? child)
               (not (seq (:children child))))
        (render-trie
 
 (defmethod render-trie ::single-child-non-terminal
   [{:keys [char children]}]
-  (let [child (first children)]
-    (str char (render-trie child))))
+  (str (escape char) (render-trie (first children))))
 
 (defmethod render-trie :default
   [{:keys [char children terminal?]}]
                 (-> (first v)
                     (dissoc :char)
                     (render-trie)
+                    ;; Replace instances of "(?:[abc])" with "[abc]".
                     ;; This is such an ugly hack.
                     (string/replace #"\(\?:?(\[[^\]]+\])\)" "$1"))))
          groups)]
-    (str char
+    (str (escape char)
          (if (= (first grouped) (peek grouped))
            (str (peek grouped) (when terminal? "?"))
            (re-group grouped terminal?)))))
       (str "^" pattern "$")
       pattern)))
 
-(defn pattern
+(defn ^:export pattern
   "Construct a regular expression from a collection of strings."
   ([strs]
      (pattern strs {:capture? false, :exact? false}))
diff --git a/src/cljx/frak/cli.cljx b/src/cljx/frak/cli.cljx
new file mode 100644 (file)
index 0000000..d8cd6ff
--- /dev/null
@@ -0,0 +1,76 @@
+(ns frak.cli
+  "Command line interface."
+  (:require [clojure.string :as string]
+            [frak]))
+
+;;;; Utilities
+
+#+clj
+(defn exit [code]
+  (System/exit code))
+
+#+cljs 
+(defn exit [code]
+  (.exit js/process code))
+
+#+clj
+(defn printerr [message]
+  (.println *err* message))
+
+#+cljs
+(defn printerr [message]
+  (.error js/console message))
+
+#+clj
+(defn log [message]
+  (println message))
+
+#+cljs
+(defn log [message]
+  (.log js/console message))
+
+;;;; Main 
+
+(def main-flags
+  [[["-e" "--exact"] "Generated pattern requires an exact match"]
+   [["-c" "--capture"] "Generated pattern captures"]
+   [["-h" "--help"] "Display this help message"]])
+
+(defn flag-val [s]
+  (condp re-seq s
+    #"-(?:e|-exact)" {:exact? true}
+    #"-(?:c|-capture)" {:capture? true}
+    #"-(?:h|-help)" {:help? true}
+    {}))
+
+(defn flags->opts [flags]
+  (reduce
+   (fn [m flag]
+     (merge m (flag-val flag)))
+   {}
+   flags))
+
+(def summary 
+  (reduce
+   (fn [message [flags info]]
+     (format "%s\t%s\t%s\n" message (string/join ", " flags) info))
+   "Usage: frak <flags*> <strings+>\n\n"
+   main-flags))
+
+(defn parse-args [args]
+  (let [flag? (->> (mapcat first main-flags)
+                   (frak/pattern)
+                   (partial re-matches))]
+    (split-with flag? args)))
+
+(defn -main
+  "Passes arguments to frak/pattern"
+  [& args]
+  (let [[flags words] (parse-args args)
+        opts (flags->opts flags)]
+    (if (or (empty? args) (:help? opts))
+      (log summary)
+      (log (frak/string-pattern words opts)))
+    (exit 0)))
+
+#+cljs (set! *main-cli-fn* -main)