adding support for clojure.zip (#435)

This commit is contained in:
Matias Bjarland 2020-05-14 22:16:42 +02:00 committed by GitHub
parent 79cba0fbef
commit eef0b046cd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 97 additions and 0 deletions

View file

@ -187,6 +187,36 @@ $ bb "(use 'doric.core) (println (table [:a :b :c] [{:a 1 :b 2 :c 3} {:a 4 :b 5
|---+---+---|
```
### [clojure.data.zip](https://github.com/clojure/data.zip)
Utilities for clojure.zip, among other things a more fluent way to work
with xml.
Small sample:
``` clojure
$ export BABASHKA_CLASSPATH=$(clojure -Spath -Sdeps '{:deps {org.clojure/data.zip {:mvn/version "1.0.0"}}}')
$ cat data_zip_xml.clj
(require '[clojure.data.xml :as xml])
(require '[clojure.zip :as zip])
(require '[clojure.data.zip.xml :refer [text attr attr= xml-> xml1-> text=]])
(def data (str "<root>"
" <character type=\"person\" name=\"alice\" />"
" <character type=\"animal\" name=\"march hare\" />"
"</root>"))
(let [xml (-> data java.io.StringReader. xml/parse zip/xml-zip)]
(prn :alice-is-a (xml1-> xml :character [(attr= :name "alice")] (attr :type)))
(prn :animal-is-called (xml1-> xml :character [(attr= :type "animal")] (attr :name))))
$ bb data_zip_xml.clj
:alice-is-a "person"
:animal-is-called "march hare"
```
(see for exaple [this article](https://blog.korny.info/2014/03/08/xml-for-fun-and-profit.html#datazip-for-zipper-awesomeness)
for more on clojure.data.zip).
## Projects
### [deps.clj](https://github.com/borkdude/deps.clj)

View file

@ -0,0 +1,28 @@
#!/usr/bin/env bash
set -eo pipefail
export BABASHKA_CLASSPATH="$(clojure -Sdeps '{:deps {org.clojure/data.zip {:mvn/version "1.0.0"}}}' -Spath)"
if [ "$BABASHKA_TEST_ENV" = "native" ]; then
BB_CMD="./bb"
else
BB_CMD="lein bb"
fi
$BB_CMD --verbose "
(require '[clojure.data.xml :as xml])
(require '[clojure.zip :as zip])
(require '[clojure.data.zip.xml :refer [text attr attr= xml-> xml1-> text=]])
(def data (str \"<root>\"
\" <character type=\\\"person\\\" name=\\\"alice\\\" />\"
\" <character type=\\\"animal\\\" name=\\\"march hare\\\" />\"
\"</root>\"))
;(prn :data data)
(let [xml (zip/xml-zip (xml/parse (java.io.StringReader. data)))]
;(prn :xml xml)
(prn :alice-is-a (xml1-> xml :character [(attr= :name \"alice\")] (attr :type)))
(prn :animal-is-called (xml1-> xml :character [(attr= :type \"animal\")] (attr :name))))
"

View file

@ -0,0 +1,37 @@
(ns babashka.impl.clojure.zip
{:no-doc true}
(:require [clojure.zip :as zip]
[sci.impl.namespaces :refer [copy-var]]
[sci.impl.vars :as vars]))
(def zip-ns (vars/->SciNamespace 'clojure.zip nil))
(def zip-namespace
{'zipper (copy-var zip/zipper zip-ns)
'seq-zip (copy-var zip/seq-zip zip-ns)
'vector-zip (copy-var zip/vector-zip zip-ns)
'xml-zip (copy-var zip/xml-zip zip-ns)
'node (copy-var zip/node zip-ns)
'branch? (copy-var zip/branch? zip-ns)
'children (copy-var zip/children zip-ns)
'make-node (copy-var zip/make-node zip-ns)
'path (copy-var zip/path zip-ns)
'lefts (copy-var zip/lefts zip-ns)
'rights (copy-var zip/rights zip-ns)
'down (copy-var zip/down zip-ns)
'up (copy-var zip/up zip-ns)
'root (copy-var zip/root zip-ns)
'right (copy-var zip/right zip-ns)
'rightmost (copy-var zip/rightmost zip-ns)
'left (copy-var zip/left zip-ns)
'leftmost (copy-var zip/leftmost zip-ns)
'insert-left (copy-var zip/insert-left zip-ns)
'insert-right (copy-var zip/insert-right zip-ns)
'replace (copy-var zip/replace zip-ns)
'edit (copy-var zip/edit zip-ns)
'insert-child (copy-var zip/insert-child zip-ns)
'append-child (copy-var zip/append-child zip-ns)
'next (copy-var zip/next zip-ns)
'prev (copy-var zip/prev zip-ns)
'end? (copy-var zip/end? zip-ns)
'remove (copy-var zip/remove zip-ns)})

View file

@ -11,6 +11,7 @@
[babashka.impl.clojure.main :as clojure-main :refer [demunge]]
[babashka.impl.clojure.pprint :refer [pprint-namespace]]
[babashka.impl.clojure.stacktrace :refer [stacktrace-namespace]]
[babashka.impl.clojure.zip :refer [zip-namespace]]
[babashka.impl.common :as common]
[babashka.impl.curl :refer [curl-namespace]]
[babashka.impl.features :as features]
@ -350,6 +351,7 @@ If neither -e, -f, or --socket-repl are specified, then the first argument that
'clojure.java.io io-namespace
'cheshire.core cheshire-core-namespace
'clojure.stacktrace stacktrace-namespace
'clojure.zip zip-namespace
'clojure.main {'demunge demunge
'repl-requires clojure-main/repl-requires}
'clojure.test t/clojure-test-namespace