I have a small pebble in my shoe using rewrite-clj in one of our scripts. Can you point me in the right direction?
This URL should explain (hopefully the URL highlights the string "we didn't find a way ..."
https://github.com/day8/re-com/blob/master/scripts/add-at-macro/README.md#readme:~:text=we%20didn't%20find%20a%20way%20to%20add%20code%20on%20the%20next%20line%2C%20with%20correct%20indentation
Problem: we were able to add the :src (at) code, but we couldn't ever add it correctly formatted/indented. So, in the example given on that page, is there a way to figure out the indentation level of :size (the first child of v-box ) ... and then add that level of indentation in front of the :src being added?
@mikethompson, I am glad it is just a small pebble in your shoe and not a thorn in your side!
Here’s one naive example that might get you going.
(let [code (str "[v-box\n"
" :size \"auto\"\n"
" :gap \"10px\"\n"
" :children []]")
zloc (z/of-string code)
zloc-arg1 (-> zloc z/down z/right)
indent-col (-> zloc-arg1 z/node meta :col)]
(-> zloc-arg1
(z/insert-left :src)
(z/insert-left '(at))
z/insert-newline-left
(z/insert-space-left (dec indent-col))
z/print-root))
;; =stdout=>
; [v-box
; :src (at)
; :size "auto"
; :gap "10px"
; :children []]
My little example here uses https://cljdoc.org/d/rewrite-clj/rewrite-clj/1.0.605-alpha/doc/user-guide#nodes.
If your work through the zipper changes :col for subsequent nodes, then you might consider https://cljdoc.org/d/rewrite-clj/rewrite-clj/1.0.605-alpha/doc/user-guide#position-tracking instead of metadata.
Another strategy some people take is to get formatting good enough (usually just inserting newlines) for a final treatment with a dedicated formatting tool like https://github.com/weavejester/cljfmt.This looks great, thanks! We'll work on it.
@lee @borkdude
For the record, Ike has now used this approach. Thanks!
https://github.com/day8/re-com/pull/282
This script might be an interesting example to point to from a tutorial point of view. It is well documented, has tests, uses lots of features, and is non trivial without being crazy complicated, and is run via bb.
probably obvious but zprint and cljstyle might be worth considering in addition to the already mentioned cljfmt