summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <mail@nicolasgoaziou.fr>2017-04-15 17:27:01 +0200
committerNicolas Goaziou <mail@nicolasgoaziou.fr>2017-04-15 17:27:01 +0200
commit8a2ffac88ae697ddd835da1db1de03bb0162c4c0 (patch)
tree1795b2457b90384a0435f01519ee7a77abdd72eb
parent74379eaaa2443f7a9fe62e04606c49613f5e6204 (diff)
downloadorg-mode-8a2ffac88ae697ddd835da1db1de03bb0162c4c0.tar.gz
org-element: Fix radio link parser
* lisp/org-element.el (org-element--object-lex): Fix parsing of radio links within emphasis. * testing/lisp/test-org-element.el (test-org-element/link-parser): Add test. Reported-by: R C <recifx@gmail.com> <http://permalink.gmane.org/gmane.emacs.orgmode/113063>
-rw-r--r--lisp/org-element.el11
-rw-r--r--testing/lisp/test-org-element.el11
2 files changed, 19 insertions, 3 deletions
diff --git a/lisp/org-element.el b/lisp/org-element.el
index f120619..deeb51b 100644
--- a/lisp/org-element.el
+++ b/lisp/org-element.el
@@ -4366,6 +4366,10 @@ to an appropriate container (e.g., a paragraph)."
(if (memq 'table-cell restriction) (org-element-table-cell-parser)
(let* ((start (point))
(limit
+ ;; Object regexp sometimes needs to have a peek at
+ ;; a character ahead. Therefore, when there is a hard
+ ;; limit, make it one more than the true beginning of the
+ ;; radio target.
(save-excursion
(cond ((not org-target-link-regexp) nil)
((not (memq 'link restriction)) nil)
@@ -4381,8 +4385,8 @@ to an appropriate container (e.g., a paragraph)."
((and (= start (1+ (line-beginning-position)))
(= start (match-end 1)))
(and (re-search-forward org-target-link-regexp nil t)
- (match-beginning 1)))
- (t (match-beginning 1)))))
+ (1+ (match-beginning 1))))
+ (t (1+ (match-beginning 1))))))
found)
(save-excursion
(while (and (not found)
@@ -4456,7 +4460,8 @@ to an appropriate container (e.g., a paragraph)."
(org-element-link-parser)))))))
(or (eobp) (forward-char))))
(cond (found)
- (limit (org-element-link-parser)) ;radio link
+ (limit (forward-char -1)
+ (org-element-link-parser)) ;radio link
(t nil))))))
(defun org-element--parse-objects (beg end acc restriction &optional parent)
diff --git a/testing/lisp/test-org-element.el b/testing/lisp/test-org-element.el
index c8c3528..afda308 100644
--- a/testing/lisp/test-org-element.el
+++ b/testing/lisp/test-org-element.el
@@ -1618,6 +1618,17 @@ e^{i\\pi}+1=0
(org-test-with-temp-text "* <<<a>>>\n<point>a-bug"
(org-update-radio-target-regexp)
(org-element-parse-buffer)))
+ ;; Pathological case: radio target in an emphasis environment.
+ (should
+ (eq 'bold
+ (org-test-with-temp-text "* <<<radio>>>\n<point>*radio*"
+ (org-update-radio-target-regexp)
+ (org-element-type (org-element-context)))))
+ (should
+ (eq 'link
+ (org-test-with-temp-text "* <<<radio>>>\n*<point>radio*"
+ (org-update-radio-target-regexp)
+ (org-element-type (org-element-context)))))
;; Standard link.
;;
;; ... with description.