;; -*- coding: utf-8 -*- ;; ;; Copyright 2019 Fabien Bourgeois ;; ;; This program is free software: you can redistribute it and/or modify ;; it under the terms of the GNU Affero General Public License as ;; published by the Free Software Foundation, either version 3 of the ;; License, or (at your option) any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU Affero General Public License for more details. ;; ;; You should have received a copy of the GNU Affero General Public License ;; along with this program. If not, see . " XML helpers and macros " (import [xml.etree.ElementTree :as ET]) (defn xmlroot [tree] "Special process for root XML Node" (setv rootel (.Element ET (get tree "tag") (get tree "attrs")) children (get tree "children")) (if children (xmlchild rootel children)) (return rootel)) (defn xmlchild [parent children] "Handling of children (ie non root) XML Nodes with/o text and subchildren (recursive)" (for [child children] (if (string? child) (setv (. parent text) child) (do (setv attrs (dfor [k v] (.items (get child "attrs")) [(str k) (str v)])) (setv new_parent (.SubElement ET parent (get child "tag") attrs)) (setv subchildren (get child "children")) (if subchildren (xmlchild new_parent subchildren)))))) (defn xmln [tag &optional attrs children text] "XMLNode with default children, not attributes" (setv children (or (if text [text] children) [])) {"tag" tag "attrs" (or attrs {}) "children" children} ) (defmacro xmlnc [&rest args] "XMLNode with default children, not attributes" (cond [(= (len args) 1) (setv tag (first args) attrs {} children [])] [(= (len args) 2) (setv tag (first args) attrs {} children (last args))] [(= (len args) 3) (setv tag (first args) attrs (get args 1) children (last args))]) `{"tag" ~tag "attrs" ~attrs "children" ~children}) (defmacro xmlna [&rest args] "XMLNode with default attributes, not children" (cond [(= (len args) 1) (setv tag (first args) attrs {} children [])] [(= (len args) 2) (setv tag (first args) attrs (last args) children [])] [(= (len args) 3) (setv tag (first args) attrs (get args 1) children (last args))]) `{"tag" ~tag "attrs" ~attrs "children" ~children}) (defmacro xmlnt [&rest args] "XMLNode with no child but maybe some text" (cond [(= (len args) 1) (setv tag (first args) attrs {} text "")] [(= (len args) 2) (setv tag (first args) attrs {} text (last args))] [(= (len args) 3) (setv tag (first args) attrs (get args 1) text (last args))]) `(xmln ~tag ~attrs [~text]))