From 7e181e8d74f7e67b8b3acb8524fc85157ed39c8e Mon Sep 17 00:00:00 2001 From: Alexandre Rostovtsev Date: Sun, 1 May 2011 22:52:14 -0400 Subject: [PATCH] Enable compatibility with traditional man (#648854) As of commit 46a82ade3e6f0fac8f08b18e7fc23d8665f6f728, Yelp runs "man -Z -Tutf8 -EUTF-8 [FILE]" to obtain the groff intermediate format of the man page. However, the only implementation of man that accepts these options is man-db (used by Debian, Fedora, SUSE & Ubuntu). The traditional Linux man used by other distros and man implementations on non-Linux Unixes (FreeBSD, Solaris) do not have command-line options for outputting groff intermediate format. Therefore, on systems that do not use man-db, we need to manually uncompress the nroff source file and feed it to groff. This is best done using a small shell script (/usr/libexec/yelp-groff), both for for clarity and for ease of modification on systems with weird man setups. Signed-off-by: Alexandre Rostovtsev --- libyelp/Makefile.am | 2 + libyelp/yelp-groff | 49 +++++++++++++++++++++++++++++++++++++++++++++ libyelp/yelp-man-parser.c | 4 +- 3 files changed, 53 insertions(+), 2 deletions(-) create mode 100755 libyelp/yelp-groff diff --git a/libyelp/Makefile.am b/libyelp/Makefile.am index a4dd68b..5d55bf1 100644 --- a/libyelp/Makefile.am +++ b/libyelp/Makefile.am @@ -1,4 +1,5 @@ lib_LTLIBRARIES = libyelp.la +libexec_SCRIPTS = yelp-groff libyelp_la_SOURCES = \ yelp-bookmarks.c \ @@ -49,6 +50,7 @@ endif libyelp_la_CFLAGS = \ $(YELP_CFLAGS) \ -DDATADIR=\""$(datadir)"\" \ + -DLIBEXECDIR=\"$(libexecdir)\" \ -DYELP_ICON_PATH=\"$(YELP_ICON_PATH)\" libyelp_la_LIBADD = $(YELP_LIBS) diff --git a/libyelp/yelp-groff b/libyelp/yelp-groff new file mode 100755 index 0000000..5348024 --- /dev/null +++ b/libyelp/yelp-groff @@ -0,0 +1,49 @@ +#!/bin/sh +# +# Copyright (c) 2011 Alexandre Rostovtsev +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the +# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +### +# +# Process the requested compressed source nroff file and output groff +# intermediate format. +# + +filename=$1 + +if [ -z ${filename} ] ; then + echo "Usage: yelp-groff [FILE]" >&2 + echo "Process a man FILE and output groff intermediate format." + exit 1 +fi + +# If "man -Z -Tutf8 -EUTF-8" works (i.e. if man is man-db), use that. +man -Z -Tutf8 -EUTF-8 ${filename} 2>/dev/null && exit 0 + +# Otherwise, manually uncompress the file ... +cat="cat" +case ${filename} in + *.bz2) cat="bzip2 -c -d" ;; + *.gz) cat="gunzip -c" ;; + *.lzma) cat="unlzma -c -d" ;; + *.xz) cat="unxz -c" ;; + *.Z) cat="zcat" ;; +esac + +# ... and run groff to get the intermediate format; preprocess with tbl +# unless MANROFFSEQ is defined. +${cat} ${filename} | groff -${MANROFFSEQ:-t} -man -Z -Tutf8 diff --git a/libyelp/yelp-man-parser.c b/libyelp/yelp-man-parser.c index 4001d38..9818803 100644 --- a/libyelp/yelp-man-parser.c +++ b/libyelp/yelp-man-parser.c @@ -371,9 +371,9 @@ get_troff (gchar *path, GError **error) { gint stdout; GError *err = NULL; - gchar *argv[] = { "man", "-Z", "-Tutf8", "-EUTF-8", NULL, NULL }; + gchar *argv[] = { LIBEXECDIR "/yelp-groff", NULL, NULL }; - argv[4] = path; + argv[1] = path; if (!g_spawn_async_with_pipes (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, -- 1.7.5.rc3