diff --git a/doc/libraries.md b/doc/libraries.md index 125e9232..6d7e8ec3 100644 --- a/doc/libraries.md +++ b/doc/libraries.md @@ -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 "" + " " + " " + "")) + +(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) diff --git a/script/lib_tests/clojure_data_zip_test b/script/lib_tests/clojure_data_zip_test new file mode 100755 index 00000000..3cbbfb6b --- /dev/null +++ b/script/lib_tests/clojure_data_zip_test @@ -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 \"\" + \" \" + \" \" + \"\")) + +;(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)))) +" diff --git a/src/babashka/impl/clojure/zip.clj b/src/babashka/impl/clojure/zip.clj new file mode 100644 index 00000000..8a101d26 --- /dev/null +++ b/src/babashka/impl/clojure/zip.clj @@ -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)}) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index c5c3572e..d07d863c 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -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