11<!DOCTYPE html>
22<html lang =" en" class =" dark" >
3- <head >
4- <title >Code Statistic</title >
5- <meta name =" viewport" content =" width=device-width, initial-scale=1.0" >
6- <link rel =" stylesheet" href =" https://cdn.bootcdn.net/ajax/libs/element-plus/2.2.32/index.css" >
7- <link rel =" stylesheet" href =" https://cdn.bootcdn.net/ajax/libs/element-plus/2.2.32/theme-chalk/base.css" >
8- <style >
9- html , body {
10- padding : 0 ;
11- margin : 0 ;
12- display : flex ;
13- align-items : center ;
14- justify-content : center ;
15- gap : 8px ;
16- width : 100% ;
17- height : 100% ;
18- overflow : auto ;
19- background : #fafcf1 ;
20- }
21- #app {
22- position : absolute ;
23- top : 8px ;
24- display : flex ;
25- flex-direction : column ;
26- gap : 8px ;
27- margin : 30px ;
28- width : 80% ;
29- min-width : 220px ;
30- max-width : 500px ;
31- }
32- #generate {
33- margin : 0 auto ;
34- transform : translateY (20px );
35- }
36- #preview {
37- width : 100% ;
38- }
39- * {
40- font-family : Consolas, Nunito, monospace , Serif ;
41- }
42- </style >
43- <script src =" https://cdn.bootcdn.net/ajax/libs/vue/3.2.47/vue.global.js" ></script >
44- <script src =" https://cdn.bootcdn.net/ajax/libs/element-plus/2.2.32/index.full.js" ></script >
45- </head >
3+ <head ><title >Code Statistic</title ><meta name =" viewport" content =" width=device-width, initial-scale=1.0" ><link rel =" stylesheet" href =" https://cdn.bootcdn.net/ajax/libs/element-plus/2.2.32/index.css" ><link rel =" stylesheet" href =" https://cdn.bootcdn.net/ajax/libs/element-plus/2.2.32/theme-chalk/base.css" ><style >html , body {padding : 0 ;margin : 0 ;display : flex ;align-items : center ;justify-content : center ;gap : 8px ;width : 100% ;height : 100% ;overflow : auto ;background : #fafcf1 ;}#app {position : absolute ;top : 8px ;display : flex ;flex-direction : column ;gap : 8px ;margin : 30px ;width : 80% ;min-width : 220px ;max-width : 500px }#generate {margin : 0 auto ;transform : translateY (20px )}#preview {width : 100% }* {font-family : Consolas, Nunito, monospace , Serif } </style ><script src =" https://cdn.bootcdn.net/ajax/libs/vue/3.2.47/vue.global.js" ></script ><script src =" https://cdn.bootcdn.net/ajax/libs/element-plus/2.2.32/index.full.js" ></script ></head >
464<body >
475<div id =" app" >
48- <el-card >
49- <el-form label-width =" auto" >
50- <el-form-item label =" Username" ><el-input v-model =" form.username" ></el-input ></el-form-item >
51- <el-form-item label =" Repo" v-if =" isRepo" ><el-input v-model =" form.repo" ></el-input ></el-form-item >
52- <el-form-item label =" Type" ><el-radio-group v-model =" form.type" ><el-radio border label =" User" ></el-radio ><el-radio border label =" Repo" ></el-radio ></el-radio-group ></el-form-item >
53- <el-form-item label =" Dark Mode " ><el-switch v-model =" form.dark " ></el-switch ></el-form-item >
54- <el-form-item ><el-button type =" primary" @click =" generate" id =" generate" >Generate</el-button ></el-form-item >
55- </el-form >
56- </el-card >
57- <el-card >
58- <template v-if =" ! link" ><el-empty image-size =" 80" ></el-empty ></template >
59- <template v-else ><el-form-item label =" Link " ><el-input readonly v-model = " link " ></el-input >< /el-form-item ><img id =" preview" :src =" link" alt ></template >
60- </el-card >
6+ <el-card >
7+ <el-form label-width =" auto" >
8+ <el-form-item label =" Username" ><el-input v-model =" form.username" ></el-input ></el-form-item >
9+ <el-form-item label =" Repo" v-if =" isRepo" ><el-input v-model =" form.repo" ></el-input ></el-form-item >
10+ <el-form-item label =" Type" ><el-radio-group v-model =" form.type" ><el-radio-button border label =" User" ></el-radio-button ><el-radio-button border label =" Repo" ></el-radio-button ></el-radio-group ></el-form-item >
11+ <el-form-item label =" Theme " ><el-radio-group v-model =" form.theme " ><el-radio-button border label = " Light " >< /el-radio-button >< el-radio-button border label = " Dark " ></ el-radio-button ></ el-radio-group ></el-form-item >
12+ <el-form-item ><el-button type =" primary" @click =" generate" id =" generate" >Generate</el-button ></el-form-item >
13+ </el-form >
14+ </el-card >
15+ <el-card >
16+ <template v-if =" ! link" ><el-empty image-size =" 80" ></el-empty ></template >
17+ <template v-else ><el-radio-group @change = " refresh " class = " type " v-model = " form.format " >< el-radio-button border label =" URL " ></ el-radio-button >< el-radio-button border label = " Markdown " ></ el-radio-button >< el-radio-button border label = " HTML " ></el-radio-button >< el-radio-button border label = " AsciiDoc " >< /el-radio-button ></ el-radio-group >< el-input readonly v-model = " content " ></ el-input ><img id =" preview" :src =" link" alt ></template >
18+ </el-card >
6119</div >
6220<script >
63- const form = Vue .ref ({
64- username: " " ,
65- repo: " " ,
66- type: " User" ,
67- dark: false ,
68- })
69- const link = Vue .ref (" " );
70- const isRepo = Vue .computed (() => form .value .type !== " User" );
71- const throwWarning = msg => ElementPlus .ElMessage ({grouping: true , message: msg, showClose: false , type: " warning" })
72- Vue .createApp ({
73- data () {
74- return {
75- form: form,
76- link: link,
77- isRepo: isRepo,
78- generate : () => {
79- const username = form .value .username .trim (),
80- repo = form .value .repo .trim (),
81- dark = !! form .value .dark ;
82-
83- if (! username) {throwWarning (" username is empty." ); return }
84- if (isRepo .value && ! repo) {throwWarning (" repo is empty." ); return }
85- link .value = location .origin +
86- ((! isRepo .value ) ? ` /user/${ username} /` : ` /repo/${ username} /${ repo} ` ) +
87- (dark ? " ?theme=dark" : " " );
88- }
89- }
21+ const form = Vue .ref ({
22+ username: " " ,
23+ repo: " " ,
24+ type: " User" ,
25+ theme: " Light" ,
26+ format: " URL" ,
27+ })
28+ const link = Vue .ref (" " );
29+ const content = Vue .ref (" " );
30+ const isRepo = Vue .computed (() => form .value .type !== " User" );
31+ const throwWarning = msg => ElementPlus .ElMessage ({grouping: true , message: msg, showClose: false , type: " warning" });
32+ const refresh = () => {
33+ const username = form .value .username .trim (),
34+ repo = form .value .repo .trim (),
35+ format = form .value .format ;
36+ const target = isRepo .value ? ` ${ username} /${ repo} ` : username
37+ switch (format) {
38+ case " URL" : content .value = link .value ;break ;
39+ case " Markdown" : content .value = ` [](https://github.com/zmh-program/code-statistic)` ;break ;
40+ case " HTML" : content .value = ` <a href="https://github.com/zmh-program/code-statistic"><img src="${ link .value } " alt="${ target} 's Github Stats"></a>` ;break ;
41+ case " AsciiDoc" : content .value = ` image:${ link .value } [${ target} 's Github Stats]` ;break ;
42+ }
43+ }
44+ Vue .createApp ({
45+ data () {
46+ return {
47+ form: form,
48+ link: link,
49+ content: content,
50+ isRepo: isRepo,
51+ refresh: refresh,
52+ generate : () => {
53+ const username = form .value .username .trim (),
54+ repo = form .value .repo .trim (),
55+ dark = form .value .theme === " Dark" ;
56+ if (! username) {throwWarning (" username is empty." ); return }
57+ if (isRepo .value && ! repo) {throwWarning (" repo is empty." ); return }
58+ link .value = location .origin +
59+ ((! isRepo .value ) ? ` /user/${ username} /` : ` /repo/${ username} /${ repo} ` ) +
60+ (dark ? " ?theme=dark" : " " );
61+ refresh ();
9062 }
91- }).use (ElementPlus).mount (' #app' );
63+ }
64+ }
65+ }).use (ElementPlus).mount (' #app' );
9266 </script >
9367</body >
9468</html >
0 commit comments