/** * 鑺傛棩姘涘洿 * festivals.js * * @version 0.0.1 * * @author 闃块攱 * @link https://feng.pub */ const fengCustomFestivals = (() => { const tool = { /** * 鍒涘缓鍏冪礌 * @param {*} className * @returns */ createElement: (className) => { const div = document.createElement('div') div.className = className return div }, /** * 鍏冪礌缁戝畾 * @param {*} selector 鐖惰妭鐐癸紙榛樿涓猴細body锛 * @param {*} element 瀛愯妭鐐 */ bindElement: (selector, element) => { if (selector === undefined || selector === '') selector = 'body' document.querySelector(selector).appendChild(element) }, // 瀛楃涓茶浆鎹负鏁扮粍 stringToArray: (text, defaultText = []) => { // console.log(text, text.length) if (typeof text === 'string') { const splitText = text.split("") // console.log('splitText.length', splitText, splitText.length) if (splitText.length > 0) { return splitText } } return defaultText }, /** * 杞崲涓烘暟瀛楋紝鑾峰彇鎻愬墠鎴栧欢鍚庣殑澶╂暟 * * @param String number 鏁板瓧 * @param Number defaultNum 榛樿鏁板瓧 * @returns */ toNumber: (number, defaultNum) => { if (number === "") { return Number(number) ? Number(number) : defaultNum } return Number(number) }, /** * 姣旇緝鏃ユ湡 * * @param {*} data 鏁版嵁 * @param {*} callback 鎵ц鍑芥暟 */ in: (data = {}, callback) => { const { month, day, isLunar, advanceDays, delayDays } = { ...data } // 鑾峰彇褰撳墠鏃堕棿 const currentDate = Solar.fromDate(new Date()) // const currentDate = Solar.fromYmd(2023, 9, 28) const year = currentDate.getYear() const currentDateLunar = currentDate.getLunar() const lunarYear = currentDateLunar.getYear() const date = isLunar === true ? Lunar.fromYmd(lunarYear, month, day).getSolar() : Solar.fromYmd(year, month, day) // 寮€濮嬫棩鏈 const startDate = date.next(-(advanceDays + 1)) // 缁撴潫鏃ユ湡 const endDate = date.next(delayDays + 1) // console.log('褰撳墠鑺傛棩', date.toString(), advanceDays, delayDays) // console.log('寮€濮嬫棩鏈?, startDate.toString()) // console.log('缁撴潫鏃ユ湡', endDate.toString()) // console.log('褰撳墠鏃ユ湡', currentDate.toString()) // console.log(currentDate.isAfter(startDate), currentDate.isBefore(endDate)) if (currentDate.isAfter(startDate) && currentDate.isBefore(endDate)) callback() } } /** * 鏋勫缓鐏 */ const buildLantern = (data = {}) => { const { className, elementID, bindElement, light, text, position, top, left, bottom, right, scale, fontSize, lineHeight, } = { ...data } const lanternObject = { // 鍒涘缓鐏涓讳綋 createBodyElement: (text) => { const body = tool.createElement('body') body.appendChild(tool.createElement('cadre')) body.appendChild(tool.createElement('cadre')) const textEle = tool.createElement('text') if (text !== undefined) textEle.appendChild(document.createTextNode(text)) if (fontSize !== undefined) textEle.style.fontSize = fontSize if (lineHeight !== undefined) textEle.style.lineHeight = lineHeight; (light === undefined || light === 'none' || light === '') ? body.style.boxShadow = 'none' : body.style.boxShadow = '0 0 30px #ffea00' body.appendChild(textEle) return body }, // 鍒涘缓鐏搴曢儴 createBottomElement: () => { const bottom = tool.createElement('bottom') bottom.appendChild(tool.createElement('bottom_bg')) bottom.appendChild(tool.createElement('bottom_line')) bottom.appendChild(tool.createElement('bottom_line')) bottom.appendChild(tool.createElement('bottom_line')) bottom.appendChild(tool.createElement('bottom_line')) return bottom } } // 鐏澶х洅瀛 const lantern = tool.createElement('feng_custom_lantern') if (className !== undefined) lantern.classList.add(className) if (elementID !== undefined) lantern.setAttribute('id', elementID) if (position !== undefined) lantern.style.position = position const lanternBox = tool.createElement('lantern_box') lanternBox.appendChild(tool.createElement('line')) lanternBox.appendChild(tool.createElement('ring')) lanternBox.appendChild(tool.createElement('cap')) lanternBox.appendChild(lanternObject.createBottomElement()) lanternBox.appendChild(tool.createElement('bottom_cap')) lanternBox.appendChild(lanternObject.createBodyElement(text)) lantern.appendChild(lanternBox) //璁剧疆浣嶇疆 if (top !== undefined) lantern.style.top = top if (left !== undefined) lantern.style.left = left if (bottom !== undefined) lantern.style.bottom = bottom if (right !== undefined) lantern.style.right = right // 缂╂斁澶у皬 if (scale !== undefined) lantern.style.transform = 'scale(' + scale + ')' tool.bindElement(bindElement, lantern) } /** * 鍥藉簡鑺傜伅绗 * @param {*} option */ const nationalDayLanter = (option = {}) => { tool.in({ month: 10, day: 1, advanceDays: tool.toNumber(option.national_day_advance, 3), delayDays: tool.toNumber(option.national_day_delay, 6) // advanceDays: Number(option.national_day_advance) ? Number(option.national_day_advance) : 3, // delayDays: Number(option.national_day_delay) ? Number(option.national_day_delay) : 6 }, () => { const showText = tool.stringToArray(option.national_day_text, ['娆?, '搴?, '鍥?, '搴?]) // 鍒涘缓澶х洅瀛 const bigBox = tool.createElement('feng_custom_national_day') tool.bindElement('body', bigBox) buildLantern({ bindElement: '.feng_custom_national_day', text: showText[0], light: '1', top: '0', left: '2%' }) buildLantern({ bindElement: '.feng_custom_national_day', text: showText[1], light: '1', top: '0', left: '12%' }) buildLantern({ bindElement: '.feng_custom_national_day', text: showText[2], light: '1', top: '0', right: '12%' }) buildLantern({ bindElement: '.feng_custom_national_day', text: showText[3], light: '1', top: '0', right: '2%' }) }) } /** * 涓蹇箰锛堟弧鏈堬級 * @param {*} option */ const midAutumnFullMoon = (option = {}) => { // console.log(option) tool.in({ month: 8, day: 15, isLunar: true, advanceDays: tool.toNumber(option.mid_autumn_advance, 3), delayDays: tool.toNumber(option.mid_autumn_delay, 1) // advanceDays: Number(option.mid_autumn_advance) ? Number(option.mid_autumn_advance) : 3, // delayDays: Number(option.mid_autumn_delay) ? Number(option.mid_autumn_delay) : 1 }, () => { const moonEle = tool.createElement('feng_custom_full_moon moon') const date = tool.createElement('date') date.appendChild(document.createTextNode('鍏湀鍗佷簲')) moonEle.appendChild(date) const textEle = tool.createElement('text') const showText = tool.stringToArray(option.mid_autumn_text, ['涓?, '绉?, '蹇?, '涔?]) showText.forEach((value) => { const span = document.createElement('span') span.appendChild(document.createTextNode(value)) textEle.appendChild(span) }) moonEle.appendChild(textEle) const midAutumnEle = tool.createElement('feng_custom_mid_autumn') midAutumnEle.appendChild(moonEle) tool.bindElement('body', midAutumnEle) }) } const run = (option) => { if (typeof option === 'string') option = JSON.parse(option) // console.log(option) if (option.mid_autumn_open == 1) { midAutumnFullMoon(option) } if (option.national_day_open == 1) { nationalDayLanter(option) } } return { // 鍥藉簡鐏 nationalDayLanter, // 涓鏈堜寒 midAutumnFullMoon, // 閰嶇疆骞惰繍琛 run } })();