UNPKG

cp-metas

Version:

set website title

2 lines (1 loc) 3.31 kB
import{inject as t,getCurrentInstance as e,watchEffect as n}from"vue";const a="undefined"!=typeof window;function i(t){return t=(t=(t=(t=(t=t.replace(/&/g,"&amp;")).replace(/</g,"&lt;")).replace(/>/g,"&gt;")).replace(/"/g,"&quot;")).replace(/'/g,"&#039;")}class o{#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 e=[];for(const n in t.meta)if(t.meta.hasOwnProperty(n)){const a=t.meta[n];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:e.push(a)}}if(this.head.metas=e,!this.#t){const e=document.getElementsByTagName("title");if(e&&e.length)e[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(a&&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 o=document.createElement("meta");o.setAttribute(n,a),o.setAttribute("content",i),o.setAttribute("data-mark","cp"),document.getElementsByTagName("head")[0].appendChild(o)}}}}getHead(){let t=this.head.description,e=this.head.keywords,n=this.head.description,a=this.head.image;const o=[];for(const s in this.head.metas)if(this.head.metas.hasOwnProperty(s)){const r=this.head.metas[parseInt(s)];switch(r.name||r.property){case"description":t=i(r.content);break;case"keywords":if("string"==typeof r.content)e=i(r.content);else if(r.content instanceof Array){let t=[];for(const e in r.content)t.push(i(r.content[e]));e=t.join("、")}break;case"og:description":n=i(r.content);break;case"og:image":a=r.content;break;default:r.content=i(r.content),o.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:n},{property:"og:image",content:a},...o]}}renderToString(){const t=this.getHead();let e=`<title>${t.title}</title>`;for(const n in t.meta){const a=t.meta[n];let i="",o="";if(a.name?(i="name",o=a.name):a.property&&(i="property",o=a.property),!i)return;e+=`<meta ${i}="${o}" 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}}function s(e){const n=t("cpMeta");n&&n.setHead(e)}const r={data:()=>({_cpMetaHeadFn:e()?.type.head}),created(){this._cpMetaHeadFn&&this.$cpMeta.setHead(this._cpMetaHeadFn())},activated(){this._cpMetaHeadFn&&this.$cpMeta.setHead(this._cpMetaHeadFn())},mounted(){this._cpMetaHeadFn&&n((()=>{this.$cpMeta.setHead(this._cpMetaHeadFn())}))}};function c(t,e=!1,n=!1){return{install(a,i){const s=new o(t,e,n);i.mixin&&a.mixin(r),a.provide("cpMeta",s),a.config.globalProperties.$cpMeta=s}}}export{o as CpMetas,r as cpMeta,c as default,s as usMeta};