lunisolar
Version:
专业农历库,支持公历阴历互转,支持各类黄历数据查询,如八字四柱、阴历、神煞宜忌、时辰吉凶、建除十二神、胎神占方、五行纳音等。支持自定义插件。
179 lines (159 loc) • 4.75 kB
text/typescript
import {
addMarkers,
removeMarkers,
removeMarkersByTagOrName,
getMarkersFromFormatList,
prettyMarkersItem,
filterStoreMarkers,
filterByObj
} from '../utils/markers'
export class Markers {
_list: StoreMarker[] | null = null
static readonly store: MarkersStore = {
formatList: [],
formatMap: new Map<string, MarkersMatcherMap>(),
fnList: []
}
storeMarkers: StoreMarker[] = []
storeMarkersFromGlobal: StoreMarker[] = []
readonly lsr: lunisolar.Lunisolar
static add(markersSetting: MarkersSetting, tags?: string | string[]) {
addMarkers(Markers.store, markersSetting, tags)
return Markers
}
static clean() {
Markers.store.formatList = []
Markers.store.formatMap = new Map<string, MarkersMatcherMap>()
Markers.store.fnList = []
return Markers
}
static cleanFnList() {
Markers.store.fnList = []
return Markers
}
static remove(format: string, matcher?: string, names?: string | string[]) {
removeMarkers(Markers.store, format, matcher, names)
return Markers
}
static removeByTag(tags: string | string[]) {
removeMarkersByTagOrName(Markers.store, tags, true)
return Markers
}
static removeByName(names: string | string[]) {
removeMarkersByTagOrName(Markers.store, names, false)
return Markers
}
constructor(lsr: lunisolar.Lunisolar) {
this.lsr = lsr
this.init()
}
init() {
const mksArr: StoreMarker[][] = []
const mksStore = Markers.store
for (const formatKey of mksStore.formatList) {
const matcher = this.lsr.format(formatKey)
const mks = getMarkersFromFormatList(mksStore, formatKey, matcher)
if (mks) mksArr.push(mks)
}
this.storeMarkersFromGlobal.splice(0, this.storeMarkersFromGlobal.length, ...mksArr.flat())
}
add(marker: MarkersSettingItem | MarkersSettingItem[], tags?: string | string[]) {
this._list = null
if (Array.isArray(marker)) {
for (const item of marker) {
this.add(item, tags)
}
} else {
const mk = prettyMarkersItem(marker, tags)
this.storeMarkers.push(mk)
}
return this
}
/**
* 移除指定名称或tag的markers
* @param name 指定的marker名字或tag
* @param isTag name参数是否为tag, 默认为false
* @param flag 1: 只移除从全局设定进本实例的markers, 2: 只移除通过本实例add方法加进来的markers, 0: 包括1和2。
* @returns 返回本markers实例
*/
remove(name: string | string[], isTag: Boolean = false, flag: 0 | 1 | 2 = 0) {
this._list = null
if (flag === 0 || flag === 1) {
this.storeMarkersFromGlobal = filterStoreMarkers(this.storeMarkersFromGlobal, name, isTag)
}
if (flag === 0 || flag === 2) {
this.storeMarkers = filterStoreMarkers(this.storeMarkers, name, isTag)
}
return this
}
/**
* 清除所有markers
* @param flag 1: 只清除从全局设定进本实例的markers,2: 只清除通过本实例add方法加进来的markers, 0:包括1和2
* @returns 返回本markers实例
*/
clean(flag: 0 | 1 | 2 = 0) {
this._list = null
if (flag === 0 || flag === 1) {
this.storeMarkersFromGlobal = []
// this.storeMarkersFromGlobal.splice(0, this.storeMarkersFromGlobal.length)
}
if (flag === 0 || flag === 2) {
this.storeMarkers = []
// this.storeMarkers.splice(0, this.storeMarkersFromGlobal.length)
}
return this
}
/**
* 重置markers实例
* @returns
*/
reset() {
this._list = null
this.clean(0)
this.init()
return this
}
[Symbol.iterator](): IteratorInterface {
let index = 0
const list = this.list
return {
next() {
if (index < list.length) {
return {
value: list[index++],
done: false
}
} else {
return {
value: undefined,
done: true
}
}
}
}
}
/**
* 取得markers列表
*/
get list(): StoreMarker[] {
if (this._list == null) this._list = [...this.storeMarkersFromGlobal, ...this.storeMarkers]
return this._list
}
filter(fn: Partial<MarkersSettingItem> | MarkersFilterFn): StoreMarker[] {
if (typeof fn === 'function') return this.list.filter(fn)
if (typeof fn === 'object') {
return this.list.filter(item => filterByObj(fn, item))
}
return []
}
find(fn: Partial<MarkersSettingItem> | MarkersFilterFn): StoreMarker | undefined {
if (typeof fn === 'function') return this.list.find(fn)
if (typeof fn === 'object') {
return this.list.find(item => filterByObj(fn, item))
}
return undefined
}
toString() {
return this.list.map(v => v.name).join(',')
}
}