PageSourceSearch

https://blit-ai.com/assets/reportImage-Bpwz63K1.js

js blit-ai.com collected 2026-10-02 01:25:09 UTC 16,169 bytes, 6 lines download raw bytes

1import{c as ft}from"./chunkReload-CDOQzfiw.js";import{i as $t}from"./searchVolumeLabel-DU_R3bBC.js";/**
2 * @license lucide-react v0.469.0 - ISC
3 *
4 * This source code is licensed under the ISC license.
5 * See the LICENSE file in the root directory of this source tree.
6 */const Xt=ft("House",[["path",{d:"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8",key:"5wwlr5"}],["path",{d:"M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",key:"1d0kgt"}]]);function dt(t){return t&&t.trim().replace(/^https?:\/\//,"").replace(/^m\./,"").replace(/\?.*$/,"")||null}const qt={clientName:"",authorName:"",note:""},W=t=>String(t).padStart(2,"0");function gt(t){const e=new Date(t+324e5);return`${e.getUTCFullYear()}.${W(e.getUTCMonth()+1)}.${W(e.getUTCDate())}`}function pt(t){const e=new Date(t+324e5);return`${e.getUTCFullYear()}년 ${e.getUTCMonth()+1}월 ${e.getUTCDate()}일`}function A(t){return!t||t.kind==="pending"?"pending":t.kind==="out"?"absent":"exposed"}const xt="순위는 네이버 검색 첫 페이지에서 블로그 글이 노출될 수 있는 자리만 세어 매겼습니다.";function Z(t){if(!t)return{full:"내 블로그 미등록",short:"—"};switch(t.kind){case"rank":return{full:`${t.rank}위`,short:`${t.rank}위`};case"smart":return{full:"묶음칸",short:"묶음칸"};case"pc":return{full:`컴퓨터 ${t.rank}위`,short:`PC ${t.rank}위`};case"out":return{full:"아직 미노출",short:"미노출"};case"pending":return{full:"확인 전",short:"확인 전"}}}function mt(t){return!t||t.kind==="out"||t.kind==="pending"?{text:"",strong:!1}:{text:Z(t).short,strong:t.kind==="rank"&&t.rank<=3}}function wt(t){return(t==null?void 0:t.kind)==="rank"?t.rank:null}function kt(t){return(t??[]).filter(e=>e!=null).length}function bt(t,e){switch(t){case"up":return`▲ ${e}`;case"down":return`▼ ${e}`;case"new":return"신규";case"dropped":return"이탈";case"same":return"유지";default:return"—"}}function Zt(t,e={}){const n=t.map(i=>{var S;const u=Z(i.exposure),b=mt(i.exposure),y=A(i.exposure)==="exposed"&&i.series!==void 0&&kt(i.series)<2&&(i.delta==="same"||i.delta==="none");return{keyword:i.keyword,volume:i.volume,position:u.full,positionShort:u.short,badge:b.text,badgeStrong:b.strong,state:A(i.exposure),deltaText:y?"신규":bt(i.delta,i.deltaAmount),delta:y?"new":i.delta,stale:!!((S=i.exposure)!=null&&S.stale),rankNum:wt(i.exposure),series:i.series??[],clipMatched:i.clipMatched===!0,postUrl:A(i.exposure)==="exposed"?dt(i.postUrl):null}}),o={exposed:0,absent:1,pending:2},l=i=>{const u=i.exposure;return(u==null?void 0:u.kind)==="rank"?u.rank:(u==null?void 0:u.kind)==="smart"?90:(u==null?void 0:u.kind)==="pc"?91:99},s=new Map(t.map((i,u)=>[i.keyword,u]));n.sort((i,u)=>{const b=t[s.get(i.keyword)],y=t[s.get(u.keyword)],S=o[i.state]-o[u.state];if(S!==0)return S;const d=l(b)-l(y);return d!==0?d:(y.volume??0)-(b.volume??0)});const r=n.filter(i=>i.state==="exposed").length,a=n.filter(i=>i.state==="absent").length,g=n.filter(i=>i.state==="pending").length,w=n.length,p=n.filter(i=>i.rankNum!=null&&i.rankNum<=3).length,$=n.reduce((i,u)=>i+(u.rankNum!=null&&u.volume!=null?u.volume:0),0),k=e.baseline,E=new Map(t.map(i=>[i.keyword,i.volume])),_=k?[...k.keywords].reduce((i,u)=>i+(E.get(u)??0),0):null;return{rows:n,total:w,exposedCount:r,absentCount:a,pendingCount:g,top3Count:p,rankedVolume:$,rankedVolumeBase:_,baselineDayLabel:(k==null?void 0:k.dayLabel)??null,clipMatchedCount:n.filter(i=>i.clipMatched).length,summary:yt(n,{total:w,exposedCount:r,top3Count:p}),scopeLabel:e.scopeLabel||"전체 키워드",staleCount:n.filter(i=>i.stale).length}}function yt(t,e){if(e.total===0)return"추적 중인 키워드가 없습니다.";const n=t.filter(r=>r.delta==="up"||r.delta==="new"),o=t.filter(r=>r.delta==="down"||r.delta==="dropped"),l=e.top3Count>0?` 상위 3위 안에 ${e.top3Count}개가 있습니다.`:"",s=r=>r.slice().sort((a,g)=>(a.rankNum??99)-(g.rankNum??99))[0];if(n.length>0){const r=s(n);return`지난번 확인 이후 ${n.length>1?`「${r.keyword}」 등 ${n.length}개`:`「${r.keyword}」`}가 올라섰습니다.${l}`}if(o.length>0){const r=s(o);return`지난번 확인 이후 ${o.length>1?`「${r.keyword}」 등 ${o.length}개`:`「${r.keyword}」`}가 내려갔습니다.${l}`}return e.exposedCount===0?"아직 블로그 자리에 오른 키워드가 없습니다.":e.top3Count>0?`순위 변동 없이 상위 3위 안에 ${e.top3Count}개가 자리를 지키고 있습니다.`:`순위 변동 없이 ${e.exposedCount}개가 블로그 자리를 지키고 있습니다.`}function _t(t,e,n="png"){return`${(t.clientName||"네이버검색노출").replace(/[\\/:*?"<>|]/g,"").trim()||"리포트"}_노출현황_${gt(e).replace(/\./g,"")}.${n}`}const m=720,h=48,N=7,F=140,J=96,Q=138,Et=44,z=103,St=44,tt=50,Lt=17,et=34,R=100,Mt=18,j=42,V=20,nt=21,D=30,P=34,ot=26,Ct=24,vt=3,Tt=3,C=1.5,G=1160,st=24,T=108,U=26,B=(m-h*2-st)/2,c={bg:"#FAF8F4",ink:"#171310",body:"#3D3833",muted:"#6E655C",faint:"#8C8377",lineHi:"#CFC6B8",tint:"#F1EDE5",clipBg:"#E4EFE9",up:"#146B45",down:"#A32E22",flat:"#6E655C",good:"#146B45"},lt="Apple SD Gothic Neo, Malgun Gothic, sans-serif";function x(t){return String(t??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}function I(t,e){return t.length>e?t.slice(0,e-1)+"…":t}function H(t,e,n){if(L(t,n)<=e)return t;let o="";for(const l of t){if(L(o+l+"…",n)>e)break;o+=l}return o+"…"}function L(t,e){let n=0;for(const o of t)n+=/[\x20-\x7E]/.test(o)?.55:1;return n*e}function Y(t){return t.delta==="up"||t.delta==="new"?c.up:t.delta==="down"||t.delta==="dropped"?c.down:c.flat}function it(t,e,n){const o=t.split(" "),l=[];let s="";for(const r of o){const a=s+(s?" ":"")+r;L(a,n)>
6e&&s?(l.push(s),s=r):s=a}return s&&l.push(s),l}const Ut=t=>P+(t.lines.length-1)*D+(t.note?ot:0)+Ct,v=t=>t.t==="hero"?Q:t.t==="sec"?St:t.t==="row"?tt+(t.row.postUrl?Lt:0):t.t==="abs"?et:Ut(t);function Rt(t,e){const n=t.rows.filter(s=>s.state==="exposed"),o=t.rows.filter(s=>s.state!=="exposed"),l=[];if(t.rankedVolume>0&&l.push({t:"hero"}),l.push({t:"sum",lines:it(t.summary,m-h*2,nt).slice(0,vt),note:e.note?I(e.note,44):""}),n.length>0){l.push({t:"sec",label:`검색하면 우리 글이 나오는 키워드 ${n.length}개`,tone:"good",note:"최근 7일 순위 흐름, 선이 위로 갈수록 상위"});for(const s of n)l.push({t:"row",row:s})}if(o.length>0){l.push({t:"sec",label:`아직 우리 글이 나오지 않는 키워드 ${o.length}개`,tone:"muted"});for(let s=0;s<o.length;s+=2)l.push({t:"abs",pair:o.slice(s,s+2)})}return l}function X(t,e){const n=[];let o=[],l=0,s=null;const r=()=>t-(n.length===0?F:J)-R;for(const a of e){a.t==="sec"&&(s=a);const g=v(a);if(o.length>0&&l+g>r()){let w=[a];const p=o[o.length-1];if(p.t==="sec"&&(o.pop(),w=[p,a]),n.push(o),o=[],l=0,w[0].t!=="sec"&&s){const $={t:"sec",label:`${s.label} (이어서)`,tone:s.tone};o.push($),l+=v($)}for(const $ of w)o.push($),l+=v($);continue}o.push(a),l+=g}return o.length>0&&n.push(o),n.length>0?n:[[]]}function Ht(t){const e=X(G,t);if(e.length<=1)return e;const n=t.reduce((l,s)=>l+v(s),0),o=Math.ceil(n/e.length)+F+R;for(let l=o;l<=G;l+=16){const s=X(l,t);if(s.length<=e.length)return s}return e}function Ot(t,e,n){if(t.push(`<rect x="${h}" y="${e}" width="${m-h*2}" height="${Tt}" fill="${c.ink}"/>`),t.push(`<text x="${h}" y="${e+Et}" font-size="13" font-weight="700" letter-spacing="0.09em" fill="${c.muted}">첫 페이지에 올라 있는 우리 글이</text>`),t.push(`<text x="${h}" y="${e+z}" font-size="54" font-weight="700" letter-spacing="-0.02em" fill="${c.ink}"><tspan font-size="20" font-weight="400" fill="${c.muted}">한 달</tspan><tspan dx="11">${x(n.rankedVolume.toLocaleString("ko-KR"))}</tspan><tspan dx="9" font-size="20" font-weight="400" fill="${c.muted}">회 검색됩니다</tspan></text>`),n.rankedVolumeBase!=null&&n.baselineDayLabel){const o=n.rankedVolume-n.rankedVolumeBase,l=o>0?`▲ ${o.toLocaleString("ko-KR")}회`:o<0?`▼ ${Math.abs(o).toLocaleString("ko-KR")}회`:"지난달과 같습니다",s=o>0?c.up:o<0?c.down:c.flat;t.push(`<text x="${m-h}" y="${e+z-26}" font-size="22" font-weight="700" text-anchor="end" fill="${s}">${x(l)}</text>`),t.push(`<text x="${m-h}" y="${e+z}" font-size="13" font-weight="400" text-anchor="end" fill="${c.muted}">${x(n.baselineDayLabel)}에는 ${x(n.rankedVolumeBase.toLocaleString("ko-KR"))}회</text>`)}t.push(`<rect x="${h}" y="${e+Q-C}" width="${m-h*2}" height="${C}" fill="${c.lineHi}"/>`)}function At(t,e,n,o,l){t.push(`<text x="${h}" y="${e+32}" font-size="13" font-weight="700" letter-spacing="0.09em" fill="${o==="good"?c.body:c.muted}">${x(n)}</text>`),l&&t.push(`<text x="${m-h}" y="${e+32}" font-size="13" font-weight="400" text-anchor="end" fill="${c.muted}">${x(l)}</text>`)}const O=40,q=19,rt=(t,e)=>t-e*.37;function ct(t,e,n,o){const l=rt(n,o);t.push(`<rect x="${e}" y="${(l-q/2).toFixed(1)}" width="${O}" height="${q}" rx="5" fill="${c.clipBg}"/>`),t.push(`<text x="${e+O/2}" y="${(l+12*.37).toFixed(1)}" font-size="12" font-weight="700" text-anchor="middle" fill="${c.good}">클립</text>`)}const Nt=56,zt=12,Bt=62,Dt=14,Pt=t=>t.rows.reduce((e,n)=>n.badge?Math.max(e,22+n.badge.length*13):e,0);function Ft(t,e,n,o){const l=22+n.badge.length*13;n.badge&&(t.push(`<rect x="${h}" y="${e+10}" width="${l}" height="30" rx="6" fill="${n.badgeStrong?c.good:c.tint}"/>`),t.push(`<text x="${h+l/2}" y="${e+31}" font-size="14" font-weight="700" text-anchor="middle" fill="${n.badgeStrong?"#ffffff":c.body}">${x(n.badge)}</text>`));const s=m-h,r=s-Nt-zt-T,a=r-18,g=h+(o?o+Dt:0),w=n.clipMatched?O+10:0,p=H(n.keyword,Math.max(90,a-Bt-12-w-g),18);if(t.push(`<text x="${g}" y="${e+31}" font-size="18" font-weight="700" letter-spacing="-0.01em" fill="${c.ink}">${x(p)}</text>`),n.clipMatched&&ct(t,g+L(p,18)+8,e+31,18),n.volume!=null){const k=$t(n.volume)?"월 10회 미만":`월 ${n.volume.toLocaleStr
6ing("ko-KR")}회`;t.push(`<text x="${a}" y="${e+31}" font-size="13" font-weight="400" text-anchor="end" fill="${c.muted}">${x(k)}</text>`)}n.postUrl&&t.push(`<text x="${g}" y="${e+50}" font-size="12" font-weight="400" letter-spacing="0.01em" fill="${c.muted}">${x(I(n.postUrl,52))}</text>`);const $=at(n.series,Y(n));$&&t.push(`<svg x="${r}" y="${e+(tt-U)/2}" width="${T}" height="${U}" viewBox="0 0 ${T} ${U}">${$}</svg>`),t.push(`<text x="${s}" y="${e+31}" font-size="15" font-weight="700" text-anchor="end" fill="${Y(n)}">${x(n.deltaText)}</text>`)}function It(t,e,n){t.push(`<rect x="${h-12}" y="${e-2}" width="${m-h*2+24}" height="${et}" fill="${c.tint}"/>`),n.forEach((o,l)=>{const s=h+l*(B+st),r=o.clipMatched?O+10:0,a=H(o.keyword,Math.max(90,B-r-40),15);t.push(`<text x="${s}" y="${e+21}" font-size="15" font-weight="400" fill="${c.body}">${x(a)}</text>`),o.clipMatched?ct(t,s+L(a,15)+8,e+21,15):o.state!=="absent"&&t.push(`<text x="${s+B}" y="${e+21}" font-size="13" font-weight="400" text-anchor="end" fill="${c.muted}">${x(o.positionShort)}</text>`)})}function Kt(t,e,n){if(n.lines.forEach((o,l)=>{t.push(`<text x="${h}" y="${e+P+l*D}" font-size="${nt}" font-weight="700" letter-spacing="-0.01em" fill="${c.ink}">${x(o)}</text>`)}),n.note){const o=e+P+(n.lines.length-1)*D;t.push(`<text x="${h}" y="${o+ot}" font-size="13" font-weight="400" fill="${c.muted}">${x(n.note)}</text>`)}}function Wt(t,e,n,o,l,s){const r=l===0,a=Pt(e),g=r?F:J,w=t.reduce((d,f)=>d+v(f),0),p=g+w+R,$=[];$.push(`<rect x="0" y="0" width="${m}" height="${p}" fill="${c.bg}"/>`),$.push(`<rect x="0" y="0" width="${m}" height="${N}" fill="${c.ink}"/>`);const k=e.scopeLabel!=="전체 키워드"?`, ${e.scopeLabel}`:"",E=N+(r?52:44),_=I(n.authorName.trim(),18);if(_){const d=(rt(E,r?30:18)+5.55).toFixed(1);$.push(`<text x="${m-h}" y="${d}" font-size="15" font-weight="700" text-anchor="end" fill="${c.body}">${x(_)}</text>`)}const i=m-h*2-(_?L(_,15)+24:0);if(r){const d=n.clientName||"네이버 검색 노출 현황";$.push(`<text x="${h}" y="${E}" font-size="30" font-weight="700" letter-spacing="-0.01em" fill="${c.ink}">${x(H(d,i,30))}</text>`);const f=`${pt(o)} 기준${k}, 키워드 ${e.total}개`;$.push(`<text x="${h}" y="${N+82}" font-size="16" font-weight="400" fill="${c.body}">${n.clientName?`네이버 검색 노출 현황 (${x(f)})`:x(f)}</text>`)}else{const d=n.clientName?`${n.clientName} (네이버 검색 노출 현황)`:"네이버 검색 노출 현황";$.push(`<text x="${h}" y="${E}" font-size="18" font-weight="700" fill="${c.ink}">${x(H(d,i,18))}</text>`),$.push(`<rect x="${h}" y="${g-18}" width="${m-h*2}" height="${C}" fill="${c.lineHi}"/>`)}let u=g;t.forEach(d=>{switch(d.t){case"hero":Ot($,u,e);break;case"sec":At($,u,d.label,d.tone,d.note);break;case"row":Ft($,u,d.row,a);break;case"abs":It($,u,d.pair);break;case"sum":Kt($,u,d);break}u+=v(d)});const b=p-R;$.push(`<rect x="${h}" y="${b+Mt}" width="${m-h*2}" height="${C}" fill="${c.lineHi}"/>`);const y=[xt,"네이버 폰 검색 기준으로 자동 확인했습니다. 검색 횟수는 네이버 기준 월간 검색량입니다."];return e.clipMatchedCount>0&&y.push("「클립」 표시는 네이버 클립 지면에 우리 채널이 올라 있다는 뜻입니다."),e.staleCount>0&&y.push(`${e.staleCount}건은 마지막으로 잰 값입니다.`),y.slice(0,3).forEach((d,f)=>{$.push(`<text x="${h}" y="${b+j+f*V}" font-size="13" font-weight="400" fill="${c.faint}">${x(d)}</text>`)}),s>1&&$.push(`<text x="${m-h}" y="${b+j+2*V}" font-size="13" font-weight="400" text-anchor="end" fill="${c.faint}">${l+1} / ${s}장</text>`),$.push(`<rect x="0" y="${p-C}" width="${m}" height="${C}" fill="${c.ink}"/>`),{svg:`<svg xmlns="http://www.w3.org/2000/svg" width="${m}" height="${p}" viewBox="0 0 ${m} ${p}" font-family="${lt}">${$.join("")}</svg>`,width:m,height:p}}function K(t,e,n){const o=Ht(Rt(t,e));return o.map((l,s)=>Wt(l,t,e,n,s,o.length))}function jt(t,e,n){return K(t,e,n)[0]}function at(t,e=c.up){const n=t.map((f,M)=>({r:f,i:M})).filter(f=>f.r!=null);if(n.length<2)return null;const o=Math.max(2,t.length),l=Math.min(...n.map(f=>f.r)),s=Math.max(...n.map(f=>f.r)),r=4,a=f=>2+f*(T-4)/(o-1),g=4,w=(s+l)/2,p=Math.max(g,s-l),$=w-p/2,k=f=>r+(f-$)/p*(U-r*2),E=[],_=[];let i=[];const u=()=>{i.length>=2?E.push(i.map((f,M)=>`${M===0?"M":"L"} ${a(f.i)} ${k(f.r)}`).join(" ")):i.length===1&&_.push(i[0]),i=[]};for(let f=0;f<t.length;f++){const M=t[f];if(M==null){u();continue}i.push({i:f,r:M})}u();const b=n[n.length-1],y=E.map(f=>`<path d="${f}" fill="none" stroke="${c.muted}" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>`).join(""),S=_.map(f=>`<circle cx="${a(f.i)}" cy="${k(f.r)}" r="2.2" fill="${c.muted}"/>`).join(""),d=`<circle cx="${a(b.i)}" cy="${k(b.r)}" r="3" fill="${e}"/>`;return y+S+d}async function ut(t,e,n,o=2){const l=URL.createObjectURL(new Blob([t],{type:"image/svg+xml;charset=utf-8"}));try{const s=new Image;await new Promise((w,p)=>{s.onload=()=>w(),s.onerror=()=>p(new Error("이미지 변환에 실패했습니다.")),s.src=l});const r=document.createElement("canvas");r.width=e*o,r.height=n*o;const a=r.getContext("2d");if(!a)throw new Error("이미지 변환에 실패했습니다.");a.fillStyle=c.bg,a.fillRect(0,0,r.width,r.height),a.drawImage(s,0,0,r.width,r.height);const g=await new Promise(w=>r.toBlob(w,"image/png"));if(!g)throw new Error("이미지 변환에 실패했습니다.");return g}finally{URL.revokeObjectURL(l)}}function ht(t,e){const n=URL.createObjectURL(t),o=document.createElement("a");o.href=n,o.download=e,document.body.appendChild(o),o.click(),o.remove(),setTimeout(()=>URL.revokeObjectURL(n),1e3)}async function Vt(t,e,n){const o=K(t,e,n),l=_t(e,n,"png");for(let s=0;s<o.length;s++){const{svg:r,width:a,height:g}=o[s],w=await ut(r,a,g);ht(w,o.length>1?l.replace(/\.png$/,`_${s+1}of${o.length}.png`):l),s<o.length-1&&await new Promise(p=>setTimeout(p,400))}}const Jt=Object.freeze(Object.defineProperty({__proto__:null,FONT_STACK:lt,INK:c,approxW:L,buildReportPages:K,buildReportSvg:jt,downloadReportPng:Vt,esc:x,sparklineInner:at,svgToPngBlob:ut,triggerDownload:ht,wrapPx:it},Symbol.toStringTag,{value:"Module"}));
6export{qt as E,lt as F,Xt as H,c as I,K as a,Zt as b,L as c,x as e,Jt as r,ut as s,ht as t,it as w};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.