将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 ...
随机推荐
- Lodop打印控件在页面如何使用
Lodop打印控件部署到web服务器简单,在页面的使用方法也简单,是非常容易和方便使用的打印控件.客户端本地打印角色(即用户访问网站后 用自己链接的打印机进行客户端本地打印),步骤很少,部署简单:Lo ...
- 安装mysql8.0出现服务无法启动,服务没报告任何错误
改为net start mysql80 参考https://blog.csdn.net/gzejia/article/details/82156994
- zookeeper的单实例和伪集群部署
原文链接: http://gudaoyufu.com/?p=1395 zookeeper工作方式 ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现 ...
- P1313 计算系数
题目描述 给定一个多项式(by+ax)k(by+ax)^k(by+ax)k,请求出多项式展开后xn×ymx^n \times y^mxn×ym项的系数. 输入输出格式 输入格式: 共一行,包含555个 ...
- Linux基本命令总结(五)
接上篇: 21,在lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以.Chgrp命令就是chang ...
- 关于Oracle.ManagedDataAccess数据库表加字段后,必须重启的问题
关于Oracle.ManagedDataAccess数据库表加字段后,必须重启的问题,解决方法如下:在数据库连接字串中,增加一个参数:Metadata Pooling=false如“Data Sour ...
- Python统计词频的几种方式
语料 text = """My fellow citizens: I stand here today humbled by the task before us, gr ...
- CMDB资产管理系统开发【day25】:表结构设计1
资产表 # _*_coding:utf-8_*_ __author__ = 'jieli' from assets.myauth import UserProfile from django.db i ...
- 分布式监控系统开发【day38】:报警阈值程序逻辑解析(三)
一.需求讨论 1.请问如何解决延迟问题 1000台机器,每1分钟循环一次但是刚好第一次循环第一秒刚处理完了,结果还没等到第二分钟又出问题,你那必须等到第二次循环,假如我这个服务很重要必须实时知道,每次 ...
- Quartz.net 3.x使用总结(一)——入门介绍
1.Quartz.net简介 Quartz.NET是一个强大.开源.轻量级的任务调度框架.任务调度在我们的开发中经常遇到,如说:每天晚上三点让程序或网站执行某些代码,或者每隔5秒种执行一个方法等.Wi ...