1405/04/27
-
This commit is contained in:
@@ -2,8 +2,12 @@ export interface AboutSection {
|
||||
title?: string
|
||||
paragraphs?: string[]
|
||||
items?: string[]
|
||||
/** متن HTML از Setting — در صورت وجود، اولویت با این است */
|
||||
html?: string
|
||||
}
|
||||
|
||||
const ABOUT_SETTING_KEYS = ['text_about'] as const
|
||||
|
||||
export function getAboutSections(projectName: string): AboutSection[] {
|
||||
return [
|
||||
{
|
||||
@@ -11,3 +15,59 @@ export function getAboutSections(projectName: string): AboutSection[] {
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
function looksLikeHtml(value: string) {
|
||||
return /<\/?[a-z][\s\S]*>/i.test(value)
|
||||
}
|
||||
|
||||
function parseAboutSettingValue(raw: string): AboutSection[] | null {
|
||||
const value = raw.trim()
|
||||
if (!value) return null
|
||||
|
||||
try {
|
||||
const decoded = JSON.parse(value)
|
||||
if (Array.isArray(decoded) && decoded.length > 0) {
|
||||
return decoded as AboutSection[]
|
||||
}
|
||||
if (decoded && typeof decoded === 'object' && typeof decoded.html === 'string') {
|
||||
const html = decoded.html.trim()
|
||||
if (html) return [{ html }]
|
||||
}
|
||||
if (decoded && typeof decoded === 'object' && typeof decoded.text === 'string') {
|
||||
return parseAboutSettingValue(decoded.text)
|
||||
}
|
||||
} catch {
|
||||
// plain text / html
|
||||
}
|
||||
|
||||
if (looksLikeHtml(value)) {
|
||||
return [{ html: value }]
|
||||
}
|
||||
|
||||
const paragraphs = value
|
||||
.split(/\r?\n+/)
|
||||
.map((line) => line.trim())
|
||||
.filter(Boolean)
|
||||
|
||||
return [{ paragraphs: paragraphs.length > 0 ? paragraphs : [value] }]
|
||||
}
|
||||
|
||||
export function getAboutSettingText(
|
||||
getSettingByKey: (key: string) => unknown,
|
||||
): string {
|
||||
for (const key of ABOUT_SETTING_KEYS) {
|
||||
const value = String(getSettingByKey(key) ?? '').trim()
|
||||
if (value) return value
|
||||
}
|
||||
return ''
|
||||
}
|
||||
|
||||
/** اولویت با Setting؛ در صورت خالی بودن، متن پیشفرض */
|
||||
export function resolveAboutSections(
|
||||
projectName: string,
|
||||
settingsText?: string | null,
|
||||
): AboutSection[] {
|
||||
const fromSettings = parseAboutSettingValue(String(settingsText ?? ''))
|
||||
if (fromSettings?.length) return fromSettings
|
||||
return getAboutSections(projectName)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user