emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/org-real 2ee4b19 006/160: More edge cases


From: ELPA Syncer
Subject: [elpa] externals/org-real 2ee4b19 006/160: More edge cases
Date: Wed, 6 Oct 2021 16:58:04 -0400 (EDT)

branch: externals/org-real
commit 2ee4b1955bd7f2dcf6a36e22bacec45025c022c3
Author: Tyler Grinn <tylergrinn@gmail.com>
Commit: Tyler Grinn <tylergrinn@gmail.com>

    More edge cases
---
 garage.org       |   4 +++
 org-real.el      | 104 +++++++++++++++++++++++++++++++++++++++++++++----------
 prepositions.org |   8 +++++
 3 files changed, 97 insertions(+), 19 deletions(-)

diff --git a/garage.org b/garage.org
index 92cf5f5..b8ebb4b 100644
--- a/garage.org
+++ b/garage.org
@@ -1,4 +1,8 @@
 * Items in the garage
   - [[real://garage/workbench?rel=in/wrench?rel=on][wrench]]
   - [[real://garage/workbench?rel=in/ratchet?rel=on][ratchet]]
+  - [[real://garage/workbench?rel=in/ratchet?rel=on/screwdriver?rel=to the 
left of][screwdriver]]
   - [[real://garage/east wall?rel=in/rake?rel=on][rake]]
+  - [[real://garage/east wall?rel=in/rake?rel=on/shovel?rel=to the left 
of][shovel]]
+  - [[real://garage/east wall?rel=in/rake?rel=on/hoe?rel=to the left of][hoe]]
+  - 
[[real://garage/workbench?rel=in/wrench?rel=on/paintbrush?rel=above][paintbrush]]
diff --git a/org-real.el b/org-real.el
index 62510d6..dc7f358 100644
--- a/org-real.el
+++ b/org-real.el
@@ -55,7 +55,7 @@
                (oset box :behind t))
               ((string= rel "in front of")
                (oset box :x-order (oref prev :x-order))
-               (oset box :y-order (oref prev :y-order))
+               (oset box :y-order 9999)
                (oset box :behind (oref prev :behind))
                (oset box :in-front t))
               ((string= rel "above")
@@ -147,15 +147,73 @@
                   (when (and (slot-boundp from-box :name)
                              (slot-boundp to-box :name)
                              (string= (oref from-box :name) (oref to-box 
:name)))
-                    (mapc
-                     (lambda (child)
-                       (org-real--flex-add child to-box to))
-                     (oref from-box :children))
+                    (org-real--add-matching from-box to-box to)
                     t))
                 to-boxes))
              from-boxes)
       (org-real--flex-add from to to))))
 
+(defun org-real--map (fn box)
+  (funcall fn box)
+  (mapc
+   (lambda (box) (org-real--map fn box))
+   (org-real--next box t)))
+  
+  
+(defun org-real--next (box &optional exclude-children)
+  (let ((relatives (append (if exclude-children '() (oref box :children))
+                           (oref (oref box :parent) :children))))
+    (seq-filter
+     (lambda (relative)
+       (and (slot-boundp relative :rel-box)
+            (string= (oref (oref relative :rel-box) :name)
+                     (oref box :name))))
+     relatives)))
+
+(defun org-real--add-matching (box match world)
+  (let ((next-boxes (org-real--next box))
+        (parent (oref match :parent)))
+    (mapc
+     (lambda (next)
+       (let ((rel (oref next :rel)))
+         (cond
+          ((string= rel "above")
+           (let ((y-order (oref match :y-order)))
+             (oset next :y-order y-order)
+             (org-real--map
+              (lambda (box) (when (>= (oref box :y-order) y-order)
+                              (oset box :y-order (+ 1 (oref box :y-order)))))
+              match))
+           (oset next :x-order (oref match :x-order))
+           (oset next :behind (oref match :behind)))
+          ((string= rel "below")
+           (oset next :x-order (oref match :x-order))
+           (oset next :y-order (+ 1 (oref match :y-order)))
+           (oset next :behind (oref match :behind)))
+          ((string= rel "to the right of")
+           (oset next :x-order (+ 1 (oref match :x-order)))
+           (oset next :y-order (oref match :y-order))
+           (oset next :behind (oref match :behind))
+           (oset next :in-front (oref match :in-front)))
+          ((string= rel "to the left of")
+           (let ((x-order (oref match :x-order)))
+             (oset next :x-order x-order)
+             (org-real--map
+              (lambda (box) (when (>= (oref box :x-order) x-order)
+                              (oset box :x-order (+ 1 (oref box :x-order)))))
+              match))
+           (oset next :y-order (oref match :y-order))
+           (oset next :behind (oref match :behind))
+           (oset next :in-front (oref match :in-front))))
+
+         (oset next :rel-box match)
+         (if (member rel '("in" "on" "behind" "in front of"))
+             (org-real--flex-add next match world)
+           (oset next :parent parent)
+           (object-add-to-list parent :children next))
+         (org-real--add-matching next next world)))
+     next-boxes)))
+
 (defun org-real--flex-add (box parent world)
   (let* ((cur-width (org-real--get-width world))
          (siblings (oref parent :children))
@@ -170,11 +228,13 @@
                                           (if (and (= max-y sibling-y) (> 
sibling-x max-x))
                                               sibling
                                             max))))
-                                    siblings
+                                    (seq-filter
+                                     (lambda (sibling) (not (oref sibling 
:in-front)))
+                                     siblings)
                                     (org-real--box :y-order -9999)))))
     (oset box :parent parent)
     (object-add-to-list parent :children box)
-    (when last-sibling
+    (when (and last-sibling (not (oref box :in-front)))
       (oset box :y-order (oref last-sibling :y-order))
       (oset box :x-order (+ 1 (oref last-sibling :x-order)))
       (let ((new-width (org-real--get-width world)))
@@ -183,9 +243,6 @@
           (oset box :x-order 0))))))
 
   
-(defun org-real--expand (box)
-  (apply 'append (list box) (mapcar 'org-real--expand (oref box :children))))
-
 (defun org-real-world ()
   (interactive)
   (let* ((box (org-real--parse-buffer))
@@ -194,6 +251,7 @@
     (with-current-buffer-window "Org Real" nil nil
       (dotimes (_ height) (insert (concat (make-string width ?\s) "\n")))
       (org-real--draw box 0)
+      (toggle-truncate-lines t)
       (special-mode))))
 
 
@@ -205,7 +263,6 @@
          (box (org-real--create-box (copy-tree containers))))
     (org-real--pp box (copy-tree containers))))
 
-(defvar org-real--level)
 
 (defvar org-real--padding '(2 . 1))
 (defvar org-real--margin '(2 . 1))
@@ -218,6 +275,7 @@
       (let ((offset (line-number-at-pos)))
         (dotimes (_ (+ 10 height)) (insert (concat (make-string width ?\s) 
"\n")))
         (org-real--draw box offset)
+        (toggle-truncate-lines t)
         (special-mode)))))
 
 (defface org-real-primary
@@ -353,9 +411,9 @@
       (let* ((x-order (oref box :x-order))
              (y-order (oref box :y-order))
              (above (seq-filter
-                      (lambda (child) (and (= x-order (oref child :x-order))
-                                           (< (oref child :y-order) y-order)))
-                      (oref parent :children)))
+                     (lambda (child) (and (= x-order (oref child :x-order))
+                                          (< (oref child :y-order) y-order)))
+                     (oref parent :children)))
              (directly-above (and above (seq-reduce
                                          (lambda (max child)
                                            (if (> (oref child :y-order) (oref 
max :y-order))
@@ -366,7 +424,11 @@
         (if directly-above
             (+ (org-real--get-top directly-above)
                (org-real--get-height directly-above))
-          top)))))
+          (if (and (slot-boundp box :rel)
+                   (or (string= "to the left of" (oref box :rel))
+                       (string= "to the right of" (oref box :rel))))
+              (org-real--get-top (oref box :rel-box))
+            top))))))
 
 (defun org-real--get-left (box)
   (if (not (slot-boundp box :parent))
@@ -377,9 +439,9 @@
                     (car org-real--padding)
                     (org-real--get-left parent)))
            (to-the-left (seq-filter
-                          (lambda (child) (and (= (oref box :y-order) (oref 
child :y-order))
-                                               (< (oref child :x-order) (oref 
box :x-order))))
-                          (oref parent :children)))
+                         (lambda (child) (and (= (oref box :y-order) (oref 
child :y-order))
+                                              (< (oref child :x-order) (oref 
box :x-order))))
+                         (oref parent :children)))
            (directly-left (and to-the-left
                                (seq-reduce
                                 (lambda (max child)
@@ -392,5 +454,9 @@
           (+ (org-real--get-left directly-left)
              (org-real--get-width directly-left)
              (car org-real--margin))
-        left))))
+        (if (and (slot-boundp box :rel)
+                 (or (string= "above" (oref box :rel))
+                     (string= "below" (oref box :rel))))
+            (org-real--get-left (oref box :rel-box))
+          left)))))
                              
diff --git a/prepositions.org b/prepositions.org
new file mode 100644
index 0000000..8e1c8d2
--- /dev/null
+++ b/prepositions.org
@@ -0,0 +1,8 @@
+- [[real:// /in?rel=in][in]]
+- [[real:// /on?rel=on][on]]
+- [[real:// /behind?rel=behind][behind]]
+- [[real:// /in front of?rel=in front of][in front of]]
+- [[real:// /to the right of?rel=to the right of][to the right of]]
+- [[real:// /above?rel=above][above]]
+- [[real:// /below?rel=below][below]]
+- [[real:// /to the left of?rel=to the left of][to the left of]]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]