[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/org-real c1a21a5 050/160: Added 'on top of' preposition
From: |
ELPA Syncer |
Subject: |
[elpa] externals/org-real c1a21a5 050/160: Added 'on top of' preposition; update customization vars |
Date: |
Wed, 6 Oct 2021 16:58:13 -0400 (EDT) |
branch: externals/org-real
commit c1a21a5c356a4a21bcdf104418866ee33e71657e
Author: Tyler Grinn <tylergrinn@gmail.com>
Commit: Tyler Grinn <tylergrinn@gmail.com>
Added 'on top of' preposition; update customization vars
Added on top of, changed customization variables
---
garage.org | 23 +--
org-real.el | 562 ++++++++++++++++++++++++++++++++++--------------------------
2 files changed, 328 insertions(+), 257 deletions(-)
diff --git a/garage.org b/garage.org
index c165c46..aa025d5 100644
--- a/garage.org
+++ b/garage.org
@@ -1,11 +1,14 @@
* 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]]
- - [[real://garage/workbench?rel=in/ratchet?rel=on/hammer?rel=to the right
of][hammer]]
- - [[real://garage/workbench?rel=in/ratchet?rel=on/nails?rel=to the right
of][nails]]
- - [[real://garage/car?rel=in/air freshener?rel=in][air freshener]]
+ - [[real://house/garage?rel=in/workbench?rel=in/paintbrush?rel=in front
of/wrench?rel=to the right of][wrench]]
+ - [[real://house/garage?rel=in/workbench?rel=in/paintbrush?rel=in front
of][paintbrush]]
+ - [[real://house/garage?rel=in/workbench?rel=in/screwdriver?rel=on top
of][screwdriver]]
+ - [[real://house/garage?rel=in/east wall?rel=in/shovel?rel=on][shovel]]
+ - [[real://house/garage?rel=in/east wall?rel=in/rake?rel=on][rake]]
+ - [[real://house/garage?rel=in/workbench?rel=in/hammer?rel=on][hammer]]
+ - [[real://house/garage?rel=in/east wall?rel=in/rake?rel=on/hoe?rel=to the
left of][hoe]]
+ - [[real://house/garage?rel=in/car?rel=in/air freshener?rel=in][air
freshener]]
+ - [[real://house/garage?rel=in/east wall?rel=in][East wall]]
+ - [[real://house/garage?rel=in/workbench?rel=in/ratchet?rel=on][ratchet]]
+ - [[real://house/garage?rel=in/workbench?rel=in/nails?rel=on top of][nails]]
+ - [[real://house/garage?rel=in/workbench?rel=in/nails?rel=on top of][nails2]]
+
diff --git a/org-real.el b/org-real.el
index 1c7e875..09578b9 100644
--- a/org-real.el
+++ b/org-real.el
@@ -1,7 +1,7 @@
;;; org-real.el --- Keep track of real things as org-mode links -*-
lexical-binding: t -*-
;; Author: Tyler Grinn <tylergrinn@gmail.com>
-;; Version: 0.1.1
+;; Version: 0.2.0
;; File: org-real.el
;; Package-Requires: ((emacs "26.1"))
;; Keywords: tools
@@ -33,6 +33,14 @@
(and (fboundp 'org-real--get-top) (fmakunbound 'org-real--get-top))
(and (fboundp 'org-real--get-left) (fmakunbound 'org-real--get-left))
+;;;; Patch! 0.1.1 > 0.2.0+
+;;;; Will be removed in version 1.0.0+
+
+(let ((customizations (get 'org-real 'custom-group)))
+ (setf customizations (cl-delete "org-real-margin" customizations :key #'car
:test #'string=))
+ (setf customizations (cl-delete "org-real-padding" customizations :key #'car
:test #'string=))
+ (put 'org-real 'custom-group customizations))
+
;;;; Requirements
(require 'eieio)
@@ -45,20 +53,24 @@
"Customization options for org-real"
:group 'applications)
-(defcustom org-real-margin '(2 . 1)
- "Margin to be used when displaying boxes.
+(defcustom org-real-margin-x 2
+ "Horizontal margin to be used when displaying boxes."
+ :type 'number
+ :group 'org-real)
-The first number is the horizontal margin, second is the vertical
-margin"
- :type 'cons
+(defcustom org-real-margin-y 1
+ "Vertical margin to be used when displaying boxes."
+ :type 'number
:group 'org-real)
-(defcustom org-real-padding '(2 . 1)
- "Padding to be used when displaying boxes.
+(defcustom org-real-padding-x 2
+ "Horizontal padding to be used when displaying boxes."
+ :type 'number
+ :group 'org-real)
-The first number is the horizontal padding, second is the
-vertical padding"
- :type 'cons
+(defcustom org-real-padding-y 1
+ "Vertical padding to be used when displaying boxes."
+ :type 'number
:group 'org-real)
;;;; Faces
@@ -72,7 +84,7 @@ vertical padding"
;;;; Constants
(defconst org-real-prepositions
- '("in" "on" "behind" "in front of" "above" "below" "to the left of" "to the
right of")
+ '("in" "on" "behind" "in front of" "above" "below" "to the left of" "to the
right of" "on top of")
"List of available prepositions for things.")
;;;; Interactive functions
@@ -87,7 +99,6 @@ vertical padding"
(org-real--make-instance 'org-real-box containers))
(org-real--parse-buffer)))))
-
;;;; Pretty printing
(defun org-real--pp (box &optional containers)
@@ -105,8 +116,8 @@ describing where BOX is."
(toggle-truncate-lines t)
(if containers (org-real--pp-text containers))
(let ((offset (- (line-number-at-pos)
- (cdr org-real-margin)
- (* 2 (cdr org-real-padding)))))
+ org-real-margin-y
+ (* 2 org-real-padding-y))))
(dotimes (_ (+ top height)) (insert (concat (make-string width ?\s)
"\n")))
(org-real--draw box offset)
(special-mode)))
@@ -119,8 +130,8 @@ describing where BOX is."
(let* ((reversed (reverse containers))
(container (pop reversed))
(primary-name (plist-get container :name)))
- (dotimes (_ (cdr org-real-padding)) (insert "\n"))
- (insert (make-string (car org-real-padding) ?\s))
+ (dotimes (_ org-real-padding-y) (insert "\n"))
+ (insert (make-string org-real-padding-x ?\s))
(insert "The ")
(put-text-property 0 (length primary-name) 'face 'org-real-primary
primary-name)
@@ -331,6 +342,9 @@ ORIG is `org-insert-link', ARGS are the arguments passed to
it."
(behind :initarg :behind
:initform nil
:type boolean)
+ (on-top :initarg :on-top
+ :initform nil
+ :type boolean)
(parent :initarg :parent
:type org-real-box)
(children :initarg :children
@@ -399,38 +413,39 @@ property and optionally a :rel property."
OFFSET is the starting line to start insertion."
(let ((children (with-slots (children) box (org-real--get-all children))))
- (if (slot-boundp box :name)
- (with-slots (name behind (align-bottom in-front) (dashed behind)
primary) box
- (let* ((top (+ offset (org-real--get-top box)))
- (left (org-real--get-left box))
- (width (org-real--get-width box))
- (height (org-real--get-height box)))
- (cl-flet ((draw (coords str &optional primary)
- (forward-line (- (car coords)
(line-number-at-pos)))
- (move-to-column (cdr coords) t)
- (if primary
- (put-text-property 0 (length str) 'face
'org-real-primary
- str))
- (insert str)
- (delete-char (length str))))
- (draw (cons top left)
- (concat "┌" (make-string (- width 2) (if dashed #x254c
#x2500)) "┐"))
- (if align-bottom
- (draw (cons (+ top height) left)
- (concat "┴" (make-string (- width 2) (if dashed #x254c
#x2500)) "┴"))
- (draw (cons (+ top height -1) left)
- (concat "└" (make-string (- width 2) (if dashed #x254c
#x2500)) "┘")))
- (draw (cons (+ top 1 (cdr org-real-padding))
- (+ left 1 (car org-real-padding)))
- name
- primary)
- (let ((r (+ top 1))
- (c1 left)
- (c2 (+ left width -1)))
- (dotimes (_ (- height (if align-bottom 1 2)))
- (draw (cons r c1) (if dashed "╎" "│"))
- (draw (cons r c2) (if dashed "╎" "│"))
- (setq r (+ r 1))))))))
+ (with-slots (name behind in-front on-top (dashed behind) primary) box
+ (when (slot-boundp box :name)
+ (let* ((top (+ offset (org-real--get-top box)))
+ (left (org-real--get-left box))
+ (width (org-real--get-width box))
+ (height (org-real--get-height box))
+ (align-bottom (or in-front on-top)))
+ (cl-flet ((draw (coords str &optional primary)
+ (forward-line (- (car coords) (line-number-at-pos)))
+ (move-to-column (cdr coords) t)
+ (if primary
+ (put-text-property 0 (length str) 'face
'org-real-primary
+ str))
+ (insert str)
+ (delete-char (length str))))
+ (draw (cons top left)
+ (concat "┌" (make-string (- width 2) (if dashed #x254c
#x2500)) "┐"))
+ (if align-bottom
+ (draw (cons (+ top height) left)
+ (concat "┴" (make-string (- width 2) (if dashed #x254c
#x2500)) "┴"))
+ (draw (cons (+ top height -1) left)
+ (concat "└" (make-string (- width 2) (if dashed #x254c
#x2500)) "┘")))
+ (draw (cons (+ top 1 org-real-padding-y)
+ (+ left 1 org-real-padding-x))
+ name
+ primary)
+ (let ((r (+ top 1))
+ (c1 left)
+ (c2 (+ left width -1)))
+ (dotimes (_ (- height (if align-bottom 1 2)))
+ (draw (cons r c1) (if dashed "╎" "│"))
+ (draw (cons r c2) (if dashed "╎" "│"))
+ (setq r (+ r 1))))))))
(mapc
(lambda (child) (org-real--draw child offset))
children)))
@@ -441,7 +456,7 @@ OFFSET is the starting line to start insertion."
(if (slot-boundp box :width)
stored-width
(let* ((base-width (+ 2 ; box walls
- (* 2 (car org-real-padding))))
+ (* 2 org-real-padding-x)))
(width (+ base-width
(if (slot-boundp box :name)
(with-slots (name) box (length name))
@@ -449,100 +464,141 @@ OFFSET is the starting line to start insertion."
(children (with-slots (children) box (org-real--get-all
children))))
(if (not children)
(setq stored-width width)
- (let* ((column-indices (cl-delete-duplicates
- (mapcar (lambda (child) (with-slots
(x-order) child x-order)) children)))
- (columns (mapcar
- (lambda (c)
- (seq-filter
- (lambda (child)
- (with-slots (x-order) child
- (= c x-order)))
- children))
- column-indices))
- (column-widths (mapcar
- (lambda (column)
- (apply 'max (mapcar 'org-real--get-width
column)))
- columns))
- (children-width (seq-reduce
- (lambda (total width)
- (+ total (car org-real-margin) width))
- column-widths
- (* -1 (car org-real-margin)))))
- (if (> width (+ (* 2 (car org-real-margin)) children-width))
- (setq stored-width width)
- (setq stored-width (+ base-width children-width)))))))))
-
-(cl-defmethod org-real--get-height ((box org-real-box))
- "Get the height of BOX."
- (with-slots ((stored-height height)) box
- (if (slot-boundp box :height)
- stored-height
- (let* ((in-front (with-slots (in-front) box in-front))
- (height (+ (if in-front -1 0)
- 3 ; box walls + text
- (* 2 (cdr org-real-padding))))
- (children (with-slots (children) box (org-real--get-all
children))))
- (if (not children)
- (setq stored-height height)
(let* ((row-indices (cl-delete-duplicates
- (mapcar (lambda (child) (with-slots (y-order)
child y-order)) children)))
+ (mapcar
+ (lambda (child) (with-slots (y-order) child
y-order))
+ children)))
(rows (mapcar
(lambda (r)
- (seq-filter
- (lambda (child)
- (with-slots (y-order) child
- (= r y-order)))
- children))
+ (cl-delete-duplicates
+ (seq-filter
+ (lambda (child) (with-slots (y-order) child (= r
y-order)))
+ children)
+ :test #'(lambda (a b) (string= (with-slots (name) a
name)
+ (with-slots (name) b
name)))))
row-indices))
- (row-heights (mapcar
- (lambda (row)
- (apply 'max (mapcar 'org-real--get-height
row)))
- rows)))
- (setq stored-height (+ height (seq-reduce '+ row-heights 0)))))))))
+ (children-width (apply 'max
+ (mapcar
+ (lambda (row)
+ (seq-reduce
+ (lambda (sum width)
+ (+ sum width org-real-margin-x))
+ (mapcar 'org-real--get-width row)
+ (* -1 org-real-margin-x)))
+ rows))))
+ (if (> width (+ (* 2 org-real-margin-x) children-width))
+ (setq stored-width width)
+ (setq stored-width (+ base-width children-width)))))))))
+
+(cl-defmethod org-real--get-on-top-height ((box org-real-box))
+ "Get the height of any boxes on top of the parent of BOX."
+ (with-slots (children rel) box
+ (+
+ (if (and (slot-boundp box :rel)
+ (string= "on top of" rel))
+ (org-real--get-height box)
+ 0)
+ (apply 'max 0
+ (mapcar
+ 'org-real--get-on-top-height
+ (seq-filter
+ (lambda (child)
+ (with-slots ((child-rel rel)) child
+ (and (slot-boundp child :rel)
+ (string= "on top of" child-rel))))
+ (org-real--get-all children)))))))
+
+(cl-defmethod org-real--get-height ((box org-real-box) &optional
include-on-top)
+ "Get the height of BOX.
+
+If INCLUDE-ON-TOP is non-nil, also include height on top of box"
+ (let ((on-top-height (if include-on-top (org-real--get-on-top-height box)
0)))
+ (with-slots ((stored-height height) in-front on-top) box
+ (if (slot-boundp box :height)
+ (+ stored-height on-top-height)
+ (let ((height (+ (if (or in-front on-top) -1 0)
+ 3 ; box walls + text
+ (* 2 org-real-padding-y)))
+ (children (seq-filter
+ (lambda (child) (with-slots (on-top) child (not
on-top)))
+ (with-slots (children) box (org-real--get-all
children)))))
+ (if (not children)
+ (progn
+ (setq stored-height height)
+ (+ height on-top-height))
+ (let* ((last-row (seq-reduce
+ (lambda (last-row child)
+ (with-slots ((last-y y-order)) (car last-row)
+ (with-slots ((child-y y-order)) child
+ (cond ((= last-y child-y)
+ (push child last-row)
+ last-row)
+ ((> child-y last-y) (list child))
+ (t last-row)))))
+ children
+ (list (pop children))))
+ (last-row-top (org-real--get-top (car last-row)))
+ (last-row-height (apply 'max (mapcar
+ (lambda (child)
+ (org-real--get-height child
include-on-top))
+ last-row))))
+ (setq stored-height (-
+ (+ (if in-front 0 org-real-padding-y)
+ last-row-top
+ last-row-height)
+ (org-real--get-top box)))
+ (+ stored-height on-top-height))))))))
(cl-defmethod org-real--get-top ((box org-real-box))
"Get the top row index of BOX."
- (with-slots ((stored-top top)) box
- (if (slot-boundp box :top)
- stored-top
- (if (not (slot-boundp box :parent))
- (setq stored-top 0)
- (with-slots (parent x-order y-order) box
- (let* ((children (with-slots (children) parent (org-real--get-all
children)))
- (offset (+ 2 (cdr org-real-padding) (cdr org-real-margin)))
- (top (+ offset (org-real--get-top parent)))
- (above (seq-filter
- (lambda (child)
- (with-slots ((child-x x-order) (child-y y-order))
child
- (and (= x-order child-x)
- (< child-y y-order))))
- children))
- (directly-above (and above (seq-reduce
- (lambda (max child)
- (with-slots ((max-y y-order))
max
- (with-slots ((child-y
y-order)) child
- (if (> child-y max-y)
- child
- max))))
- above
- (org-real-box :y-order -9999))))
- (above-height (and directly-above (apply 'max
- (mapcar
-
'org-real--get-height
- (seq-filter
- (lambda (child)
- (= (with-slots
(y-order) directly-above y-order)
- (with-slots
(y-order) child y-order)))
- children))))))
- (if directly-above
- (setq stored-top (+ (org-real--get-top directly-above)
- above-height))
- (with-slots (rel rel-box) box
- (if (and (slot-boundp box :rel)
- (or (string= "to the left of" rel)
- (string= "to the right of" rel)))
- (setq stored-top (org-real--get-top rel-box))
- (setq stored-top top))))))))))
+ (with-slots ((stored-top top) on-top parent x-order y-order rel rel-box) box
+ (cond ((slot-boundp box :top) stored-top)
+ (on-top (- (org-real--get-top parent) (org-real--get-height box)))
+ (t
+ (let ((on-top-height (org-real--get-on-top-height box)))
+ (if (not (slot-boundp box :parent))
+ (setq stored-top on-top-height)
+ (let* ((siblings (with-slots (children) parent
+ (seq-filter
+ (lambda (sibling)
+ (with-slots (on-top in-front) sibling
+ (not (or on-top in-front))))
+ (org-real--get-all children))))
+ (offset (+ 2 org-real-padding-y org-real-margin-y))
+ (top (+ on-top-height offset (org-real--get-top parent)))
+ (above (seq-filter
+ (lambda (sibling)
+ (with-slots ((sibling-x x-order) (sibling-y
y-order)) sibling
+ (and (= x-order sibling-x)
+ (< sibling-y y-order))))
+ siblings))
+ (directly-above (and above (seq-reduce
+ (lambda (max child)
+ (with-slots ((max-y
y-order)) max
+ (with-slots ((child-y
y-order)) child
+ (if (> child-y max-y)
+ child
+ max))))
+ above
+ (org-real-box :y-order
-9999))))
+ (above-height (and directly-above (+ org-real-margin-y
+ (apply 'max
+ (mapcar
+
'org-real--get-height
+ (seq-filter
+ (lambda
(sibling)
+ (=
(with-slots (y-order) directly-above y-order)
+
(with-slots (y-order) sibling y-order)))
+
siblings)))))))
+ (if directly-above
+ (setq stored-top (+ on-top-height
+ (org-real--get-top directly-above)
+ above-height))
+ (if (and (slot-boundp box :rel)
+ (or (string= "to the left of" rel)
+ (string= "to the right of" rel)))
+ (setq stored-top (org-real--get-top rel-box))
+ (setq stored-top top))))))))))
(cl-defmethod org-real--get-left ((box org-real-box))
"Get the left column index of BOX."
@@ -553,7 +609,7 @@ OFFSET is the starting line to start insertion."
(setq stored-left 0)
(with-slots (parent x-order y-order) box
(let* ((left (+ 1
- (car org-real-padding)
+ org-real-padding-x
(org-real--get-left parent)))
(to-the-left (seq-filter
(lambda (child)
@@ -574,7 +630,7 @@ OFFSET is the starting line to start insertion."
(if directly-left
(setq stored-left (+ (org-real--get-left directly-left)
(org-real--get-width directly-left)
- (car org-real-margin)))
+ org-real-margin-x))
(with-slots (rel rel-box) box
(if (and (slot-boundp box :rel)
(or (string= "above" rel)
@@ -598,12 +654,14 @@ PREV must already existing in PARENT."
((cur-x x-order)
(cur-y y-order)
(cur-behind behind)
+ (cur-on-top on-top)
(cur-in-front in-front))
box
(with-slots
((prev-x x-order)
(prev-y y-order)
(prev-behind behind)
+ (prev-on-top on-top)
(prev-in-front in-front))
prev
(cond ((or (string= rel "in") (string= rel "on"))
@@ -619,6 +677,11 @@ PREV must already existing in PARENT."
(setq cur-y 9999)
(setq cur-behind prev-behind)
(setq cur-in-front t))
+ ((string= rel "on top of")
+ (setq cur-x prev-x)
+ (setq cur-y -9999)
+ (setq cur-behind prev-behind)
+ (setq cur-on-top t))
((string= rel "above")
(setq cur-x prev-x)
(setq cur-y (- prev-y 1))
@@ -632,14 +695,16 @@ PREV must already existing in PARENT."
(setq cur-x (- prev-x 1))
(setq cur-y prev-y)
(setq cur-behind prev-behind)
+ (setq cur-on-top prev-on-top)
(setq cur-in-front prev-in-front))
((string= rel "to the right of")
(setq cur-x (+ 1 prev-x))
(setq cur-y prev-y)
(setq cur-behind prev-behind)
+ (setq cur-on-top prev-on-top)
(setq cur-in-front prev-in-front))))))
- (if (and prev (member rel '("in" "on" "behind" "in front of")))
+ (if (and prev (member rel '("in" "on" "behind" "in front of" "on top of")))
(progn
(oset box :parent prev)
(with-slots (children) prev
@@ -663,17 +728,6 @@ PREV must already existing in PARENT."
(with-slots (children) box
(mapc 'org-real--make-dirty (org-real--get-all children))))
-(cl-defmethod org-real--map-immediate (fn (box org-real-box))
- "Map a function FN across all immediate relatives of BOX, including BOX.
-
-Any box with a :rel-box slot equivalent to BOX will be passed to
-FN."
- (progn
- (funcall fn box)
- (mapc
- (lambda (box) (org-real--map-immediate fn box))
- (org-real--next box t))))
-
(cl-defmethod org-real--next ((box org-real-box) &optional exclude-children)
"Retrieve any boxes for which the :rel-box slot is BOX.
@@ -690,10 +744,7 @@ If EXCLUDE-CHILDREN, only retrieve sibling boxes."
(seq-filter
(lambda (relative)
(and (slot-boundp relative :rel-box)
- (string= (with-slots
- (name)
- (with-slots (rel-box) relative rel-box)
- name)
+ (string= (with-slots (name) (with-slots (rel-box) relative
rel-box) name)
(with-slots (name) box name))))
relatives)))
@@ -727,76 +778,99 @@ If EXCLUDE-CHILDREN, only retrieve sibling boxes."
MATCH is used to set the :rel-box and :parent slots on children
of BOX."
+ (with-slots (primary) box
+ (oset match :primary primary))
(with-slots
- (parent
+ (children
+ parent
(match-y y-order)
(match-x x-order)
(match-behind behind)
- (match-in-front in-front))
+ (match-in-front in-front)
+ (match-on-top on-top))
match
- (let ((next-boxes (org-real--next box)))
- (mapc
- (lambda (next)
- (with-slots
- (rel
- (next-y y-order)
- (next-x x-order)
- (next-behind behind)
- (next-in-front in-front))
- next
- (cond
- ((string= rel "above")
- (setq next-y match-y)
- (org-real--map-immediate
- (lambda (child)
- (with-slots ((child-y y-order)) child
- (when (>= child-y match-y)
- (setq child-y (+ 1 child-y)))))
- match)
- (setq next-x match-x)
- (setq next-behind match-behind))
- ((string= rel "below")
- (setq next-y (+ 1 match-y))
- (org-real--map-immediate
- (lambda (child)
- (with-slots ((child-y y-order)) child
- (when (> child-y match-y)
- (setq child-y (+ 1 child-y)))))
- match)
- (setq next-x match-x)
- (setq next-behind match-behind))
- ((string= rel "to the right of")
- (setq next-x (+ 1 match-x))
- (org-real--map-immediate
- (lambda (child)
- (with-slots ((child-x x-order)) child
- (when (> child-x match-x)
- (setq child-x (+ 1 child-x)))))
- match)
- (setq next-y match-y)
- (setq next-behind match-behind)
- (setq next-in-front match-in-front))
- ((string= rel "to the left of")
- (setq next-x match-x)
- (org-real--map-immediate
- (lambda (child)
- (with-slots ((child-x x-order)) child
- (when (>= child-x match-x)
- (setq child-x (+ 1 child-x)))))
- match)
- (setq next-y match-y)
- (setq next-behind match-behind)
- (setq next-in-front 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)
- (with-slots (children) parent
- (setq children (org-real--push children next))))
- (org-real--add-matching next next world)))
- next-boxes))))
-
+ (with-slots ((siblings children)) parent
+ (let ((next-boxes (org-real--next box)))
+ (mapc
+ (lambda (next)
+ (with-slots
+ (rel
+ (next-y y-order)
+ (next-x x-order)
+ (next-behind behind)
+ (next-in-front in-front)
+ (next-on-top on-top))
+ next
+ (cond
+ ((string= rel "above")
+ (setq next-y match-y)
+ (mapc
+ (lambda (sibling)
+ (with-slots ((sibling-y y-order)) sibling
+ (when (>= sibling-y match-y)
+ (setq sibling-y (+ 1 sibling-y)))))
+ (org-real--get-all siblings))
+ (setq next-x match-x)
+ (setq next-behind match-behind))
+ ((string= rel "below")
+ (setq next-y (+ 1 match-y))
+ (mapc
+ (lambda (sibling)
+ (with-slots ((sibling-y y-order)) sibling
+ (when (> sibling-y match-y)
+ (setq sibling-y (+ 1 sibling-y)))))
+ (org-real--get-all siblings))
+ (setq next-x match-x)
+ (setq next-behind match-behind))
+ ((string= rel "on top of")
+ (setq next-x (+ 1
+ (apply 'max 0
+ (mapcar
+ (lambda (child) (with-slots (x-order)
child x-order))
+ (seq-filter
+ (lambda (child) (with-slots (on-top)
child on-top))
+ (org-real--get-all children))))))
+ (setq next-behind match-behind))
+ ((string= rel "to the right of")
+ (setq next-x (+ 1 match-x))
+ (mapc
+ (lambda (sibling)
+ (with-slots ((sibling-y y-order) (sibling-x x-order)) sibling
+ (when (and (= sibling-y match-y)
+ (> sibling-x match-x))
+ (setq sibling-x (+ 1 sibling-x)))))
+ (org-real--get-all siblings))
+ (setq next-y match-y)
+ (setq next-behind match-behind)
+ (setq next-in-front match-in-front)
+ (setq next-on-top match-on-top))
+ ((string= rel "to the left of")
+ (setq next-x match-x)
+ (setq next-y match-y)
+ (mapc
+ (lambda (sibling)
+ (with-slots ((sibling-y y-order) (sibling-x x-order)) sibling
+ (when (and (= sibling-y match-y)
+ (>= sibling-x match-x))
+ (setq sibling-x (+ 1 sibling-x)))))
+ (org-real--get-all siblings))
+ (setq next-behind match-behind)
+ (setq next-in-front match-in-front)
+ (setq next-on-top match-on-top)))
+
+ (oset next :rel-box match)
+ (cond
+ ((member rel '("in front of" "on top of"))
+ (oset next :parent match)
+ (setq children (org-real--push children next)))
+ ((member rel '("in" "on" "behind"))
+ (org-real--flex-add next match world))
+ (t
+ (oset next :parent parent)
+ (setq siblings (org-real--push siblings next))))
+ (org-real--add-matching next next world)))
+ next-boxes)))))
+
(cl-defmethod org-real--flex-add ((box org-real-box)
(parent org-real-box)
(world org-real-box))
@@ -805,33 +879,28 @@ of BOX."
This function ignores the :rel slot and adds BOX in such a way
that the width of WORLD is kept below 80 characters if possible."
(with-slots ((siblings children)) parent
- (let* ((cur-width (org-real--get-width world))
- (siblings (org-real--get-all siblings))
- (last-sibling (and siblings (seq-reduce
- (lambda (max sibling)
- (with-slots
- ((max-x x-order)
- (max-y y-order))
- max
- (with-slots
- ((sibling-x x-order)
- (sibling-y y-order))
- sibling
- (if (> sibling-y max-y)
- sibling
- (if (and (= max-y sibling-y)
(> sibling-x max-x))
- sibling
- max)))))
- (seq-filter
- (lambda (sibling)
- (not (with-slots (in-front) sibling
in-front)))
- siblings)
- (org-real-box :y-order -9999)))))
+ (let* ((all-siblings (seq-filter
+ (lambda (sibling)
+ (with-slots (in-front on-top) sibling
+ (not (or in-front on-top))))
+ (org-real--get-all siblings)))
+ (last-sibling (and all-siblings
+ (seq-reduce
+ (lambda (max sibling)
+ (with-slots ((max-x x-order) (max-y y-order))
max
+ (with-slots ((sibling-x x-order) (sibling-y
y-order)) sibling
+ (if (> sibling-y max-y)
+ sibling
+ (if (and (= max-y sibling-y) (>
sibling-x max-x))
+ sibling
+ max)))))
+ all-siblings
+ (org-real-box :y-order -9999))))
+ (cur-width (org-real--get-width world)))
(org-real--make-dirty world)
(oset box :parent parent)
- (with-slots (children) parent
- (setq children (org-real--push children box)))
- (when (and last-sibling (not (with-slots (in-front) box in-front)))
+ (setq siblings (org-real--push siblings box))
+ (when last-sibling
(with-slots
((last-sibling-y y-order)
(last-sibling-x x-order))
@@ -878,7 +947,6 @@ LINK is escaped with backslashes for inclusion in buffer."
(org-link-escape link)
(if description (format "[%s]" description) "")))))
-
(defun org-real--parse-url (str)
"Parse STR into a list of plists.
@@ -913,7 +981,7 @@ Returns a list of plists with a :name property and
optionally a
(org-real--parse-url
(org-element-property :raw-link link))
t))))
- container-matrix))
+ (seq-sort (lambda (a b) (>= (length a) (length b))) container-matrix)))
(defun org-real--to-link (containers)
"Create a link string from CONTAINERS."
- [elpa] externals/org-real b2dcbfc 001/160: initial commit, (continued)
- [elpa] externals/org-real b2dcbfc 001/160: initial commit, ELPA Syncer, 2021/10/06
- [elpa] externals/org-real 49c8920 008/160: Removed server stage from ci/cd, ELPA Syncer, 2021/10/06
- [elpa] externals/org-real f281b65 010/160: Typo, ELPA Syncer, 2021/10/06
- [elpa] externals/org-real e0eac63 019/160: Updated preposition list, ELPA Syncer, 2021/10/06
- [elpa] externals/org-real 735ce86 028/160: Cleaned up hooks, ELPA Syncer, 2021/10/06
- [elpa] externals/org-real 4fe5b9f 036/160: Renamed md5 command, ELPA Syncer, 2021/10/06
- [elpa] externals/org-real 0974b67 023/160: Make changes to satisfy elc compiler, ELPA Syncer, 2021/10/06
- [elpa] externals/org-real 4c2915a 033/160: Updated README, ELPA Syncer, 2021/10/06
- [elpa] externals/org-real 89d616e 024/160: Check compilation during ci/cd pipeline, ELPA Syncer, 2021/10/06
- [elpa] externals/org-real ed47eaa 048/160: Using stored values for computing top left width and height, ELPA Syncer, 2021/10/06
- [elpa] externals/org-real c1a21a5 050/160: Added 'on top of' preposition; update customization vars,
ELPA Syncer <=
- [elpa] externals/org-real 180d374 014/160: Standardized pretty printing for org-real-world and opening a link, ELPA Syncer, 2021/10/06
- [elpa] externals/org-real 356767c 034/160: Added org-real-pkg for multifile package, ELPA Syncer, 2021/10/06
- [elpa] externals/org-real dd03f41 025/160: Initial release, ELPA Syncer, 2021/10/06
- [elpa] externals/org-real 0b764c7 022/160: get-width compares children with margins included, ELPA Syncer, 2021/10/06
- [elpa] externals/org-real a5df40f 026/160: Bump version, ELPA Syncer, 2021/10/06
- [elpa] externals/org-real ac799d3 040/160: Merge into single file, ELPA Syncer, 2021/10/06
- [elpa] externals/org-real 7d9d67d 044/160: Rearranging, ELPA Syncer, 2021/10/06
- [elpa] externals/org-real 2ebeb5c 046/160: Updated readme, ELPA Syncer, 2021/10/06
- [elpa] externals/org-real 8445765 047/160: Added customization group, ELPA Syncer, 2021/10/06
- [elpa] externals/org-real cb64694 051/160: Added children when following a link, ELPA Syncer, 2021/10/06