refactor: markdown template theme
This commit is contained in:
@@ -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()
|
||||
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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),
|
||||
}),
|
||||
)
|
||||
|
||||
@@ -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
|
||||
// }
|
||||
}
|
||||
|
||||
@@ -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' },
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user