如何不使用groff将Linux手册页转换为HTML?


11

我想在不使用groff的情况下将一些Linux手册页转换为HTML。我对groff的偏见是由于某些PNG渲染问题,它似乎使我本地化为Sabayon(因为这些问题似乎在我的VirtualBox VM上并未出现在其他发行版中)。我意识到这是一个错误,但是解决方案似乎不会在不久的将来出现,所以我想问一下是否还有其他方法可以将Linux手册页转换为HTML。使用http://linux.die.net/man上的HTML页面是不可接受的解决方案,因为我感兴趣的某些手册页不存在(例如,emerge(1)不存在)。


你为什么不使用troff?这是免费的。
schily 2015年

我不知道如何,通过阅读本网站和相关网站上的一些答案,我学会了如何使用groff。如果您写出涉及troff的答案,我会接受它,具体取决于此问题其他答案的质量。
BH2017年

为什么不向sabayon提交错误报告并让他们修复错误?
cas 2015年

@cas第一个链接(PNG渲染问题)是我问这个问题时提交的Sabayon错误报告。
BH2017年

请尝试查找并修复warning: can't find font `b'消息的来源-这可能是原因,因为创建的png文件往往只是图形格式的文本。可能是缺少的字体软件包需要安装。
cas 2015年

Answers:


10

有很多选择,例如roffittroffman2html。还有基于perl的在线联机帮助页浏览器,例如manServer

我最喜欢的是pandoc,尽管很遗憾,默认情况下它似乎并不支持ROFF输入(尽管如果您需要将多个转换过滤器链接在一起,则可以使用它。

man2html示例:

zcat /usr/share/man/man1/dd.1.gz \ 
    | man2html \
    | sudo tee /var/www/html/dd.html

roffit示例:

git clone git://github.com/bagder/roffit.git
cd roffit
zcat /usr/share/man/man1/dd.1.gz \
    | perl roffit \
    | sudo tee /var/www/html/dd-roffit.html

其他工具:


嗯,我要澄清的是,我不仅对程序的名称感兴趣,而且还对如何使用它们将手册页转换为HTML感兴趣。因此,请至少选择这些程序之一,并向我展示如何使用它将手册页转换为HTML。
BH2017年

感谢您的编辑,更好!我有几个问题。为什么在man2html示例中将stderr重定向到html文件?为什么要重定向到中的文件/var/www/html?不需要网络服务器,只需重定向到本地文件,您就可以将浏览器指向该文件。另外,您检查man2html输出了吗?我在Arch上尝试了它,但不产生格式化输出。
terdon

无需重定向stderr,请忽略它:-)。我已将其重定向到/ var / www / html,以便可以在测试期间查看结果(我通过ssh使用远程系统)。您不必-在本地使用浏览器就可以了。我都检查了-他们在我的系统上看起来还可以。虽然没有检查他们是否可以产生PNG(或Arch的问题)。
Criveti Mihai

我喜欢这个答案,我想我最终会接受它,但是这个答案有最后一个问题。请参阅Sabayon,.bz2而不是使用格式的联机帮助页.gz,那么您是否可以相应地重写答案?像用将bcat2压缩的手册页一起使用的那样修改zcat行一样。
BH2017年

man2html需要nroff输出,而在trodd输入中不起作用您的示例是错误的。
2015年

6

这是来自官方网站的无耻撕裂:

mandoc是一套工具编译工具mdoc,是roffBSD手册页选择的宏语言man,也是UNIX手册的主要历史语言。它体积小,ISO C,ISC许可,而且速度很快。该工具集的主要组件是mandoc实用程序,该程序基于libmandoc验证编译器,用于格式化UNIX终端(支持宽字符语言环境),XHTML,HTML,PostScript和PDF的输出。

mandoc主要是在OpenBSD上开发的,它既是OpenBSD也是BSD.lv项目。我们努力支持所有感兴趣的免费操作系统,特别是FreeBSD,NetBSD,DragonFly,illumos,Minix 3和GNU / Linux,以及所有运行pkgsrc便携式软件包构建系统的系统。为了支持mandoc开发,请考虑向OpenBSD基金会捐款。

pacman通知我我在本地安装的mdocml软件包大小为3.28mb,并且其中包括以下/usr/bin定位的二进制文件:

/usr/bin/demandoc
/usr/bin/makewhatis
/usr/bin/mandoc
/usr/bin/mapropos
/usr/bin/mman
/usr/bin/mwhatis

有了它,我可以做到:

mman -Thtml mman >/tmp/html
firefox file:///tmp/html

在此处输入图片说明

您可以根据需要应用自己的样式表。所有文档也都在线。我认为,所有这些也都已编译mandoc


该项目已重命名为mandoc
富兰克林·于

5

首先,应该注意,有多个程序被称为man2html

所谓的一个实用程序man2html是1990年代末由埃因霍温科技大学的Richard Verhoeven在1990年代末最初编写的C程序。该程序的内部构造非常古怪。但是,它的优点是它的原始手册页来源的作品,而不是troffnroff输出。该程序已添加到Frederico Lucifredi的男士套房中。

该程序了解manmandoc宏的语义,并输出合理的HTML结构。例如,当您使用缩进的段落时,如下所示:

.IP字
的定义
字。
.RS

该程序将显示一个HTML定义列表。

我维护着一个非常大的手册页(当通过转换为字母大小的PDF时,它的源页面大部分为兆字节,而将近400页groff):

$ ls -l txr.1
-rw-rw-r-- 1 kaz kaz 980549 Jan 3 11:38 txr.1

大约五年前,当我需要将其转换为HTML时,我发现做得合理的唯一事情是man2htmlC程序,以及将其输出后处理为“按时品尝”的程序。

最终,我想要一个质量更好的HTML文档,因此我开始编写troff宏。C程序的局限性变得显而易见,因此我分叉了它。在我的git网站上,您可以找到一个git repo,其中包含对man2html的30个补丁。这些修补程序修复了许多错误,并以大大提高的解释troff宏,条件,循环和其他结构的能力增强了程序。我还添加了一个M2寄存器,通过该寄存器,您可以编写代码来检测其是否在运行,man2html并可以有条件地执行某些操作(例如,向下滚动)。同样,我添加了一个.M2SS命令,该命令可让您发出自定义HTML标头部分。

我的大手册页托管在这里。这是通过man2html,由我的genman.txr程序进行后处理而产生的,该程序重新排列了各个部分,并在整个文档中添加了超链接。它还将目录中的内部链接重写为稳定的URL(基于散列而不是任意枚举),并通过某些Javascript使目录可折叠。

我使用的确切命令Makefile

man2html txr.1 | ./txr genman.txr-> txr-manpage.html
tbl txr.1 | pdfroff -man --no-toc-> txr-manpage.pdf

有关输出在HTML之间有条件不同的示例,nroff我们可以看一下man输出的一部分:

       9.19.4宏解构

       句法:

                (defstruct {<名称> |(<名称> <arg> *)} <超级>
                   <插槽说明符> *)

              defstruct宏定义新的结构类型和寄存器
              根据<name>,它必须是可绑定的符号
              可绑定功能。同样,每个<slot>的名称必须
              也是可绑定的符号。

上面,请注意如何在中表示参数<angle> <brackets>。在HTML版本中,它们以斜体显示

语法部分出现在源代码中,如下所示:

.coNP宏@ defstruct
.synb
.mets(defstruct >> {name | >>(name << arg *)} <超级
.mets \ \ <<插槽说明*)
.syne

这是同一文档中定义的所有自定义宏。下.mets< b装置b是一种元句法变量。>> a bmean a是一种具体的语法,其次是b没有任何中间空格的元语法,而<> a b cmeans b是在ac字面量之间加紧的元语法。

我改进后的版本man2html理解了实现这些标记约定的相当复杂的宏。

另外,请注意手册是如何自动为各部分编号的:全部由troff代码完成,这可以man2html理解。


1

由于OpenSolaris作为OSS可用,因此有一个免费的troff

一组移植的源代码在这里:

http://heirloom.sourceforge.net/doctools.html

但自传世以来,传家宝是一个死的项目。2007。您可能要检查

https://github.com/nt-roff/heirloom-doctools

一些人继续进行死去的传家宝项目。

man2htmltroff 一起,可以使您自动创建漂亮的html手册页。

请参见例如SchilliX手册页:

http://schillix.sourceforge.net/man/

使用Schily Bourne Shell:

http://schillix.sourceforge.net/man/man1/bosh.1.html

我对此感到满意,并通过正确的选项,可以将手册页链接到同一小组的其他文档。我使用例如以下命令:

soelim sh.1 | tbl | nroff -u1 -Tlp -man - | col -x | \
                        (sed -e 's/XXX/sh.1/g' ../conf/pre.html; \
                        man2html  -cgiurl '../man$section$subsection/$title.$section$subsection.html' -compress -nodepage; \
                        cat ../conf/post.html) | \
                        egrep -v 'HTML|BODY'> sh.1.html

这是schily工具中make文件系统的一部分。请注意标题和其他文件../conf/pre.html../conf/post.html文件。您可能想更改这四个需求。

增强功能man2thml是schily工具的一部分(请参见bosh手册页的底部)。

顺便说一句:有趣的信息:整个troff源代码以及所有辅助程序(如soelim,,tbl...)的所有源,再加上man程序源仅是该程序所需代码的一半,mandoc并且mandoc只有非常有限的tbl支持才能破坏大多数Solaris程序员。页面。

如果您需要mandocFreeBSD及类似格式的格式化troff源的支持,我创建了一组适用于的mandoc宏troff。在以下位置检查SchilliX源:https ://sourceforge.net/p/schillix-on/schillix-on/ci/default/tree/usr/src/cmd/troff/troff.d/tmac.d/相关 代码在文件andoc和中doc*

manSchilliX-ON中的程序源已更改为,nroff -mandoc而不是nroff -man


啊,你击败了我!我也刚刚安装heirloom-doctools。不得不摆弄mk.config:-)。
Criveti Mihai 2015年

0

OP的PNG文件问题与我在xterm的手册页和控制序列文档中使用groff的经验相符。问题是,groff试图将表格渲染为从PDF文件中剪切下来的图像,并且它已经出现了很多年的错误。从1990年代开始我就使用Perl脚本man2html来编写ncurses文档,但对于其他程序,我发现使用groff生成临时html和pdf文件更为简单。PDF档案运作良好;html文件没有。

同时,Perl脚本有其自身的问题。

由于两者都没有消失(并且由于添加的依赖项或引入了其他限制,建议的替代方案也没有得到改善),因此我通过对man2html进行了改进(在我在几个过程中所做的改进之外)解决了该问题。年),并为每个程序添加了一个新的configure script选项,以允许将groff用作html转换器的默认联机帮助页,但在设置该选项时使用man2html。完成此操作后,今年网站上删除了所有由groff生成的html文件。网站上有一个“ man2html”页面对此进行了记录;实际的脚本可以在我的其他脚本页面上找到

一些建议和评论似乎没有注意到,至少有两个名为man2html的程序:

C程序执行自己的格式设置,不依赖于nroff / groff /任何格式。它可以从标准输入中读取手册,也可以读取为实际文件(此外,请参阅其手册页)。给定一个nroff语法手册页“ foo.1”,您可以使用以下任何命令对其进行格式化:

man2html - <foo.1 >foo.1.html
cat foo.1 |man2html - >foo.1.html
man2html foo.1 >foo.1.html

Perl脚本从中读取格式化的手册页(例如,nroffOP的问题是包装groff)。您可以这样使用它:

nroff -man foo.1 |man2html >foo.1.html

我调查了使用C程序替代Perl脚本的情况,但将其丢弃是因为

  • 它不能很好地格式化输出。通过ncurses的terminfo.5文件的快速检查,我可以看到输出格式中的错误。
  • C程序具有手册页宏的内置概念,该概念不涵盖我的网站手册页所需的各种情况(包括编写新的宏)。

顺便说一句,它确实可以处理此文件中使用的多个重定向(这是旧版troff的问题-ncurses安装说明建议在过去20年中使用groff的原因)。


如前所述:man2html将nroff输出作为输入,因此您不能给它一个手册页源文件作为输入。
schily 2015年

1
@shily这取决于man2html您在说什么。
卡兹

> C程序具有手册页宏的内置概念,该概念未涵盖我的网站手册页所需的各种情况(包括编写新的宏)。 请看这里:kylheku.com/cgit/man/log
Kaz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.