TA的每日心情 | 擦汗 2021-3-8 17:59 |
---|
签到天数: 2 天 [LV.1]初来乍到
解元
- 积分
- 1927
|
本帖最后由 lixun305 于 2014-8-21 17:01 编辑
觉得无用的,也别喷,只是提供了一个揉合txt文件的方法。
思路来源于 yangxiups 提供的 古代文献藏书13337种.rar, 这个文件解开之后包含多个目录及纯文本(txt)文件,达2.12G之多。
如果保存这样一个目录结构及文件,非常不方便,一是文件非常大,二是移动非常费时,三是浏览也不甚直观。
如果保存rar文件,文件倒是小了一半,但是浏览就麻烦了,无论在手机还是在pc上,都要解开,解开后的麻烦同保存目录结构一样。
于是,想做到如下:
1. 将这些目录及txt文件揉合成一个文件。
2. 这个文件尺寸要控制一下,同原始文件相比,要有一定的压缩比例。
3. 这个文件应该可以直接浏览,无需解开。
做成mdx就能满足上述。
例如以 H:\liteature1\古文\古代文献藏书13337种 目录为例。
1. 做成 古代文献藏书13337种.txt, 进而用 mdxbuilder 做成 古代文献藏书13337种.mdx.
2. mdxbuilder在制作过程中,会将 原始内容进行压缩,压缩比例甚至可与rar相比。
3. mdx用 mdict浏览即可。
编了个小程序,完成功能:
1. 打开 一个目录。
2. 对该目录进行遍历。
3. 在某一个目录下,包含多个目录和txt文件,针对该目录:
(1) 生成一个主页面,这个页面是所有的txt文件和目录的超级链接,文件和目录之间以点化线间隔。如图。
主目录以 00000000 xx 标识,目的是在 mdict中居于首位。 右边的文件名以[]括起来,目录名以 【】括起来。 文件和目录可以选择分成多少列(图中是3列)显示,自动对齐。
(2) 对于每一个目录,都要对应一个条目,点击超级链接,打开的是这个目录对应的页面。 如图:
(3) 对于每一个文件,也要对应一个主条目和若干个分条目(如果需要的话)。
由于 mdxbuilder 在对 txt 文件进行处理的时候,要求单个条目的 content < 8M,所以,文件内容大于8M就要遭遇 Content is longer then 8388608 错误,因此,必须对文件进行分割,分成若干份。 那么,为了浏览一个文件的多个部分,就需要在页面上有多个链接,分别指向各个部分。
当然,对于一个大的txt文件,真要让 mdict把他的内容显示出来,非常费劲,得挺长时间的迟钝(pc端是这样的,手机端还不清楚)。 因此,程序在处理大文件的时候,>8M 的是肯定要处理了,但是,调试发现,哪怕是1M的文本文件在mdict的有窗口中显示也是不可容忍的,因此,程序中可以设置一个分段显示的大小(例如 512K),这样,一个大文件就大致按照 512K一部分分成若干页面。 如图:
庆余年.txt 这个文件有6.97M,按照512K大小分成了15份。 那么,该文件对应的条目页面上面和下面都有 0 1 2 ...... 14 的超级链接,连到各个部分。
待续。。。
示例文件及 古代文献藏书13337种.mdx
http://pan.baidu.com/s/1sj6pyNz
.......后者实在太大,网速<70k/s,实在没信心上传。
程序还得另外提取出来,因为我是在一个大的vc工程下做的,要用到很多的dll库和积累的其它源码,很难萃取出来, 我已发的帖子中牵扯到的许多都是这个工程的一个部分。 倒是有源代码大家可以参考,随后附上。
喜欢捣鼓程序的同志,可以看下面本程序主要考虑的方面:
1. 对 mdx 文件的结构需要有一个了解。 因为不处理图片等资源,所以,不会生成 mdd, 因此,要简单很多。
2. 单个条目内容不能大于 8M,这要求程序必须考虑大文件分割的问题。
由于 mdcit 浏览时,右侧视图窗口显示文本太多,会造成明显的滞后,影响阅读爽度,所以,即便对于不到8M的文件,也要考虑文件分割的问题。
文件分割,无非按照“固定”大小,例如 512K= 536870912, 如果文件尺寸<=512K,当然省劲,不用分割,否则,又会面临下述问题:
例如文件大小 546870912,应该分成两份,第0份 536870912, 第1份 10000000, 但是 第0份,从 0 ~ 536870911,如果536870911字节是一个汉字字符的一半位置,就坏了(这是很容易出现的事情)。如果不管,分得的第 0 份和第 1份都会出现若干乱码! 因此, 程序中要 找到 “友好”位置,即: 结束位置必须是下述之一: 是回车换行\r\n 结束的地方; 是<br>结束的地方; 是 空格 结束的地方;是句号。结束的地方; 最不济,是任意一个单字节字符结束的地方。 这样就能保证每一部分都是“好的”。
3. 文本文件必然含有好多回车换行\r\n,如果不处理,写入到 mdx 源文本文件中后也没啥,但是用mdxbuilder编译,生成 mdx 文件,浏览的时候,文本文件就没有换行了,内容一片庞杂。 为此,程序中要提前将 其中的\r\n替换成html格式需要的 <br> 换行符,这是一个费事操作(有时可能使时间增加几十倍),程序中为了加快速度,要临时分配大内存。
4. 对html的格式要有点了解,最起码:
超级链接格式 <a href="entry://00 庆余年" >[庆余年]</a>
不带下划线:<a href="entry://00 庆余年" style="text-decoration: none">[庆余年]</a>
5. 当某一个目录下的文件和子目录很多是,要考虑多列显示,否则,滚动条拖动费劲且浪费空间。 多列显示面临对其问题,本程序考虑:
假设显示出 3 列,那么最后一列长度可以不管,前2列必须考虑。 第 0 列所有文件的文件名长度的最大值要记录下来,假设为 L0, 第 1 列所有文件的文件名长度的最大值也要记录下来,假设为 L1,这样,排列的时候,处在第 1 列位置的文件,前面的文件(长度设为L)要补充 L0 - L 个空格;同理,处在第 2 列位置的文件也要补充 L1 - L 个空格。
上述,只是保证每一列,其前面的列,文件的文件名长度经过补充之后达到相同的字符数,这些字符有双字节的(汉字),也有单字节的(英文字母,空格等),不同的字体对这些字符显示所占据的宽度是不相同的,调试发现,宋体能保证相同的字符(字节数)数,宽度相同。
因此,每一个页面,加入总体字体设置:
<font face="宋体">
</font>
6. 如何分配条目文本(及mdx文件的索引)
为了保证能连接到不重复的目标,对每一个文件及目录,都要有一个唯一的条目文本(因为,不同目录下的子目录,txt文件名很可能相同)。
程序中做的也不是很完善,只是保证:
(1) 唯一
(2) 同一个目录或者文件对应的条目尽量聚集在一起,这样mdict左侧窗口就不是那么凌乱。
7. 程序中是将 txt 文件融合到了 mdx文件中,最终出来的是一个 mdx文件,我把这种方法叫嵌入。
其实还有一种方法叫 链接,个人觉得更好。 就是,对某一个文件,在页面中保留它的超级链接,点击该链接,不是打开文件,而是提示另存为。 下载下来后,可以用文本工具查看(例如 pc端的:ultraedit, emeditor; 手机端的anyview等)。
这种情况下,实际上 txt 文件是视为 资源看待的,同 (jpg, wav, spx?) 地位是等价的,应该存放在 mdd文件中,并且得到压缩处理。
只是这个我还不知道如何实现,哪位达人知道的话,告知一声,已知 <a href="file:///庆余年.txt">庆余年</a> 不行,在 mdict 下点右键,另存为,一闪而过,没反应。
进一步的,如果能实现,我就可以将 目录下的任何文件(txt, jpg, rar, ...)做成 mdx, 做成的mdx文件就是一个壳(目录的壳),由他连接到的所有的文件都放置在 mdd 中。 从开放角度讲,这个应该是最终完美的实现。
程序就要追求完美,不完美的东西给别人就是恶心人。
------------------------------------
已发帖:
李白诗集 https://www.pdawiki.com/forum/thread-12793-1-1.html
微词典(英汉汉英) 极限尺寸 https://www.pdawiki.com/forum/thread-11945-1-1.html
现代汉语词典 制作过程 https://www.pdawiki.com/forum/thread-11859-1-1.html
mdb格式转成的纯文本mdx(手机内存小的有福了) https://www.pdawiki.com/forum/thread-11800-1-1.html
mdb xls mdx dict词库格式相互转换 https://www.pdawiki.com/forum/thread-11657-1-1.html |
|