将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 ...
随机推荐
- Linux--前后端分离部署
项目部署 (vue + nginx + uwsgi + django + mysql + redis) 一 . 前端部署 1. 下载vue代码,解压缩 wget https://files.cnblo ...
- 作业二:分布式版本控制系统Git的安装与使用
作业要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 1.下载安装配置用户名和邮箱. (1)下载安装Github配置 ...
- Insert Into select 与 Select Into 哪个更快?
在平常数据库操作的时候,我们有时候会遇到表之间数据复制的情况,可能会用到INSERT INTO SELECT 或者 SELECT INTO : 那么二者语法上有什么区别?性能上又如何呢? 围绕着这两个 ...
- CSS概念,引入,选择器
概念 层叠样式表,定义如何显示HTML元素. 使用方式 行内样式 不推荐使用此方式 结构 和 样式的 杂糅会影响后期的维护 <p style="color: red"> ...
- A.01.12—模块的输出—通讯(CAN&LIN)
AN和LIN相关的内容很多,今天仅对几年前困扰过我的一个疑问进行说明. 以前最常见的通迅方式为CAN和LIN,但现在也有很多其他的通讯方式了,而这两种通讯方式仍使用广泛. 前几年常听人说CAN的成本和 ...
- 我眼中的K-近邻算法
有一句话这样说:如果你想了解一个人,你可以从他身边的朋友开始. 如果与他交往的好友都是一些品行高尚的人,那么可以认为这个人的品行也差不了. 其实古人在这方面的名言警句,寓言故事有很多.例如:人以类聚, ...
- 分布式监控系统开发【day37】:表结构设计(二)
一.表结构关系图 二.表结构需求讨论 1.主机表(Host) 1.解决了什么问题? 1.如果我不想让它监控了,就有一个开关的东西给它禁掉2.主机存活状态检测间隔 2.代码 class Host(mod ...
- 分布式监控系统开发【day38】:监控数据如何画图(九)
一.画图代码 1.收集处理数据 class GraphGenerator(object): ''' generate graphs ''' def __init__(self,request,redi ...
- MongoDB 分片集群技术
在了解分片集群之前,务必要先了解复制集技术! 1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这 ...
- Sass学习第一天
Sass学习 网站学习地址: Sass中文网:https://www.sass.hk/docs/#t7-3 Airen的博客:https://www.w3cplus.com/preprocessor/ ...