An open API service indexing awesome lists of open source software.

https://github.com/oldj/wp-epub-gen


https://github.com/oldj/wp-epub-gen

Last synced: 8 days ago
JSON representation

Awesome Lists containing this project

README

          

# wp-epub-gen

基于 [epub-gen](https://github.com/cyrilis/epub-gen/) 改进的 EPUB 生成器,支持 TypeScript 和现代 ES 模块。

## 安装

使用 npm 安装:

```bash
npm install wp-epub-gen --save
```

## 基本使用

### JavaScript (CommonJS)

```javascript
const { epubGen } = require("wp-epub-gen");

epubGen({
title: "我的电子书",
author: "作者名",
output: "./my-book.epub",
content: [
{
title: "第一章",
data: "

第一章

这是第一章的内容...

"
}
]
}).then(
() => console.log("电子书生成成功!"),
err => console.error("生成失败:", err)
);
```

### TypeScript / ES 模块

```typescript
import { epubGen, type IEpubGenOptions } from 'wp-epub-gen';

const options: IEpubGenOptions = {
title: "我的电子书",
author: "作者名",
output: "./my-book.epub",
content: [
{
title: "第一章",
data: "

第一章

这是第一章的内容...

"
}
]
};

try {
const result = await epubGen(options);
if (result.success) {
console.log("电子书生成成功!");
} else {
console.error("生成失败:", result.message);
}
} catch (error) {
console.error("发生错误:", error);
}
```

### 完整示例

```typescript
import { epubGen } from 'wp-epub-gen';

const options = {
title: "完整示例电子书",
author: ["张三", "李四"],
publisher: "我的出版社",
cover: "https://example.com/cover.jpg",
output: "./complete-book.epub",
version: 3,
lang: "zh-cn",
css: "body { font-family: 'Microsoft YaHei', sans-serif; }",
tocTitle: "目录",
appendChapterTitles: true,
tocAutoNumber: true,
verbose: true,
timeoutSeconds: 60,
content: [
{
title: "前言",
data: "

前言

这是前言内容...

",
beforeToc: true
},
{
title: "第一部分",
data: "

第一部分

",
children: [
{
title: "第一章",
data: "

第一章

第一章内容...

"
},
{
title: "第二章",
data: "

第二章

第二章内容...

"
}
]
},
{
title: "第二部分",
data: "

第二部分

第二部分内容...

"
},
{
title: "附录",
data: "

附录

附录内容...

",
excludeFromToc: true
}
]
};

epubGen(options).then(result => {
if (result.success) {
console.log("电子书生成成功!");
}
});
```

## API 参考

### epubGen(options, configs?)

主要的 EPUB 生成函数。

**参数:**
- `options: IEpubGenOptions` - 配置选项对象(标题、作者、封面、章节内容等)
- `configs?: IGenConfigs` - 可选的运行时回调(logger、onProgress、concurrency),见下文 [IGenConfigs](#igenconfigs-运行时回调)

**返回值:**
- `Promise` - 包含生成结果的 Promise

### IEpubGenOptions 配置选项

#### 必需参数

- **`title: string`** - 电子书标题
- **`output: string`** - 输出文件路径(绝对路径)
- **`content: IChapter[]`** - 章节内容数组

#### 可选参数

- **`author?: string | string[]`** - 作者名称,可以是字符串或字符串数组
- 示例:`"张三"` 或 `["张三", "李四"]`

- **`publisher?: string`** - 出版社名称

- **`cover?: string`** - 封面图片
- 支持网络 URL:`"https://example.com/cover.jpg"`
- 支持本地文件:`"/path/to/cover.jpg"`

- **`version?: 2 | 3`** - EPUB 版本
- `3`:最新版本(默认)
- `2`:兼容老设备

- **`lang?: string`** - 语言代码
- 默认:`"en"`
- 中文:`"zh-cn"`

- **`css?: string`** - 自定义 CSS 样式
- 示例:`"body { font-family: 'Microsoft YaHei'; }"`

- **`fonts?: string[]`** - 自定义字体文件路径数组
- 示例:`["/path/to/font.ttf"]`

使用方法:
```css
@font-face {
font-family: "CustomFont";
src: url("./fonts/font.ttf");
}
```

- **`tocTitle?: string`** - 目录标题
- 默认:`"Table Of Contents"`

- **`appendChapterTitles?: boolean`** - 是否在章节开头自动添加标题
- 默认:`true`

- **`tocAutoNumber?: boolean`** - 目录是否自动编号
- 默认:`false`

- **`verbose?: boolean`** - 是否输出详细日志
- 默认:`false`

- **`timeoutSeconds?: number`** - 超时时间(秒)
- `0` 表示无超时
- 默认:`900`(15分钟)

- **`description?: string`** - 电子书描述

- **`date?: string`** - 出版日期(ISO 格式)

- **`tmpDir?: string`** - 临时目录路径

#### 高级自定义选项

- **`customOpfTemplatePath?: string`** - 自定义 OPF 模板文件路径
- **`customNcxTocTemplatePath?: string`** - 自定义 NCX 目录模板文件路径
- **`customHtmlTocTemplatePath?: string`** - 自定义 HTML 目录模板文件路径

### IChapter 章节对象

每个章节对象可以包含以下属性:

#### 必需属性

- **`data: string`** - 章节的 HTML 内容
- 网络图片:``
- 本地图片:``

#### 可选属性

- **`id?: string`** - 唯一标识符
- **`title?: string`** - 章节标题
- **`author?: string | string[]`** - 章节作者(覆盖全局作者)
- **`filename?: string`** - 自定义文件名
- **`excludeFromToc?: boolean`** - 是否从目录中排除(默认:`false`)
- **`beforeToc?: boolean`** - 是否显示在目录之前(如版权页)(默认:`false`)
- **`appendChapterTitle?: boolean`** - 覆盖全局的 `appendChapterTitles` 设置
- **`children?: IChapter[]`** - 子章节数组(用于创建层级结构)

### 返回值类型 IOut

```typescript
interface IOut {
success?: boolean; // 是否成功
message?: string; // 错误信息(如果失败)
options?: IEpubGenOptions; // 使用的配置选项
}
```

### IGenConfigs 运行时回调

`epubGen` 的第二个参数,用于注入宿主侧的回调和并发配置。所有字段都是可选的。

```typescript
interface IGenConfigs {
logger?: ILogger;
onProgress?: (e: IProgressEvent) => void;
concurrency?: number;
}
```

#### `logger?: ILogger`

注入自定义日志记录器(替代默认 `console`)。常用于 Electron 主进程把日志转发到渲染进程。

```typescript
interface ILogger {
log: (msg: any) => void;
info: (msg: any) => void;
warn: (msg: any) => void;
error: (msg: any) => void;
}
```

#### `onProgress?: (e: IProgressEvent) => void`

进度回调。生成过程会在 5 个阶段中分别推送事件,宿主可据此渲染进度条或转发 IPC 给 UI。

```typescript
type ProgressPhase =
| 'parseContent' // 解析章节 HTML
| 'writeChapters' // 写章节临时文件
| 'buildToc' // 渲染 OPF / NCX / TOC
| 'downloadImage' // 下载图片(仅当存在图片时)
| 'zip' // 打包 .epub

interface IProgressEvent {
phase: ProgressPhase;
current: number; // 已完成数量
total: number; // 总数量
label?: string; // 当前条目标签(章节标题 / 图片 URL)
}
```

最小用法:

```typescript
await epubGen(options, {
onProgress: (e) => {
console.log(`[${e.phase}] ${e.current}/${e.total}`);
},
});
```

回调中抛出的异常会被库静默吞掉,不会中断 EPUB 生成。

#### `concurrency?: number`

写章节文件和下载图片所共用的并发上限。默认 `16`,机械硬盘或带宽受限场景可调小(如 `4`)。非有限正整数(NaN、负数等)会被自动归一化为默认值。

## 导出的类型

库导出了所有 TypeScript 类型定义:

```typescript
import type {
IEpubGenOptions,
IChapter,
IChapterData,
IEpubData,
IEpubImage,
IGenConfigs,
ILogger,
IProgressEvent,
ProgressPhase,
IOut,
} from 'wp-epub-gen';
```

## 错误处理

```typescript
import { epubGen, errors } from 'wp-epub-gen';

const result = await epubGen(options);

if (!result.success) {
switch (result.message) {
case errors.no_title:
console.error("缺少标题");
break;
case errors.no_output_path:
console.error("缺少输出路径");
break;
case errors.no_content:
console.error("缺少内容");
break;
default:
console.error("未知错误:", result.message);
}
}
```