2
2
import { useRoute , useData } from " vitepress" ;
3
3
import { useNamespace , useBuSunZi } from " ../hooks" ;
4
4
import { ElBreadcrumb , ElBreadcrumbItem , ElIcon } from " element-plus" ;
5
- import { computed , unref } from " vue" ;
5
+ import { computed , nextTick , onMounted , ref , unref } from " vue" ;
6
6
import { House , Reading , Clock , View } from " @element-plus/icons-vue" ;
7
7
import { useUnrefData } from " ../configProvider" ;
8
8
import { FileInfo } from " vitepress-plugin-doc-analysis" ;
9
9
import PostBaseInfo from " ./PostBaseInfo.vue" ;
10
- import { Breadcrumb , DocAnalysis , Post } from " ../config/types" ;
10
+ import { Article , Breadcrumb , DocAnalysis } from " ../config/types" ;
11
11
import { TkContentData } from " ../post/types" ;
12
12
13
13
const ns = useNamespace (" articleAnalyze" );
@@ -74,17 +74,38 @@ const pageViewInfo = computed(() => {
74
74
return pageViewInfo ;
75
75
});
76
76
77
- const { showBaseInfo = true }: Post = { ... theme .post , ... frontmatter .post };
77
+ // 文章信息配置项
78
+ const { showInfo = true , teleport = {} }: Article = { ... theme .article , ... frontmatter .article };
78
79
79
80
// 是否展示作者、日期、分类、标签等信息
80
- const isShowBaseInfo = computed (() => {
81
- const arr = [showBaseInfo ].flat ();
81
+ const isShowInfo = computed (() => {
82
+ const arr = [showInfo ].flat ();
82
83
if (arr .includes (true ) || arr .includes (" article" )) return true ;
83
84
return false ;
84
85
});
85
86
86
87
// 通过不蒜子获取页面访问量
87
88
const { pagePv, isGet } = useBuSunZi (pageIteration );
89
+
90
+ const baseInfoRef = ref <HTMLDivElement >();
91
+ const teleportInfo = () => {
92
+ const { selector, position = " after" , className = " teleport" } = teleport ;
93
+ // 没有指定选择器,则不进行传送
94
+ if (! selector ) return ;
95
+
96
+ const docDomContainer = window .document .querySelector (" #VPContent" );
97
+ let h1Dom = docDomContainer ?.querySelector (selector );
98
+
99
+ // 传送前先尝试删除传送位置的自己,避免重新传送渲染
100
+ h1Dom ?.parentElement ?.querySelectorAll (` .${ns .e (" wrapper" )} ` ).forEach (v => v .remove ());
101
+
102
+ unref (baseInfoRef ).classList .add (className );
103
+ h1Dom ?.[position ]?.(unref (baseInfoRef ));
104
+ };
105
+
106
+ onMounted (() => {
107
+ nextTick (() => teleportInfo ());
108
+ });
88
109
</script >
89
110
90
111
<template >
@@ -107,22 +128,22 @@ const { pagePv, isGet } = useBuSunZi(pageIteration);
107
128
</el-breadcrumb-item >
108
129
</el-breadcrumb >
109
130
110
- <div v-if =" isShowBaseInfo " :class =" `${ns.e('wrapper')} flx-center`" >
131
+ <div v-if =" isShowInfo " ref = " baseInfoRef " :class =" `${ns.e('wrapper')} flx-align -center`" >
111
132
<PostBaseInfo :post scope =" article" />
112
133
113
134
<div v-if =" wordCount" class =" flx-center" >
114
135
<el-icon ><Reading /></el-icon >
115
- <a title =" 文章字数" >{{ pageViewInfo.wordCount }}</a >
136
+ <a title =" 文章字数" class = " hover-color " >{{ pageViewInfo.wordCount }}</a >
116
137
</div >
117
138
118
139
<div v-if =" readingTime" class =" flx-center" >
119
140
<el-icon ><Clock /></el-icon >
120
- <a title =" 预计阅读时长" >{{ pageViewInfo.readingTime }}</a >
141
+ <a title =" 预计阅读时长" class = " hover-color " >{{ pageViewInfo.readingTime }}</a >
121
142
</div >
122
143
123
144
<div v-if =" pageView" class =" flx-center" >
124
145
<el-icon ><View /></el-icon >
125
- <a title =" 浏览量" >{{ isGet ? pagePv : "Get..." }}</a >
146
+ <a title =" 浏览量" class = " hover-color " >{{ isGet ? pagePv : "Get..." }}</a >
126
147
</div >
127
148
</div >
128
149
</div >
0 commit comments