unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Michael Vehrs <Michael.Burschik@gmx.de>
To: Glenn Morris <rgm@gnu.org>
Cc: emacs-devel@gnu.org
Subject: Re: Slight improvement to WoMan tbl handling
Date: Tue, 23 Feb 2010 17:24:01 +0100	[thread overview]
Message-ID: <4B840121.2010905@gmx.de> (raw)
In-Reply-To: <ke3a0y9iiv.fsf@fencepost.gnu.org>

Glenn Morris wrote:
> Please could you provide an explanation of what this change is
> supposed to do, and a suggested ChangeLog entry? (See etc/CONTRIBUTE
> for more details of how to supply patches.) Thanks.
>   

OK, next try.

This patch adds support for the "T{ T}" tbl syntax. Since this syntax is 
mainly used for long lines within a table, the patch also adds support 
for filling the last column of a table if the line length would exceed 
fill-column.


diff -cp woman.el.orig woman.el
*** woman.el.orig    2010-02-23 17:16:26.000000000 +0100
--- woman.el    2010-02-23 17:16:34.000000000 +0100
*************** expression in parentheses.  Leaves point
*** 3774,3780 ****
                               (setq fn 'woman2-format-paragraphs))))
                 ()
               ;; Find next control line:
!              (set-marker to (woman-find-next-control-line))
               ;; Call the appropriate function:
               (funcall fn to)))
        (if (not (eobp))            ; This should not happen, but ...
--- 3774,3782 ----
                               (setq fn 'woman2-format-paragraphs))))
                 ()
               ;; Find next control line:
!              (if (equal request "TS")
!                  (set-marker to (woman-find-next-control-line "TE"))
!                (set-marker to (woman-find-next-control-line)))
               ;; Call the appropriate function:
               (funcall fn to)))
        (if (not (eobp))            ; This should not happen, but ...
*************** expression in parentheses.  Leaves point
*** 3785,3796 ****
        (fset 'insert-and-inherit insert-and-inherit)
        (set-marker to nil))))
 
! (defun woman-find-next-control-line ()
    "Find and return start of next control line."
  ;  (let ((to (save-excursion
  ;          (re-search-forward "^\\." nil t))))
  ;    (if to (1- to) (point-max)))
!   (let (to)
      (save-excursion
        ;; Must handle
        ;; ...\c
--- 3787,3799 ----
        (fset 'insert-and-inherit insert-and-inherit)
        (set-marker to nil))))
 
! (defun woman-find-next-control-line (&optional pat)
    "Find and return start of next control line."
  ;  (let ((to (save-excursion
  ;          (re-search-forward "^\\." nil t))))
  ;    (if to (1- to) (point-max)))
!   (let ((pattern (concat "\\(\\\\c\\)?\n[.']" pat))
!         to)
      (save-excursion
        ;; Must handle
        ;; ...\c
*************** expression in parentheses.  Leaves point
*** 3799,3810 ****
        ;; BEWARE THAT THIS CODE MAY BE UNRELIABLE!!!!!
        (while
        (and
!        (setq to (re-search-forward "\\(\\\\c\\)?\n[.']" nil t))
         (match-beginning 1)
         (looking-at "br"))
      (goto-char (match-beginning 0))
      (woman-delete-line 2)))
!     (if to (1- to) (point-max))))
 
  (defun woman2-PD (to)
    ".PD d -- Set the interparagraph distance to d.
--- 3802,3813 ----
        ;; BEWARE THAT THIS CODE MAY BE UNRELIABLE!!!!!
        (while
        (and
!        (setq to (re-search-forward pattern nil t))
         (match-beginning 1)
         (looking-at "br"))
      (goto-char (match-beginning 0))
      (woman-delete-line 2)))
!     (if to (- to (+ 1 (length pat))) (point-max))))
 
  (defun woman2-PD (to)
    ".PD d -- Set the interparagraph distance to d.
*************** Needs doing properly!"
*** 4560,4566 ****
    ".TS -- Start of table code for the tbl processor.
  Format paragraphs upto TO."
    ;; This is a preliminary hack that seems to suffice for lilo.8.
-   (woman-delete-line 1)            ; ignore any arguments
    (when woman-emulate-tbl
      ;; Assumes column separator is \t and intercolumn spacing is 3.
      ;; The first line may optionally be a list of options terminated by
--- 4563,4568 ----
*************** Format paragraphs upto TO."
*** 4572,4577 ****
--- 4574,4595 ----
      (woman-delete-line 1)
      ;; For each column, find its width and align it:
      (let ((start (point)) (col 1))
+       (WoMan-log "%s" (buffer-substring start (+ start 40)))
+       ;; change T{ T} to tabs
+       (while (search-forward "T{\n" to t)
+         (replace-match "")
+         (catch 'end
+           (while (search-forward "\n" to t)
+             (replace-match " ")
+             (if (looking-at "T}")
+                 (progn
+                   (delete-char 2)
+                   (throw 'end t))))))
+       (goto-char start)
+       ;; strip space and headers
+       (while (re-search-forward "^\\.TH\\|\\.sp" to t)
+         (woman-delete-whole-line))
+       (goto-char start)
        (while (prog1 (search-forward "\t" to t) (goto-char start))
      ;; Find current column width:
      (while (< (point) to)
*************** Format paragraphs upto TO."
*** 4587,4593 ****
          (delete-char -1)
          (insert-char ?\  (- col (current-column))))
        (forward-line))
!     (goto-char start))))
    ;; Format table with no filling or adjusting (cf. woman2-nf):
    (setq woman-nofill t)
    (woman2-format-paragraphs to))
--- 4605,4628 ----
          (delete-char -1)
          (insert-char ?\  (- col (current-column))))
        (forward-line))
!         (goto-char start))
!       ;; find maximum width
!       (let ((max-col 0))
!         (while (search-forward "\n" to t)
!           (backward-char)
!           (if (> (current-column) max-col)
!               (setq max-col (current-column)))
!           (forward-char))         
!         (goto-char start)
!         ;; break lines if they are too long
!         (when (and (> max-col woman-fill-column)
!                    (> woman-fill-column col))
!           (setq max-col woman-fill-column)
!           (woman-break-table col to)
!           (goto-char start))         
!         (while (re-search-forward "^_$" to t)
!           (replace-match (make-string max-col ?_)))
!         (goto-char start))))
    ;; Format table with no filling or adjusting (cf. woman2-nf):
    (setq woman-nofill t)
    (woman2-format-paragraphs to))
*************** Format paragraphs upto TO."
*** 4596,4601 ****
--- 4631,4648 ----
    ;; ".TE -- End of table code for the tbl processor."
    ;; Turn filling and adjusting back on.
 
+ (defun woman-break-table (start-column to)
+   (while (< (point) to)
+     (move-to-column woman-fill-column)
+     (if (eolp)
+         (forward-line)
+       (if (and (search-backward " " start t)
+                (> (current-column) start-column))
+           (progn
+             (insert-char ?\n 1)
+             (insert-char ?\ (- start-column 5)))
+         (forward-line)))))
+
 

  ;;; WoMan message logging:
 





  reply	other threads:[~2010-02-23 16:24 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-02-17 14:55 Slight improvement to WoMan tbl handling Michael Vehrs
2010-02-19  0:27 ` Glenn Morris
2010-02-23 16:24   ` Michael Vehrs [this message]
2010-02-19 13:20 ` Andreas Schwab
2010-02-19 13:57   ` David Kastrup
2010-02-20  8:42   ` Michael Vehrs
2010-02-20  9:57     ` David Kastrup

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.gnu.org/software/emacs/

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

  git send-email \
    --in-reply-to=4B840121.2010905@gmx.de \
    --to=michael.burschik@gmx.de \
    --cc=emacs-devel@gnu.org \
    --cc=rgm@gnu.org \
    /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.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).