UNPKG

lunisolar

Version:

专业农历库,支持公历阴历互转,支持各类黄历数据查询,如八字四柱、阴历、神煞宜忌、时辰吉凶、建除十二神、胎神占方、五行纳音等。支持自定义插件。

97 lines (80 loc) 2.91 kB
import { _GlobalConfig } from '../config' import { Stem, Branch } from './stemBranch' import type { Trigram8 } from './trigram8' import { stemD24Idx, d24Trigrams, d24Directions } from '../constants/direction24' import { getDirection24List } from '../utils/direction24' function parseValue(value: number | Branch | Stem | Trigram8): number { if (typeof value === 'number') return value const className = value.constructor.name const signValue = value.value if (className === 'Stem') value = stemD24Idx[signValue] else if (className === 'Branch') value = signValue * 2 else if (className === 'Trigram8') { const idOf = d24Trigrams.indexOf(signValue) if (idOf === -1) throw new Error('Invalid direction24 value') value = (2 * idOf + 1) * 3 } else { throw new Error('Invalid direction24 value') } return value } export class Direction24 { readonly value: number readonly _sign: Stem | Branch | Trigram8 readonly _config: Required<ClassCommonConfig> = { lang: _GlobalConfig.lang } static instances = new Map<string, Direction24>() static create(value: number | Branch | Stem | Trigram8, config: ClassCommonConfig): Direction24 { const idx = parseValue(value) const lang = config?.lang || 'zh' const instKey = `${idx}:${lang}` if (Direction24.instances.has(instKey)) return Direction24.instances.get(instKey) as Direction24 const inst = new Direction24(idx, config) Direction24.instances.set(instKey, inst) return inst } static createFromAngle(angle: number, config: ClassCommonConfig): Direction24 { const value = Math.round((angle % 360) / 15) return Direction24.create(value, config) } static getNames(lang?: string): string[] { lang = lang || _GlobalConfig.lang return getDirection24List(lang).map(item => item.name) } constructor(value: number | Branch | Stem | Trigram8, config?: ClassCommonConfig) { const idx = parseValue(value) this.value = idx const lang = config?.lang || _GlobalConfig.lang const direction24List = getDirection24List(lang) if (idx === -1) this._sign = Stem.create(4, config) else if (idx === -1) this._sign = Stem.create(5, config) else this._sign = direction24List[idx % 24] } get sign() { return this._sign } get name() { return this._sign.toString() } get type(): 'Branch' | 'Stem' | 'Trigram8' { return this._sign.constructor.name as 'Branch' | 'Stem' | 'Trigram8' } get angle(): number { return this.value > 0 ? this.value * 15 : NaN } get direction(): string { return _GlobalConfig.locales[this._config.lang].directions[this.directionIndex] } get directionIndex(): number { if (this.value < 0) return 5 return d24Directions[this.value] } toString() { return this._sign.toString() } valueOf() { return this.value } } export const createDirection24 = function () {}