[#995] Add clojure.data.xml/alias-uri
This commit is contained in:
parent
1da01203ce
commit
cddd4ce581
2 changed files with 42 additions and 5 deletions
|
|
@ -1,13 +1,48 @@
|
||||||
(ns babashka.impl.xml
|
(ns babashka.impl.xml
|
||||||
{:no-doc true}
|
{:no-doc true}
|
||||||
(:require [clojure.data.xml :as xml]
|
(:require [babashka.impl.common :refer [ctx]]
|
||||||
[sci.impl.namespaces :refer [copy-var]]
|
[clojure.data.xml :as xml]
|
||||||
[sci.impl.vars :as vars]))
|
[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
|
(def xml-namespace
|
||||||
{'aggregate-xmlns (copy-var xml/aggregate-xmlns xns)
|
{'aggregate-xmlns (copy-var xml/aggregate-xmlns xns)
|
||||||
|
'alias-uri (copy-var alias-uri xns)
|
||||||
'as-qname (copy-var xml/as-qname xns)
|
'as-qname (copy-var xml/as-qname xns)
|
||||||
'cdata (copy-var xml/cdata xns)
|
'cdata (copy-var xml/cdata xns)
|
||||||
'element (copy-var xml/element xns)
|
'element (copy-var xml/element xns)
|
||||||
|
|
|
||||||
|
|
@ -430,7 +430,9 @@
|
||||||
(deftest clojure-data-xml-test
|
(deftest clojure-data-xml-test
|
||||||
(is (= "<?xml version=\"1.0\" encoding=\"UTF-8\"?><items><item>1</item><item>2</item></items>"
|
(is (= "<?xml version=\"1.0\" encoding=\"UTF-8\"?><items><item>1</item><item>2</item></items>"
|
||||||
(bb nil "(let [xml (xml/parse-str \"<items><item>1</item><item>2</item></items>\")] (xml/emit-str xml))")))
|
(bb nil "(let [xml (xml/parse-str \"<items><item>1</item><item>2</item></items>\")] (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
|
(deftest uberscript-test
|
||||||
(let [tmp-file (java.io.File/createTempFile "uberscript" ".clj")]
|
(let [tmp-file (java.io.File/createTempFile "uberscript" ".clj")]
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue