前言

添加这两个标签的是因为自己想为博客增加一个博客功能,奈何 哔哔 等具有发布动态功能的项目都要去添加 leancould ,但自己又不想去注册它(主要它要绑定支付宝)。于是,退而求其次,自己搞个时间线也就能发布动态了(和归档那部分的时间戳类似),缺点就是要在 PC 端以发布博客的形式发布微动态。时间线和外链两个外挂标签是对于 volantis 在 butterfly 的适配,本文主要记录配置的流程。


快速开始

添加 js 脚本文件

进入博客主题目录下的「\scripts\tag 」,创建相应的 js 脚本:

  • 「timeline.js」

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    /**
    * timeline.js | https://volantis.js.org/v3/tag-plugins/#Timeline
    */

    "use strict";

    function postTimeline(args, content) {
    if (args.length > 0) {
    return `<div class="timeline"><p class='p h2'>${args}</p>${content}</div>`;
    } else {
    return `<div class="timeline">${content}</div>`;
    }
    }

    function postTimenode(args, content) {
    args = args.join(" ").split(",");
    var time = args[0];
    return `<div class="timenode"><div class="meta"><p>${hexo.render.renderSync({
    text: time,
    engine: "markdown",
    })}</p></div><div class="body">${hexo.render
    .renderSync({ text: content, engine: "markdown" })
    .split("\n")
    .join("")}</div></div>`;
    }

    // {% timeline %}
    // ... timenode ...
    // {% endtimeline %}
    hexo.extend.tag.register("timeline", postTimeline, { ends: true });

    // {% timenode time %}
    // what happened
    // {% endtimenode %}
    hexo.extend.tag.register("timenode", postTimenode, { ends: true });

  • 「link.js」

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    "use strict";

    // {% link title, url %}
    // {% link title, url, img %}
    hexo.extend.tag.register("link", function (args) {
    args = args.join(" ").split(",");
    let text = "";
    let url = "";
    let img = "";
    if (args.length > 1) {
    text = args[0].trim();
    url = args[1].trim();
    } else {
    return;
    }
    if (args.length > 2) {
    img = args[2].trim();
    return `<div><a class='link-card' title='${url}' href='${url}'><div class='left'><img src=${img}></div><div class='right'><p class='text'>${text}</p><p class='url'>${url}</p></div></a></div>`;
    } else {
    return `<div><a class='link-card' title='${url}' href='${url}'><div class='left'><i class='fas fa-link'></i></div><div class='right'><p class='text'>${text}</p><p class='url'>${url}</p></div></a></div>`;
    }
    });

添加 css 渲染文件

进入博客主题目录下的「\source\css 」,创建「tag-diy.css」文件(若存在则添加以下代码即可),并添加以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/* TAG Link */

#post a.link-card {
text-decoration: none;
margin: 0.2rem auto;
background: var(--tab-botton-bg);
display: -ms-inline-flexbox;
display: inline-flex;
-ms-flex-align: center;
align-items: center;
cursor: pointer;
text-align: left;
font-size: 0.575rem;
min-width: 200px;
max-width: 361px;
color: var(--tab-botton-color);
border-radius: 8px;
}
@media screen and (max-width: 425px) {
#post a.link-card {
max-width: 100%;
}
}
@media screen and (max-width: 375px) {
#post a.link-card {
width: 100%;
}
}
#post a.link-card:hover {
box-shadow: 0 4px 8px 0px rgba(0, 0, 0, 0.1);
}
#post a.link-card div.left,
#post a.link-card div.right {
pointer-events: none;
}
#post a.link-card div.left {
width: 48px;
height: 48px;
margin: 12px;
overflow: hidden;
-ms-flex-negative: 0;
flex-shrink: 0;
position: relative;
}
#post a.link-card div.left i {
font-size: 32px;
line-height: 48px;
margin-left: 4px;
}
#post a.link-card div.left img {
display: block;
position: absolute;
border-radius: 8px/4;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
#post a.link-card div.right {
overflow: hidden;
margin-right: 12px;
}
#post a.link-card p {
margin: 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
#post a.link-card p.text {
font-weight: bold;
}
#post a.link-card p.url {
-ms-flex-negative: 0;
flex-shrink: 0;
color: var(--search-input-color);
font-size: 0.7125rem;
}
/* TAG 时间线 */
span.p.h2,
p.p.h2 {
font-size: 1.375rem;
color: var(--font-color);
padding-top: 0.8rem;
border-bottom: 1px solid var(--hr-border);
}
div.timenode {
position: relative;
}
div.timenode:before,
div.timenode:after {
content: "";
z-index: 1;
position: absolute;
background: rgba(68, 215, 182, 0.5);
width: 2px;
left: 7px;
}
div.timenode:before {
top: 0px;
height: 6px;
}
div.timenode:after {
top: 26px;
height: calc(100% - 26px);
}
div.timenode:last-child:after {
height: calc(100% - 26px - 16px);
border-bottom-left-radius: 2px;
border-bottom-right-radius: 2px;
}
div.timenode .meta {
position: relative;
color: var(--tab-botton-color);
font-size: 0.375rem;
line-height: 32px;
height: 32px;
left: 27px;
}
div.timenode .meta:before,
div.timenode .meta:after {
content: "";
position: absolute;
top: 8px;
z-index: 2;
left: -27px;
}
div.timenode .meta:before {
background: rgba(68, 215, 182, 0.5);
width: 16px;
height: 16px;
border-radius: 8px;
}
div.timenode .meta:after {
background: #44d7b6;
margin-left: 2px;
margin-top: 2px;
width: 12px;
height: 12px;
border-radius: 6px;
transform: scale(0.5);
transition: all 0.28s ease;
-moz-transition: all 0.28s ease;
-webkit-transition: all 0.28s ease;
-o-transition: all 0.28s ease;
}
div.timenode .meta p {
font-weight: bold;
margin: 0 0 0 24px;
}
div.timenode .body {
margin: 4px 0 16px 24px;
padding: 16px;
border-radius: 8px;
background: var(--blockquote-bg);
}
div.timenode .body p:first-child {
margin-top: 0;
}
div.timenode .body p:last-child {
margin-bottom: 0;
}
div.timenode:hover .meta {
color: var(--text-highlight-color);
}
div.timenode:hover .meta:before {
background: rgba(255, 87, 34, 0.5);
}
div.timenode:hover .meta:after {
background: #ff5722;
transform: scale(1);
}

引入样式文件配置

在主题配置文件「_config.butterfly.yml」的 inject 标签中引入上述 css 渲染文件:

1
2
3
inject:
head:
- <link rel="stylesheet" href="/css/tag-diy.css"> # 外挂标签

使用语法

  1. 使用方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    {% timeline 时间线标题 %}

    {% timenode 时间节点(标题) %}

    正文内容

    {% endtimenode %}

    {% timenode 时间节点(标题) %}

    正文内容

    {% endtimenode %}

    {% endtimeline %}
  2. 样例

    说说

    2021-01-25 嘀嘀嘀

    『出师表』

    2021-01-24 嘀嘀嘀

    今天是2021-1-24

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    {% timeline 说说 %}

    {% timenode 2021-01-25 [嘀嘀嘀](https://caczhtus.github.io) %}

    『出师表』

    {% endtimenode %}

    {% timenode 2021-01-24 [嘀嘀嘀](https://caczhtus.github.io) %}

    今天是2021-1-24

    {% endtimenode %}

    {% endtimeline %}
  1. 使用方法

    1
    {% link 标题, 链接, 图片 %}
  2. 样例

    1
    {% link Caczhtus, https://caczhtus.gitee.io/, https://cdn.jsdelivr.net/gh/Caczhtus/Caczhtus-imgs/images/other/ic_2.jpg %}

后记

参考文章

  1. https://volantis.js.org/
  2. Hexo 博客之 butterfly 主题优雅魔改系列