Function: org-element--cache-before-change

org-element--cache-before-change is a byte-compiled function defined in org-element.el.gz.

Signature

(org-element--cache-before-change BEG END)

Documentation

Detect modifications in sensitive parts of Org buffer.

BEG and END are the beginning and end of the range of changed text. See before-change-functions for more information.

The function returns the new value of org-element--cache-change-warning.

Source Code

;; Defined in /usr/src/emacs/lisp/org/org-element.el.gz
(defun org-element--cache-before-change (beg end)
  "Detect modifications in sensitive parts of Org buffer.
BEG and END are the beginning and end of the range of changed
text.  See `before-change-functions' for more information.

The function returns the new value of `org-element--cache-change-warning'."
  (org-with-base-buffer nil
    (when (org-element--cache-active-p t)
      (org-with-wide-buffer
       (setq org-element--cache-change-tic (buffer-chars-modified-tick))
       (setq org-element--cache-last-buffer-size (buffer-size))
       (goto-char beg)
       (forward-line 0)
       (let ((bottom (save-excursion (goto-char end) (line-end-position))))
         (prog1
             ;; Use the worst change warning to not miss important edits.
             ;; This function is called before edit and after edit by
             ;; `org-element--cache-after-change'.  Before the edit, we still
             ;; want to use the old value if it comes from previous
             ;; not yet processed edit (they may be merged by
             ;; `org-element--cache-submit-request').  After the edit, we want to
             ;; look if there was a sensitive removed during edit.
             ;; FIXME: This is not the most efficient way and we now
             ;; have to delete more elements than needed in some
             ;; cases.  A better approach may be storing the warning
             ;; in the modification request itself.
             (let ((org-element--cache-change-warning-before org-element--cache-change-warning)
                   (org-element--cache-change-warning-after))
               (setq org-element--cache-change-warning-after
                     ;; We must preserve match data when called as `before-change-functions'.
                     (save-match-data
                       (let ((case-fold-search t))
                         (when (re-search-forward
                                org-element--cache-sensitive-re bottom t)
                           (goto-char beg)
                           (forward-line 0)
                           (let (min-level)
                             (cl-loop while (re-search-forward
                                             (rx-to-string
                                              (if (and min-level
                                                       (> min-level 1))
                                                  `(and bol (repeat 1 ,(1- min-level) "*") " ")
                                                `(and bol (+ "*") " ")))
                                             bottom t)
                                      do (setq min-level (1- (length (match-string 0))))
                                      until (= min-level 1))
                             (goto-char beg)
                             (forward-line 0)
                             (or (and min-level (org-reduced-level min-level))
                                 (when (looking-at-p "^[ \t]*#\\+CATEGORY:")
                                   'org-data)
                                 t))))))
               (setq org-element--cache-change-warning
                     (cond
                      ((and (numberp org-element--cache-change-warning-before)
                            (numberp org-element--cache-change-warning-after))
                       (min org-element--cache-change-warning-after
                            org-element--cache-change-warning-before))
                      ((numberp org-element--cache-change-warning-before)
                       org-element--cache-change-warning-before)
                      ((numberp org-element--cache-change-warning-after)
                       org-element--cache-change-warning-after)
                      (t (or org-element--cache-change-warning-after
                             org-element--cache-change-warning-before)))))
           (org-element--cache-log-message
            "%S is about to modify text: warning %S"
            this-command
            org-element--cache-change-warning)))))))