class MewElement extends HTMLElement { constructor() { super() if (this.hasAttribute('draw')) return this.init() } drawComplete() { this.setAttribute('draw', true) } } document.addEventListener('DOMContentLoaded', () => { customElements.define( 'mew-hide', class MewHide extends MewElement { init() { let $this = $(this) const $mainContent = $this.closest('.main-content') this.options = { target: $mainContent.attr('data-target'), id: $mainContent.attr('data-id') } if (this.options.target && this.options.id) { let commentIds = localStorage.getItem(window.encrypt('mew-hide-' + this.options.target)) commentIds = commentIds ? JSON.parse(window.decrypt(commentIds)) : [] if (commentIds.includes(this.options.id)) { $this.before(this.innerHTML) $this.remove() } else { let isToc = $this.find('h1,h2,h3,h4,h5').length !== 0 this.setAttribute('hide', window.encrypt(this.innerHTML)) this.innerHTML = '' if(isToc) { this.setAttribute('toc', true) commonContext.initTocAndNotice() } this.onclick = function () { let $haloComment = $(`halo-comment[id='${this.options.id}'][type='${this.options.target.substring(0, this.options.target.length - 1)}']`) if ($haloComment.length === 0 || $haloComment.is(':hidden')) { return } Utils.animateScroll($haloComment[0], 20, (window.innerHeight || document.documentElement.clientHeight) / 4) } } } this.drawComplete() } } ) customElements.define( 'mew-subtitle', class MewSubtitle extends MewElement { init() { this.innerHTML = `${this.innerText || '默认标题'}` this.drawComplete() } } ) customElements.define( 'mew-music', class MewMusic extends HTMLElement { constructor() { super() this.innerHTML = '音乐播放器加载中...' this.options = { container: this, theme: this.getAttribute('theme') || 'var(--theme)', loop: this.getAttribute('loop') || 'all', autoplay: this.hasAttribute('autoplay') && this.getAttribute('autoplay') !== 'false', lrcType: 3, } if (!('APlayer' in window)) { if (!MewMusic.prototype.load) { MewMusic.prototype.load = true MewMusic.prototype.await = [] new Promise((resolve) => { const $head = $('head') $head.append('') Utils.cachedScript('https://unpkg.com/aplayer@1.10.1/dist/APlayer.min.js') .done(() => resolve()) .fail(() => resolve()) }).then(() => { this.render() MewMusic.prototype.await && MewMusic.prototype.await.forEach(n => n()) }) } else { MewMusic.prototype.await.push(() => this.render()) } } else { this.render() } } render() { if (!('APlayer' in window)) { this.innerHTML = '未开启音乐播放器!' return } // eslint-disable-next-line no-async-promise-executor new Promise(async (resolve) => { if (this.hasAttribute('song')) { this.options.audio = await fetch( 'https://api.i-meto.com/meting/api?server=netease&type=song&id=' + this.getAttribute('song') ).then((response) => response.json()) } else if (this.hasAttribute('playlist')) { this.options.listFolded = this.getAttribute('fold') this.options.order = this.getAttribute('order') this.options.audio = await fetch( 'https://api.i-meto.com/meting/api?server=netease&type=playlist&id=' + this.getAttribute('playlist') ).then((response) => response.json()) } else if (this.hasAttribute('url')) { this.options.audio = [{ name: this.getAttribute('name') || '音乐', url: this.getAttribute('url'), artist: this.getAttribute('artist') || '未知歌手', cover: this.getAttribute('cover'), lrc: this.getAttribute('lrc') || (this.options.lrcType = undefined), }] } else { this.innerHTML = '未指定播放的音乐!' return resolve() } this.aplayer = new APlayer(this.options) resolve() }) } disconnectedCallback() { this.aplayer && this.aplayer.destroy() } } ) customElements.define( 'mew-bilibili', class MewBilibili extends MewElement { init() { this.options = { bvid: this.getAttribute('bvid'), width: /^\d{1,3}%$/.test(this.getAttribute('width')) ? this.getAttribute('width') : '100%', } if (this.options.bvid) { this.style.padding = `calc(${this.options.width} * 0.3) 0` this.innerHTML = `` } else this.innerHTML = 'bvid未填写!' this.drawComplete() } } ) customElements.define( 'mew-tabs', class MewTabs extends MewElement { init() { const $tabPage = $(this).children('mew-tab-page') if ($tabPage.length === 0) { this.innerHTML = '没有标签页!' this.drawComplete() return } let navs = '' let contents = '' let active = false $tabPage.each((index, elem) => { let title = elem.getAttribute('title') || '默认标签' let id = `${index}-${new Date().getTime()}` if (!active && elem.hasAttribute('active')) { active = true navs += `
${this.innerHTML}
${nameElem}${this.options.title || '我分享了一个网站'}
${descElem}${imageElem}` this.drawComplete() } }) customElements.define( 'mew-video', class MewVideo extends MewElement { init() { this.options = { src: this.getAttribute('src'), type: this.getAttribute('type'), autoplay: this.hasAttribute('autoplay') && this.getAttribute('autoplay') !== 'false', controls: this.getAttribute('controls') !== 'false', loop: this.hasAttribute('loop') && this.getAttribute('loop') !== 'false', muted: this.hasAttribute('muted') && this.getAttribute('muted') !== 'false', // 静音播放 preload: this.hasAttribute('preload') && this.getAttribute('preload') !== 'false', poster: this.getAttribute('poster'), // 加载图片 width: /^\d{1,3}%$/.test(this.getAttribute('width')) ? this.getAttribute('width') : '100%', } this.innerHTML = `` this.drawComplete() } }) customElements.define( 'mew-photos', class MewPhotos extends MewElement { init() { if (!($.fn.justifiedGallery)) { if (!MewPhotos.prototype.load) { MewPhotos.prototype.load = true MewPhotos.prototype.await = [] new Promise((resolve) => { Utils.cachedScript('https://unpkg.com/justifiedGallery@3.8.1/dist/js/jquery.justifiedGallery.min.js') .done(() => resolve()) .fail(() => resolve()) }).then(() => { this.render() MewPhotos.prototype.await && MewPhotos.prototype.await.forEach(n => n()) }) } else { MewPhotos.prototype.await.push(() => this.render()) } } else { this.render() } } render() { this.options = { captions: this.hasAttribute('captions') && this.getAttribute('captions') !== 'false', margins: this.getAttribute('margins') || '4' } $(this).find('img').each((i, elem) => { $(elem).wrap(``) }) $(this).justifiedGallery({captions: this.options.captions, margins: this.options.margins}) this.drawComplete() } }) customElements.define( 'mew-raw', class MewRaw extends MewElement { init() { let html = this.innerHTML this.innerHTML = '' const shadowRoot = this.attachShadow({ mode: 'closed' }) shadowRoot.innerHTML = html this.drawComplete() } } ) })