将LibreOffice文档转换为豆瓣日记
豆瓣日记的编辑器一直以来都只支持纯文本的,因此无法将原先在LibreOffice中写的带有简单格式的文章导出。由于我在豆瓣主要写一些随笔性的内容,所以它们在LibreOffice中排版时也并未用到什么复杂的格式,充其量就是粗体、斜体、加亮等字符样式,以及章节标题、多级有序和无序列表的段落样式。接下来,我的想法就是先将LibreOffice中选中的文章导出成MediaWiki的markup格式,然后再写一个脚本程序对这个纯文本文件过滤处理一下,变成适合在豆瓣日记编辑器中粘贴的样式即可。该脚本程序最终用Perl来编写。对于字符样式,其直接将相应的样式标识符删除,例如在MediaWiki中:
- 粗体用'''...'''标识;
- 斜体用''...''标识;
- 粗斜体用'''''...'''''标识。
对于多级有序列表,经Perl脚本转换后,采用不同的序号编号以及缩进进行区分,如:
- 一级列表用阿拉伯数字:1.、2.、3. ...;
- 二级列表用加右括号的小写字母:a)、b)、c)、...;
- 三级列表用带圈的阿拉伯数字:①、②、③、...它们可以在特殊字符中找到;
- 四级列表用小写罗马数字:i.、ii.、iii.、...。
对于多级无序列表,则采用特殊符号与缩进来区分。一至四级的编辑分别为:• ◦ ▪ ▫。
对于章节标题,则保留MediaWiki的格式,分别用=、==、===等表示一、二、三级标题。
Perl脚本源码如下。其命令行第一个参数为由LibreOffice导出的MediaWiki文本文件名。转换后的文本直接输出到控制台。
#!/usr/bin/perl use warnings;
use strict; our @level_counters = (, , , ); our @unordered_list_symbols = qw/ • ◦ ▪ ▫ /;
our @level0_symbols = qw/ . . . . . . . . . . /;
our @level1_symbols = qw/ a) b) c) d) e) f) g) h) i) j) /;
our @level2_symbols = qw/ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ /;
our @level3_symbols = qw/ i. ii. iii. iv. v. vi. vii. viii. ix. x. /; # Symmetric typeface markers
our $bold_marker = "'''";
our $italic_marker = "''";
our $bold_italic_marker = "'''''"; sub ProcessListBr {
my $current_list_level = $_[];
my $first_line_spacings = " " x $current_list_level;
s/<br\/>/\n$first_line_spacings/g;
} sub ProcessLists {
if (s/^\* +/$unordered_list_symbols[] /) {
ProcessListBr();
return;
} if (s/^\*\* +/ $unordered_list_symbols[] /) {
ProcessListBr();
return;
} if (s/^\*\*\* +/ $unordered_list_symbols[] /) {
ProcessListBr();
return;
} if (s/^\*\*\*\* +/ $unordered_list_symbols[] /) {
ProcessListBr();
return;
} my $clear_level_numbering_index = ; if (s/^# +/$level0_symbols[$level_counters[0]] /) {
$clear_level_numbering_index = ;
$level_counters[]++;
ProcessListBr();
} if (s/^## +/ $level1_symbols[$level_counters[1]] /) {
$clear_level_numbering_index = ;
$level_counters[]++;
ProcessListBr();
} if (s/^### +/ $level2_symbols[$level_counters[2]] /) {
$clear_level_numbering_index = ;
$level_counters[]++;
ProcessListBr();
} if (s/^#### +/ $level3_symbols[$level_counters[3]] /) {
$clear_level_numbering_index = ;
$level_counters[]++;
ProcessListBr();
} if ($clear_level_numbering_index != ) {
for (my $i = $clear_level_numbering_index; $i <= $#level_counters; $i++) {
$level_counters[$i] = ;
} return;
} @level_counters = (, , , );
} sub ProcessURL {
s/\[(http[^\s]+)\s+([^\s]+)\]/<a href=\"$1\">$2<\/a>/g;
} sub RemoveFormat {
s/$bold_italic_marker(.+?)$bold_italic_marker/$1/g;
s/$bold_marker(.+?)$bold_marker/$1/g;
s/$italic_marker(.+?)$italic_marker/$1/g;
s/<u>(.+?)<\/u>/$1/g;
} my $wiki_file = shift; if (defined($wiki_file)) {
open INPUT, "<$wiki_file" or die "Cannot open the file $wiki_file!\n"; while(<INPUT>) {
ProcessLists;
ProcessURL;
RemoveFormat;
print;
} close INPUT;
}
else {
print "Please specify the input file!\n";
}
将LibreOffice文档转换为豆瓣日记的更多相关文章
- OFFICE 文档转换为html在线预览
OFFICE 文档在线预览方案很多: 服务器先转换为PDF,再转换为SWF,最后通过网页加载Flash预览,比如flexpaper Office文档直接转换为SWF,通过网页加载Flash预览 微软的 ...
- 把office文档转换为html过程中的一些坑
之前和我们项目的团队一起酝酿了一个项目,公司的业务文档技术文档比较多,但都比较分散,虽然通过FTP或其他方式聚合起来了,但感觉还是不够方便. 另外公司每次都来新员工,新员工都需要一些培训,比较耗时,比 ...
- 转:C#实现office文档转换为PDF或xps的一些方法
代码支持任意office格式 需要安装office 2007 还有一个office2007的插件OfficeSaveAsPDFandXPS 下载地址 [url]http://www.microsoft ...
- PDF文档转换为图片、图片转成PDF 及PDF合并
简介 功能:PDF文档按每页转换成一张图片,一张图片转换成一张PDF 并将多张PDF合成一个多页的PDF文档. 经历:在各个网站上搜索始终出现各种问题,尤其是遇到引用的版本问题尤其头疼,不是不能适用当 ...
- C#,VB.NET将PPT文档转换为HTML
PPT文档主要用于展示,有时候我们需要将PPT文档转换为HTML格式方便查看.本文将介绍如何使用C#和VB.NET将PPT文档转换为HTML格式.该方案使用了.NET PowerPoint 组件Spi ...
- 在禅道中实现WORD等OFFICE文档转换为PDF进行在线浏览
条件: 安装好禅道的服务器 能直接浏览PDF的浏览器(或通过 安装插件实现 ) 文档转换服务程序(建议部署在另一台服务器上) 实现 原理: 修改禅道的文件预览功能(OFFICE文档其使用的是下 ...
- C#实现office文档转换为PDF或xps的一些方法( 转)
源博客http://blog.csdn.net/kable999/article/details/4786654 代码支持任意office格式 需要安装office 2007 还有一个office20 ...
- 将LibreOffice文档批量转成PDF格式
使用如下命令可以将文档一次性批量导出为pdf格式: -name -I /program/soffice.exe --headless --convert-to pdf '{}' find命令的-max ...
- C#实现office文档转换为PDF格式
1.安装组件OfficeSaveAsPDFandXPS 需要安装office 2007 还有一个office2007的插件OfficeSaveAsPDFandXPS 下载地址 OfficeSave ...
随机推荐
- fifo 实现问题
AR# 63960 FIFO Generator v12.0 - [Common 17-55] 'get_property' expects at least one object.[axis_fif ...
- Fixing “Did you mean to run dotnet SDK commands?” error when running dotnet –version
I recently installed the dotnet 1.11.0 Windows Server Hosting package which apparently installs the ...
- js基础-字符串常用属性合集
/* * * 实例方法---->必须要通过new的方式创建的对象(实例对象)来调用的方法 * 静态方法---->直接通过大写的构造函数的名字调用的方法(直接通过大写的对象名字调 ...
- Unity3d中如何查找一个脚本被挂在那些预设上面?
用一个脚本函数可以获取到选择的脚本文件被哪些预设和场景引用 [MenuItem("Assets/Tool/GetReference")] static void GetRefere ...
- 使用css实现无滚动条滚动+使用插件自定义滚动条样式
使用css实现无滚动条滚动,摘抄自:曹小萌博客 使用css实现无滚动条滚动,大体思路是在div外面再套一个div.这个div设置overflow:hidden.而内容div设置 overflow-x: ...
- Day047--JS BOM介绍, jQuery介绍和使用
内容回顾 DOM 文档对象模型(model) 一个模型就是一个对象(属性和方法 面向对象的三大特性:封装 继承 多态) 为了可扩展性 DOM操作 标签属性操作 获取值 getAttribute() 设 ...
- python 发送post和get请求
摘自:http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201231085444250/ 测试用CGI,名字为test.py,放在ap ...
- Kubernetes之ServiceAccount
ServiceAccount 是什么 Service Account为Pod中的进程和外部用户提供身份信息.所有的kubernetes集群中账户分为两类,Kubernetes管理的serviceacc ...
- GIT-Bonobo.Git.Server的使用
GIT-Bonobo.Git.Server的使用 登录 (默认用户:admin/admin) 创建用户: 创建团队,勾选用户 创建新库 保存完成!
- Python复习笔记(十一)TCP/IP协议
1. TCP/IP协议简介 帧头: mac地址, 网卡上的序列号 2. wireshark使用 分析一个数据是否发送, 是否是网络问题 ip.dst == 192.168.0.137 and udp ...