emacs-orgmode
[Top][All Lists]
Advanced

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

[PATCH] Re: c47b535bb origin/main org-element: Remove dependency on ‘org


From: Ihor Radchenko
Subject: [PATCH] Re: c47b535bb origin/main org-element: Remove dependency on ‘org-emphasis-regexp-components’
Date: Fri, 19 Nov 2021 19:38:28 +0800

Nicolas Goaziou <mail@nicolasgoaziou.fr> writes:

> You can use a zero-width space to help Org sorting out the ambiguity,
> for example (| denotes the zero-width space):
>
>   /|A link [[https://orgmode.org/?oops=true][Org Mode]]
>
>   /A code ~user|/?my-user-variable~ with slash/

Makes sense. Maybe we should also mention it in the Markup section of
the manual? I attached a tentative patch.

Also, part of the problem with
/|A link [[https://orgmode.org/?oops=true][Org Mode]]
is that the link is emphasised despite not being parser as a link by
org-element. I attached a patch for our link/emphasis fontification that
makes sure that fontification is always consistent with the parser. The
patch might hit the performance slightly, but I do not see obvious
slowdown using my 15Mb notes file.

Best,
Ihor
>From 3b4a857582e848e9688a49c01b853ed577dd4935 Mon Sep 17 00:00:00 2001
Message-Id: 
<3b4a857582e848e9688a49c01b853ed577dd4935.1637321577.git.yantar92@gmail.com>
From: Ihor Radchenko <yantar92@gmail.com>
Date: Fri, 19 Nov 2021 19:27:56 +0800
Subject: [PATCH] org-manual.org: Clarify how to handle markup ambiguity

* doc/org-manual.org (Emphasis and Monospace): Advice users to insert
zero width space when Org does not parse emphasized text correctly.
---
 doc/org-manual.org | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/doc/org-manual.org b/doc/org-manual.org
index a38dbec4a..1db993d3d 100644
--- a/doc/org-manual.org
+++ b/doc/org-manual.org
@@ -10818,6 +10818,18 @@ ** Emphasis and Monospace
 ~org-fontify-emphasized-text~ to ~nil~.  To narrow down the list of
 available markup syntax, you can customize ~org-emphasis-alist~.
 
+Sometimes, Org mode has difficulties recognising markup.  It usually
+happens when markup marker symbols are present inside verbatim or code
+blocks:
+
+#+begin_example
+/The whole line is supposed to be marked italic, but the following
+~user/?variable~ contains italics =/= marker and confuses Org parser/.
+#+end_example
+
+You can use zero width space to help Org sorting out the ambiguity.
+See [[*Escape Character]] for more details.
+
 ** Subscripts and Superscripts
 :PROPERTIES:
 :DESCRIPTION: Simple syntax for raising/lowering text.
-- 
2.32.0

>From d5413e772fe6aedb8a8aa094f98c96fc20b82d3a Mon Sep 17 00:00:00 2001
Message-Id: 
<d5413e772fe6aedb8a8aa094f98c96fc20b82d3a.1637321613.git.yantar92@gmail.com>
From: Ihor Radchenko <yantar92@gmail.com>
Date: Fri, 19 Nov 2021 19:13:54 +0800
Subject: [PATCH] org.el: Make emphasis and link fontification consistent with
 parser

* lisp/org.el (org-do-emphasis-faces):
(org-activate-links): Do not fontify just based on approximate
regexps.  Make sure the current object is emphasis.
---
 lisp/org.el | 62 ++++++++++++++++++++++++++++-------------------------
 1 file changed, 33 insertions(+), 29 deletions(-)

diff --git a/lisp/org.el b/lisp/org.el
index cb1b58c51..d9f073100 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -5106,12 +5106,15 @@ (defun org-do-emphasis-faces (limit)
                               (looking-at-p org-outline-regexp-bol))))
                   ;; Match full emphasis markup regexp.
                   (looking-at (if verbatim? org-verbatim-re org-emph-re))
-                  ;; Do not span over paragraph boundaries.
-                  (not (string-match-p org-element-paragraph-separate
-                                       (match-string 2)))
-                  ;; Do not span over cells in table rows.
-                  (not (and (save-match-data (org-match-line "[ \t]*|"))
-                            (string-match-p "|" (match-string 4))))))
+                   ;; Verify that we are at the right object.
+                   (let ((object (save-excursion
+                                   (save-match-data
+                                     (goto-char (match-beginning 2))
+                                     (org-element-context)))))
+                     (and (memq (org-element-type object)
+                                '(bold italic verbatim code strike-through))
+                          (eq (match-beginning 2)
+                              (org-element-property :begin object))))))
            (pcase-let ((`(,_ ,face ,_) (assoc marker org-emphasis-alist))
                        (m (if org-hide-emphasis-markers 4 2)))
              (font-lock-prepend-text-property
@@ -5206,7 +5209,7 @@ (defun org-activate-links (limit)
                                 (eq 'org-tag face))))))
          (let* ((link-object (save-excursion
                                (goto-char start)
-                               (save-match-data (org-element-link-parser))))
+                               (save-match-data (org-element-context))))
                 (link (org-element-property :raw-link link-object))
                 (type (org-element-property :type link-object))
                 (path (org-element-property :path link-object))
@@ -5229,29 +5232,30 @@ (defun org-activate-links (limit)
                                        ((and (pred functionp) f) (funcall f))
                                        (_ `(:uri ,link)))
                        'font-lock-multiline t)))
-           (org-remove-flyspell-overlays-in start end)
-           (org-rear-nonsticky-at end)
-           (if (not (eq 'bracket style))
-               (progn
+            (when (eq (org-element-type link-object) 'link)
+              (org-remove-flyspell-overlays-in start end)
+             (org-rear-nonsticky-at end)
+             (if (not (eq 'bracket style))
+                 (progn
+                    (add-face-text-property start end face-property)
+                   (add-text-properties start end properties))
+               ;; Handle invisible parts in bracket links.
+               (remove-text-properties start end '(invisible nil))
+               (let ((hidden
+                      (append `(invisible
+                                ,(or (org-link-get-parameter type :display)
+                                     'org-link))
+                              properties)))
+                 (add-text-properties start visible-start hidden)
                   (add-face-text-property start end face-property)
-                 (add-text-properties start end properties))
-             ;; Handle invisible parts in bracket links.
-             (remove-text-properties start end '(invisible nil))
-             (let ((hidden
-                    (append `(invisible
-                              ,(or (org-link-get-parameter type :display)
-                                   'org-link))
-                            properties)))
-               (add-text-properties start visible-start hidden)
-                (add-face-text-property start end face-property)
-               (add-text-properties visible-start visible-end properties)
-               (add-text-properties visible-end end hidden)
-               (org-rear-nonsticky-at visible-start)
-               (org-rear-nonsticky-at visible-end)))
-           (let ((f (org-link-get-parameter type :activate-func)))
-             (when (functionp f)
-               (funcall f start end path (eq style 'bracket))))
-           (throw :exit t)))))         ;signal success
+                 (add-text-properties visible-start visible-end properties)
+                 (add-text-properties visible-end end hidden)
+                 (org-rear-nonsticky-at visible-start)
+                 (org-rear-nonsticky-at visible-end)))
+             (let ((f (org-link-get-parameter type :activate-func)))
+               (when (functionp f)
+                 (funcall f start end path (eq style 'bracket))))
+             (throw :exit t))))))              ;signal success
     nil))
 
 (defun org-activate-code (limit)
-- 
2.32.0


reply via email to

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