|
@@ -478,7 +478,7 @@ containing `:begin', `:end', `:hiddenp', `:contents-begin',
|
|
|
Assume point is at the beginning of the block."
|
|
|
(let ((case-fold-search t))
|
|
|
(if (not (save-excursion
|
|
|
- (re-search-forward "^[ \t]*#\\+END_CENTER" limit t)))
|
|
|
+ (re-search-forward "^[ \t]*#\\+END_CENTER[ \t]*$" limit t)))
|
|
|
;; Incomplete block: parse it as a paragraph.
|
|
|
(org-element-paragraph-parser limit)
|
|
|
(let ((block-end-line (match-beginning 0)))
|
|
@@ -524,7 +524,7 @@ Return a list whose CAR is `drawer' and CDR is a plist containing
|
|
|
|
|
|
Assume point is at beginning of drawer."
|
|
|
(let ((case-fold-search t))
|
|
|
- (if (not (save-excursion (re-search-forward "^[ \t]*:END:" limit t)))
|
|
|
+ (if (not (save-excursion (re-search-forward "^[ \t]*:END:[ \t]*$" limit t)))
|
|
|
;; Incomplete drawer: parse it as a paragraph.
|
|
|
(org-element-paragraph-parser limit)
|
|
|
(let ((drawer-end-line (match-beginning 0)))
|
|
@@ -578,7 +578,8 @@ containing `:block-name', `:begin', `:end', `:hiddenp',
|
|
|
|
|
|
Assume point is at beginning of dynamic block."
|
|
|
(let ((case-fold-search t))
|
|
|
- (if (not (save-excursion (re-search-forward org-dblock-end-re limit t)))
|
|
|
+ (if (not (save-excursion
|
|
|
+ (re-search-forward "^[ \t]*#\\+END:?[ \t]*$" limit t)))
|
|
|
;; Incomplete block: parse it as a paragraph.
|
|
|
(org-element-paragraph-parser limit)
|
|
|
(let ((block-end-line (match-beginning 0)))
|
|
@@ -1145,7 +1146,7 @@ containing `:begin', `:end', `:hiddenp', `:contents-begin',
|
|
|
Assume point is at the beginning of the block."
|
|
|
(let ((case-fold-search t))
|
|
|
(if (not (save-excursion
|
|
|
- (re-search-forward "^[ \t]*#\\+END_QUOTE" limit t)))
|
|
|
+ (re-search-forward "^[ \t]*#\\+END_QUOTE[ \t]*$" limit t)))
|
|
|
;; Incomplete block: parse it as a paragraph.
|
|
|
(org-element-paragraph-parser limit)
|
|
|
(let ((block-end-line (match-beginning 0)))
|
|
@@ -1227,7 +1228,8 @@ Assume point is at the beginning of the block."
|
|
|
(type (progn (looking-at "[ \t]*#\\+BEGIN_\\(S-+\\)")
|
|
|
(upcase (match-string-no-properties 1)))))
|
|
|
(if (not (save-excursion
|
|
|
- (re-search-forward (concat "^[ \t]*#\\+END_" type) limit t)))
|
|
|
+ (re-search-forward
|
|
|
+ (format "^[ \t]*#\\+END_%s[ \t]*$" type) limit t)))
|
|
|
;; Incomplete block: parse it as a paragraph.
|
|
|
(org-element-paragraph-parser limit)
|
|
|
(let ((block-end-line (match-beginning 0)))
|
|
@@ -1425,7 +1427,7 @@ containing `:begin', `:end', `:hiddenp', `:value' and
|
|
|
Assume point is at comment block beginning."
|
|
|
(let ((case-fold-search t))
|
|
|
(if (not (save-excursion
|
|
|
- (re-search-forward "^[ \t]*#\\+END_COMMENT" limit t)))
|
|
|
+ (re-search-forward "^[ \t]*#\\+END_COMMENT[ \t]*$" limit t)))
|
|
|
;; Incomplete block: parse it as a paragraph.
|
|
|
(org-element-paragraph-parser limit)
|
|
|
(let ((contents-end (match-beginning 0)))
|
|
@@ -1470,7 +1472,7 @@ containing `:begin', `:end', `:number-lines', `:preserve-indent',
|
|
|
`:switches', `:value' and `:post-blank' keywords."
|
|
|
(let ((case-fold-search t))
|
|
|
(if (not (save-excursion
|
|
|
- (re-search-forward "^[ \t]*#\\+END_EXAMPLE" limit t)))
|
|
|
+ (re-search-forward "^[ \t]*#\\+END_EXAMPLE[ \t]*$" limit t)))
|
|
|
;; Incomplete block: parse it as a paragraph.
|
|
|
(org-element-paragraph-parser limit)
|
|
|
(let ((contents-end (match-beginning 0)))
|
|
@@ -1549,7 +1551,8 @@ Assume point is at export-block beginning."
|
|
|
(type (progn (looking-at "[ \t]*#\\+BEGIN_\\(\\S-+\\)")
|
|
|
(upcase (org-match-string-no-properties 1)))))
|
|
|
(if (not (save-excursion
|
|
|
- (re-search-forward (concat "^[ \t]*#\\+END_" type) limit t)))
|
|
|
+ (re-search-forward
|
|
|
+ (format "^[ \t]*#\\+END_%s[ \t]*$" type) limit t)))
|
|
|
;; Incomplete block: parse it as a paragraph.
|
|
|
(org-element-paragraph-parser limit)
|
|
|
(let ((contents-end (match-beginning 0)))
|
|
@@ -1711,7 +1714,8 @@ Assume point is at the beginning of the latex environment."
|
|
|
(env (progn (looking-at "^[ \t]*\\\\begin{\\([A-Za-z0-9]+\\*?\\)}")
|
|
|
(regexp-quote (match-string 1))))
|
|
|
(code-end
|
|
|
- (progn (re-search-forward (format "^[ \t]*\\\\end{%s}" env) limit t)
|
|
|
+ (progn (re-search-forward
|
|
|
+ (format "^[ \t]*\\\\end{%s}[ \t]*$" env) limit t)
|
|
|
(forward-line)
|
|
|
(point)))
|
|
|
(value (buffer-substring-no-properties code-begin code-end))
|
|
@@ -1744,64 +1748,74 @@ containing `:begin', `:end', `:contents-begin' and
|
|
|
|
|
|
Assume point is at the beginning of the paragraph."
|
|
|
(save-excursion
|
|
|
- (let* (;; INNER-PAR-P is non-nil when paragraph is at the
|
|
|
+ (let* ((contents-begin (point))
|
|
|
+ ;; INNER-PAR-P is non-nil when paragraph is at the
|
|
|
;; beginning of an item or a footnote reference. In that
|
|
|
;; case, we mustn't look for affiliated keywords since they
|
|
|
;; belong to the container.
|
|
|
(inner-par-p (not (bolp)))
|
|
|
- (contents-begin (point))
|
|
|
(keywords (unless inner-par-p
|
|
|
(org-element--collect-affiliated-keywords)))
|
|
|
(begin (if inner-par-p contents-begin (car keywords)))
|
|
|
(before-blank
|
|
|
(let ((case-fold-search t))
|
|
|
(end-of-line)
|
|
|
- (re-search-forward org-element-paragraph-separate limit 'm)
|
|
|
- (while (and (/= (point) limit)
|
|
|
- (cond
|
|
|
- ;; Skip non-existent or incomplete drawer.
|
|
|
- ((save-excursion
|
|
|
- (beginning-of-line)
|
|
|
- (and (looking-at "[ \t]*:\\S-")
|
|
|
- (or (not (looking-at org-drawer-regexp))
|
|
|
- (not (save-excursion
|
|
|
- (re-search-forward
|
|
|
- "^[ \t]*:END:" limit t)))))))
|
|
|
- ;; Stop at comments.
|
|
|
- ((save-excursion
|
|
|
- (beginning-of-line)
|
|
|
- (not (looking-at "[ \t]*#\\S-"))) nil)
|
|
|
- ;; Skip incomplete dynamic blocks.
|
|
|
- ((save-excursion
|
|
|
- (beginning-of-line)
|
|
|
- (looking-at "[ \t]*#\\+BEGIN: "))
|
|
|
- (not (save-excursion
|
|
|
- (re-search-forward
|
|
|
- "^[ \t]*\\+END:" limit t))))
|
|
|
- ;; Skip incomplete blocks.
|
|
|
- ((save-excursion
|
|
|
- (beginning-of-line)
|
|
|
- (looking-at "[ \t]*#\\+BEGIN_\\(\\S-+\\)"))
|
|
|
- (not (save-excursion
|
|
|
- (re-search-forward
|
|
|
- (concat "^[ \t]*#\\+END_"
|
|
|
- (match-string 1))
|
|
|
- limit t))))
|
|
|
- ;; Skip incomplete latex environments.
|
|
|
- ((save-excursion
|
|
|
- (beginning-of-line)
|
|
|
- (looking-at "^[ \t]*\\\\begin{\\([A-Za-z0-9]+\\*?\\)}"))
|
|
|
- (not (save-excursion
|
|
|
- (re-search-forward
|
|
|
- (format "^[ \t]*\\\\end{%s}"
|
|
|
- (match-string 1))
|
|
|
- limit t))))
|
|
|
- ;; Skip ill-formed keywords.
|
|
|
- ((not (save-excursion
|
|
|
- (beginning-of-line)
|
|
|
- (looking-at "[ \t]*#\\+\\S-+:"))))))
|
|
|
- (re-search-forward org-element-paragraph-separate limit 'm))
|
|
|
- (if (eobp) (point) (goto-char (line-beginning-position)))))
|
|
|
+ (if (not (re-search-forward
|
|
|
+ org-element-paragraph-separate limit 'm))
|
|
|
+ limit
|
|
|
+ ;; A matching `org-element-paragraph-separate' is not
|
|
|
+ ;; necessarily the end of the paragraph. In
|
|
|
+ ;; particular, lines starting with # or : as a first
|
|
|
+ ;; non-space character are ambiguous. We have check
|
|
|
+ ;; if they are valid Org syntax (i.e. not an
|
|
|
+ ;; incomplete keyword).
|
|
|
+ (beginning-of-line)
|
|
|
+ (while (not
|
|
|
+ (or
|
|
|
+ ;; There's no ambiguity for other symbols or
|
|
|
+ ;; empty lines: stop here.
|
|
|
+ (looking-at "[ \t]*\\(?:[^:#]\\|$\\)")
|
|
|
+ ;; Stop at valid fixed-width areas.
|
|
|
+ (looking-at "[ \t]*:\\(?: \\|$\\)")
|
|
|
+ ;; Stop at drawers.
|
|
|
+ (and (looking-at org-drawer-regexp)
|
|
|
+ (save-excursion
|
|
|
+ (re-search-forward
|
|
|
+ "^[ \t]*:END:[ \t]*$" limit t)))
|
|
|
+ ;; Stop at valid comments.
|
|
|
+ (looking-at "[ \t]*#\\(?: \\|$\\)")
|
|
|
+ ;; Stop at valid dynamic blocks.
|
|
|
+ (and (looking-at org-dblock-start-re)
|
|
|
+ (save-excursion
|
|
|
+ (re-search-forward
|
|
|
+ "^[ \t]*#\\+END:?[ \t]*$" limit t)))
|
|
|
+ ;; Stop at valid blocks.
|
|
|
+ (and (looking-at
|
|
|
+ "[ \t]*#\\+BEGIN_\\(\\S-+\\)[ \t]*$")
|
|
|
+ (save-excursion
|
|
|
+ (re-search-forward
|
|
|
+ (format "^[ \t]*#\\+END_%s[ \t]*$"
|
|
|
+ (match-string 1))
|
|
|
+ limit t)))
|
|
|
+ ;; Stop at valid latex environments.
|
|
|
+ (and (looking-at
|
|
|
+ "^[ \t]*\\\\begin{\\([A-Za-z0-9]+\\*?\\)}[ \t]*$")
|
|
|
+ (save-excursion
|
|
|
+ (re-search-forward
|
|
|
+ (format "^[ \t]*\\\\end{%s}[ \t]*$"
|
|
|
+ (match-string 1))
|
|
|
+ limit t)))
|
|
|
+ ;; Stop at valid keywords.
|
|
|
+ (looking-at "[ \t]*#\\+\\S-+:")
|
|
|
+ ;; Skip everything else.
|
|
|
+ (not
|
|
|
+ (progn
|
|
|
+ (end-of-line)
|
|
|
+ (re-search-forward org-element-paragraph-separate
|
|
|
+ limit 'm)))))
|
|
|
+ (beginning-of-line)))
|
|
|
+ (if (= (point) limit) limit
|
|
|
+ (goto-char (line-beginning-position)))))
|
|
|
(contents-end (progn (skip-chars-backward " \r\t\n" contents-begin)
|
|
|
(forward-line)
|
|
|
(point)))
|
|
@@ -1895,7 +1909,7 @@ Assume point is at the beginning of the property drawer."
|
|
|
(hidden (org-invisible-p2))
|
|
|
(properties
|
|
|
(let (val)
|
|
|
- (while (not (looking-at "^[ \t]*:END:"))
|
|
|
+ (while (not (looking-at "^[ \t]*:END:[ \t]*$"))
|
|
|
(when (looking-at "[ \t]*:\\([A-Za-z][-_A-Za-z0-9]*\\):")
|
|
|
(push (cons (org-match-string-no-properties 1)
|
|
|
(org-trim
|
|
@@ -1974,7 +1988,8 @@ containing `:language', `:switches', `:parameters', `:begin',
|
|
|
|
|
|
Assume point is at the beginning of the block."
|
|
|
(let ((case-fold-search t))
|
|
|
- (if (not (save-excursion (re-search-forward "^[ \t]*#\\+END_SRC" limit t)))
|
|
|
+ (if (not (save-excursion (re-search-forward "^[ \t]*#\\+END_SRC[ \t]*$"
|
|
|
+ limit t)))
|
|
|
;; Incomplete block: parse it as a paragraph.
|
|
|
(org-element-paragraph-parser limit)
|
|
|
(let ((contents-end (match-beginning 0)))
|
|
@@ -2179,7 +2194,7 @@ containing `:begin', `:end', `:contents-begin', `:contents-end',
|
|
|
Assume point is at beginning of the block."
|
|
|
(let ((case-fold-search t))
|
|
|
(if (not (save-excursion
|
|
|
- (re-search-forward "^[ \t]*#\\+END_VERSE" limit t)))
|
|
|
+ (re-search-forward "^[ \t]*#\\+END_VERSE[ \t]*$" limit t)))
|
|
|
;; Incomplete block: parse it as a paragraph.
|
|
|
(org-element-paragraph-parser limit)
|
|
|
(let ((contents-end (match-beginning 0)))
|