33 lines
1.4 KiB
TypeScript
33 lines
1.4 KiB
TypeScript
import { regexTag, RULES } from './rules'
|
||
import type { Tag } from './tags'
|
||
import type { Pad } from './types'
|
||
|
||
export const clamp = (x: number, lo = -1, hi = 1) => Math.max(lo, Math.min(hi, x))
|
||
|
||
// 心情事件即評估標籤,增減量由 rules.ts 的規則表決定
|
||
export const MOOD_EVENTS = RULES
|
||
export type MoodEvent = Tag
|
||
|
||
// 八分區(Mehrabian 的 PAD 八分類)→ 情緒標籤與顏文字
|
||
const OCTANTS: Record<string, { label: string; kaomoji: string }> = {
|
||
'+++': { label: '興奮', kaomoji: '(≧▽≦)' },
|
||
'++-': { label: '撒嬌', kaomoji: '(๑>ᴗ<๑)' },
|
||
'+-+': { label: '放鬆', kaomoji: '(´ᴗ`)' },
|
||
'+--': { label: '溫順', kaomoji: '(︶ᴗ︶)' },
|
||
'---': { label: '無聊', kaomoji: '(-_-)' },
|
||
'--+': { label: '不屑', kaomoji: '(¬_¬)' },
|
||
'-++': { label: '生氣', kaomoji: '(╬`益´)' },
|
||
'-+-': { label: '焦慮', kaomoji: '(;´Д`)' },
|
||
}
|
||
const CALM = { label: '平靜', kaomoji: '(・ω・)' }
|
||
const CALM_RADIUS = 0.1
|
||
|
||
export function moodLabel(m: Pad): { label: string; kaomoji: string } {
|
||
if (Math.abs(m.p) < CALM_RADIUS && Math.abs(m.a) < CALM_RADIUS && Math.abs(m.d) < CALM_RADIUS) return CALM
|
||
const s = (x: number) => (x >= 0 ? '+' : '-')
|
||
return OCTANTS[s(m.p) + s(m.a) + s(m.d)]!
|
||
}
|
||
|
||
/** 以使用者文字的關鍵字對應心情事件 */
|
||
export const keywordEvent = (text: string): MoodEvent | null => regexTag(text)
|