最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】用Docbook生成纯文本格式

Docbook crifan 1930浏览 0评论

【背景】

之前就知道,可以用Docbook生成多种格式,其中包括纯文本格式。

后来又在DocBook XSL Stylesheets: Reference Documentation中看到了纯文本格式的例子:

plain text

而目前自己虽然已经可以用docbook生成了HTML和PDF,但是也想要弄个Plain Text,所以要去试试。

【折腾过程】

1.之前生成html和pdf的时候,对应所用的输出配置是docbook-xsl-ns-1.76.1下面的html和fo相关的文件。

所以也去找找其下是否有plain text方面的配置文件。

结果没有找到。

2.找到:4. Convert Docbook to plain text,看到其用了一个没听过的工具lynx 去将html转换为plain text,觉得不靠谱,所以没理会。

结果,在官网的解释Formatted plain text中,却也提到了这个工具。说是目前来说,还没有专门的xsl stylesheet来将docbook输出为plain text,而只能用间接的办法:

先转换为HTML,然后用基于文本的浏览器将HTML转换为plain text。

后者,目前有三种,分别是lynx,elinks,w3m。

3.后来自己用IE9打开自己生成的HTML,从File->Save As –> Save As Type选择为Text File (*.txt)后,也是可以实现将HTML另存为txt的。然后导出的txt的效果,也还可以:

ie9输出的头部的效果

只不过其中表格不支持:

ie9本身对表格支持就不好

以及表格中嵌套的表格,的显示更不太好:

ie9输出的表格嵌套的效果 不好

但是也基本够用吧。所以,暂时就用IE导出HTML为txt的这个方法吧。

其他基于文本的浏览器,有空再试试。

 

4.打算继续折腾。然后无意间发现,lynx和w3m,都是已经在Cygwin中安装好了的。所以可以直接去用了。

而Elinks,是没找到,所以去Elinks的Download,下载了源码,然后去Cygwin下面编译。

先./configure然后再make,但是第一步执行的狂慢。。。。就先不等了。去试试其他两个。

(1)lynx

试了:

lynx.exe -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/lynx/MPEG_VBR.txt

是可以导出txt的,但是结果是乱码。

然后就去找,看看是否有encoding的参数,结果找到个相关的charset,然后试了试:

lynx.exe -assume_charset=UTF8 -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/lynx/MPEG_VBR_utf8.txt

结果生成的txt没乱码了,但是全部的中文字符,都没了,只剩英文了。该不会lynx不支持非英文的吧。。。

然后又试了试:

lynx.exe -assume_charset=UTF8 -assume_local_charset=UTF8 -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/lynx/MPEG_VBR_utf8_localUtf8.txt

结果效果还是和上面一样,没中文字符。

后来又试了试:

lynx.exe -assume_charset=UTF8 -assume_local_charset=UTF8 -display_charset=UTF8 -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/lynx/MPEG_VBR_utf8_localUtf8_displayUtf8.txt

输出结果,证实了是可以正常显示中文字符的。

而且也注意到了,其显示出来的表格,还是很不错的:

lynx输出的 表格 还可以了

但是嵌套的表格显示不是很好:

lynx输出的 关于嵌套表格部分 格式还是很乱的

虽然有点点瑕疵,但是总体来说还是不错的:

lynx输出的头部的效果 不支持revhistory部分的表格

然后又仔细看了看相关的参数的解释:

  -assume_charset=MIMEname
                    charset for documents that don't specify it
  -assume_local_charset=MIMEname
                    charset assumed for local files
  -assume_unrec_charset=MIMEname
                    use this instead of unrecognized charsets
  -display_charset=MIMEname
                    charset for the terminal output

基本上确定其含义是:

assume_charset指的是访问网络上的HTML的charset;

assume_local_charset指的是本地HTML的charset;

assume_unrec_charset指的是,有些字符,如果原charset中没有包含,无法识别,那么就用此charset;

display_charset指的是输出txt的charset;

所以此处:

assume_charset:由于我的是本地的HTML,所以不需要用;

assume_local_charset:由于我的本地HTML中已经有了charset=UTF-8,所以也不需要;

assume_unrec_charset:当前的UTF8已经包含了所有的字符集了,所以不会存在未识别字符,所以也不需要设置此参数;

display_charset:需要指定此输出的字符集为UTF8,这样中文字符才能正常显示。

所以就去用:

lynx.exe -display_charset=UTF8 -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/lynx/MPEG_VBR_displayUtf8.txt

这样也同样可以正确地,将本地的UTF8的HTML输出为UTF8的txt了。

【总结】

使用lynx从本地的UTF8的HTML导出UTF8的txt:

lynx.exe -display_charset=UTF8 -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/lynx/MPEG_VBR_displayUtf8.txt

 

(2)w3m

试了试如下命令:

w3m -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/w3m/MPEG_VBR.txt

结果,不仅可以成功生成出来txt,而且自动可以识别输入和输出的编码。

更强的是,其表格支持的非常好,因为带嵌套的表格效果都很不错:

w3m输出的,带表格嵌套的效果 支持的都非常好

并且连文章最开始的revhistory的部分都有表格支持:

 

w3m输出的头部内容

可以帅呆了。

这样的话,看来其他工具,比如elinks,估计不太可能再好了吧。

不过,也还是要找机会试试elinks的。

(3)links

安装的cygwin是最新版本,但是其中没有elinks,不过后来去安装过程中的setup.ini中找到了一个links:

@ links

sdesc: "Text mode WWW browser"

ldesc: "A lynx-like character mode browser. It includes support for

rendering tables and frames, features background downloads, can

display colors and has many other features. nlike lynx, links supports

the HTML TABLE tag. Links also allows you to download files in the

background."

category: Web

requires: libbz2_1 libgcc1 libopenssl098 zlib0 cygwin

version: 2.5-1

install: release/links/links-2.5-1.tar.bz2 477703 64888471ab366a297bad8e94d228a6bf

source: release/links/links-2.5-1-src.tar.bz2 3941642 8074a321ab60f00f23937ee7c5cf605e

所以去试试links:

links -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/links/MPEG_VBR.txt

是可以生成txt,但是中文都是星号,即输出编码不对。

又试了试:

links -force-html -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/links/MPEG_VBR_forceHtml.txt

结果也还是中文是星号。

然后又试了多个其他的codepage,包括utf-8的,结果都是不行:

CLi@PC-CLI-1 ~/develop/docbook/books/VBR/VBR/src
$ links -codepage windows-1250 -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/links/MPEG_VBR_1250.txt

CLi@PC-CLI-1 ~/develop/docbook/books/VBR/VBR/src
$ links -codepage windows-1252 -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/links/MPEG_VBR_1252.txt

CLi@PC-CLI-1 ~/develop/docbook/books/VBR/VBR/src
$ links -codepage utf8 -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/links/MPEG_VBR_utf8.txt
Error parsing option -codepage: UTF-8 can't be here

CLi@PC-CLI-1 ~/develop/docbook/books/VBR/VBR/src
$ links -codepage utf-8 -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/links/MPEG_VBR_utf8.txt
Error parsing option -codepage: UTF-8 can't be here

CLi@PC-CLI-1 ~/develop/docbook/books/VBR/VBR/src
$ links -codepage UTF-8 -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/links/MPEG_VBR_utf8.txt
Error parsing option -codepage: UTF-8 can't be here

CLi@PC-CLI-1 ~/develop/docbook/books/VBR/VBR/src
$ links -codepage 65001 -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/links/MPEG_VBR_65001.txt
Error parsing option -codepage: Unknown codepage

CLi@PC-CLI-1 ~/develop/docbook/books/VBR/VBR/src
$ links -codepage 936 -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/links/MPEG_VBR_936.txt
Error parsing option -codepage: Unknown codepage

CLi@PC-CLI-1 ~/develop/docbook/books/VBR/VBR/src
$ links -codepage windows-936 -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/links/MPEG_VBR_936.txt
Error parsing option -codepage: Unknown codepage

所以,没法方便的指定对应的charset的,所以算了,不折腾了。

(4)elinks

上面说到,通过:

./configure

去配置,终于配置好了,然后继续:

make

去编译,编译过程,除了一些warning,其他还算顺利。

编译完之后,再去安装:

make install

然后就可以使用elinks了。

然后再去用:

elinks -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/elinks/MPEG_VBR.txt

生成txt,效果也不错:

头部的revhistory的内容的效果,也是支持表格的:

elinks的输出效果 也不错 - 头部信息

普通表格的效果:

elinks的普通表格输出不错

带嵌套的表格的效果,也不错,但是输出内容太宽了:

elinks的嵌套表格 支持不错 但是输出太宽了

【总结】

想要从docbook中输出plain text,是没有很直接的,方便的XSL stylesheet可以用的。

但是可以用间接的方法实现此功能,即先用docbook输出HTML,然后再用一些其他工具生成plain text。

目前已尝试的方法包括:

1.用浏览器的导出功能

比如用IE9打开HTML,然后可以另存为txt格式,以此实现导出HTML为txt。

优点:不需要额外安装工具,使用方便

缺点:导出的txt,格式不好,尤其是对表格等的支持,很差。

 

2.用基本文本的浏览器(text-based webbrowser)导出HTML为txt

(1)lynx

命令:

lynx.exe -display_charset=UTF8 -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/lynx/MPEG_VBR_displayUtf8.txt

优点:

A。Cygwin最新版本,已包含此工具,无需额外下载安装。

B。对普通表格支持不错,导出效果很好。

缺点:

A。对revhistory部分支持不好,没有生成带表格的效果

B。对嵌套的表格,支持不好

(2)w3m

命令:

w3m -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/w3m/MPEG_VBR.txt

优点:

A。对revhistory部分支持很好,导出效果带表格

B。对普通表格支持很好

C。对嵌套的表格支持也很好

D。输出内容的宽度控制的也很好,没有超过右边边界(默认宽度为80)

(3)links

需要说明的是,用下面命令:

links -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/links/MPEG_VBR.txt

所生成的txt,不支持非英文字符。中文会被星号代替。

暂时没找到有效办法可以输出正常的支持中文的txt。所以,此工具只适用于纯英文的HTML。

由于其更新换代版本的elinks更好用,所以普通人可以直接忽略此工具即可。

此处只所以还提及,主要是由于Cygwin自带此工具,所以才试用了此工具,才在此处做简单介绍的。

(4)elinks

命令:

elinks -dump ../output/html/single/MPEG_VBR.html > ../output/plain_text/elinks/MPEG_VBR.txt

优点:

A。对revhistory部分支持很好,导出效果带表格

B。对普通表格支持很好

C。对嵌套的表格支持也不错

缺点:

A。输出内容的宽度控制的不是很好,会远远超过默认的右边边界(默认宽度为80)

 

【最终结论】

通过比较了ie9的导出为tx的t功能,与lynx,w3m,links,elinks等工具,最后得出的结论是:

想要实现将docbook输出为plain text的话,效果最好的方式是

1. 用docbook生成(单个)HTML文件

2.用(基于文本的浏览器工具)w3m将HTML文件导出为txt文件

用法为:

w3m -dump xxx.html > xxx.txt

其导出的txt,对各种文字和表格(甚至嵌套的表格)支持的都很好。

【提示】

如果输入的(带中文的)HTML(和输出的txt)的charset没有正确指定,可能需要在使用w3m等工具时候,传入合适的charset相关的参数,否则输出的txt可能会是乱码。

转载请注明:在路上 » 【已解决】用Docbook生成纯文本格式

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
82 queries in 0.200 seconds, using 22.39MB memory