Skip to content

Commit

Permalink
1.4.0
Browse files Browse the repository at this point in the history
  • Loading branch information
LeafYeeXYZ committed May 29, 2024
1 parent 3943881 commit d5d6202
Show file tree
Hide file tree
Showing 5 changed files with 127 additions and 103 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ mdp
| `--style=xxx` | 自定义 `CSS` 文件相对路径/模板<br>默认为 `APS` (`Acta Psychologica Sinica`) |
| `--showTitle` | 在页眉显示文件名, 默认不显示 |
| `--hideFooter` | 隐藏页码, 默认显示 |
| `--zhPunctuation` | 将正文中的英文标点符号替换为中文标点符号, 默认不替换<br>仅替换 `PDF``DOCX` 文件 |
| `--enPunctuation` | 将正文中的中文标点符号替换为英文标点符号, 默认不替换<br>仅替换 `PDF``DOCX` 文件 |
| `--outputHTML` | 输出 `HTML` 文件, 默认不输出 |
| `--outputDOCX` | 输出 `DOCX` 文件, 默认不输出<br>**须先执行 `pip install pdf2docx` 安装依赖**<br>使用时推荐开启 `--hideFooter` 参数 |

Expand Down Expand Up @@ -52,6 +54,7 @@ mdp
```

## 更新日志
- `1.4.0` (2024-05-29): 新增替换中英文标点符号功能
- `1.3.2` (2024-05-28): 优化图表标题显示
- `1.3.1` (2024-05-28): 优化样式
- `1.3.0` (2024-05-26): 支持自定义 `CSS` 文件, 简化编写格式, 优化帮助信息
Expand Down
39 changes: 33 additions & 6 deletions bin/mdp.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,37 @@
#!/usr/bin/env bun

import { main } from '../lib/main'

// 获取命令行参数
import { Options, renderMarkdown } from '../lib/main.ts'
/** 命令行参数 */
const args = process.argv.slice(2)
/** 当前工作目录 */
const cwd = process.cwd()

// 渲染 markdown
main(args, cwd)
/**
* 主函数
* @param args 命令行参数
* @param cwd 当前工作目录
*/
void async function main(args: string[], cwd: string) {
try {
// 如果没有参数, 显示帮助信息
if (args.length === 0) {
console.log(`\n使用方法:\n${Options.format}\n`)
process.exit(0)
}
// 解析参数
console.log('\n开始生成\n')
const options = new Options(args, cwd)
// 渲染 markdown
await renderMarkdown(options)
console.log('生成成功\n')
}
catch (e) {
if (e instanceof SyntaxError) {
console.error(`参数错误, 正确格式:\n${Options.format}\n`)
} else if (e instanceof Error) {
console.error(`错误:\n${e.message}\n`)
}
}
finally {
process.exit(0)
}
}(args, cwd)
123 changes: 27 additions & 96 deletions lib/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ import puppeteer from 'puppeteer-core'
import fs from 'node:fs/promises'
import path from 'node:path'
import { readFileSync, statSync } from 'node:fs'
import { en2zh, zh2en, parseCustomTags } from './utils'

/** 应用参数 */
export class Options {
/** markdown 文件绝对路径 */
src: string
Expand All @@ -21,6 +23,10 @@ export class Options {
hideFooter: boolean
/** 样式 */
style: string
/** 英文标点转中文标点 */
zhPunctuation: boolean
/** 中文标点转英文标点 */
enPunctuation: boolean
/** 正确格式 */
static format = `mdp <markdown> [--options]
Expand All @@ -31,7 +37,9 @@ export class Options {
--outputDOCX: 输出 docx 文件 (默认不输出)
--showTitle: 在页眉显示文件名 (默认不显示)
--hideFooter: 不添加页脚 (默认添加)
--browser=<path>: 自定义浏览器路径 (默认为 Edge)`
--browser=<path>: 自定义浏览器路径 (默认为 Edge)
--zhPunctuation: 中文标点转英文标点 (默认不转换)
--enPunctuation: 英文标点转中文标点 (默认不转换)`
/**
* 生成应用参数
* @param args 命令行参数
Expand All @@ -47,6 +55,8 @@ export class Options {
this.showTitle = false
this.hideFooter = false
this.browser = 'C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe'
this.zhPunctuation = false
this.enPunctuation = false
// 解析路径参数
if (args.length === 0) throw SyntaxError()
else args[0] = `--src=${args[0]}`
Expand Down Expand Up @@ -103,6 +113,14 @@ export class Options {
this.browser = a[1]
break
}
case '--zhPunctuation': {
this.zhPunctuation = true
break
}
case '--enPunctuation': {
this.enPunctuation = true
break
}
default: {
throw SyntaxError()
}
Expand All @@ -113,108 +131,15 @@ export class Options {
}
}

class Labels {
/**
* 转换 markdown
* @param md markdown 字符串
* @returns 转换后的字符串
*/
static transform(md: string): string {
md = Labels.author(md)
md = Labels.school(md)
md = Labels.keywords(md)
md = Labels.abstract(md)
return md
}
/**
* 作者
* @param md markdown 字符串
* @returns 转换后的字符串
* @example
* #author# xxx
* ->
* <div class="author">xxx</div>
*/
static author(md: string): string {
return md.replace(/#author# (.*)/mg, '<div class="author">$1</div>')
}
/**
* 单位
* @param md markdown 字符串
* @returns 转换后的字符串
* @example
* #school# xxx
* ->
* <div class="school">xxx</div>
*/
static school(md: string): string {
return md.replace(/#school# (.*)/mg, '<div class="school">$1</div>')
}
/**
* 关键词
* @param md markdown 字符串
* @returns 转换后的字符串
* @example
* #keywords# xxx
* ->
* <div class="keywords">xxx</div>
*/
static keywords(md: string): string {
return md.replace(/#keywords# (.*)/mg, '<div class="keywords">$1</div>')
}
/**
* 摘要
* @param md markdown 字符串
* @returns 转换后的字符串
* @example
* #abstract# xxx
* ->
* <div class="abstract">xxx</div>
*/
static abstract(md: string): string {
return md.replace(/#abstract# (.*)/mg, '<div class="abstract">$1</div>')
}
}

/**
* 主函数
* @param args 命令行参数
* @param cwd 当前工作目录
*/
export async function main(args: string[], cwd: string): Promise<void> {

try {
// 如果没有参数, 显示帮助信息
if (args.length === 0) {
console.log(`\n使用方法:\n${Options.format}\n`)
process.exit(0)
}
// 解析参数
console.log('\n开始生成\n')
const options = new Options(args, cwd)
// 渲染 markdown
await renderMarkdown(options)
console.log('生成成功\n')

} catch (e) {
if (e instanceof SyntaxError) console.error(`参数错误, 正确格式:\n${Options.format}\n`)
else if (e instanceof Error) console.error(`错误:\n${e.message}\n`)

} finally {
process.exit(0)

}
}

/**
* 渲染 markdown
* @param options 参数
*/
async function renderMarkdown(options: Options): Promise<void> {
export async function renderMarkdown(options: Options): Promise<void> {
// 读取 markdown 文件
let md = await fs.readFile(options.src, { encoding: 'utf-8' })
// 处理标签
md = Labels.transform(md)
md = parseCustomTags(md)
// 转换 markdown 为 html
const html = await marked(md)
// 读取 css 文件
Expand Down Expand Up @@ -256,6 +181,12 @@ async function renderMarkdown(options: Options): Promise<void> {
const page = await browser.newPage()
// 设置页面内容
await page.setContent(web)
// 替换为中文标点
if (options.zhPunctuation && !options.enPunctuation) {
await page.evaluate(en2zh)
} else if (!options.zhPunctuation && options.enPunctuation) {
await page.evaluate(zh2en)
}
// 生成 pdf
await page.pdf({
path: options.out,
Expand Down
63 changes: 63 additions & 0 deletions lib/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/** 将英文标点转换为中文标点 */
export function en2zh() {
const nodes = document.querySelectorAll('body > p, .abstract, .keywords, .author, .school')
nodes.forEach(node => {
let text = node.textContent ?? ''
// 替换中英文逗号和句号
text = text.replace(/, /g, ',').replace(/\. /g, '。').replace(/\.$/, '。')
// 替换中英文冒号
text = text.replace(/: /g, ':')
// 替换中英文分号
text = text.replace(/; /g, ';')
// 替换中英文感叹号
text = text.replace(/! /g, '!').replace(/!$/, '!')
// 替换中英文问号
text = text.replace(/\? /g, '?').replace(/\?$/, '?')
// 替换中英文括号
text = text.replace(/ \(/g, '(').replace(/\) /g, ')')
// 恢复et al.,
text = text.replace(/et al\.,/g, 'et al., ').replace(/et al。/g, 'et al. ')
// 设置新文本
node.textContent = text
})
}

/** 将中文标点转换为英文标点 */
export function zh2en() {
const nodes = document.querySelectorAll('body > p, .abstract, .keywords, .author, .school')
nodes.forEach(node => {
let text = node.textContent ?? ''
// 替换中英文逗号和句号
text = text.replace(//g, ', ').replace(//g, '. ')
// 替换中英文冒号
text = text.replace(//g, ': ')
// 替换中英文分号
text = text.replace(//g, '; ')
// 替换中英文感叹号
text = text.replace(//g, '! ')
// 替换中英文问号
text = text.replace(//g, '? ')
// 替换中英文括号
text = text.replace(//g, ' (').replace(//g, ') ')
// 设置新文本
node.textContent = text
})
}

/**
* 解析自定义标签
* @param md markdown 字符串
* @returns 转换后的 markdown 字符串
*/
export function parseCustomTags(md: string): string {
// 作者
md = md.replace(/#author# (.*)/mg, '<div class="author">$1</div>')
// 单位
md = md.replace(/#school# (.*)/mg, '<div class="school">$1</div>')
// 关键词
md = md.replace(/#keywords# (.*)/mg, '<div class="keywords">$1</div>')
// 摘要
md = md.replace(/#abstract# (.*)/mg, '<div class="abstract">$1</div>')
// 返回处理后的字符串
return md
}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "leaf-markdown-paper",
"type": "module",
"version": "1.3.2",
"version": "1.4.0",
"author": {
"name": "LeafYeeXYZ",
"email": "[email protected]"
Expand Down

0 comments on commit d5d6202

Please sign in to comment.