emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Federico Beffa <beffa@ieee.org>
To: emacs-orgmode@gnu.org, Rasmus <rasmus@gmx.us>,
	Nicolas Goaziou <mail@nicolasgoaziou.fr>
Subject: Re: [PATCH] org.el: make org-paragraph-fill ignore \[...\] regions starting and ending a line
Date: Sat, 16 Aug 2014 09:38:29 +0200	[thread overview]
Message-ID: <CAKrPhPPtaSiGc8LBuLSwbcvnix5L1L6EWnwVcP00H2Ktiwafqw@mail.gmail.com> (raw)
In-Reply-To: <87ppg6bvzd.fsf@nicolasgoaziou.fr>

[-- Attachment #1: Type: text/plain, Size: 1116 bytes --]

On Mon, Aug 11, 2014 at 10:40 PM, Nicolas Goaziou
> I'm just pointing out an ergonomy (or consistency) annoyance in your
> proposal. I'm not thrilled by faking the filling mechanism.

Well, that has nothing to do with consistency (neither with ergonomy,
unless you produce a large scale statistical study on the subject).
First, the proposed change modifies a user function which is not
supposed to be used as debugging tool for the parsing of a document.
For that you have other tools. Second, the modified function still
fills the whole paragraph and does not stop at a \[...\] block. It
just does not scramble the content of such a block.

It's really a matter of opinions: you perceive this as introducing an
"inconsistency". I see this as adapting a function to better suit the
situation. And, given that latex-mode behaves in the same way, I'm for
sure not the only one looking at this in this way.

In any case, I've updated my git repository (less than 24h ago) and
recreated the patch. I've tested it and believe it is working. Why
don't you give it a try. It's not such a disruptive change.

Regards,
Fede

[-- Attachment #2: 0001-org.el-make-org-paragraph-fill-ignore-.-regions-star.patch --]
[-- Type: application/octet-stream, Size: 5682 bytes --]

From 7c3dfca0d3ea447bfd40f810a197635b1bca9e86 Mon Sep 17 00:00:00 2001
From: Federico Beffa <beffa@fbengineering.ch>
Date: Tue, 5 Aug 2014 23:08:26 +0200
Subject: [PATCH] org.el: make org-paragraph-fill ignore \[...\] regions
 starting and ending a line

* lisp/org.el (org-paragraph-fill): If a LaTeX \[...\] macro starts
a line and ends a line (possibly spanning multiple lines), then do not
change that part of the paragraph.
---
 lisp/org.el |  116 +++++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 101 insertions(+), 15 deletions(-)
 mode change 100644 => 100755 lisp/org.el

diff --git a/lisp/org.el b/lisp/org.el
old mode 100644
new mode 100755
index 0f7a4ef..dfd4a89
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -22775,6 +22775,106 @@ matches in paragraphs or comments, use it."
 
 (declare-function message-goto-body "message" ())
 (defvar message-cite-prefix-regexp)	; From message.el
+
+(defun org-paragraph-find-dmr (beg end)
+  "Find \\=\\[...\\=\\] LaTeX macros starting and ending a line.
+
+This function returns a list of the form ((dm1-beg dm1-end)
+... (dmN-beg dmN-end)) with dmi-beg and dmi-end, i=1,...,N
+denoting the start respectively the end positions of the i-th
+\\=\\[...\\=\\] display math LaTeX macros starting and ending a
+line (possibly spanning multiple-lines).  This means that \\=\\[
+must be the first non space character of a line and \\=\\] must
+the the last non space character of a line.  The two can be on
+different lines."
+  (let ((dmrl nil) (dmr nil))
+    (save-excursion
+      (goto-char end)
+      (while (setq dmr 
+		   (if
+		       (re-search-backward 
+			(concat 
+			 "\\(^[ \t]*\\\\\\[\\).*\\([\r]?\n\\)*"
+			 "\\(.+[\r]?\n\\)*"
+			 ".*\\\\\\]"
+			 "[ \t]*[\r]?\n") beg t)
+		       (list (match-beginning 1) (match-end 0))
+		     nil))
+	(setq dmrl (append (list dmr) dmrl))))
+    dmrl))
+
+(defun org-paragraph-find-line-breaks (beg end)
+  "Find org `line-break' objects in a paragraph.
+
+Find the positions of org `line-break' objects and returns a list
+with their position, including BEG and END."
+  (append 
+   (cons beg
+	 (org-element-map
+	     (org-element--parse-objects
+	      beg end nil (org-element-restriction 'paragraph))
+	     'line-break
+	   (lambda (lb) (org-element-property :end lb))))
+   (list end)))
+
+(defun org-fill-paragraph-construct-regions (lbl dmrl)
+  "Construct paragraph regions to be filled.
+
+This function takes an ordered list LBL with the positions of org
+`line-break' objects and an ordered list DMRL with the start and
+end positions of \\=\\[...\\=\\] LaTeX macros beginning and
+ending a line.  It returns a list of the form ((r1-beg r1-end)
+... (rN-beg rN-end)) with the start end end positions of the
+paragraph regions to be filled."
+  (let ((lbl-len (length lbl))) ; compute only once length of lbl
+    (or
+     ;; elementary case 1: no display math regions and 2 entries in lbl
+     (and (not dmrl)
+	  (eq lbl-len 2)
+	  (list lbl))
+     ;; elementary case 2: 1 remaining line break (end of paragraph) and
+     ;; 1 remaining display math region.
+     (and (eq (length dmrl) 1)
+	  (eq lbl-len 1)
+	  (list (list (nth 1 dmrl) (car lbl))))
+     ;; remove line-breaks within display math regions
+     (and dmrl (>= (nth 1 lbl) (caar dmrl)) 
+	  (<= (nth 1 lbl) (nth 1 (car dmrl)))
+	  (if (> lbl-len 2)
+	      (org-fill-paragraph-construct-regions
+	       (cons (car lbl) (cddr lbl))
+	       dmrl)
+	    ;; a displayed math region finished the paragraph
+	    (org-fill-paragraph-construct-regions
+	     (cons (car lbl) (list (caar dmrl)))
+	     nil)))
+     ;; non elementary cases:
+     (if (and dmrl (> (nth 1 lbl) (caar dmrl)))
+	 (cons (list (car lbl) (caar dmrl))
+	       (org-fill-paragraph-construct-regions
+		(cons (nth 1 (car dmrl)) (cdr lbl))
+		(cdr dmrl)))
+       (cons (list (car lbl) (nth 1 lbl))
+	     (org-fill-paragraph-construct-regions
+	      (cdr lbl)
+	      dmrl))))))
+
+(defun org-fill-paragraph-regions (beg end justify)
+  "Fill paragraph starting at BEG and ending at END.
+
+This function is called by `org-fill-paragraph' to fill a
+paragraph.  If a LaTeX \\=\\[...\\=\\] macro starts a line and
+ends a line (possibly spanning multiple lines), then do not
+change that part of the paragraph.  Respect org `line-break'
+objects."
+  (let* ((dmrl (org-paragraph-find-dmr beg end))
+	(lbl (org-paragraph-find-line-breaks beg end))
+	(fill-regions (org-fill-paragraph-construct-regions lbl dmrl)))
+    ;; fill the various regions starting from the last one
+    (mapc (lambda (r) 
+	    (fill-region-as-paragraph (nth 0 r) (nth 1 r) justify))
+	  (nreverse fill-regions))))
+
 (defun org-fill-paragraph (&optional justify)
   "Fill element at point, when applicable.
 
@@ -22846,21 +22946,7 @@ a footnote definition, try to fill the first paragraph within."
 	       ;; separators, and fill the parts in reverse order to
 	       ;; avoid messing with markers.
 	       (save-excursion
-		 (goto-char end)
-		 (mapc
-		  (lambda (pos)
-		    (fill-region-as-paragraph pos (point) justify)
-		    (goto-char pos))
-		  ;; Find the list of ending positions for line breaks
-		  ;; in the current paragraph.  Add paragraph
-		  ;; beginning to include first slice.
-		  (nreverse
-		   (cons beg
-			 (org-element-map
-			     (org-element--parse-objects
-			      beg end nil (org-element-restriction 'paragraph))
-			     'line-break
-			   (lambda (lb) (org-element-property :end lb)))))))
+		 (org-fill-paragraph-regions beg end justify))
 	       t)))
 	  ;; Contents of `comment-block' type elements should be
 	  ;; filled as plain text, but only if point is within block
-- 
1.7.9


  reply	other threads:[~2014-08-16  7:38 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-10 13:13 [PATCH] org.el: make org-paragraph-fill ignore \[...\] regions starting and ending a line Federico Beffa
2014-08-11 13:06 ` Nicolas Goaziou
2014-08-11 18:27   ` Federico Beffa
2014-08-11 19:43     ` Rasmus
2014-08-11 20:44       ` Nicolas Goaziou
2014-08-16  7:50         ` Federico Beffa
2014-08-16  9:46           ` Nicolas Goaziou
2014-08-11 20:40     ` Nicolas Goaziou
2014-08-16  7:38       ` Federico Beffa [this message]
2014-08-28 10:10         ` Nicolas Goaziou
  -- strict thread matches above, loose matches on Subject: below --
2014-08-10 13:15 Federico Beffa
2014-08-07 13:56 Federico Beffa
2014-08-05 21:45 Federico Beffa
2014-08-09  8:00 ` Nicolas Goaziou
2014-08-09 10:20   ` Federico Beffa
2014-08-09 23:20     ` Nicolas Goaziou

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAKrPhPPtaSiGc8LBuLSwbcvnix5L1L6EWnwVcP00H2Ktiwafqw@mail.gmail.com \
    --to=beffa@ieee.org \
    --cc=emacs-orgmode@gnu.org \
    --cc=mail@nicolasgoaziou.fr \
    --cc=rasmus@gmx.us \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).