Re: [O] [New exporter] custom emphasis in org-emphasis-alist

2013-02-14 Thread Gregor Kappler
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:span class=org-exclamation@@$1@@html:/span@@

  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 . ((? span class=\org-question\%s/span)
 (! span class=\org-exclamation\%s/span)
 (# )))
(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))
  

Re: [O] [New exporter] custom emphasis in org-emphasis-alist

2013-02-10 Thread Nicolas Goaziou
Hello,

Gregor Kappler g.kapp...@gmx.net 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) ?)
   span class=\org-question\%s/span)
  ((equal (match-string 3 text) #) !--%s--)
  (t span class=\org-exclamation\%s/span))
(match-string 4 text
(add-to-list 'org-export-filter-plain-text-functions 'my-special-markup)
#+end_src


Regards,

-- 
Nicolas Goaziou



Re: [O] [New exporter] custom emphasis in org-emphasis-alist

2013-02-10 Thread Nicolas Goaziou
Completing myself,

 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) ?)
span class=\org-question\%s/span)
   ((equal (match-string 3 text) #) !--%s--)
   (t span class=\org-exclamation\%s/span))
 (match-string 4 text
 (add-to-list 'org-export-filter-plain-text-functions 'my-special-markup)
 #+end_src

This solution will not work but in the simplest cases (no special
markup allowed within the tags).

For additional syntax, a better option would be to define a macro:

  #+MACRO: excl @@html:span class=org-exclamation@@$1@@html:/span@@

Then use it within the buffer:

  A paragraph and {{{excl(some *bold* text within a special
  container)}}}.

This allow for some flexibility. You can even define a babel block and
call it within a paragraph for more complicated (i.e. conditional)
stuff.


Regards,

-- 
Nicolas Goaziou



[O] [New exporter] custom emphasis in org-emphasis-alist

2013-02-09 Thread Gregor Kappler
Cudos for all the work that has been done on migrating to the new
exporter.  I so welcome that exporting now is approaching a clean
design!

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.

This is my org-emphasis-alist configuration:
#+BEGIN_SRC emacs-lisp
  (setq org-emphasis-alist
(quote ((* bold b /b)
(/ italic i /i)
(_ underline span style=\text-decoration:underline;\ 
/span)
(= (:box t :foreground #AAF) code /code verbatim)
(~ org-headline-done u /u verbatim)
(+ (:strike-through t) del /del)
(? gk-org-question span class=\org-question\ /span)
(! gk-org-exclamation span class=\org-exclamation\ 
/span)
(# font-lock-comment-face !-- --
#+END_SRC

These emphases are currently not working .  During debugging I found
the following to be the reason: Though
org-element-text-markup-successor recognizes emphasis by using
org-emph-re, it returns only one of a set of hard-coded symbols
(`bold', `italic', `underline', `strike-through', `code' and
`verbatim').

IMHO org-element-text-markup-successor should recognize
org-emphasis-alist.  Maybe return the face configured in the cadr of
the respective org-emphasis-alist element.  However, the drawback
would be that this would disenable quick-and-dirty face
specification as with (:box t :foreground #AAF) above.

On the other hand, I do not know how plans with org-emphasis-alist
are, as caddr,... for html export and org-export-latex-emphasis-alist
probably are obsolete with the new exporter.

With the following setup, the following test case worked.  However,
changing deconsts and defuns in org-element surely is not a good
approach.  Do you have any suggestions?

Thank you all for your amazing work on orgmode,

Gregor

* Test Case
With these settings these work: the test *bold*, (invisible comment?!), and .

But these still do not work: *bold*, (\leftarrow invisible comment?!), 
!exclamation! and ?question?.  These examples stop working after the comment.

: (org-export-to-file 'my-html test.html)

* Changes
I played around further by adding lines to
org-element-text-markup-successor
#+BEGIN_SRC emacs-lisp
  (defun org-element-text-markup-successor (limit)
Search for the next text-markup object.

  LIMIT bounds the search.

  Return value is a cons cell whose CAR is a symbol among `bold',
  `italic', `underline', `strike-through', `code' and `verbatim'
  and CDR is beginning position.
(save-excursion
  (unless (bolp) (backward-char))
  (when (re-search-forward org-emph-re limit t)
(let ((marker (match-string 3)))
  (cons (cond
 ((equal marker *) 'bold)
 ((equal marker /) 'italic)
 ((equal marker _) 'underline)
 ((equal marker +) 'strike-through)
 ((equal marker ~) 'code)
 ((equal marker =) 'verbatim)
 ((equal marker #) 'emph-comment)
 ((equal marker ?) 'emph-question)
 ((equal marker !) 'emph-exclamation)
 (t (error Unknown marker at %d (match-beginning 3
(match-beginning 2))
#+END_SRC

and then trying to define org-element-emph-comment-parser copy-pasting
org-element-italic-parser:
#+BEGIN_SRC emacs-lisp
  (defun org-element-emph-comment-parser ()
Parse comment object at point.

  Return a list whose CAR is `italic' and CDR is a plist with
  `:begin', `:end', `:contents-begin' and `:contents-end' and
  `:post-blank' keywords.

  Assume point is at the first # marker.
(save-excursion
  (unless (bolp) (backward-char 1))
  (looking-at org-emph-re)
  (let ((begin (match-beginning 2))
(contents-begin (match-beginning 4))
(contents-end (match-end 4))
(post-blank (progn (goto-char (match-end 2))
   (skip-chars-forward  \t)))
(end (point)))
(list 'emph-comment
  (list :begin begin
:end end
:contents-begin contents-begin
:contents-end contents-end
:post-blank post-blank)


  (defun org-element-emph-comment-interpreter (italic contents)
Interpret ITALIC object as Org syntax.
  CONTENTS is the contents of the object.
(format #%s# contents))

  (defun org-element-emph-exclamation-parser ()
Parse exclamation object at point.

  Return a list whose CAR is `italic' and CDR is a plist with
  `:begin', `:end', `:contents-begin' and `:contents-end' and
  `:post-blank' keywords.

  Assume point is at the first # marker.
(save-excursion
  (unless (bolp) (backward-char 1))
  (looking-at org-emph-re)
  (let ((begin (match-beginning 2))
 

Re: [O] [New exporter] custom emphasis in org-emphasis-alist

2013-02-09 Thread François Pinard
Gregor Kappler g.kapp...@gmx.net writes:

 Cudos for all the work that has been done on migrating to the new
 exporter.  I so welcome that exporting now is approaching a clean
 design!

Let me join my voice to the chorus!  Munch congratulations, and thanks!
There is an impressive amount of work in all this, it has been a major
undertaking.  I'm very glad to see that is now in the process of falling
back into place in a definitive way.  Very good news for us all!

François