unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: "Michael Vehrs" <michael.burschik@gmx.de>
To: emacs-devel@gnu.org
Subject: Slight improvement to WoMan tbl handling
Date: Wed, 17 Feb 2010 15:55:57 +0100	[thread overview]
Message-ID: <20100217145557.312080@gmx.net> (raw)

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


-- 
GRATIS für alle GMX-Mitglieder: Die maxdome Movie-FLAT!
Jetzt freischalten unter http://portal.gmx.net/de/go/maxdome01

[-- Attachment #2: woman.diff --]
[-- Type: text/x-diff, Size: 4288 bytes --]

--- woman.el.orig	2010-02-15 14:37:45.000000000 +0100
+++ woman.el	2010-02-17 15:47:29.000000000 +0100
@@ -3774,7 +3774,9 @@
                              (setq fn 'woman2-format-paragraphs))))
                ()
              ;; Find next control line:
-             (set-marker to (woman-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 ...
@@ -3785,12 +3787,13 @@
       (fset 'insert-and-inherit insert-and-inherit)
       (set-marker to nil))))
 
-(defun woman-find-next-control-line ()
+(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 (to)
+  (let ((pattern (concat "\\(\\\\c\\)?\n[.']" (if pat pat "")))
+        to)
     (save-excursion
       ;; Must handle
       ;; ...\c
@@ -3799,12 +3802,12 @@
       ;; BEWARE THAT THIS CODE MAY BE UNRELIABLE!!!!!
       (while
 	  (and
-	   (setq to (re-search-forward "\\(\\\\c\\)?\n[.']" nil t))
+	   (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 (1- to) (point-max))))
+    (if to (- to (+ 1 (length pat))) (point-max))))
 
 (defun woman2-PD (to)
   ".PD d -- Set the interparagraph distance to d.
@@ -4560,7 +4563,6 @@
   ".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
@@ -4572,6 +4574,21 @@
     (woman-delete-line 1)
     ;; For each column, find its width and align it:
     (let ((start (point)) (col 1))
+      ;; 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)
@@ -4587,7 +4604,24 @@
 	    (delete-char -1)
 	    (insert-char ?\  (- col (current-column))))
 	  (forward-line))
-	(goto-char start))))
+        (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))
@@ -4596,6 +4630,18 @@
   ;; ".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)))))
+
 \f
 ;;; WoMan message logging:
 

             reply	other threads:[~2010-02-17 14:55 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-02-17 14:55 Michael Vehrs [this message]
2010-02-19  0:27 ` Slight improvement to WoMan tbl handling Glenn Morris
2010-02-23 16:24   ` Michael Vehrs
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=20100217145557.312080@gmx.net \
    --to=michael.burschik@gmx.de \
    --cc=emacs-devel@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).