豆瓣日记的编辑器一直以来都只支持纯文本的,因此无法将原先在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文档转换为豆瓣日记的更多相关文章

  1. OFFICE 文档转换为html在线预览

    OFFICE 文档在线预览方案很多: 服务器先转换为PDF,再转换为SWF,最后通过网页加载Flash预览,比如flexpaper Office文档直接转换为SWF,通过网页加载Flash预览 微软的 ...

  2. 把office文档转换为html过程中的一些坑

    之前和我们项目的团队一起酝酿了一个项目,公司的业务文档技术文档比较多,但都比较分散,虽然通过FTP或其他方式聚合起来了,但感觉还是不够方便. 另外公司每次都来新员工,新员工都需要一些培训,比较耗时,比 ...

  3. 转:C#实现office文档转换为PDF或xps的一些方法

    代码支持任意office格式 需要安装office 2007 还有一个office2007的插件OfficeSaveAsPDFandXPS 下载地址 [url]http://www.microsoft ...

  4. PDF文档转换为图片、图片转成PDF 及PDF合并

    简介 功能:PDF文档按每页转换成一张图片,一张图片转换成一张PDF 并将多张PDF合成一个多页的PDF文档. 经历:在各个网站上搜索始终出现各种问题,尤其是遇到引用的版本问题尤其头疼,不是不能适用当 ...

  5. C#,VB.NET将PPT文档转换为HTML

    PPT文档主要用于展示,有时候我们需要将PPT文档转换为HTML格式方便查看.本文将介绍如何使用C#和VB.NET将PPT文档转换为HTML格式.该方案使用了.NET PowerPoint 组件Spi ...

  6. 在禅道中实现WORD等OFFICE文档转换为PDF进行在线浏览

    条件: 安装好禅道的服务器 能直接浏览PDF的浏览器(或通过 安装插件实现 ) 文档转换服务程序(建议部署在另一台服务器上)     实现 原理: 修改禅道的文件预览功能(OFFICE文档其使用的是下 ...

  7. C#实现office文档转换为PDF或xps的一些方法( 转)

    源博客http://blog.csdn.net/kable999/article/details/4786654 代码支持任意office格式 需要安装office 2007 还有一个office20 ...

  8. 将LibreOffice文档批量转成PDF格式

    使用如下命令可以将文档一次性批量导出为pdf格式: -name -I /program/soffice.exe --headless --convert-to pdf '{}' find命令的-max ...

  9. C#实现office文档转换为PDF格式

    1.安装组件OfficeSaveAsPDFandXPS 需要安装office 2007 还有一个office2007的插件OfficeSaveAsPDFandXPS 下载地址   OfficeSave ...

随机推荐

  1. Linux 学习 (九) 网络基础

    Linux网络管理 学习笔记 ISO/OSI 七层模型 ISO :国际标准化组织 OSI :开放系统互联模型 应用层.表示层.会话层服务于用户 传输层.网络层.数据链路层.物理层服务于实际数据传输 帧 ...

  2. python之collection模块

    collections模块 一.总览 在内置数据类型(int.float.complex.dict.list.set.tuple)的基础上, collections模块还提供了几个额外的数据类型:Co ...

  3. Flask插件wtforms、Flask文件上传和Echarts柱状图

    一.wtforms 类比Django的Form组件Form组件的主要应用是帮助我们自动生成HTML代码和做一些表单数据的验证 flask的wtforms用法跟Form组件大同小异参考文章:https: ...

  4. [SCOI2015]小凸想跑步

    题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n 边形, nn 个顶点按照逆时针从 0 ∼n−1 编号.现在小凸随机站在操场中的某个位置,标记为p点.将 p ...

  5. Day040--HTML&CSS

    内容回顾: 标签分类: (1)行内标签 span 小跨度的标签 i em a 特点: (1)在一行内显示 (2)不能设置宽高,如果不设置宽高,默认是内容的宽高 (2)块级标签 h1~h6 h1页面中尽 ...

  6. Mock6 moco框架中如何加入header

    新建一个 startupWithHeader.json,这次在request里面添加了headers属性 [ { "description": "这是一个带header的 ...

  7. busybox(四)完善

    目录 busybox(四)完善 proc挂载 手动挂载 proc解析 使用脚本自动挂载 使用mount-a挂载 udev/mdev 挂载 使用jffs2 文件系统格式 安装zlib 安装jffs2 生 ...

  8. Java进程线程笔记

    什么是并行和并发? 并发和并行是即相似又有区别:(微观) 并行:指两个或多个事件在同一时刻发生: 强调的是时间点. 并发:指两个或多个事件在同一时间段内发生: 强调的是时间段. 进程和线程的区别? 进 ...

  9. React 记录(5)

    React文档:https://www.reactjscn.com/docs/state-and-lifecycle.html 慢慢学习:对照教程文档,逐句猜解,截图 React官网:https:// ...

  10. C# GetHashCode在x64与x86版本下不一样

    最好指定一下目标平台