cp-metas
Version:
set website title
2 lines (1 loc) • 3.37 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:!0});var t=require("vue");const e="undefined"!=typeof window;function n(t){return t=(t=(t=(t=(t=t.replace(/&/g,"&")).replace(/</g,"<")).replace(/>/g,">")).replace(/"/g,""")).replace(/'/g,"'")}class a{#t;#e=!1;head;defaultTitle;constructor(t,e,n){this.head=t,this.#t=e,this.defaultTitle=t.title,this.#e=n}setHead(t={}){t.title&&(this.head.title=t.title||this.defaultTitle);const n=[];for(const e in t.meta)if(t.meta.hasOwnProperty(e)){const a=t.meta[e];switch(a.name||a.property){case"description":this.head.description=a.content;break;case"keywords":this.head.keywords=a.content;break;case"og:image":this.head.image=a.content;break;default:n.push(a)}}if(this.head.metas=n,!this.#t){const n=document.getElementsByTagName("title");if(n&&n.length)n[0].innerText=t.title||this.defaultTitle;else{const e=document.createElement("title");e.innerText=t.title||this.defaultTitle,document.getElementsByTagName("head")[0].appendChild(e)}if(e&&this.#e){const t=document.querySelectorAll('meta[data-mark="cp"]');for(let e in t)if(t.hasOwnProperty(e)){t[e].remove()}for(let t in this.head.metas){const e=this.head.metas[t];let n="",a="",i="";if(e.name?(n="name",a=e.name):e.property&&(n="property",a=e.property),!n)return;e.content&&(i=e.content);const s=document.createElement("meta");s.setAttribute(n,a),s.setAttribute("content",i),s.setAttribute("data-mark","cp"),document.getElementsByTagName("head")[0].appendChild(s)}}}}getHead(){let t=this.head.description,e=this.head.keywords,a=this.head.description,i=this.head.image;const s=[];for(const o in this.head.metas)if(this.head.metas.hasOwnProperty(o)){const r=this.head.metas[parseInt(o)];switch(r.name||r.property){case"description":t=n(r.content);break;case"keywords":if("string"==typeof r.content)e=n(r.content);else if(r.content instanceof Array){let t=[];for(const e in r.content)t.push(n(r.content[e]));e=t.join("、")}break;case"og:description":a=n(r.content);break;case"og:image":i=r.content;break;default:r.content=n(r.content),s.push(r)}}return{title:this.head.title,meta:[{name:"description",content:t},{name:"keywords",content:e},{property:"og:title",content:this.head.title},{property:"og:description",content:a},{property:"og:image",content:i},...s]}}renderToString(){const t=this.getHead();let e=`<title>${t.title}</title>`;for(const n in t.meta){const a=t.meta[n];let i="",s="";if(a.name?(i="name",s=a.name):a.property&&(i="property",s=a.property),!i)return;e+=`<meta ${i}="${s}" content="${a.content}">`}const n=new Date;return e+=`<meta name="updatetime" content="${n.getFullYear().toString()+"-"+(n.getMonth()+1).toString()+"-"+n.getDate().toString()+" "+n.getHours().toString()+":"+n.getMinutes().toString()+":"+n.getSeconds().toString()}">`,e}}const i={data:()=>({_cpMetaHeadFn:t.getCurrentInstance()?.type.head}),created(){this._cpMetaHeadFn&&this.$cpMeta.setHead(this._cpMetaHeadFn())},activated(){this._cpMetaHeadFn&&this.$cpMeta.setHead(this._cpMetaHeadFn())},mounted(){this._cpMetaHeadFn&&t.watchEffect((()=>{this.$cpMeta.setHead(this._cpMetaHeadFn())}))}};exports.CpMetas=a,exports.cpMeta=i,exports.default=function(t,e=!1,n=!1){return{install(s,o){const r=new a(t,e,n);o.mixin&&s.mixin(i),s.provide("cpMeta",r),s.config.globalProperties.$cpMeta=r}}},exports.usMeta=function(e){const n=t.inject("cpMeta");n&&n.setHead(e)};