diff --git a/feature-xml/babashka/impl/xml.clj b/feature-xml/babashka/impl/xml.clj index 50127016..f3714a08 100644 --- a/feature-xml/babashka/impl/xml.clj +++ b/feature-xml/babashka/impl/xml.clj @@ -1,13 +1,48 @@ (ns babashka.impl.xml {:no-doc true} - (:require [clojure.data.xml :as xml] - [sci.impl.namespaces :refer [copy-var]] - [sci.impl.vars :as vars])) + (:require [babashka.impl.common :refer [ctx]] + [clojure.data.xml :as xml] + [sci.core :as sci :refer [copy-var]] + [sci.impl.vars])) -(def xns (vars/->SciNamespace 'clojure.data.xml nil)) +(def xns (sci/create-ns 'clojure.data.xml nil)) + +(defn- clj-ns-name [ns] + (cond (instance? sci.impl.vars.SciNamespace ns) (str ns) + (keyword? ns) (name ns) + :else (str ns))) + +(defn alias-uri + "Define a Clojure namespace aliases for xmlns uris. + This sets up the current namespace for reading qnames denoted with + Clojure's ::alias/keywords reader feature. + + ## Example + (alias-uri :D \"DAV:\") + ; similar in effect to + ;; (require '[xmlns.DAV%3A :as D]) + ; but required namespace is auto-created + ; henceforth, shorthand keywords can be used + {:tag ::D/propfind} + ; ::D/propfind will be expanded to :xmlns.DAV%3A/propfind + ; in the current namespace by the reader + ## Clojurescript support + Currently, namespaces can't be auto-created in Clojurescript. + Dummy files for aliased uris have to exist. Have a look at `uri-file` and `print-uri-file-command!` to create those." + {:arglists '([& {:as alias-nss}])} + [& ans] + (loop [[a n & rst :as ans] ans] + (when (seq ans) + #_(assert (<= (count ans)) (pr-str ans)) + (let [xn (xml/uri-symbol n) + al (symbol (clj-ns-name a))] + (sci/eval-form @ctx `(create-ns (quote ~xn))) + (sci/eval-form @ctx `(alias (quote ~al) (quote ~xn))) + (recur rst))))) (def xml-namespace {'aggregate-xmlns (copy-var xml/aggregate-xmlns xns) + 'alias-uri (copy-var alias-uri xns) 'as-qname (copy-var xml/as-qname xns) 'cdata (copy-var xml/cdata xns) 'element (copy-var xml/element xns) diff --git a/test/babashka/main_test.clj b/test/babashka/main_test.clj index f04563d3..a703b1ee 100644 --- a/test/babashka/main_test.clj +++ b/test/babashka/main_test.clj @@ -430,7 +430,9 @@ (deftest clojure-data-xml-test (is (= "12" (bb nil "(let [xml (xml/parse-str \"12\")] (xml/emit-str xml))"))) - (is (= "0.0.87-SNAPSHOT" (bb nil "examples/pom_version_get.clj" (.getPath (io/file "test-resources" "pom.xml")))))) + (is (= "0.0.87-SNAPSHOT" (bb nil "examples/pom_version_get.clj" (.getPath (io/file "test-resources" "pom.xml"))))) + (is (= ":xmlns.DAV%3A/propfind" + (bb nil "(clojure.data.xml/alias-uri :D \"DAV:\") (str ::D/propfind)")))) (deftest uberscript-test (let [tmp-file (java.io.File/createTempFile "uberscript" ".clj")]