refactor: markdown template theme

This commit is contained in:
Innei
2021-10-03 11:30:04 +08:00
parent f7c4b420a8
commit c97570b6ec
6 changed files with 39 additions and 26 deletions

View File

@@ -15,10 +15,10 @@ import {
ResponseInterceptor,
} from './common/interceptors/response.interceptors'
import {
ASSET_DIR,
DATA_DIR,
LOGGER_DIR,
TEMP_DIR,
USER_ASSET_DIR,
} from './constants/path.constant'
import { AggregateModule } from './modules/aggregate/aggregate.module'
import { AnalyzeModule } from './modules/analyze/analyze.module'
@@ -57,8 +57,8 @@ function mkdirs() {
Logger.log(chalk.blue('临时目录已经建好: ' + TEMP_DIR))
mkdirSync(LOGGER_DIR, { recursive: true })
Logger.log(chalk.blue('日志目录已经建好: ' + LOGGER_DIR))
mkdirSync(ASSET_DIR, { recursive: true })
Logger.log(chalk.blue('资源目录已经建好: ' + ASSET_DIR))
mkdirSync(USER_ASSET_DIR, { recursive: true })
Logger.log(chalk.blue('资源目录已经建好: ' + USER_ASSET_DIR))
}
mkdirs()

View File

@@ -10,7 +10,7 @@ export const DATA_DIR = isDev
? join(process.cwd(), './tmp')
: join(HOME, '.mx-space')
export const ASSET_DIR = join(DATA_DIR, 'assets')
export const USER_ASSET_DIR = join(DATA_DIR, 'assets')
export const LOGGER_DIR = join(DATA_DIR, 'log')
export const LOCAL_BOT_LIST_DATA_FILE_PATH = join(DATA_DIR, 'bot_list.json')

View File

@@ -13,7 +13,6 @@ import dayjs from 'dayjs'
import { render } from 'ejs'
import { minify } from 'html-minifier'
import JSZip from 'jszip'
import { sample } from 'lodash'
import { join } from 'path'
import { performance } from 'perf_hooks'
import { Readable } from 'stream'
@@ -198,14 +197,10 @@ export class MarkdownController {
const structure = await this.service.getRenderedMarkdownHtmlStructure(
markdown,
document.title,
theme,
)
const html = render(await this.service.getMarkdownEjsRenderTemplate(), {
theme:
theme === 'random'
? sample(this.service.getMarkdownRenderTheme())
: xss(theme),
...structure,
title: document.title,
@@ -246,11 +241,12 @@ export class MarkdownController {
const structure = await this.service.getRenderedMarkdownHtmlStructure(
html,
title,
theme,
)
return minify(
render(await this.service.getMarkdownEjsRenderTemplate(), {
...structure,
theme: xss(theme),
title: xss(title),
}),
)

View File

@@ -321,10 +321,19 @@ ${text.trim()}
return marked(text)
}
async getRenderedMarkdownHtmlStructure(html: string, title: string) {
async getRenderedMarkdownHtmlStructure(
html: string,
title: string,
theme = 'newsprint',
) {
const style = await this.assetService.getAsset('/markdown/markdown.css', {
encoding: 'utf8',
})
const themeStyleSheet = await this.assetService.getAsset(
'/markdown/theme/' + theme + '.css',
{ encoding: 'utf-8' },
)
return {
body: [`<article><h1>${title}</h1>${html}</article>`],
extraScripts: [
@@ -342,7 +351,7 @@ ${text.trim()}
link: [
'<link href="https://cdn.jsdelivr.net/gh/PrismJS/prism-themes@master/themes/prism-one-light.css" rel="stylesheet" />',
],
style: [style],
style: [style, themeStyleSheet],
}
}
@@ -352,7 +361,7 @@ ${text.trim()}
})
}
getMarkdownRenderTheme() {
return ['newsprint', 'github', 'han', 'gothic'] as const
}
// getMarkdownRenderTheme() {
// return ['newsprint', 'github', 'han', 'gothic'] as const
// }
}

View File

@@ -45,13 +45,13 @@ export class EmailService {
writeTemplate(type: ReplyMailType, source: string) {
switch (type) {
case ReplyMailType.Guest:
return this.assetService.writeAsset(
return this.assetService.writeUserCustomAsset(
'/email-template/guest.template.ejs',
source,
{ encoding: 'utf-8' },
)
case ReplyMailType.Owner:
return this.assetService.writeAsset(
return this.assetService.writeUserCustomAsset(
'/email-template/owner.template.ejs',
source,
{ encoding: 'utf-8' },

View File

@@ -6,7 +6,8 @@
import { Injectable, Logger } from '@nestjs/common'
import fs from 'fs'
import path, { join } from 'path'
import { ASSET_DIR } from '~/constants/path.constant'
import { promisify } from 'util'
import { USER_ASSET_DIR } from '~/constants/path.constant'
import { HttpService } from './helper.http.service'
// 先从 ASSET_DIR 找用户自定义的资源, 没有就从默认的 ASSET_DIR 找, 没有就从网上拉取, 存到默认的 ASSET_DIR
@@ -17,6 +18,9 @@ export class AssetService {
this.logger = new Logger(AssetService.name)
}
/**
* 内置资源地址
*/
public embedAssetPath = path.resolve(process.cwd(), 'assets')
// 在线资源的地址 `/` 结尾
private onlineAssetPath =
@@ -49,8 +53,8 @@ export class AssetService {
path: string,
options: Parameters<typeof fs.readFileSync>[1],
) {
if (fs.existsSync(join(ASSET_DIR, path))) {
return fs.readFileSync(join(ASSET_DIR, path), options)
if (fs.existsSync(join(USER_ASSET_DIR, path))) {
return await promisify(fs.readFile)(join(USER_ASSET_DIR, path), options)
}
return null
}
@@ -77,28 +81,32 @@ export class AssetService {
})(),
{ recursive: true },
)
fs.writeFileSync(join(this.embedAssetPath, path), data, options)
promisify(fs.writeFile)(join(this.embedAssetPath, path), data, options)
return data
} catch (e) {
this.logger.error('本地资源不存在,线上资源无法拉取')
throw e
}
}
return fs.readFileSync(join(this.embedAssetPath, path), options)
return promisify(fs.readFile)(join(this.embedAssetPath, path), options)
}
public writeAsset(
public writeUserCustomAsset(
path: string,
data: any,
options: Parameters<typeof fs.writeFileSync>[2],
) {
fs.mkdirSync(
(() => {
const p = join(ASSET_DIR, path).split('/')
const p = join(USER_ASSET_DIR, path).split('/')
return p.slice(0, p.length - 1).join('/')
})(),
{ recursive: true },
)
fs.writeFileSync(join(ASSET_DIR, path), data, options)
fs.writeFileSync(join(USER_ASSET_DIR, path), data, options)
}
public async removeUserCustomAsset(path: string) {
return promisify(fs.unlink)(join(USER_ASSET_DIR, path))
}
}