Files
nl-blogs/client/src/layouts/resolvers.ts

54 lines
1.7 KiB
TypeScript
Raw Normal View History

2026-08-24 13:06:04 +08:00
import { loadPublicSettings } from '../composables/usePublicSettings'
import {
fetchPosts, fetchPost, fetchWorks, fetchCategories,
fetchSnippets, fetchColumns, fetchTags, fetchAboutProfile,
type PublicSettings,
} from '../services/api'
export type DataSource =
| 'posts' | 'post' | 'works' | 'categories'
| 'snippets' | 'columns' | 'tags' | 'about'
// 解析 bindings 中的 settings 值("settings.site_title")
export async function resolveSetting(key: string): Promise<string> {
const s = await loadPublicSettings() as PublicSettings
const v = (s as Record<string, unknown>)[key]
return v == null ? '' : String(v)
}
// 加载数据源
export async function loadDataSource(source: DataSource, params: Record<string, any> = {}): Promise<any> {
switch (source) {
case 'posts': {
const pageSize = Number(params.pageSize) || 10
const res = await fetchPosts(undefined, undefined, undefined, undefined, 1, pageSize)
return res?.list || []
}
case 'post':
return fetchPost(String(params.id ?? ''))
case 'works':
return fetchWorks()
case 'categories':
return fetchCategories()
case 'snippets':
return fetchSnippets()
case 'columns':
return fetchColumns()
case 'tags':
return fetchTags()
case 'about':
return fetchAboutProfile()
default:
return null
}
}
/** 轻量 HTML 清洗:移除 script/事件属性,防止注入脚本 */
export function sanitizeStaticHtml(html: string): string {
if (!html) return ''
return html
.replace(/<script[\s\S]*?<\/script>/gi, '')
.replace(/\son\w+\s*=\s*("[^"]*"|'[^']*'|[^\s>]+)/gi, '')
.replace(/javascript:/gi, '')
}