豆瓣日记的编辑器一直以来都只支持纯文本的,因此无法将原先在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. golang函数

    一.函数语法 func 函数名(形参列表) (返回值列表){ ...... return 返回值 } 例如: package main import "fmt" func test ...

  2. springboot 打war

    pom.xml <packaging>war</packaging> <!-- 打包设置 --> <plugins> <plugin> &l ...

  3. Python——Pycharm基本设置

    一.,模板(加入中文UTF-8) #!/usr/bin/env python # -*- coding:utf-8 -*- 设置方法:file->settings->Editor-> ...

  4. UVA 10118 Free Candies

    https://vjudge.net/problem/UVA-10118 题目 桌上有4堆糖果,每堆有$N$($N\leqslant 40$)颗.有个熊孩子拿了个可以装5颗糖的篮子,开始玩无聊的装糖游 ...

  5. python基础4 列表和元组

    一. 列表列表:python基础数据类型之一:其他语言中也有列表的概念,js 数组,可索引,可切片,可加步长li = ['hello', 100, True, [1, 2, 3], {'name':' ...

  6. 量化交易之下单函数和context对象

    一.下单函数 聚宽设计的函数(如前文所说准确叫法是API)的用法都写在API文档里,位置在聚宽网站导航栏-帮助-API文档 1.order按股数下单 order(security, amount, s ...

  7. P2837 晚餐队列安排

    此题可能用动规不太好做,主要是状态转移方程很难想个人认为,思维发散的大佬们忽视. 我看了这位大佬的dp题解后才想到了方程,在此受我一膜%%% 嗯,说下思路: 先用a[i]数组存一下输入的编号: 然后用 ...

  8. 【LOJ2542】【PKUWC 2018】随机游走 min-max容斥 树上高斯消元

    题目描述 有一棵 \(n\) 个点的树.你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(q\) 次询问,每次询问给定一个集合 \(S\),求如果从 \(x\) 出发一 ...

  9. Django_rbac_demo 权限控制组件框架模型

    rbac 权限控制组件 基于角色的权限控制 本质每个权限即为一个 URL 项目组件结构 表结构 Role (title, permission) -(ManyToManyField)-   User  ...

  10. 在 Angular6 中使用 HTTP 请求服务端数据

    第一步 准备好api接口地址, 例如 https://api.example.com/api/ 第二步 在根组件 app.module.ts 中引入 HttpClientModule 模块. // a ...