From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gregor Kappler Subject: Re: [New exporter] custom emphasis in org-emphasis-alist Date: Thu, 14 Feb 2013 18:42:12 +0100 Message-ID: <87pq02iyh7.fsf@univie.ac.at> References: <87ehgpc8jw.fsf@univie.ac.at> <876220h8ej.fsf@gmail.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([208.118.235.92]:39737) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U62wq-0001Ii-73 for emacs-orgmode@gnu.org; Thu, 14 Feb 2013 12:50:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1U62wj-0002Vn-MD for emacs-orgmode@gnu.org; Thu, 14 Feb 2013 12:50:15 -0500 Received: from mout.gmx.net ([212.227.17.21]:52116) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U62wj-0002MO-4j for emacs-orgmode@gnu.org; Thu, 14 Feb 2013 12:50:09 -0500 Received: from mailout-de.gmx.net ([10.1.76.24]) by mrigmx.server.lan (mrigmx002) with ESMTP (Nemesis) id 0LhQlC-1UjlQR1fXM-00mXea for ; Thu, 14 Feb 2013 18:50:03 +0100 In-Reply-To: <876220h8ej.fsf@gmail.com> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Nicolas Goaziou Cc: emacs-orgmode@gnu.org Hi Nicolas, thanks for your replies. I can see that for org syntax stability and to prevent parsing hassle using a variety of characters for emphasis is not desireable. On the other hand, org-emphasis-alist had several advantages that seem not possible with your suggestions. When writing, I frequently mark up and fontify text for review or important text parts (each, ? and ! used ~1000 times in my org files). The fontification in org provided a perfect overview of what still needs attention. > For additional syntax, a better option would be to define a macro: > > #+MACRO: excl @@html:@@$1@@html:@@ > > Then use it within the buffer: > > A paragraph and {{{excl(some *bold* text within a special > container)}}}. This solution is charactery/wordy but I could work with some editing sugar (abbrevs, remove-macro-keys,...). Yet I loose the fontification feature that I appreciate highly. For now, I took the road of adding a filter as you suggested, and made it configurable with format strings for latex and html. Also, I implemented org highlighting (borrowing from `org-set-emph-re' and `org-do-emphasis-faces'). This solution now works for me. If anyone else has custom emphasis markers, and wants to keep them (like I did) the following code might be usable. Thank you very much for your help! Gregor Your markup filter code did not replace multiple occurences and had hard-coded regexps, so I adapted your markup code: #+begin_src emacs-lisp (require 'ox) (defun gk-emphasis-markup (text backend info) (let ((formats (assoc backend gk-org-export-emphasis))) (when formats (let ((start 0) (result "")) (while (string-match gk-org-emph-re text start) (setq result (concat result (substring text start (match-beginning 2)) (format (cadr (assoc (match-string 3 text) formats)) (match-string 4 text)))) (setq start (- (match-end 0) 1))) (concat result (if (substring text start (length text)) "")))))) (add-to-list 'org-export-filter-plain-text-functions 'gk-emphasis-markup) #+end_src The formating strings are configured #+begin_src emacs-lisp (setq gk-org-export-emphasis '((html . (("?" "%s") ("!" "%s") ("#" ""))) (latex . (("?" "\\mycheck{%s}") ("!" "\\myexcl{%s}") ("#" ""))))) #+end_src Org highlighting for the custom emphasis list (adapted from `org-set-emph-re') #+BEGIN_SRC emacs-lisp :tangle "~/Documents/Programme/elisp/my-org-mode.el" (setq gk-org-emphasis-alist (quote ( ("?" gk-org-question) ("!" gk-org-exclamation) ("#" font-lock-comment-face)))) (setq gk-org-emph-re (let* ((e org-emphasis-regexp-components) (pre (car e)) (post (nth 1 e)) (border (nth 2 e)) (body (nth 3 e)) (nl (nth 4 e)) (body1 (concat body "*?")) (markers (mapconcat 'car gk-org-emphasis-alist "")) (vmarkers (mapconcat (lambda (x) (if (eq (nth 4 x) 'verbatim) (car x) "")) gk-org-emphasis-alist ""))) ;; make sure special characters appear at the right position in the class (if (string-match "\\^" markers) (setq markers (concat (replace-match "" t t markers) "^"))) (if (string-match "-" markers) (setq markers (concat (replace-match "" t t markers) "-"))) (if (string-match "\\^" vmarkers) (setq vmarkers (concat (replace-match "" t t vmarkers) "^"))) (if (string-match "-" vmarkers) (setq vmarkers (concat (replace-match "" t t vmarkers) "-"))) (if (> nl 0) (setq body1 (concat body1 "\\(?:\n" body "*?\\)\\{0," (int-to-string nl) "\\}"))) ;; Make the regexp (concat "\\([" pre "]\\|^\\)" "\\(" "\\([" markers "]\\)" "\\(" "[^" border "]\\|" "[^" border "]" body1 "[^" border "]" "\\)" "\\3\\)" "\\([" post "]\\|$\\)"))) #+END_SRC The emphasis function (adapted `org-do-emphasis-faces') then is added as font-lock #+BEGIN_SRC emacs-lisp :tangle "~/Documents/Programme/elisp/my-org-mode.el" (defun gk-org-do-emphasis-faces (limit) "Run through the buffer and add overlays to emphasized strings." (let (rtn a) (while (and (not rtn) (re-search-forward gk-org-emph-re limit t)) (if (not (= (char-after (match-beginning 3)) (char-after (match-beginning 4)))) (progn (setq rtn t) (setq a (assoc (match-string 3) gk-org-emphasis-alist)) (font-lock-prepend-text-property (match-beginning 2) (match-end 2) 'face (nth 1 a)) (and (nth 4 a) (org-remove-flyspell-overlays-in (match-beginning 0) (match-end 0))) (add-text-properties (match-beginning 2) (match-end 2) '(font-lock-multiline t org-emphasis t)) (when org-hide-emphasis-markers (add-text-properties (match-end 4) (match-beginning 5) '(invisible org-link)) (add-text-properties (match-beginning 3) (match-end 3) '(invisible org-link))))) (backward-char 1)) rtn)) (font-lock-add-keywords 'org-mode '(gk-org-do-emphasis-faces)) #+END_SRC Maybe the duplication of code could be prevented by including functions `org-set-emph-re' and `org-do-emphasis-faces' with dynamical scoping? Nicolas Goaziou writes: > Hello, > > Gregor Kappler writes: > >> I am currently migrating my system and contribute my first stop: >> custom emphasis characters that I use extensively: >> - "!" is used for exclamations, >> - "?" for questions, and >> - "#" for in-text comments that I do not want exported. > > Emphasis characters are now hard-coded. You cannot change them, though, > you can change how each back-end interprets them. > > We are solidifying Org syntax for parsing purposes. Allowing variable > markup is asking for trouble. The plan is to make `org-emphasis-alist' > a defconst. > > On the other hand, you may be able to parse custom markup with the help > of a filter: > > #+begin_src emacs-lisp > (defun my-special-markup (text backend info) > (when (and (org-export-derived-backend-p backend 'html) > (string-match "\\([ ('\"{]\\|^\\)\\(\\([?!#]\\)\\([^ > ,\"']\\|[^ > ,\"'].*?\\(?: > .*?\\)\\{0,1\\}[^ > ,\"']\\)\\3\\)\\([- .,:!?;'\")}\\]\\|$\\)" > text)) > (format (cond ((equal (match-string 3 text) "?") > "%s") > ((equal (match-string 3 text) "#") "") > (t "%s")) > (match-string 4 text)))) > (add-to-list 'org-export-filter-plain-text-functions 'my-special-markup) > #+end_src > > > Regards, > > -- > Nicolas Goaziou