summaryrefslogtreecommitdiff
path: root/lisp/woman.el
diff options
context:
space:
mode:
authorKevin Ryde <user42@zip.com.au>2012-07-07 18:06:38 +0800
committerChong Yidong <cyd@gnu.org>2012-07-07 18:06:38 +0800
commitf0ecdfeaae605c0dfa115925a38f285641a69230 (patch)
tree3fc4167d0ae51f7a6ce803e818a6bb7a6bce19e3 /lisp/woman.el
parentab4c47d38224bc57201e45fa0918ca708bcf7054 (diff)
downloademacs-f0ecdfeaae605c0dfa115925a38f285641a69230.tar.gz
* woman.el (woman-strings): Fix double-quote handling.
(woman-decode-region): Replace escaped-escapes without destroying bold or underline. Fixes: debbugs:1151
Diffstat (limited to 'lisp/woman.el')
-rw-r--r--lisp/woman.el49
1 files changed, 26 insertions, 23 deletions
diff --git a/lisp/woman.el b/lisp/woman.el
index e220cd8062c..4767b062335 100644
--- a/lisp/woman.el
+++ b/lisp/woman.el
@@ -2385,20 +2385,20 @@ Currently set only from '\" t in the first line of the source file.")
(if woman-negative-vertical-space
(woman-negative-vertical-space from))
- (if woman-preserve-ascii
- ;; Re-instate escaped escapes to just `\' and unpaddable
- ;; spaces to just `space', without inheriting any text
- ;; properties. This is not necessary, UNLESS the buffer is to
- ;; be saved as ASCII.
- (progn
- (goto-char from)
- (while (search-forward woman-escaped-escape-string nil t)
- (delete-char -1)
- (insert ?\\))
- (goto-char from)
- (while (search-forward woman-unpadded-space-string nil t)
- (delete-char -1)
- (insert ?\s))))
+ (when woman-preserve-ascii
+ ;; Re-instate escaped escapes to just `\' and unpaddable spaces
+ ;; to just `space'. This is not necessary for display since
+ ;; there are display table entries for the escaped chars, but it
+ ;; is necessary if the buffer might be saved as ASCII.
+ ;;
+ ;; `subst-char-in-region' preserves text properties on the
+ ;; characters, which is necessary for bold, underline, etc on
+ ;; \e. There's usually no face on spaces, but if there is then
+ ;; it's good to keep that too.
+ (subst-char-in-region from (point-max)
+ woman-escaped-escape-char ?\\)
+ (subst-char-in-region from (point-max)
+ woman-unpadded-space-char ?\s))
;; Must return the new end of file if used in format-alist.
(point-max)))
@@ -2865,15 +2865,18 @@ interpolated by `\*x' and `\*(xx' escapes."
(re-search-forward "[^ \t\n]+")
(let ((string (match-string 0)))
(skip-chars-forward " \t")
-; (setq string
-; (cons string
-; ;; hack (?) for CGI.man!
-; (cond ((looking-at "\"\"") "\"")
-; ((looking-at ".*") (match-string 0)))
-; ))
- ;; Above hack causes trouble in arguments!
- (looking-at ".*")
- (setq string (cons string (match-string 0)))
+ (if (= ?\" (following-char))
+ ;; Double-quote starts a string, eg.
+ ;; .ds foo "blah...
+ ;; is value blah... through to newline. There's no
+ ;; closing " (per the groff manual), but rather any
+ ;; further " is included literally in the string. Eg.
+ ;; .ds foo ""
+ ;; sets foo to a single " character.
+ (forward-char))
+ (setq string (cons string
+ (buffer-substring (point)
+ (line-end-position))))
;; This should be an update, but consing a new string
;; onto the front of the alist has the same effect:
(setq woman-string-alist (cons string woman-string-alist))