90 files changed
+12420
-895
No files matched your search
@@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/zsh
|
||||||
|
|
||||||
|
# current directory is always `.git/..` root
|
||||||
|
# echo $PWD
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
[submodule "template"]
|
|
||||||
path = template
|
|
||||||
url = git@github.com:patarapolw/nuxt-blog-template.git
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"no-inline-html": false,
|
|
||||||
"line-length": false
|
|
||||||
}
|
|
||||||
Vendored
+9
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"editor.defaultFormatter": "rvest.vs-code-prettier-eslint",
|
||||||
|
"editor.formatOnSave": true,
|
||||||
|
"files.associations": {
|
||||||
|
".env.*": "dotenv"
|
||||||
|
},
|
||||||
|
"whitespacepp.backColorWS": "",
|
||||||
|
"editor.tabSize": 4
|
||||||
|
}
|
||||||
File renamed without changes.
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "千字文"
|
title: "千字文"
|
||||||
date: "2019-08-10"
|
date: 2019-08-10T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 汉字
|
- 汉字
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "句子 1.1"
|
title: "句子 1.1"
|
||||||
date: "2019-08-16 01:00"
|
date: 2019-08-16T01:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 句子
|
- 句子
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "句子 1.2"
|
title: "句子 1.2"
|
||||||
date: "2019-08-17 01:00"
|
date: 2019-08-17T01:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 句子
|
- 句子
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "句子 1.3"
|
title: "句子 1.3"
|
||||||
date: "2019-08-17 02:00"
|
date: 2019-08-17T02:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 句子
|
- 句子
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "身体1"
|
title: "身体1"
|
||||||
date: "2019-08-18 01:00"
|
date: 2019-08-18T01:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 分类词汇
|
- 分类词汇
|
||||||
- 身体
|
- 身体
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Learning Chinese using Git -- ZhLab"
|
title: "Learning Chinese using Git -- ZhLab"
|
||||||
date: "2019-09-25"
|
date: 2019-09-25T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- diary
|
- diary
|
||||||
---
|
---
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Fruit and vegetables quiz"
|
title: "Fruit and vegetables quiz"
|
||||||
date: "2019-09-30"
|
date: 2019-09-30T00:00:00+07:00
|
||||||
image: https://images.chinatimes.com/newsphoto/2018-12-31/900/20181231000035.jpg
|
image: https://images.chinatimes.com/newsphoto/2018-12-31/900/20181231000035.jpg
|
||||||
tag:
|
tag:
|
||||||
- quiz
|
- quiz
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Move to new URL notice"
|
title: "Move to new URL notice"
|
||||||
date: "2019-10-07"
|
date: 2019-10-07T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- diary
|
- diary
|
||||||
---
|
---
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Chinese from Emoji 1: 学习用品"
|
title: "Chinese from Emoji 1: 学习用品"
|
||||||
date: 2019-11-26
|
date: 2019-11-26T00:00:00+07:00
|
||||||
image: https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcQpaKJKlp3UhF_S-Q5sPWmLnKhwb8Ey0sqA7ersas1OJcAgZFzB
|
image: https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcQpaKJKlp3UhF_S-Q5sPWmLnKhwb8Ey0sqA7ersas1OJcAgZFzB
|
||||||
tag:
|
tag:
|
||||||
- vocab
|
- vocab
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Chinese from Emoji 2: 陆地动物"
|
title: "Chinese from Emoji 2: 陆地动物"
|
||||||
date: 2019-11-27
|
date: 2019-11-27T00:00:00+07:00
|
||||||
image: https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcQpaKJKlp3UhF_S-Q5sPWmLnKhwb8Ey0sqA7ersas1OJcAgZFzB
|
image: https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcQpaKJKlp3UhF_S-Q5sPWmLnKhwb8Ey0sqA7ersas1OJcAgZFzB
|
||||||
tag:
|
tag:
|
||||||
- vocab
|
- vocab
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: Moving to Netlify
|
title: Moving to Netlify
|
||||||
date: 2019-11-25
|
date: 2019-11-25T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- diary
|
- diary
|
||||||
---
|
---
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: Back to former glory
|
title: Back to former glory
|
||||||
date: 2019-12-07
|
date: 2019-12-07T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- vuetify
|
- vuetify
|
||||||
- resources
|
- resources
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Chinese from Emoji 3: 水生和昆虫"
|
title: "Chinese from Emoji 3: 水生和昆虫"
|
||||||
date: 2019-12-08
|
date: 2019-12-08T00:00:00+07:00
|
||||||
image: https://steamuserimages-a.akamaihd.net/ugc/264973755082472713/B44953104F4F5FBB70205CCCD759E511C0E50E52/
|
image: https://steamuserimages-a.akamaihd.net/ugc/264973755082472713/B44953104F4F5FBB70205CCCD759E511C0E50E52/
|
||||||
tag:
|
tag:
|
||||||
- vocab
|
- vocab
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
---
|
---
|
||||||
title: 我和你 - Another song I always hear.
|
title: 我和你 - Another song I always hear.
|
||||||
date: 2020-02-26
|
date: 2020-02-26T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 邓丽君
|
- 邓丽君
|
||||||
- song
|
- song
|
||||||
---
|
---
|
||||||
|
|
||||||
<iframe width="560" height="315" src="https://www.youtube.com/embed/z0tCpDY2Ong" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
<%- youtube('z0tCpDY2Ong') %>
|
||||||
|
|
||||||
<!-- excerpt -->
|
<!-- excerpt -->
|
||||||
|
|
||||||
@@ -1,22 +1,18 @@
|
|||||||
---
|
---
|
||||||
title: ZhLevel Level 1
|
title: ZhLevel Level 1
|
||||||
date: 2020-03-23
|
date: 2020-03-23T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- zhlevel
|
- zhlevel
|
||||||
---
|
---
|
||||||
|
|
||||||
Comes from my old repository [here](https://github.com/patarapolw/zhlevel/blob/master/resources/level/hanzi.json).
|
Comes from my old repository [here](https://github.com/patarapolw/zhlevel/blob/master/resources/level/hanzi.json).
|
||||||
|
|
||||||
```pug parsed
|
<%- xCard({
|
||||||
a(data-make-html="card" href="https://github.com/patarapolw/zhlevel/blob/master/resources/level/hanzi.json")
|
href: "https://github.com/patarapolw/zhlevel/blob/master/resources/level/hanzi.json",
|
||||||
| https://github.com/patarapolw/zhlevel/blob/master/resources/level/hanzi.json
|
image: "https://avatars3.githubusercontent.com/u/21255931?s=400&v=4",
|
||||||
pre(data-template style="display: none;").
|
title: "patarapolw/zhlevel",
|
||||||
image: 'https://avatars3.githubusercontent.com/u/21255931?s=400&v=4'
|
description: "Learn Chinese from sentences, Tatoeba, or use your own sentences - patarapolw/zhlevel - /resources/level/hanzi.json"
|
||||||
title: patarapolw/zhlevel
|
})%>
|
||||||
description: >-
|
|
||||||
Learn Chinese from sentences, Tatoeba, or use your own sentences -
|
|
||||||
patarapolw/zhlevel - /resources/level/hanzi.json
|
|
||||||
```
|
|
||||||
|
|
||||||
Level One
|
Level One
|
||||||
|
|
||||||
@@ -51,15 +47,11 @@ Level One
|
|||||||
|
|
||||||
According to <https://github.com/patarapolw/zhlevel/blob/master/resources/level/hsk.yaml>
|
According to <https://github.com/patarapolw/zhlevel/blob/master/resources/level/hsk.yaml>
|
||||||
|
|
||||||
```pug parsed
|
<%- xCard({
|
||||||
a(data-make-html="card" href="https://github.com/patarapolw/zhlevel/blob/master/resources/level/hsk.yaml")
|
href: 'https://github.com/patarapolw/zhlevel/blob/master/resources/level/hsk.yaml',
|
||||||
| https://github.com/patarapolw/zhlevel/blob/master/resources/level/hsk.yaml
|
image: 'https://avatars3.githubusercontent.com/u/21255931?s=400&v=4',
|
||||||
pre(data-template style="display: none;").
|
title: 'patarapaolw/zhlevel',
|
||||||
image: 'https://avatars3.githubusercontent.com/u/21255931?s=400&v=4'
|
description: 'Learn Chinese from sentences, Tatoeba, or use your own sentences - patarapolw/zhlevel - /resources/level/hsk.yaml'
|
||||||
title: patarapolw/zhlevel
|
}) %>
|
||||||
description: >-
|
|
||||||
Learn Chinese from sentences, Tatoeba, or use your own sentences -
|
|
||||||
patarapolw/zhlevel - /resources/level/hsk.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
爱, 八, 爸爸, 杯子, 北京, 本, 不, 不客气, 菜, 茶, 吃, 出租车, 打电话, 大, 的, 点, 电脑, 电视, 电影, 东西, 都, 读, 对不起, 多, 多少, 儿子, 二, 饭店, 飞机, 分钟
|
爱, 八, 爸爸, 杯子, 北京, 本, 不, 不客气, 菜, 茶, 吃, 出租车, 打电话, 大, 的, 点, 电脑, 电视, 电影, 东西, 都, 读, 对不起, 多, 多少, 儿子, 二, 饭店, 飞机, 分钟
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: ZhLevel Level 2
|
title: ZhLevel Level 2
|
||||||
date: 2020-03-23
|
date: 2020-03-23T01:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- zhlevel
|
- zhlevel
|
||||||
---
|
---
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: ZhLevel Level 3
|
title: ZhLevel Level 3
|
||||||
date: 2020-03-25
|
date: 2020-03-25T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- zhlevel
|
- zhlevel
|
||||||
---
|
---
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
---
|
||||||
|
title: 千里之外
|
||||||
|
date: 2020-04-20T00:00:00+07:00
|
||||||
|
tag:
|
||||||
|
- song
|
||||||
|
---
|
||||||
|
|
||||||
|
<%- youtube('ocDo3ySyHSI') %>
|
||||||
|
|
||||||
|
<!-- excerpt -->
|
||||||
|
|
||||||
|
## 周杰伦
|
||||||
|
|
||||||
|
### 千里之外(& 费玉清)
|
||||||
|
|
||||||
|
作词:方文山 \
|
||||||
|
作曲:周杰伦
|
||||||
|
|
||||||
|
(周)屋簷如悬崖 风铃如沧海 我等燕归来 \
|
||||||
|
时间被安排 演一场意外 妳悄然走开 \
|
||||||
|
故事在城外 浓雾散不开 看不清对白 \
|
||||||
|
妳听不出来 风声不存在 是我在感慨 \
|
||||||
|
梦醒来 是谁在窗台 把结局打开 \
|
||||||
|
那薄如蝉翼的未来 禁不起谁来拆
|
||||||
|
|
||||||
|
(费)我送你离开 千里之外 你无声黑白 \
|
||||||
|
沉默年代 或许不该 太遥远的相爱 \
|
||||||
|
我送妳离开 天涯之外 妳是否还在 \
|
||||||
|
琴声何来 生死难猜 用一生 去等待
|
||||||
|
|
||||||
|
(周)闻泪声入林 寻梨花白 只得一行青苔 \
|
||||||
|
天在山之外 雨落花台 我两鬓斑白 \
|
||||||
|
闻泪声入林 寻梨花白 只得一行青苔 \
|
||||||
|
天在山之外 雨落花台 我等妳来
|
||||||
|
|
||||||
|
更多更详尽歌词 在 ※ Mojim.com 魔镜歌词网 \
|
||||||
|
(费)一身琉璃白 透明著尘埃 妳无瑕的爱 \
|
||||||
|
妳从雨中来 诗化了悲哀 我淋湿现在
|
||||||
|
|
||||||
|
(周)芙蓉水面采 船行影犹在 妳却不回来 \
|
||||||
|
被岁月覆蓋 妳说的花开 过去成空白
|
||||||
|
|
||||||
|
(费)梦醒来 是谁在窗台 把结局打开 \
|
||||||
|
(周)那薄如蝉翼的未来 \
|
||||||
|
(周)禁不起谁来拆 \
|
||||||
|
(费)我送你离开 千里之外 你无声黑白 沉默年代 或许不该 太遥远的相爱 \
|
||||||
|
(周)我送妳离开 天涯之外 妳是否还在 琴声何来 生死难猜 用一生 \
|
||||||
|
(费)我送妳离开 千里之外 妳无声黑白 沉默年代 或许不该 太遥远的相爱 \
|
||||||
|
(周)我送妳离开 天涯之外 \
|
||||||
|
(周)妳是否还在 \
|
||||||
|
(周)琴声何来 \
|
||||||
|
(费)生死难猜 \
|
||||||
|
(合)用一生去等待
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
---
|
---
|
||||||
title: 祝福
|
title: 祝福
|
||||||
date: 2020-04-18
|
date: 2020-04-18T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- song
|
- song
|
||||||
---
|
---
|
||||||
|
|
||||||
<iframe width="560" height="315" src="https://www.youtube.com/embed/ZuJM8AOivYU" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
<%- youtube('ZuJM8AOivYU') %>
|
||||||
|
|
||||||
<!-- excerpt -->
|
<!-- excerpt -->
|
||||||
|
|
||||||
@@ -13,31 +13,31 @@ tag:
|
|||||||
|
|
||||||
## 祝福
|
## 祝福
|
||||||
|
|
||||||
作词:丁晓雯
|
作词:丁晓雯 \
|
||||||
作曲:郭子
|
作曲:郭子 \
|
||||||
编曲:王豫民
|
编曲:王豫民 \
|
||||||
|
|
||||||
不要问 不要说 一切尽在不言中
|
不要问 不要说 一切尽在不言中 \
|
||||||
这一刻 偎著烛光 让我们静静的渡过
|
这一刻 偎著烛光 让我们静静的渡过 \
|
||||||
莫挥手 莫回头 当我唱起这首歌 怕只怕 泪水轻轻的滑落
|
莫挥手 莫回头 当我唱起这首歌 怕只怕 泪水轻轻的滑落 \
|
||||||
愿心中永远留着我的笑容 伴你走过每一个春夏秋冬
|
愿心中永远留着我的笑容 伴你走过每一个春夏秋冬
|
||||||
|
|
||||||
几许愁 几许忧 人生难免苦与痛
|
几许愁 几许忧 人生难免苦与痛 \
|
||||||
失去过 才能真正懂得去珍惜和拥有
|
失去过 才能真正懂得去珍惜和拥有 \
|
||||||
情难舍 人难留 今朝一别各西东 冷和热 点点滴滴在心头
|
情难舍 人难留 今朝一别各西东 冷和热 点点滴滴在心头 \
|
||||||
愿心中永远留着我的笑容 伴你走过每一个春夏秋冬
|
愿心中永远留着我的笑容 伴你走过每一个春夏秋冬
|
||||||
|
|
||||||
*伤离别 离别虽然在眼前 说再见 再见不会太遥远
|
*伤离别 离别虽然在眼前 说再见 再见不会太遥远 \
|
||||||
更多更详尽歌词
|
更多更详尽歌词 \
|
||||||
若有缘 有缘就能期待明天 你和我重逢在灿烂的季节
|
若有缘 有缘就能期待明天 你和我重逢在灿烂的季节
|
||||||
|
|
||||||
Repeat *
|
Repeat *
|
||||||
|
|
||||||
伤离别 离别虽然在眼前 说再见 再见不会太遥远
|
伤离别 离别虽然在眼前 说再见 再见不会太遥远 \
|
||||||
伤离别 离别虽然在眼前 说再见 再见不会太遥远
|
伤离别 离别虽然在眼前 说再见 再见不会太遥远 \
|
||||||
若有缘 有缘就能期待明天 你和我重逢在灿烂的季节
|
若有缘 有缘就能期待明天 你和我重逢在灿烂的季节
|
||||||
|
|
||||||
不要问 不要说 一切尽在不言中
|
不要问 不要说 一切尽在不言中 \
|
||||||
这一刻 偎著烛光 让我们静静的渡过
|
这一刻 偎著烛光 让我们静静的渡过 \
|
||||||
莫挥手 莫回头 当我唱起这首歌
|
莫挥手 莫回头 当我唱起这首歌 \
|
||||||
愿心中留着笑容 陪你度过每个春夏秋冬
|
愿心中留着笑容 陪你度过每个春夏秋冬
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
title: 虫儿飞
|
||||||
|
date: 2020-04-10T00:00:00+07:00
|
||||||
|
tag:
|
||||||
|
- song
|
||||||
|
---
|
||||||
|
|
||||||
|
<%- youtube('4CazJNOLoM0') %>
|
||||||
|
|
||||||
|
<!-- excerpt -->
|
||||||
|
|
||||||
|
黑黑的天空低垂 \
|
||||||
|
亮亮的繁星相随 \
|
||||||
|
虫儿飞 虫儿飞 \
|
||||||
|
你在思念谁
|
||||||
|
|
||||||
|
天上的星星流泪 \
|
||||||
|
地上的玫瑰枯萎 \
|
||||||
|
冷风吹 冷风吹 \
|
||||||
|
只要有你陪
|
||||||
|
|
||||||
|
虫儿飞 花儿睡 \
|
||||||
|
一双又一对才美 \
|
||||||
|
不怕天黑 只怕心碎 \
|
||||||
|
不管累不累 \
|
||||||
|
也不管东南西北
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
---
|
||||||
|
title: "千字文 - 1/1"
|
||||||
|
date: 2019-08-11T00:00:00+07:00
|
||||||
|
tag:
|
||||||
|
- 千字文
|
||||||
|
- 汉字
|
||||||
|
---
|
||||||
|
|
||||||
|
<div class="w-100 mt-3">
|
||||||
|
<h3 class="text-center">天地玄黃,宇宙洪荒。</h3>
|
||||||
|
</div>
|
||||||
|
<div class="w-100">
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://upload.wikimedia.org/wikipedia/commons/a/ab/天-order.gif" height="100" />
|
||||||
|
<figcaption class="text-center">tian1</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://upload.wikimedia.org/wikipedia/commons/f/fb/地-order.gif" height="100" />
|
||||||
|
<figcaption class="text-center">di4</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://upload.wikimedia.org/wikipedia/commons/d/d3/玄-order.gif" height="100" />
|
||||||
|
<figcaption class="text-center">xuan2</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://upload.wikimedia.org/wikipedia/commons/e/e7/黄-order.gif" height="100" />
|
||||||
|
<figcaption class="text-center">huang2</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
<div class="w-100">
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/23431.gif" height="100" />
|
||||||
|
<figcaption class="text-center">yu3</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/23449.gif" height="100" />
|
||||||
|
<figcaption class="text-center">zhou4</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/27946.gif" height="100" />
|
||||||
|
<figcaption class="text-center">hong2</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/33618.gif" height="100" />
|
||||||
|
<figcaption class="text-center">huang1</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
img[height="100"] {
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
figure {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.w-100 {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mt-3 {
|
||||||
|
margin-top: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d-inline-block {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
table td:first-child {
|
||||||
|
width: 10em;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<!-- excerpt_separator -->
|
||||||
|
|
||||||
|
| | | |
|
||||||
|
| --- | --- | --- |
|
||||||
|
宇宙 | yǔzhòu | universe / cosmos
|
||||||
|
宇航 | yǔháng | space flight
|
||||||
|
宇航员 | yǔhángyuán | astronaut
|
||||||
|
宇宙飞船 | yǔzhòufēichuán | spacecraft
|
||||||
|
防洪 | fánghóng | flood control / flood prevention
|
||||||
|
山洪 | shānhóng | mountain flash flood / mountain torrent
|
||||||
|
荒 | huāng | desolate / shortage / scarce / out of practice / absurd / uncultivated / to neglect
|
||||||
|
荒野 | huāngyě | wilderness
|
||||||
@@ -1,41 +1,50 @@
|
|||||||
---
|
---
|
||||||
title: "千字文 - 1/2"
|
title: "千字文 - 1/2"
|
||||||
date: "2019-08-12"
|
createdAt: 2019-08-12T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 汉字
|
- 汉字
|
||||||
---
|
---
|
||||||
|
|
||||||
```pug parsed
|
<div class="w-100 mt-3">
|
||||||
.w-100.mt-3
|
<h3 class="text-center">日月盈昃,辰宿列張。</h3>
|
||||||
h3.text-center 日月盈昃,辰宿列張。
|
</div>
|
||||||
.w-100
|
<div class="w-100">
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/26085.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/26085.gif" height="100" />
|
||||||
figcaption.text-center ri4
|
<figcaption class="text-center">ri4</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/26376.gif" height=100 data-no-cache)
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center yue4
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/26376.gif" height="100" />
|
||||||
figure.d-inline-block
|
<figcaption class="text-center">yue4</figcaption>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/30408.gif" height=100 data-no-cache)
|
</figure>
|
||||||
figcaption.text-center ying2
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block.text-center
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/30408.gif" height="100" />
|
||||||
.hanzi-img 昃
|
<figcaption class="text-center">ying2</figcaption>
|
||||||
figcaption ze4
|
</figure>
|
||||||
.w-100
|
<figure class="d-inline-block text-center">
|
||||||
figure.d-inline-block
|
<div class="hanzi-img">昃</div>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/36784.gif" height=100 data-no-cache)
|
<figcaption>ze4</figcaption>
|
||||||
figcaption.text-center chen2
|
</figure>
|
||||||
figure.d-inline-block
|
</div>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/23487.gif" height=100 data-no-cache)
|
<div class="w-100">
|
||||||
figcaption.text-center su4
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/36784.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/21015.gif" height=100 data-no-cache)
|
<figcaption class="text-center">chen2</figcaption>
|
||||||
figcaption.text-center lie2
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24373.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/23487.gif" height="100" />
|
||||||
figcaption.text-center zhang1
|
<figcaption class="text-center">su4</figcaption>
|
||||||
```
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/21015.gif" height="100" />
|
||||||
|
<figcaption class="text-center">lie2</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24373.gif" height="100" />
|
||||||
|
<figcaption class="text-center">zhang1</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
img[height="100"] {
|
img[height="100"] {
|
||||||
@@ -1,41 +1,51 @@
|
|||||||
---
|
---
|
||||||
title: "千字文 - 1/3"
|
title: "千字文 - 1/3"
|
||||||
date: "2019-08-13"
|
createdAt: 2019-10-08T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 汉字
|
- 汉字
|
||||||
---
|
---
|
||||||
|
|
||||||
```pug parsed
|
|
||||||
.w-100.mt-3
|
<div class="w-100 mt-3">
|
||||||
h3.text-center 寒來暑往,秋收冬藏。
|
<h3 class="text-center">寒來暑往,秋收冬藏。</h3>
|
||||||
.w-100
|
</div>
|
||||||
figure.d-inline-block
|
<div class="w-100">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/23506.gif" height=100 data-no-cache)
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center han2
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/23506.gif" height="100" />
|
||||||
figure.d-inline-block
|
<figcaption class="text-center">han2</figcaption>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20358.gif" height=100 data-no-cache)
|
</figure>
|
||||||
figcaption.text-center lai2
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20358.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/26257.gif" height=100 data-no-cache)
|
<figcaption class="text-center">lai2</figcaption>
|
||||||
figcaption.text-center shu3
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24448.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/26257.gif" height="100" />
|
||||||
figcaption.text-center wang3
|
<figcaption class="text-center">shu3</figcaption>
|
||||||
.w-100
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/31179.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24448.gif" height="100" />
|
||||||
figcaption.text-center qiu1
|
<figcaption class="text-center">wang3</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/25910.gif" height=100 data-no-cache)
|
</div>
|
||||||
figcaption.text-center shou1
|
<div class="w-100">
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20908.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/31179.gif" height="100" />
|
||||||
figcaption.text-center dong1
|
<figcaption class="text-center">qiu1</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/34255.gif" height=100 data-no-cache)
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center cang2
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/25910.gif" height="100" />
|
||||||
```
|
<figcaption class="text-center">shou1</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20908.gif" height="100" />
|
||||||
|
<figcaption class="text-center">dong1</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/34255.gif" height="100" />
|
||||||
|
<figcaption class="text-center">cang2</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
img[height="100"] {
|
img[height="100"] {
|
||||||
@@ -1,41 +1,51 @@
|
|||||||
---
|
---
|
||||||
title: "千字文 - 1/4"
|
title: "千字文 - 1/4"
|
||||||
date: "2019-08-14"
|
createdAt: 2019-08-14T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 汉字
|
- 汉字
|
||||||
---
|
---
|
||||||
|
|
||||||
```pug parsed
|
|
||||||
.w-100.mt-3
|
<div class="w-100 mt-3">
|
||||||
h3.text-center 閏餘成歲,律呂調陽。
|
<h3 class="text-center">閏餘成歲,律呂調陽。</h3>
|
||||||
.w-100
|
</div>
|
||||||
figure.d-inline-block
|
<div class="w-100">
|
||||||
.hanzi-img 閏
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center run4
|
<div class="hanzi-img">閏</div>
|
||||||
figure.d-inline-block
|
<figcaption class="text-center">run4</figcaption>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/39192.gif" height=100 data-no-cache)
|
</figure>
|
||||||
figcaption.text-center yu2
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/39192.gif" height="100"/>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/25104.gif" height=100 data-no-cache)
|
<figcaption class="text-center">yu2</figcaption>
|
||||||
figcaption.text-center cheng2
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/27506.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/25104.gif" height="100"/>
|
||||||
figcaption.text-center sui4
|
<figcaption class="text-center">cheng2</figcaption>
|
||||||
.w-100
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24459.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/27506.gif" height="100"/>
|
||||||
figcaption.text-center lu:4
|
<figcaption class="text-center">sui4</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/21570.gif" height=100 data-no-cache)
|
</div>
|
||||||
figcaption.text-center lu:3
|
<div class="w-100">
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/35519.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24459.gif" height="100"/>
|
||||||
figcaption.text-center diao4
|
<figcaption class="text-center">lu:4</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/38525.gif" height=100 data-no-cache)
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center yang2
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/21570.gif" height="100"/>
|
||||||
```
|
<figcaption class="text-center">lu:3</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/35519.gif" height="100"/>
|
||||||
|
<figcaption class="text-center">diao4</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/38525.gif" height="100"/>
|
||||||
|
<figcaption class="text-center">yang2</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
img[height="100"] {
|
img[height="100"] {
|
||||||
@@ -1,41 +1,50 @@
|
|||||||
---
|
---
|
||||||
title: "千字文 - 1/5"
|
title: "千字文 - 1/5"
|
||||||
date: "2019-08-15"
|
createdAt: 2019-08-15T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 汉字
|
- 汉字
|
||||||
---
|
---
|
||||||
|
|
||||||
```pug parsed
|
<div class="w-100 mt-3">
|
||||||
.w-100.mt-3
|
<h3 class="text-center">雲騰致雨,露結為霜。</h3>
|
||||||
h3.text-center 雲騰致雨,露結為霜。
|
</div>
|
||||||
.w-100
|
<div class="w-100">
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/38642.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/38642.gif" height="100" />
|
||||||
figcaption.text-center yun2
|
<figcaption class="text-center">yun2</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/39472.gif" height=100 data-no-cache)
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center teng2
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/39472.gif" height="100" />
|
||||||
figure.d-inline-block
|
<figcaption class="text-center">teng2</figcaption>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/33268.gif" height=100 data-no-cache)
|
</figure>
|
||||||
figcaption.text-center zhi4
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/33268.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/38632.gif" height=100 data-no-cache)
|
<figcaption class="text-center">zhi4</figcaption>
|
||||||
figcaption.text-center yu3
|
</figure>
|
||||||
.w-100
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/38632.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/38706.gif" height=100 data-no-cache)
|
<figcaption class="text-center">yu3</figcaption>
|
||||||
figcaption.text-center lu4
|
</figure>
|
||||||
figure.d-inline-block
|
</div>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/32080.gif" height=100 data-no-cache)
|
<div class="w-100">
|
||||||
figcaption.text-center jie2
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/38706.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/28858.gif" height=100 data-no-cache)
|
<figcaption class="text-center">lu4</figcaption>
|
||||||
figcaption.text-center wei4
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/38684.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/32080.gif" height="100" />
|
||||||
figcaption.text-center shuang1
|
<figcaption class="text-center">jie2</figcaption>
|
||||||
```
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/28858.gif" height="100" />
|
||||||
|
<figcaption class="text-center">wei4</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/38684.gif" height="100" />
|
||||||
|
<figcaption class="text-center">shuang1</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
img[height="100"] {
|
img[height="100"] {
|
||||||
@@ -1,41 +1,50 @@
|
|||||||
---
|
---
|
||||||
title: "千字文 - 1/6"
|
title: "千字文 - 1/6"
|
||||||
date: "2019-08-16"
|
createdAt: 2019-08-16T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 汉字
|
- 汉字
|
||||||
---
|
---
|
||||||
|
|
||||||
```pug parsed
|
<div class="w-100 mt-3">
|
||||||
.w-100.mt-3
|
<h3 class="text-center">金生麗水,玉出崑岡。</h3>
|
||||||
h3.text-center 金生麗水,玉出崑岡。
|
</div>
|
||||||
.w-100
|
<div class="w-100">
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/37329.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/37329.gif" height="100" />
|
||||||
figcaption.text-center jin1
|
<figcaption class="text-center">jin1</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/29983.gif" height=100 data-no-cache)
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center sheng1
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/29983.gif" height="100" />
|
||||||
figure.d-inline-block
|
<figcaption class="text-center">sheng1</figcaption>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/40599.gif" height=100 data-no-cache)
|
</figure>
|
||||||
figcaption.text-center li4
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/40599.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/27700.gif" height=100 data-no-cache)
|
<figcaption class="text-center">li4</figcaption>
|
||||||
figcaption.text-center shui3
|
</figure>
|
||||||
.w-100
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/27700.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/29577.gif" height=100 data-no-cache)
|
<figcaption class="text-center">shui3</figcaption>
|
||||||
figcaption.text-center yu4
|
</figure>
|
||||||
figure.d-inline-block
|
</div>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20986.gif" height=100 data-no-cache)
|
<div class="w-100">
|
||||||
figcaption.text-center chu1
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/29577.gif" height="100" />
|
||||||
.hanzi-img 崑
|
<figcaption class="text-center">yu4</figcaption>
|
||||||
figcaption.text-center kun1
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/23713.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20986.gif" height="100" />
|
||||||
figcaption.text-center gang1
|
<figcaption class="text-center">chu1</figcaption>
|
||||||
```
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<div class="hanzi-img">崑</div>
|
||||||
|
<figcaption class="text-center">kun1</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/23713.gif" height="100" />
|
||||||
|
<figcaption class="text-center">gang1</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
img[height="100"] {
|
img[height="100"] {
|
||||||
@@ -1,41 +1,50 @@
|
|||||||
---
|
---
|
||||||
title: "千字文 - 1/7"
|
title: "千字文 - 1/7"
|
||||||
date: "2019-08-17"
|
createdAt: 2019-08-17T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 汉字
|
- 汉字
|
||||||
---
|
---
|
||||||
|
|
||||||
```pug parsed
|
<div class="w-100 mt-3">
|
||||||
.w-100.mt-3
|
<h3 class="text-center">劍號巨闕,珠稱夜光。</h3>
|
||||||
h3.text-center 劍號巨闕,珠稱夜光。
|
</div>
|
||||||
.w-100
|
<div class="w-100">
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/21133.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/21133.gif" height="100" />
|
||||||
figcaption.text-center jian4
|
<figcaption class="text-center">jian4</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/34399.gif" height=100 data-no-cache)
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center hao4
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/34399.gif" height="100" />
|
||||||
figure.d-inline-block
|
<figcaption class="text-center">hao4</figcaption>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24040.gif" height=100 data-no-cache)
|
</figure>
|
||||||
figcaption.text-center ju4
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24040.gif" height="100" />
|
||||||
.hanzi-img 闕
|
<figcaption class="text-center">ju4</figcaption>
|
||||||
figcaption.text-center que4
|
</figure>
|
||||||
.w-100
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<div class="hanzi-img">闕</div>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/29664.gif" height=100 data-no-cache)
|
<figcaption class="text-center">que4</figcaption>
|
||||||
figcaption.text-center zhu1
|
</figure>
|
||||||
figure.d-inline-block
|
</div>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/31281.gif" height=100 data-no-cache)
|
<div class="w-100">
|
||||||
figcaption.text-center cheng1
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/29664.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/22812.gif" height=100 data-no-cache)
|
<figcaption class="text-center">zhu1</figcaption>
|
||||||
figcaption.text-center ye4
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20809.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/31281.gif" height="100" />
|
||||||
figcaption.text-center guang1
|
<figcaption class="text-center">cheng1</figcaption>
|
||||||
```
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/22812.gif" height="100" />
|
||||||
|
<figcaption class="text-center">ye4</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20809.gif" height="100" />
|
||||||
|
<figcaption class="text-center">guang1</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
img[height="100"] {
|
img[height="100"] {
|
||||||
@@ -1,41 +1,50 @@
|
|||||||
---
|
---
|
||||||
title: "千字文 - 1/8"
|
title: "千字文 - 1/8"
|
||||||
date: "2019-08-18"
|
createdAt: 2019-08-18T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 汉字
|
- 汉字
|
||||||
---
|
---
|
||||||
|
|
||||||
```pug parsed
|
<div class="w-100 mt-3">
|
||||||
.w-100.mt-3
|
<h3 class="text-center">果珍李柰,菜重芥薑。</h3>
|
||||||
h3.text-center 果珍李柰,菜重芥薑。
|
</div>
|
||||||
.w-100
|
<div class="w-100">
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/26524.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/26524.gif" height="100" />
|
||||||
figcaption.text-center guo3
|
<figcaption class="text-center">guo3</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/29645.gif" height=100 data-no-cache)
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center zhen1
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/29645.gif" height="100" />
|
||||||
figure.d-inline-block
|
<figcaption class="text-center">zhen1</figcaption>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/26446.gif" height=100 data-no-cache)
|
</figure>
|
||||||
figcaption.text-center li3
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/26446.gif" height="100" />
|
||||||
.hanzi-img 柰
|
<figcaption class="text-center">li3</figcaption>
|
||||||
figcaption.text-center nai4
|
</figure>
|
||||||
.w-100
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<div class="hanzi-img">柰</div>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/33756.gif" height=100 data-no-cache)
|
<figcaption class="text-center">nai4</figcaption>
|
||||||
figcaption.text-center cai4
|
</figure>
|
||||||
figure.d-inline-block
|
</div>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/37325.gif" height=100 data-no-cache)
|
<div class="w-100">
|
||||||
figcaption.text-center zhong4
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/33756.gif" height="100" />
|
||||||
.hanzi-img 柰
|
<figcaption class="text-center">cai4</figcaption>
|
||||||
figcaption.text-center jie4
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
.hanzi-img 薑
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/37325.gif" height="100" />
|
||||||
figcaption.text-center jiang1
|
<figcaption class="text-center">zhong4</figcaption>
|
||||||
```
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<div class="hanzi-img">柰</div>
|
||||||
|
<figcaption class="text-center">jie4</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<div class="hanzi-img">薑</div>
|
||||||
|
<figcaption class="text-center">jiang1</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
img[height="100"] {
|
img[height="100"] {
|
||||||
@@ -1,41 +1,50 @@
|
|||||||
---
|
---
|
||||||
title: "千字文 - 1/9"
|
title: "千字文 - 1/9"
|
||||||
date: "2019-08-19"
|
createdAt: 2019-08-19T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 汉字
|
- 汉字
|
||||||
---
|
---
|
||||||
|
|
||||||
```pug parsed
|
<div class="w-100 mt-3">
|
||||||
.w-100.mt-3
|
<h3 class="text-center">海咸河淡,鱗潛羽翔。</h3>
|
||||||
h3.text-center 海咸河淡,鱗潛羽翔。
|
</div>
|
||||||
.w-100
|
<div class="w-100">
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/28023.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/28023.gif" height="100" />
|
||||||
figcaption.text-center hai3
|
<figcaption class="text-center">hai3</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/21688.gif" height=100 data-no-cache)
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center xian2
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/21688.gif" height="100" />
|
||||||
figure.d-inline-block
|
<figcaption class="text-center">xian2</figcaption>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/27827.gif" height=100 data-no-cache)
|
</figure>
|
||||||
figcaption.text-center he2
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/27827.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/28129.gif" height=100 data-no-cache)
|
<figcaption class="text-center">he2</figcaption>
|
||||||
figcaption.text-center dan4
|
</figure>
|
||||||
.w-100
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/28129.gif" height="100" />
|
||||||
.hanzi-img 鱗
|
<figcaption class="text-center">dan4</figcaption>
|
||||||
figcaption.text-center lin2
|
</figure>
|
||||||
figure.d-inline-block
|
</div>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/28507.gif" height=100 data-no-cache)
|
<div class="w-100">
|
||||||
figcaption.text-center qian2
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<div class="hanzi-img">鱗</div>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/32701.gif" height=100 data-no-cache)
|
<figcaption class="text-center">lin2</figcaption>
|
||||||
figcaption.text-center yu3
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/32724.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/28507.gif" height="100" />
|
||||||
figcaption.text-center xiang2
|
<figcaption class="text-center">qian2</figcaption>
|
||||||
```
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/32701.gif" height="100" />
|
||||||
|
<figcaption class="text-center">yu3</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/32724.gif" height="100" />
|
||||||
|
<figcaption class="text-center">xiang2</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
img[height="100"] {
|
img[height="100"] {
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
---
|
||||||
|
title: "千字文 - 2/1"
|
||||||
|
createdAt: 2019-08-20T00:00:00+07:00
|
||||||
|
tag:
|
||||||
|
- 千字文
|
||||||
|
- 汉字
|
||||||
|
---
|
||||||
|
|
||||||
|
<div class="w-100 mt-3">
|
||||||
|
<h3 class="text-center">龍師火帝,鳥官人皇。</h3>
|
||||||
|
</div>
|
||||||
|
<div class="w-100">
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/40845.gif" height="100" />
|
||||||
|
<figcaption class="text-center">long2</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24107.gif" height="100" />
|
||||||
|
<figcaption class="text-center">shi1</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/28779.gif" height="100" />
|
||||||
|
<figcaption class="text-center">huo3</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24093.gif" height="100" />
|
||||||
|
<figcaption class="text-center">di4</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
<div class="w-100">
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/40165.gif" height="100" />
|
||||||
|
<figcaption class="text-center">niao3</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/23448.gif" height="100" />
|
||||||
|
<figcaption class="text-center">guan1</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20154.gif" height="100" />
|
||||||
|
<figcaption class="text-center">ren2</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/30343.gif" height="100" />
|
||||||
|
<figcaption class="text-center">huang1</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- excerpt_separator -->
|
||||||
|
|
||||||
|
<style>
|
||||||
|
img[height="100"] {
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
figure {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.w-100 {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mt-3 {
|
||||||
|
margin-top: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d-inline-block {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
table td:first-child {
|
||||||
|
width: 10em;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
| | | |
|
||||||
|
| --- | --- | --- |
|
||||||
|
官方 | guānfāng | government / official (approved or issued by an authority)
|
||||||
|
官员 (官員) | guānyuán | official (in an organization or government) / administrator
|
||||||
|
法官 | fǎguān | judge
|
||||||
|
警官 | jǐngguān | constable / police officer
|
||||||
|
感官 | gǎnguān | sense / sense organ
|
||||||
|
指挥官 (指揮官) | zhǐhuīguān | commander
|
||||||
|
收官 | shōuguān | final part of a go game (see 官子) / endgame / to finish up / to come to the final stage
|
||||||
@@ -1,41 +1,50 @@
|
|||||||
---
|
---
|
||||||
title: "千字文 - 2/2"
|
title: "千字文 - 2/2"
|
||||||
date: "2019-08-21"
|
createdAt: 2019-08-21T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 汉字
|
- 汉字
|
||||||
---
|
---
|
||||||
|
|
||||||
```pug parsed
|
<div class="w-100 mt-3">
|
||||||
.w-100.mt-3
|
<h3 class="text-center">始制文字,乃服衣裳。</h3>
|
||||||
h3.text-center 始制文字,乃服衣裳。
|
</div>
|
||||||
.w-100
|
<div class="w-100">
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/22987.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/22987.gif" height="100" />
|
||||||
figcaption.text-center shi3
|
<figcaption class="text-center">shi3</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/21046.gif" height=100 data-no-cache)
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center zhi4
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/21046.gif" height="100" />
|
||||||
figure.d-inline-block
|
<figcaption class="text-center">zhi4</figcaption>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/25991.gif" height=100 data-no-cache)
|
</figure>
|
||||||
figcaption.text-center wen2
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/25991.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/23383.gif" height=100 data-no-cache)
|
<figcaption class="text-center">wen2</figcaption>
|
||||||
figcaption.text-center zi4
|
</figure>
|
||||||
.w-100
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/23383.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20035.gif" height=100 data-no-cache)
|
<figcaption class="text-center">zi4</figcaption>
|
||||||
figcaption.text-center nai3
|
</figure>
|
||||||
figure.d-inline-block
|
</div>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/26381.gif" height=100 data-no-cache)
|
<div class="w-100">
|
||||||
figcaption.text-center fu2
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20035.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/34915.gif" height=100 data-no-cache)
|
<figcaption class="text-center">nai3</figcaption>
|
||||||
figcaption.text-center yi1
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/35059.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/26381.gif" height="100" />
|
||||||
figcaption.text-center chang2
|
<figcaption class="text-center">fu2</figcaption>
|
||||||
```
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/34915.gif" height="100" />
|
||||||
|
<figcaption class="text-center">yi1</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/35059.gif" height="100" />
|
||||||
|
<figcaption class="text-center">chang2</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
img[height="100"] {
|
img[height="100"] {
|
||||||
@@ -1,41 +1,50 @@
|
|||||||
---
|
---
|
||||||
title: "千字文 - 2/3"
|
title: "千字文 - 2/3"
|
||||||
date: "2019-08-23"
|
createdAt: 2019-08-23T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 汉字
|
- 汉字
|
||||||
---
|
---
|
||||||
|
|
||||||
```pug parsed
|
<div class="w-100 mt-3">
|
||||||
.w-100.mt-3
|
<h3 class="text-center">推位讓國,有虞陶唐。</h3>
|
||||||
h3.text-center 推位讓國,有虞陶唐。
|
</div>
|
||||||
.w-100
|
<div class="w-100">
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/25512.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/25512.gif" height="100" />
|
||||||
figcaption.text-center tui1
|
<figcaption class="text-center">tui1</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20301.gif" height=100 data-no-cache)
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center wei4
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20301.gif" height="100" />
|
||||||
figure.d-inline-block
|
<figcaption class="text-center">wei4</figcaption>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/35731.gif" height=100 data-no-cache)
|
</figure>
|
||||||
figcaption.text-center rang4
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/35731.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/22283.gif" height=100 data-no-cache)
|
<figcaption class="text-center">rang4</figcaption>
|
||||||
figcaption.text-center guo2
|
</figure>
|
||||||
.w-100
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/22283.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/26377.gif" height=100 data-no-cache)
|
<figcaption class="text-center">guo2</figcaption>
|
||||||
figcaption.text-center you3
|
</figure>
|
||||||
figure.d-inline-block
|
</div>
|
||||||
.hanzi-img 虞
|
<div class="w-100">
|
||||||
figcaption.text-center fu2
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/26377.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/38518.gif" height=100 data-no-cache)
|
<figcaption class="text-center">you3</figcaption>
|
||||||
figcaption.text-center tao2
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/21776.gif" height=100 data-no-cache)
|
<div class="hanzi-img">虞</div>
|
||||||
figcaption.text-center tang2
|
<figcaption class="text-center">fu2</figcaption>
|
||||||
```
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/38518.gif" height="100" />
|
||||||
|
<figcaption class="text-center">tao2</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/21776.gif" height="100" />
|
||||||
|
<figcaption class="text-center">tang2</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
img[height="100"] {
|
img[height="100"] {
|
||||||
@@ -1,41 +1,50 @@
|
|||||||
---
|
---
|
||||||
title: "千字文 - 2/4"
|
title: "千字文 - 2/4"
|
||||||
date: "2019-08-27"
|
createdAt: 2019-08-27T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 汉字
|
- 汉字
|
||||||
---
|
---
|
||||||
|
|
||||||
```pug parsed
|
<div class="w-100 mt-3">
|
||||||
.w-100.mt-3
|
<h3 class="text-center">弔民伐罪,周發殷湯。</h3>
|
||||||
h3.text-center 弔民伐罪,周發殷湯。
|
</div>
|
||||||
.w-100
|
<div class="w-100">
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24340.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24340.gif" height="100" />
|
||||||
figcaption.text-center diao1
|
<figcaption class="text-center">diao1</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/27665.gif" height=100 data-no-cache)
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center min2
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/27665.gif" height="100" />
|
||||||
figure.d-inline-block
|
<figcaption class="text-center">min2</figcaption>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20240.gif" height=100 data-no-cache)
|
</figure>
|
||||||
figcaption.text-center fa2
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20240.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/32618.gif" height=100 data-no-cache)
|
<figcaption class="text-center">fa2</figcaption>
|
||||||
figcaption.text-center zui4
|
</figure>
|
||||||
.w-100
|
<figure class="d-inline-block">\
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/32618.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/21608.gif" height=100 data-no-cache)
|
<figcaption class="text-center">zui4</figcaption>
|
||||||
figcaption.text-center zhou1
|
</figure>
|
||||||
figure.d-inline-block
|
</div>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/30332.gif" height=100 data-no-cache)
|
<div class="w-100">
|
||||||
figcaption.text-center fa1
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/21608.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/27575.gif" height=100 data-no-cache)
|
<figcaption class="text-center">zhou1</figcaption>
|
||||||
figcaption.text-center yin1
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/28271.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/30332.gif" height="100" />
|
||||||
figcaption.text-center tang1
|
<figcaption class="text-center">fa1</figcaption>
|
||||||
```
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/27575.gif" height="100" />
|
||||||
|
<figcaption class="text-center">yin1</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/28271.gif" height="100" />
|
||||||
|
<figcaption class="text-center">tang1</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
img[height="100"] {
|
img[height="100"] {
|
||||||
@@ -1,41 +1,50 @@
|
|||||||
---
|
---
|
||||||
title: "千字文 - 2/5"
|
title: "千字文 - 2/5"
|
||||||
date: "2019-08-29"
|
createdAt: 2019-08-29T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 汉字
|
- 汉字
|
||||||
---
|
---
|
||||||
|
|
||||||
```pug parsed
|
<div class="w-100 mt-3">
|
||||||
.w-100.mt-3
|
<h3 class="text-center">坐朝問道,垂拱平章。</h3>
|
||||||
h3.text-center 坐朝問道,垂拱平章。
|
</div>
|
||||||
.w-100
|
<div class="w-100">
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/22352.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/22352.gif" height="100" />
|
||||||
figcaption.text-center zuo4
|
<figcaption class="text-center">zuo4</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/26397.gif" height=100 data-no-cache)
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center zhao1
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/26397.gif" height="100" />
|
||||||
figure.d-inline-block
|
<figcaption class="text-center">zhao1</figcaption>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/21839.gif" height=100 data-no-cache)
|
</figure>
|
||||||
figcaption.text-center wen4
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/21839.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/36947.gif" height=100 data-no-cache)
|
<figcaption class="text-center">wen4</figcaption>
|
||||||
figcaption.text-center dao4
|
</figure>
|
||||||
.w-100
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/36947.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/22402.gif" height=100 data-no-cache)
|
<figcaption class="text-center">dao4</figcaption>
|
||||||
figcaption.text-center chui2
|
</figure>
|
||||||
figure.d-inline-block
|
</div>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/25329.gif" height=100 data-no-cache)
|
<div class="w-100">
|
||||||
figcaption.text-center gong3
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/22402.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24179.gif" height=100 data-no-cache)
|
<figcaption class="text-center">chui2</figcaption>
|
||||||
figcaption.text-center ping2
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/31456.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/25329.gif" height="100" />
|
||||||
figcaption.text-center zhang1
|
<figcaption class="text-center">gong3</figcaption>
|
||||||
```
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24179.gif" height="100" />
|
||||||
|
<figcaption class="text-center">ping2</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/31456.gif" height="100" />
|
||||||
|
<figcaption class="text-center">zhang1</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
img[height="100"] {
|
img[height="100"] {
|
||||||
@@ -1,41 +1,50 @@
|
|||||||
---
|
---
|
||||||
title: "千字文 - 2/6"
|
title: "千字文 - 2/6"
|
||||||
date: "2019-08-30"
|
createdAt: 2019-08-30T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 汉字
|
- 汉字
|
||||||
---
|
---
|
||||||
|
|
||||||
```pug parsed
|
<div class="w-100 mt-3">
|
||||||
.w-100.mt-3
|
<h3 class="text-center">愛育黎首,臣伏戎羌。</h3>
|
||||||
h3.text-center 愛育黎首,臣伏戎羌。
|
</div>
|
||||||
.w-100
|
<div class="w-100">
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24859.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24859.gif" height="100" />
|
||||||
figcaption.text-center ai4
|
<figcaption class="text-center">ai4</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/32946.gif" height=100 data-no-cache)
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center yu4
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/32946.gif" height="100" />
|
||||||
figure.d-inline-block
|
<figcaption class="text-center">yu4</figcaption>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/40654.gif" height=100 data-no-cache)
|
</figure>
|
||||||
figcaption.text-center li2
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/40654.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/39318.gif" height=100 data-no-cache)
|
<figcaption class="text-center">li2</figcaption>
|
||||||
figcaption.text-center shou3
|
</figure>
|
||||||
.w-100
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/39318.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/33251.gif" height=100 data-no-cache)
|
<figcaption class="text-center">shou3</figcaption>
|
||||||
figcaption.text-center chen2
|
</figure>
|
||||||
figure.d-inline-block
|
</div>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20239.gif" height=100 data-no-cache)
|
<div class="w-100">
|
||||||
figcaption.text-center fu2
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/33251.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/25102.gif" height=100 data-no-cache)
|
<figcaption class="text-center">chen2</figcaption>
|
||||||
figcaption.text-center rong2
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/32652.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20239.gif" height="100" />
|
||||||
figcaption.text-center qiang1
|
<figcaption class="text-center">fu2</figcaption>
|
||||||
```
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/25102.gif" height="100" />
|
||||||
|
<figcaption class="text-center">rong2</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/32652.gif" height="100" />
|
||||||
|
<figcaption class="text-center">qiang1</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
img[height="100"] {
|
img[height="100"] {
|
||||||
@@ -1,41 +1,50 @@
|
|||||||
---
|
---
|
||||||
title: "千字文 - 2/7"
|
title: "千字文 - 2/7"
|
||||||
date: "2019-09-01"
|
createdAt: 2019-09-01T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 汉字
|
- 汉字
|
||||||
---
|
---
|
||||||
|
|
||||||
```pug parsed
|
<div class="w-100 mt-3">
|
||||||
.w-100.mt-3
|
<h3 class="text-center">遐邇一體,率賓歸王。</h3>
|
||||||
h3.text-center 遐邇一體,率賓歸王。
|
</div>
|
||||||
.w-100
|
<div class="w-100">
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/36944.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/36944.gif" height="100" />
|
||||||
figcaption.text-center xia2
|
<figcaption class="text-center">xia2</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
.hanzi-img 邇
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center er3
|
<div class="hanzi-img">邇</div>
|
||||||
figure.d-inline-block
|
<figcaption class="text-center">er3</figcaption>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/19968.gif" height=100 data-no-cache)
|
</figure>
|
||||||
figcaption.text-center yi1
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/19968.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/39636.gif" height=100 data-no-cache)
|
<figcaption class="text-center">yi1</figcaption>
|
||||||
figcaption.text-center ti3
|
</figure>
|
||||||
.w-100
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/39636.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/29575.gif" height=100 data-no-cache)
|
<figcaption class="text-center">ti3</figcaption>
|
||||||
figcaption.text-center lu:4
|
</figure>
|
||||||
figure.d-inline-block
|
</div>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/36051.gif" height=100 data-no-cache)
|
<div class="w-100">
|
||||||
figcaption.text-center bin1
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/29575.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/27512.gif" height=100 data-no-cache)
|
<figcaption class="text-center">lu:4</figcaption>
|
||||||
figcaption.text-center gui1
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/29579.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/36051.gif" height="100" />
|
||||||
figcaption.text-center wang2
|
<figcaption class="text-center">bin1</figcaption>
|
||||||
```
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/27512.gif" height="100" />
|
||||||
|
<figcaption class="text-center">gui1</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/29579.gif" height="100" />
|
||||||
|
<figcaption class="text-center">wang2</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
img[height="100"] {
|
img[height="100"] {
|
||||||
@@ -1,41 +1,50 @@
|
|||||||
---
|
---
|
||||||
title: "千字文 - 2/8"
|
title: "千字文 - 2/8"
|
||||||
date: "2019-09-02"
|
createdAt: 2019-09-02T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 汉字
|
- 汉字
|
||||||
---
|
---
|
||||||
|
|
||||||
```pug parsed
|
<div class="w-100 mt-3">
|
||||||
.w-100.mt-3
|
<h3 class="text-center">鳴鳳在竹,白駒食場。</h3>
|
||||||
h3.text-center 鳴鳳在竹,白駒食場。
|
</div>
|
||||||
.w-100
|
<div class="w-100">
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/40180.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/40180.gif" height="100" />
|
||||||
figcaption.text-center ming2
|
<figcaption class="text-center">ming2</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/40179.gif" height=100 data-no-cache)
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center feng4
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/40179.gif" height="100" />
|
||||||
figure.d-inline-block
|
<figcaption class="text-center">feng4</figcaption>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/22312.gif" height=100 data-no-cache)
|
</figure>
|
||||||
figcaption.text-center zai4
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/22312.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/31481.gif" height=100 data-no-cache)
|
<figcaption class="text-center">zai4</figcaption>
|
||||||
figcaption.text-center zhu2
|
</figure>
|
||||||
.w-100
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/31481.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/30333.gif" height=100 data-no-cache)
|
<figcaption class="text-center">zhu2</figcaption>
|
||||||
figcaption.text-center bai2
|
</figure>
|
||||||
figure.d-inline-block
|
</div>
|
||||||
.hanzi-img 駒
|
<div class="w-100">
|
||||||
figcaption.text-center ju1
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/30333.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/39135.gif" height=100 data-no-cache)
|
<figcaption class="text-center">bai2</figcaption>
|
||||||
figcaption.text-center shi2
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/22580.gif" height=100 data-no-cache)
|
<div class="hanzi-img">駒</div>
|
||||||
figcaption.text-center chang2
|
<figcaption class="text-center">ju1</figcaption>
|
||||||
```
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/39135.gif" height="100" />
|
||||||
|
<figcaption class="text-center">shi2</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/22580.gif" height="100" />
|
||||||
|
<figcaption class="text-center">chang2</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
img[height="100"] {
|
img[height="100"] {
|
||||||
@@ -1,41 +1,51 @@
|
|||||||
---
|
---
|
||||||
title: "千字文 - 2/9"
|
title: "千字文 - 2/9"
|
||||||
date: "2019-09-03"
|
createdAt: 2019-09-03T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 汉字
|
- 汉字
|
||||||
---
|
---
|
||||||
|
|
||||||
```pug parsed
|
|
||||||
.w-100.mt-3
|
<div class="w-100 mt-3">
|
||||||
h3.text-center 化被草木,賴及萬方。
|
<h3 class="text-center">化被草木,賴及萬方。</h3>
|
||||||
.w-100
|
</div>
|
||||||
figure.d-inline-block
|
<div class="w-100">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/21270.gif" height=100 data-no-cache)
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center hua4
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/21270.gif" height="100" />
|
||||||
figure.d-inline-block
|
<figcaption class="text-center">hua4</figcaption>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/34987.gif" height=100 data-no-cache)
|
</figure>
|
||||||
figcaption.text-center bei4
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/34987.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/33609.gif" height=100 data-no-cache)
|
<figcaption class="text-center">bei4</figcaption>
|
||||||
figcaption.text-center cao3
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/26408.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/33609.gif" height="100" />
|
||||||
figcaption.text-center mu4
|
<figcaption class="text-center">cao3</figcaption>
|
||||||
.w-100
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/36084.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/26408.gif" height="100" />
|
||||||
figcaption.text-center lai4
|
<figcaption class="text-center">mu4</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/21450.gif" height=100 data-no-cache)
|
</div>
|
||||||
figcaption.text-center ji2
|
<div class="w-100">
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/33836.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/36084.gif" height="100" />
|
||||||
figcaption.text-center wan4
|
<figcaption class="text-center">lai4</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/26041.gif" height=100 data-no-cache)
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center fang1
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/21450.gif" height="100" />
|
||||||
```
|
<figcaption class="text-center">ji2</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/33836.gif" height="100" />
|
||||||
|
<figcaption class="text-center">wan4</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/26041.gif" height="100" />
|
||||||
|
<figcaption class="text-center">fang1</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
img[height="100"] {
|
img[height="100"] {
|
||||||
@@ -1,41 +1,50 @@
|
|||||||
---
|
---
|
||||||
title: "千字文 - 3/1"
|
title: "千字文 - 3/1"
|
||||||
date: "2019-09-12"
|
createdAt: 2019-09-12T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 汉字
|
- 汉字
|
||||||
---
|
---
|
||||||
|
|
||||||
```pug parsed
|
<div class="w-100 mt-3">
|
||||||
.w-100.mt-3
|
<h3 class="text-center">蓋此身髮,四大五常。</h3>
|
||||||
h3.text-center 蓋此身髮,四大五常。
|
</div>
|
||||||
.w-100
|
<div class="w-100">
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/33995.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/33995.gif" height="100" />
|
||||||
figcaption.text-center gai4
|
<figcaption class="text-center">gai4</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/27492.gif" height=100 data-no-cache)
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center ci3
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/27492.gif" height="100" />
|
||||||
figure.d-inline-block
|
<figcaption class="text-center">ci3</figcaption>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/36523.gif" height=100 data-no-cache)
|
</figure>
|
||||||
figcaption.text-center shen1
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/36523.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/39662.gif" height=100 data-no-cache)
|
<figcaption class="text-center">shen1</figcaption>
|
||||||
figcaption.text-center fa4
|
</figure>
|
||||||
.w-100
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/39662.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/22235.gif" height=100 data-no-cache)
|
<figcaption class="text-center">fa4</figcaption>
|
||||||
figcaption.text-center si4
|
</figure>
|
||||||
figure.d-inline-block
|
</div>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/22823.gif" height=100 data-no-cache)
|
<div class="w-100">
|
||||||
figcaption.text-center da4
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/22235.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20116.gif" height=100 data-no-cache)
|
<figcaption class="text-center">si4</figcaption>
|
||||||
figcaption.text-center wu3
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24120.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/22823.gif" height="100" />
|
||||||
figcaption.text-center chang2
|
<figcaption class="text-center">da4</figcaption>
|
||||||
```
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20116.gif" height="100" />
|
||||||
|
<figcaption class="text-center">wu3</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24120.gif" height="100" />
|
||||||
|
<figcaption class="text-center">chang2</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
img[height="100"] {
|
img[height="100"] {
|
||||||
@@ -1,41 +1,50 @@
|
|||||||
---
|
---
|
||||||
title: "千字文 - 3/2"
|
title: "千字文 - 3/2"
|
||||||
date: "2019-09-15"
|
createdAt: 2019-09-15T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 汉字
|
- 汉字
|
||||||
---
|
---
|
||||||
|
|
||||||
```pug parsed
|
<div class="w-100 mt-3">
|
||||||
.w-100.mt-3
|
<h3 class="text-center">恭惟鞠養,豈敢毀傷。</h3>
|
||||||
h3.text-center 恭惟鞠養,豈敢毀傷。
|
</div>
|
||||||
.w-100
|
<div class="w-100">
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24685.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24685.gif" height="100" />
|
||||||
figcaption.text-center gong1
|
<figcaption class="text-center">gong1</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24799.gif" height=100 data-no-cache)
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center wei2
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24799.gif" height="100" />
|
||||||
figure.d-inline-block
|
<figcaption class="text-center">wei2</figcaption>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/38816.gif" height=100 data-no-cache)
|
</figure>
|
||||||
figcaption.text-center ju1
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/38816.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/39178.gif" height=100 data-no-cache)
|
<figcaption class="text-center">ju1</figcaption>
|
||||||
figcaption.text-center yang3
|
</figure>
|
||||||
.w-100
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/39178.gif" height="100" />
|
||||||
.hanzi-img 豈
|
<figcaption class="text-center">yang3</figcaption>
|
||||||
figcaption.text-center qi3
|
</figure>
|
||||||
figure.d-inline-block
|
</div>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/25954.gif" height=100 data-no-cache)
|
<div class="w-100">
|
||||||
figcaption.text-center gan3
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<div class="hanzi-img">豈</div>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/27584.gif" height=100 data-no-cache)
|
<figcaption class="text-center">qi3</figcaption>
|
||||||
figcaption.text-center hui3
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20663.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/25954.gif" height="100" />
|
||||||
figcaption.text-center shang1
|
<figcaption class="text-center">gan3</figcaption>
|
||||||
```
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/27584.gif" height="100" />
|
||||||
|
<figcaption class="text-center">hui3</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20663.gif" height="100" />
|
||||||
|
<figcaption class="text-center">shang1</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
img[height="100"] {
|
img[height="100"] {
|
||||||
@@ -1,41 +1,50 @@
|
|||||||
---
|
---
|
||||||
title: "千字文 - 3/3"
|
title: "千字文 - 3/3"
|
||||||
date: "2019-09-23"
|
createdAt: 2019-09-23T00:00:00+07:00
|
||||||
tag:
|
tag:
|
||||||
- 千字文
|
- 千字文
|
||||||
- 汉字
|
- 汉字
|
||||||
---
|
---
|
||||||
|
|
||||||
```pug parsed
|
<div class="w-100 mt-3">
|
||||||
.w-100.mt-3
|
<h3 class="text-center">女慕貞絜,男效才良。</h3>
|
||||||
h3.text-center 女慕貞絜,男效才良。
|
</div>
|
||||||
.w-100
|
<div class="w-100">
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/22899.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/22899.gif" height="100" />
|
||||||
figcaption.text-center nu:3
|
<figcaption class="text-center">nu:3</figcaption>
|
||||||
figure.d-inline-block
|
</figure>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24917.gif" height=100 data-no-cache)
|
<figure class="d-inline-block">
|
||||||
figcaption.text-center mu4
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24917.gif" height="100" />
|
||||||
figure.d-inline-block
|
<figcaption class="text-center">mu4</figcaption>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/35998.gif" height=100 data-no-cache)
|
</figure>
|
||||||
figcaption.text-center zhen1
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/35998.gif" height="100" />
|
||||||
.hanzi-img 絜
|
<figcaption class="text-center">zhen1</figcaption>
|
||||||
figcaption.text-center xie2
|
</figure>
|
||||||
.w-100
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<div class="hanzi-img">絜</div>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/30007.gif" height=100 data-no-cache)
|
<figcaption class="text-center">xie2</figcaption>
|
||||||
figcaption.text-center nan2
|
</figure>
|
||||||
figure.d-inline-block
|
</div>
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/25928.gif" height=100 data-no-cache)
|
<div class="w-100">
|
||||||
figcaption.text-center xiao4
|
<figure class="d-inline-block">
|
||||||
figure.d-inline-block
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/30007.gif" height="100" />
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/25165.gif" height=100 data-no-cache)
|
<figcaption class="text-center">nan2</figcaption>
|
||||||
figcaption.text-center cai2
|
</figure>
|
||||||
figure.d-inline-block
|
<figure class="d-inline-block">
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/33391.gif" height=100 data-no-cache)
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/25928.gif" height="100" />
|
||||||
figcaption.text-center liang2
|
<figcaption class="text-center">xiao4</figcaption>
|
||||||
```
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/25165.gif" height="100" />
|
||||||
|
<figcaption class="text-center">cai2</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure class="d-inline-block">
|
||||||
|
<img src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/33391.gif" height="100" />
|
||||||
|
<figcaption class="text-center">liang2</figcaption>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
img[height="100"] {
|
img[height="100"] {
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
# editorconfig.org
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
env: {
|
||||||
|
browser: true,
|
||||||
|
node: true,
|
||||||
|
},
|
||||||
|
extends: [
|
||||||
|
'@nuxtjs/eslint-config-typescript',
|
||||||
|
'prettier',
|
||||||
|
'prettier/vue',
|
||||||
|
'plugin:prettier/recommended',
|
||||||
|
'plugin:nuxt/recommended',
|
||||||
|
],
|
||||||
|
plugins: ['prettier'],
|
||||||
|
// add your custom rules here
|
||||||
|
rules: {
|
||||||
|
'require-await': 0,
|
||||||
|
'vue/no-v-html': 0,
|
||||||
|
'import/order': 0,
|
||||||
|
},
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
# This file specifies files that are *not* uploaded to Google Cloud Platform
|
||||||
|
# using gcloud. It follows the same syntax as .gitignore, with the addition of
|
||||||
|
# "#!include" directives (which insert the entries of the given .gitignore-style
|
||||||
|
# file at that point).
|
||||||
|
#
|
||||||
|
# For more information, run:
|
||||||
|
# $ gcloud topic gcloudignore
|
||||||
|
#
|
||||||
|
.gcloudignore
|
||||||
|
# If you would like to upload your .git directory, .gitignore file or files
|
||||||
|
# from your .gitignore file, remove the corresponding line
|
||||||
|
# below:
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
|
||||||
|
# Node.js dependencies:
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
/scripts/
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
# Created by .ignore support plugin (hsz.mobi)
|
||||||
|
### Node template
|
||||||
|
# Logs
|
||||||
|
/logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
*.pid.lock
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
lib-cov
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
coverage
|
||||||
|
|
||||||
|
# nyc test coverage
|
||||||
|
.nyc_output
|
||||||
|
|
||||||
|
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
||||||
|
.grunt
|
||||||
|
|
||||||
|
# Bower dependency directory (https://bower.io/)
|
||||||
|
bower_components
|
||||||
|
|
||||||
|
# node-waf configuration
|
||||||
|
.lock-wscript
|
||||||
|
|
||||||
|
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||||
|
build/Release
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
|
node_modules/
|
||||||
|
jspm_packages/
|
||||||
|
|
||||||
|
# TypeScript v1 declaration files
|
||||||
|
typings/
|
||||||
|
|
||||||
|
# Optional npm cache directory
|
||||||
|
.npm
|
||||||
|
|
||||||
|
# Optional eslint cache
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
|
# Optional REPL history
|
||||||
|
.node_repl_history
|
||||||
|
|
||||||
|
# Output of 'npm pack'
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# Yarn Integrity file
|
||||||
|
.yarn-integrity
|
||||||
|
|
||||||
|
# dotenv environment variables file
|
||||||
|
.env
|
||||||
|
|
||||||
|
# parcel-bundler cache (https://parceljs.org/)
|
||||||
|
.cache
|
||||||
|
|
||||||
|
# next.js build output
|
||||||
|
.next
|
||||||
|
|
||||||
|
# nuxt.js build output
|
||||||
|
.nuxt
|
||||||
|
|
||||||
|
# Nuxt generate
|
||||||
|
dist
|
||||||
|
|
||||||
|
# vuepress build output
|
||||||
|
.vuepress/dist
|
||||||
|
|
||||||
|
# Serverless directories
|
||||||
|
.serverless
|
||||||
|
|
||||||
|
# IDE / Editor
|
||||||
|
.idea
|
||||||
|
|
||||||
|
# Service worker
|
||||||
|
sw.*
|
||||||
|
|
||||||
|
# macOS
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Vim swap files
|
||||||
|
*.swp
|
||||||
|
|
||||||
|
/built/
|
||||||
|
/static/media/
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"semi": false,
|
||||||
|
"singleQuote": true
|
||||||
|
}
|
||||||
Vendored
+4
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"editor.formatOnSave": true,
|
||||||
|
"editor.defaultFormatter": "rvest.vs-code-prettier-eslint"
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
# zhdiary
|
||||||
|
|
||||||
|
## Build Setup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# install dependencies
|
||||||
|
$ yarn install
|
||||||
|
|
||||||
|
# serve with hot reload at localhost:3000
|
||||||
|
$ yarn dev
|
||||||
|
|
||||||
|
# build for production and launch server
|
||||||
|
$ yarn build
|
||||||
|
$ yarn start
|
||||||
|
|
||||||
|
# generate static project
|
||||||
|
$ yarn generate
|
||||||
|
```
|
||||||
|
|
||||||
|
For detailed explanation on how things work, check out [Nuxt.js docs](https://nuxtjs.org).
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
runtime: nodejs12
|
||||||
|
|
||||||
|
instance_class: F2
|
||||||
|
|
||||||
|
handlers:
|
||||||
|
- url: /_nuxt
|
||||||
|
static_dir: .nuxt/dist/client
|
||||||
|
secure: always
|
||||||
|
|
||||||
|
- url: /(.*\.(gif|png|jpg|ico|txt))$
|
||||||
|
static_files: static/\1
|
||||||
|
upload: static/.*\.(gif|png|jpg|ico|txt)$
|
||||||
|
secure: always
|
||||||
|
|
||||||
|
- url: /.*
|
||||||
|
script: auto
|
||||||
|
secure: always
|
||||||
|
|
||||||
|
env_variables:
|
||||||
|
HOST: '0.0.0.0'
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
export default function () {
|
||||||
|
return { x: 0, y: 0 }
|
||||||
|
}
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
interface IPostTeaser {
|
||||||
|
title: string
|
||||||
|
path: string
|
||||||
|
date?: string
|
||||||
|
excerpt: string
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
import type { ITheme } from '~/server/theme'
|
||||||
|
|
||||||
|
export const THEME: ITheme = JSON.parse(process.env.THEME!)
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
/* eslint-disable camelcase */
|
||||||
|
|
||||||
|
import { THEME } from './global'
|
||||||
|
|
||||||
|
export type Theme = 'light' | 'dark'
|
||||||
|
|
||||||
|
export interface CommentsConfig {
|
||||||
|
host: string
|
||||||
|
site_id: string
|
||||||
|
url?: string
|
||||||
|
max_shown_comments?: number
|
||||||
|
theme?: Theme
|
||||||
|
page_title?: string
|
||||||
|
node?: string | HTMLElement
|
||||||
|
locale?: string
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
__colors__?: any
|
||||||
|
}
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
interface Window {
|
||||||
|
remark_config: CommentsConfig
|
||||||
|
REMARK42: {
|
||||||
|
changeTheme(theme: Theme): void
|
||||||
|
destroy?: () => void
|
||||||
|
createInstance: (
|
||||||
|
remark_config: CommentsConfig
|
||||||
|
) =>
|
||||||
|
| {
|
||||||
|
changeTheme(theme: Theme): void
|
||||||
|
destroy(): void
|
||||||
|
}
|
||||||
|
| undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.browser && THEME?.comment?.remark42) {
|
||||||
|
;(function (c) {
|
||||||
|
for (let i = 0; i < c.length; i++) {
|
||||||
|
const d = document
|
||||||
|
const s = d.createElement('script')
|
||||||
|
s.src = THEME.comment.remark42.host + '/web/' + c[i] + '.js'
|
||||||
|
s.defer = true
|
||||||
|
;(d.head || d.body).appendChild(s)
|
||||||
|
}
|
||||||
|
})(['embed'])
|
||||||
|
}
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
<template>
|
||||||
|
<article>
|
||||||
|
<post-teaser v-for="p in posts" :key="p.path" :post="p"></post-teaser>
|
||||||
|
|
||||||
|
<nav v-if="count > 5">
|
||||||
|
<ul>
|
||||||
|
<li v-if="page > 1">
|
||||||
|
<nuxt-link :to="makePageUrl(1)" aria-label="page 1">1</nuxt-link>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li v-if="page > 3">
|
||||||
|
<span> … </span>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li v-if="page > 2">
|
||||||
|
<nuxt-link
|
||||||
|
:to="makePageUrl(page - 1)"
|
||||||
|
:aria-label="`page ${page - 1}`"
|
||||||
|
>
|
||||||
|
{{ page - 1 }}
|
||||||
|
</nuxt-link>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<span>
|
||||||
|
{{ page }}
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li v-if="page < total - 1">
|
||||||
|
<nuxt-link
|
||||||
|
:to="makePageUrl(page + 1)"
|
||||||
|
:aria-label="`page ${page + 1}`"
|
||||||
|
>
|
||||||
|
{{ page + 1 }}
|
||||||
|
</nuxt-link>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li v-if="page < total - 2">
|
||||||
|
<span> … </span>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li v-if="page < total">
|
||||||
|
<nuxt-link :to="makePageUrl(total)" :aria-label="`page ${total}`">
|
||||||
|
{{ total }}
|
||||||
|
</nuxt-link>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</article>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { Vue, Component, Prop } from 'nuxt-property-decorator'
|
||||||
|
|
||||||
|
@Component
|
||||||
|
export default class PostQuery extends Vue {
|
||||||
|
@Prop({ required: true }) posts!: IPostTeaser[]
|
||||||
|
@Prop({ required: true }) count!: number
|
||||||
|
|
||||||
|
get page() {
|
||||||
|
return parseInt((this.$route.query.page as string) || '1')
|
||||||
|
}
|
||||||
|
|
||||||
|
get total() {
|
||||||
|
return Math.ceil(this.count / 5)
|
||||||
|
}
|
||||||
|
|
||||||
|
makePageUrl(page: number) {
|
||||||
|
return this.$router.resolve({
|
||||||
|
path: this.$route.path,
|
||||||
|
query: {
|
||||||
|
...this.$route.query,
|
||||||
|
page: page.toString(),
|
||||||
|
},
|
||||||
|
}).href
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
<template>
|
||||||
|
<section>
|
||||||
|
<h2>
|
||||||
|
<nuxt-link :to="'post/' + post.path">
|
||||||
|
{{ post.title }}
|
||||||
|
</nuxt-link>
|
||||||
|
</h2>
|
||||||
|
<small>
|
||||||
|
<span>
|
||||||
|
by
|
||||||
|
<a
|
||||||
|
v-if="theme.author.url"
|
||||||
|
:href="theme.author.url"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener"
|
||||||
|
>
|
||||||
|
{{ theme.author.name }}
|
||||||
|
</a>
|
||||||
|
<span v-else>
|
||||||
|
{{ theme.author.name }}
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
<span v-if="post.date" style="float: right">
|
||||||
|
{{ post.date | formatDate }}
|
||||||
|
</span>
|
||||||
|
</small>
|
||||||
|
|
||||||
|
<article v-html="post.excerpt"></article>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { Vue, Component, Prop } from 'nuxt-property-decorator'
|
||||||
|
import { THEME } from '~/assets/global'
|
||||||
|
|
||||||
|
@Component
|
||||||
|
export default class PostTeaser extends Vue {
|
||||||
|
@Prop() post!: IPostTeaser
|
||||||
|
|
||||||
|
theme = THEME
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
article {
|
||||||
|
margin-top: 2em;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
<template>
|
||||||
|
<main>
|
||||||
|
<header>
|
||||||
|
<h1>{{ theme.title }}</h1>
|
||||||
|
|
||||||
|
<nav>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<nuxt-link to="/">Home</nuxt-link>
|
||||||
|
</li>
|
||||||
|
<li v-for="(n, i) in theme.nav || []" :key="i">
|
||||||
|
<nuxt-link v-if="n.to" :to="n.to">{{ n.name }}</nuxt-link>
|
||||||
|
<a v-else :href="n.href" target="_blank" rel="noopener">
|
||||||
|
{{ n.name }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<form @submit.prevent="doSearch">
|
||||||
|
<input v-model="q" type="search" placeholder="Search..." />
|
||||||
|
<div class="icon">🔎</div>
|
||||||
|
</form>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<Nuxt />
|
||||||
|
</main>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { Vue, Component } from 'nuxt-property-decorator'
|
||||||
|
import { THEME } from '~/assets/global'
|
||||||
|
|
||||||
|
@Component
|
||||||
|
export default class DefaultLayout extends Vue {
|
||||||
|
theme = THEME
|
||||||
|
q = this.$route.query.q || ''
|
||||||
|
|
||||||
|
doSearch() {
|
||||||
|
let path = this.$route.path
|
||||||
|
if (['/blog', '/tag'].includes(path)) {
|
||||||
|
path = '/blog'
|
||||||
|
}
|
||||||
|
|
||||||
|
this.$router.push({
|
||||||
|
path,
|
||||||
|
query: {
|
||||||
|
q: this.q,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
nav ul {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
form {
|
||||||
|
float: right;
|
||||||
|
max-width: 300px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
form .icon {
|
||||||
|
position: absolute;
|
||||||
|
right: 5px;
|
||||||
|
top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
padding-right: 1.5em;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<section>
|
||||||
|
<h2 v-if="error.statusCode === 404">Page not found</h2>
|
||||||
|
<pre v-else style="width: 100%">{{ error }}</pre>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<NuxtLink to="/">Home page</NuxtLink>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
// eslint-disable-next-line vue/require-prop-types
|
||||||
|
props: ['error'],
|
||||||
|
layout: 'error', // you can set a custom layout for the error page
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
# MIDDLEWARE
|
||||||
|
|
||||||
|
**This directory is not required, you can delete it if you don't want to use it.**
|
||||||
|
|
||||||
|
This directory contains your application middleware.
|
||||||
|
Middleware let you define custom functions that can be run before rendering either a page or a group of pages.
|
||||||
|
|
||||||
|
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/routing#middleware).
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
import { NuxtConfig } from '@nuxt/types'
|
||||||
|
|
||||||
|
import { getTheme } from './server/theme'
|
||||||
|
|
||||||
|
const config = async (): Promise<NuxtConfig> => {
|
||||||
|
const theme = getTheme()
|
||||||
|
const PORT = process.env.PORT || '3000'
|
||||||
|
|
||||||
|
return {
|
||||||
|
// Global page headers (https://go.nuxtjs.dev/config-head)
|
||||||
|
head: {
|
||||||
|
title: theme.title,
|
||||||
|
meta: [
|
||||||
|
{ charset: 'utf-8' },
|
||||||
|
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
|
||||||
|
{
|
||||||
|
hid: 'description',
|
||||||
|
name: 'description',
|
||||||
|
content: theme.description || '',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
link: [
|
||||||
|
{ rel: 'icon', type: 'image/x-icon', href: '/media/favicon.ico' },
|
||||||
|
{
|
||||||
|
rel: 'stylesheet',
|
||||||
|
href: theme.awsm
|
||||||
|
? `https://unpkg.com/awsm.css/dist/awsm_theme_${theme.awsm}.min.css`
|
||||||
|
: 'https://unpkg.com/awsm.css/dist/awsm.min.css',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
script: [
|
||||||
|
...(theme.analytics?.plausible
|
||||||
|
? [
|
||||||
|
{
|
||||||
|
src: 'https://plausible.io/js/plausible.js',
|
||||||
|
async: true,
|
||||||
|
defer: true,
|
||||||
|
'data-domain': theme.analytics?.plausible,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
: []),
|
||||||
|
{
|
||||||
|
src:
|
||||||
|
'https://unpkg.com/@webcomponents/webcomponentsjs/webcomponents-loader.js',
|
||||||
|
defer: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'module',
|
||||||
|
src: '/webcomponents.js',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
// Global CSS (https://go.nuxtjs.dev/config-css)
|
||||||
|
css: [],
|
||||||
|
|
||||||
|
// Plugins to run before rendering page (https://go.nuxtjs.dev/config-plugins)
|
||||||
|
plugins: [
|
||||||
|
'~/plugins/axios-fix.ts',
|
||||||
|
'~/plugins/format.ts',
|
||||||
|
'~/plugins/remark42.client.js',
|
||||||
|
],
|
||||||
|
|
||||||
|
// Auto import components (https://go.nuxtjs.dev/config-components)
|
||||||
|
components: true,
|
||||||
|
|
||||||
|
// Modules for dev and build (recommended) (https://go.nuxtjs.dev/config-modules)
|
||||||
|
buildModules: [
|
||||||
|
// https://go.nuxtjs.dev/typescript
|
||||||
|
'@nuxt/typescript-build',
|
||||||
|
],
|
||||||
|
|
||||||
|
// Modules (https://go.nuxtjs.dev/config-modules)
|
||||||
|
modules: ['@nuxtjs/axios'],
|
||||||
|
|
||||||
|
// Build Configuration (https://go.nuxtjs.dev/config-build)
|
||||||
|
build: {},
|
||||||
|
env: {
|
||||||
|
THEME: JSON.stringify(theme),
|
||||||
|
PORT,
|
||||||
|
},
|
||||||
|
serverMiddleware: [{ path: '/api', handler: '~/server/index.ts' }],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default config
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
{
|
||||||
|
"name": "@patarapolw/nuxt-awsm",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"dev": "nuxt-ts",
|
||||||
|
"build": "nuxt-ts build",
|
||||||
|
"start": "nuxt-ts start",
|
||||||
|
"generate": "nuxt-ts generate",
|
||||||
|
"lint:js": "eslint --ext .ts,.js,.vue --ignore-path .gitignore .",
|
||||||
|
"lint": "yarn lint:js",
|
||||||
|
"ts": "ts-node -O '{\"module\":\"commonjs\"}'",
|
||||||
|
"ts:prepare": "yarn ts scripts/prepare.ts",
|
||||||
|
"predeploy": "yarn build",
|
||||||
|
"deploy": "gcloud app deploy"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@nuxt/typescript-runtime": "^2.0.0",
|
||||||
|
"@nuxtjs/axios": "^5.12.4",
|
||||||
|
"@patarapolw/scope-css": "^1.3.0",
|
||||||
|
"@types/express": "^4.17.9",
|
||||||
|
"@types/js-yaml": "^3.12.5",
|
||||||
|
"@types/morgan": "^1.9.2",
|
||||||
|
"better-sqlite3": "^7.1.1",
|
||||||
|
"cheerio": "^1.0.0-rc.3",
|
||||||
|
"core-js": "^3.6.5",
|
||||||
|
"express": "^4.17.1",
|
||||||
|
"js-yaml": "^3.14.1",
|
||||||
|
"morgan": "^1.10.0",
|
||||||
|
"nuxt": "^2.14.6",
|
||||||
|
"nuxt-property-decorator": "^2.8.8",
|
||||||
|
"showdown": "^1.9.1",
|
||||||
|
"zod": "^1.11.11"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@nuxt/types": "^2.14.6",
|
||||||
|
"@nuxt/typescript-build": "^2.0.3",
|
||||||
|
"@nuxtjs/eslint-config": "^3.1.0",
|
||||||
|
"@nuxtjs/eslint-config-typescript": "^3.0.0",
|
||||||
|
"@nuxtjs/eslint-module": "^2.0.0",
|
||||||
|
"@types/better-sqlite3": "^5.4.1",
|
||||||
|
"@types/cheerio": "^0.22.23",
|
||||||
|
"@types/ejs": "^3.0.5",
|
||||||
|
"@types/fs-extra": "^9.0.5",
|
||||||
|
"@types/rimraf": "^3.0.0",
|
||||||
|
"@types/showdown": "^1.9.3",
|
||||||
|
"babel-eslint": "^10.1.0",
|
||||||
|
"dotenv": "^8.2.0",
|
||||||
|
"ejs": "^3.1.5",
|
||||||
|
"eslint": "^7.10.0",
|
||||||
|
"eslint-config-prettier": "^6.12.0",
|
||||||
|
"eslint-plugin-nuxt": "^1.0.0",
|
||||||
|
"eslint-plugin-prettier": "^3.1.4",
|
||||||
|
"import-sort-parser-typescript": "^6.0.0",
|
||||||
|
"nodejieba": "^2.5.1",
|
||||||
|
"prettier": "^2.1.2",
|
||||||
|
"ts-node": "^9.1.1",
|
||||||
|
"typescript": "4.0.5"
|
||||||
|
},
|
||||||
|
"importSort": {
|
||||||
|
".ts, .tsx, .config.ts": {
|
||||||
|
"parser": "typescript",
|
||||||
|
"style": "module"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "12",
|
||||||
|
"npm": "please-use-yarn",
|
||||||
|
"yarn": "1",
|
||||||
|
"pnpm": "please-use-yarn"
|
||||||
|
},
|
||||||
|
"engineStrict": true
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
<template>
|
||||||
|
<p v-if="$fetchState.pending"></p>
|
||||||
|
<p v-else-if="$fetchState.error">
|
||||||
|
An error occurred {{ $fetchState.error.message }}
|
||||||
|
</p>
|
||||||
|
<p v-else-if="!posts.length">No posts found.</p>
|
||||||
|
<post-query v-else :posts="posts" :count="count" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { Vue, Component } from 'nuxt-property-decorator'
|
||||||
|
|
||||||
|
@Component<BlogPage>({
|
||||||
|
watch: {
|
||||||
|
'$route.query.q': '$fetch',
|
||||||
|
'$route.query.page': '$fetch',
|
||||||
|
},
|
||||||
|
async fetch() {
|
||||||
|
const { result, count } = await this.$axios.$get('/api/q', {
|
||||||
|
params: {
|
||||||
|
q: this.$route.query.q,
|
||||||
|
page: this.$route.query.page,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
this.posts = result
|
||||||
|
this.count = count
|
||||||
|
},
|
||||||
|
})
|
||||||
|
export default class BlogPage extends Vue {
|
||||||
|
posts: IPostTeaser[] = []
|
||||||
|
count = 0
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue'
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
middleware: (ctx) => {
|
||||||
|
ctx.redirect('/blog')
|
||||||
|
},
|
||||||
|
})
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
<template>
|
||||||
|
<p v-if="$fetchState.pending"></p>
|
||||||
|
<p v-else-if="$fetchState.error">
|
||||||
|
An error occurred {{ $fetchState.error.message }}
|
||||||
|
</p>
|
||||||
|
<section v-else>
|
||||||
|
<section>
|
||||||
|
<h2>
|
||||||
|
{{ post.title }}
|
||||||
|
</h2>
|
||||||
|
<small>
|
||||||
|
<span>
|
||||||
|
by
|
||||||
|
<a
|
||||||
|
v-if="theme.author.url"
|
||||||
|
:href="theme.author.url"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener"
|
||||||
|
>
|
||||||
|
{{ theme.author.name }}
|
||||||
|
</a>
|
||||||
|
<span v-else>
|
||||||
|
{{ theme.author.name }}
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
<span v-if="post.date" style="float: right">
|
||||||
|
{{ post.date | formatDate }}
|
||||||
|
</span>
|
||||||
|
</small>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section v-html="post.content"></section>
|
||||||
|
|
||||||
|
<section class="tags-container">
|
||||||
|
<span>Tags:</span>
|
||||||
|
<span v-for="t in post.tag || []" :key="t">
|
||||||
|
<nuxt-link :to="`/tag/${t}`">
|
||||||
|
{{ t }}
|
||||||
|
</nuxt-link>
|
||||||
|
</span>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<footer v-if="remark42settings">
|
||||||
|
<div ref="remark42" />
|
||||||
|
</footer>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { Vue, Component, Watch } from 'nuxt-property-decorator'
|
||||||
|
import { THEME } from '~/assets/global'
|
||||||
|
import '~/assets/remark42'
|
||||||
|
|
||||||
|
@Component<PostPage>({
|
||||||
|
async fetch() {
|
||||||
|
const r = await this.$axios.$get('/api', {
|
||||||
|
params: {
|
||||||
|
path: this.$route.params.pathMatch,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
this.post = r
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.initRemark42()
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
if (this.remark42Instance) {
|
||||||
|
this.remark42Instance.destroy()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
})
|
||||||
|
export default class PostPage extends Vue {
|
||||||
|
post: {
|
||||||
|
date?: string
|
||||||
|
title: string
|
||||||
|
image?: string
|
||||||
|
tag?: string[]
|
||||||
|
category?: string
|
||||||
|
content: string
|
||||||
|
} | null = null
|
||||||
|
|
||||||
|
theme = THEME
|
||||||
|
|
||||||
|
remark42settings = THEME.comment?.remark42 || null
|
||||||
|
remark42Instance: any = null
|
||||||
|
|
||||||
|
@Watch('$fetchState.pending')
|
||||||
|
initRemark42() {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
if (
|
||||||
|
this.$refs.remark42 &&
|
||||||
|
process.browser &&
|
||||||
|
this.remark42settings &&
|
||||||
|
window.REMARK42
|
||||||
|
) {
|
||||||
|
if (this.remark42Instance) {
|
||||||
|
this.remark42Instance.destroy()
|
||||||
|
}
|
||||||
|
|
||||||
|
this.remark42Instance = window.REMARK42.createInstance({
|
||||||
|
node: this.$refs.remark42 as HTMLElement,
|
||||||
|
host: this.remark42settings.host,
|
||||||
|
site_id: this.remark42settings.siteId,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.tags-container > span + span {
|
||||||
|
margin-left: 0.6em;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
<template>
|
||||||
|
<p v-if="$fetchState.pending"></p>
|
||||||
|
<p v-else-if="$fetchState.error">An error occurred {{ $fetchState.error }}</p>
|
||||||
|
<post-query v-else :posts="posts" :count="count" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { Vue, Component } from 'nuxt-property-decorator'
|
||||||
|
|
||||||
|
@Component<TagPage>({
|
||||||
|
watch: {
|
||||||
|
'$route.query.q': '$fetch',
|
||||||
|
'$route.query.page': '$fetch',
|
||||||
|
},
|
||||||
|
async fetch() {
|
||||||
|
const { result, count } = await this.$axios.$get('/api/q', {
|
||||||
|
params: {
|
||||||
|
q: this.$route.query.q,
|
||||||
|
page: this.$route.query.page,
|
||||||
|
tag: this.$route.params.tag,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
this.posts = result
|
||||||
|
this.count = count
|
||||||
|
},
|
||||||
|
})
|
||||||
|
export default class TagPage extends Vue {
|
||||||
|
posts: IPostTeaser[] = []
|
||||||
|
count = 0
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
import { Plugin } from '@nuxt/types'
|
||||||
|
|
||||||
|
const plugin: Plugin = ({ $axios, error }) => {
|
||||||
|
if (typeof location !== 'undefined') {
|
||||||
|
$axios.defaults.baseURL = location.origin
|
||||||
|
}
|
||||||
|
|
||||||
|
$axios.interceptors.response.use(
|
||||||
|
(r) => {
|
||||||
|
if (r.data?.error) {
|
||||||
|
error({
|
||||||
|
statusCode: r.status,
|
||||||
|
message: r.data.error,
|
||||||
|
})
|
||||||
|
throw new Error(r.data.error)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r
|
||||||
|
},
|
||||||
|
(err) => {
|
||||||
|
error({
|
||||||
|
statusCode: err.response.status,
|
||||||
|
message: err.toJSON(),
|
||||||
|
})
|
||||||
|
|
||||||
|
return Promise.reject(err)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default plugin
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
import Vue from 'vue'
|
||||||
|
|
||||||
|
Vue.filter('formatDate', (s: string) => {
|
||||||
|
return s
|
||||||
|
? new Date(s).toLocaleDateString([], {
|
||||||
|
year: 'numeric',
|
||||||
|
month: 'long',
|
||||||
|
day: 'numeric',
|
||||||
|
weekday: 'short',
|
||||||
|
})
|
||||||
|
: ''
|
||||||
|
})
|
||||||
Whitespace-only changes.
@@ -0,0 +1,19 @@
|
|||||||
|
import fs from 'fs'
|
||||||
|
import path from 'path'
|
||||||
|
|
||||||
|
import dotenv from 'dotenv'
|
||||||
|
|
||||||
|
import { THEME_FILENAME } from '../server/theme'
|
||||||
|
|
||||||
|
dotenv.config({ path: '../../.env' })
|
||||||
|
dotenv.config()
|
||||||
|
|
||||||
|
export const CONTENT_PATH = path.resolve(
|
||||||
|
process.env.CONTENT_PATH ||
|
||||||
|
(fs.existsSync('../../_posts') ? '../..' : 'content')
|
||||||
|
)
|
||||||
|
|
||||||
|
export const srcPath = (
|
||||||
|
root: '_posts' | '_media' | typeof THEME_FILENAME,
|
||||||
|
...ps: string[]
|
||||||
|
): string => path.join(CONTENT_PATH, root, ...ps)
|
||||||
@@ -0,0 +1,148 @@
|
|||||||
|
import crypto from 'crypto'
|
||||||
|
|
||||||
|
import scopeCss from '@patarapolw/scope-css'
|
||||||
|
import cheerio from 'cheerio'
|
||||||
|
import ejs from 'ejs'
|
||||||
|
import jieba from 'nodejieba'
|
||||||
|
import showdown from 'showdown'
|
||||||
|
|
||||||
|
export class MakeHTML {
|
||||||
|
$ = cheerio.load('')
|
||||||
|
|
||||||
|
mdConverter = new showdown.Converter({
|
||||||
|
noHeaderId: true,
|
||||||
|
parseImgDimensions: true,
|
||||||
|
simplifiedAutoLink: true,
|
||||||
|
// literalMidWordUnderscores: true,
|
||||||
|
strikethrough: true,
|
||||||
|
tables: true,
|
||||||
|
tasklists: true,
|
||||||
|
// simpleLineBreaks: true,
|
||||||
|
openLinksInNewWindow: true,
|
||||||
|
backslashEscapesHTMLTags: true,
|
||||||
|
emoji: true,
|
||||||
|
underline: true,
|
||||||
|
disableForced4SpacesIndentedSublists: true,
|
||||||
|
metadata: true,
|
||||||
|
})
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.mdConverter.addExtension(
|
||||||
|
{
|
||||||
|
type: 'lang',
|
||||||
|
regex: /\\\n/g,
|
||||||
|
replace: '<br />',
|
||||||
|
},
|
||||||
|
'commonmark-simple-linebreak'
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ! For some reasons default underscore italic fails to render...
|
||||||
|
*/
|
||||||
|
this.mdConverter.addExtension(
|
||||||
|
{
|
||||||
|
type: 'lang',
|
||||||
|
regex: /([^\\])_{1}(.*?[^\\])_{1}/g,
|
||||||
|
replace: '$1<i>$2</i>',
|
||||||
|
},
|
||||||
|
'underscore-italic'
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ! This is the only way to preserve syntax highlighting, while output multiline strings correctly
|
||||||
|
*/
|
||||||
|
this.mdConverter.addExtension(
|
||||||
|
{
|
||||||
|
type: 'lang',
|
||||||
|
regex: /(^|\n)```html parsed([^]+)\n```\n/g,
|
||||||
|
replace: (_: string, p1: string, p2: string) => {
|
||||||
|
return (
|
||||||
|
p1 +
|
||||||
|
ejs.render(p2, {
|
||||||
|
rmWhitespace: true,
|
||||||
|
beautify: false,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'html-parsed'
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
async parse(
|
||||||
|
filename: string
|
||||||
|
): Promise<{
|
||||||
|
$: cheerio.Cheerio
|
||||||
|
html(): string
|
||||||
|
clean(): string
|
||||||
|
}> {
|
||||||
|
const id =
|
||||||
|
'md-' +
|
||||||
|
crypto
|
||||||
|
.createHash('sha256')
|
||||||
|
.update(filename)
|
||||||
|
.digest()
|
||||||
|
.toString('hex')
|
||||||
|
.substr(0, 8)
|
||||||
|
|
||||||
|
const $div = this.$(`<div id="${id}">`)
|
||||||
|
$div.html(await this.getHTML(filename))
|
||||||
|
$div.find('style').each((_, el) => {
|
||||||
|
const $el = this.$(el)
|
||||||
|
const html = $el.html() || ''
|
||||||
|
if (html.trim()) {
|
||||||
|
$el.html(scopeCss(html, `#${id}`))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return {
|
||||||
|
$: $div,
|
||||||
|
html: () => {
|
||||||
|
return this.$('<div>').append($div).html() || ''
|
||||||
|
},
|
||||||
|
clean: () => {
|
||||||
|
return jieba.cutForSearch($div.text() || '').join(' ')
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async getHTML(filename: string) {
|
||||||
|
return this.mdConverter.makeHtml(
|
||||||
|
await ejs.renderFile(filename, {
|
||||||
|
youtube: (id: string) =>
|
||||||
|
ejs.render(
|
||||||
|
/* html */ `
|
||||||
|
<div style="position:relative;padding-top:56.25%;">
|
||||||
|
<iframe src="https://www.youtube.com/embed/${id}"
|
||||||
|
frameborder="0"
|
||||||
|
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
|
||||||
|
allowfullscreen
|
||||||
|
style="position:absolute;top:0;left:0;width:100%;height:100%"></iframe>
|
||||||
|
</div>`,
|
||||||
|
{ rmWhitespace: true, beautify: false }
|
||||||
|
),
|
||||||
|
xCard: (opts: {
|
||||||
|
href: string
|
||||||
|
image?: string
|
||||||
|
title: string
|
||||||
|
description?: string
|
||||||
|
}) =>
|
||||||
|
this.$('<div>')
|
||||||
|
.append(
|
||||||
|
this.$('<x-card>')
|
||||||
|
.attr(opts)
|
||||||
|
.append(
|
||||||
|
this.$('<a>')
|
||||||
|
.attr({
|
||||||
|
href: opts.href,
|
||||||
|
rel: 'noopener',
|
||||||
|
target: '_blank',
|
||||||
|
})
|
||||||
|
.text(opts.title)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.html(),
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
import fg from 'fast-glob'
|
||||||
|
import fs from 'fs-extra'
|
||||||
|
import yaml from 'js-yaml'
|
||||||
|
import rimraf from 'rimraf'
|
||||||
|
|
||||||
|
import { Database, IMatter } from '../server/db'
|
||||||
|
import { builtPath, dstMediaPath } from '../server/dir'
|
||||||
|
import { THEME_FILENAME } from '../server/theme'
|
||||||
|
import { srcPath } from './dir'
|
||||||
|
import { MakeHTML } from './make-html'
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
rimraf.sync(dstMediaPath())
|
||||||
|
rimraf.sync(builtPath())
|
||||||
|
|
||||||
|
await fs.copy(srcPath('_media'), dstMediaPath())
|
||||||
|
await fs.ensureDir(builtPath())
|
||||||
|
|
||||||
|
await fs.copyFile(srcPath(THEME_FILENAME), builtPath(THEME_FILENAME))
|
||||||
|
|
||||||
|
const db = new Database()
|
||||||
|
db.init()
|
||||||
|
|
||||||
|
const files = await fg('**/*.md', {
|
||||||
|
cwd: srcPath('_posts'),
|
||||||
|
})
|
||||||
|
|
||||||
|
const makeHtml = new MakeHTML()
|
||||||
|
|
||||||
|
await Promise.all(
|
||||||
|
files.map(async (f) => {
|
||||||
|
const path = f.replace(/\.md$/, '')
|
||||||
|
const markdown = fs.readFileSync(srcPath('_posts', f), 'utf8')
|
||||||
|
|
||||||
|
const [h] = markdown.substr(4).split(/---\n(.*)$/s)
|
||||||
|
const header = yaml.safeLoad(h) as IMatter
|
||||||
|
|
||||||
|
const r = await makeHtml.parse(srcPath('_posts', f))
|
||||||
|
const contentHtml = r.html()
|
||||||
|
const excerptHtml = contentHtml.split(
|
||||||
|
/<!-- excerpt(?:_separator)? -->/
|
||||||
|
)[0]
|
||||||
|
|
||||||
|
db.insert({
|
||||||
|
...header,
|
||||||
|
path,
|
||||||
|
content: r.clean(),
|
||||||
|
excerptHtml,
|
||||||
|
contentHtml,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (require.main === module) {
|
||||||
|
main()
|
||||||
|
}
|
||||||
@@ -0,0 +1,280 @@
|
|||||||
|
import sqlite3 from 'better-sqlite3'
|
||||||
|
import * as z from 'zod'
|
||||||
|
|
||||||
|
import { builtPath } from './dir'
|
||||||
|
|
||||||
|
const zMatter = z.object({
|
||||||
|
date: z.date().optional(),
|
||||||
|
createdAt: z.date().optional(),
|
||||||
|
updatedAt: z.date().optional(),
|
||||||
|
priority: z.number().optional(),
|
||||||
|
title: z.string(),
|
||||||
|
image: z.string().optional(),
|
||||||
|
tag: z.array(z.string()).optional(),
|
||||||
|
category: z.string().optional(),
|
||||||
|
})
|
||||||
|
|
||||||
|
export type IMatter = z.infer<typeof zMatter>
|
||||||
|
|
||||||
|
export const zPost = z
|
||||||
|
.object({
|
||||||
|
path: z.string(),
|
||||||
|
/**
|
||||||
|
* Cleaned and jieba-separated markdown
|
||||||
|
*/
|
||||||
|
content: z.string(),
|
||||||
|
excerptHtml: z.string(),
|
||||||
|
contentHtml: z.string(),
|
||||||
|
})
|
||||||
|
.merge(zMatter.nonstrict())
|
||||||
|
|
||||||
|
export type IPost = z.infer<typeof zPost>
|
||||||
|
|
||||||
|
export class Database {
|
||||||
|
db: sqlite3.Database
|
||||||
|
|
||||||
|
constructor(opts?: sqlite3.Options) {
|
||||||
|
this.db = sqlite3(builtPath('data.db'), opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
public init(): void {
|
||||||
|
this.db.exec(/* sql */ `
|
||||||
|
CREATE TABLE IF NOT EXISTS files (
|
||||||
|
[path] TEXT PRIMARY KEY,
|
||||||
|
[date] INT, -- epoch milli
|
||||||
|
createdAt INT, -- epoch milli
|
||||||
|
updatedAt INT, -- epoch milli
|
||||||
|
priority INT,
|
||||||
|
-- q.title
|
||||||
|
[image] TEXT,
|
||||||
|
-- m2o files_tag
|
||||||
|
-- q.category
|
||||||
|
-- q.content
|
||||||
|
excerptHtml TEXT NOT NULL,
|
||||||
|
contentHtml TEXT NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS files_date ON files([date]);
|
||||||
|
CREATE INDEX IF NOT EXISTS files_createdAt ON files(createdAt);
|
||||||
|
CREATE INDEX IF NOT EXISTS files_updatedAt ON files(updatedAt);
|
||||||
|
CREATE INDEX IF NOT EXISTS files_priority ON files(priority);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS files_tag (
|
||||||
|
[path] TEXT NOT NULL,
|
||||||
|
tag TEXT NOT NULL,
|
||||||
|
PRIMARY KEY ([path], tag)
|
||||||
|
);
|
||||||
|
`)
|
||||||
|
|
||||||
|
this.db.exec(/* sql */ `
|
||||||
|
CREATE VIRTUAL TABLE IF NOT EXISTS q USING fts5 (
|
||||||
|
[path], -- REFERENCES files([path])
|
||||||
|
title,
|
||||||
|
tag, -- space separated
|
||||||
|
category, -- can compare via equal
|
||||||
|
content -- cleaned markdown
|
||||||
|
);
|
||||||
|
`)
|
||||||
|
}
|
||||||
|
|
||||||
|
public insert(...ps: IPost[]): void {
|
||||||
|
const fStmt = this.db.prepare(/* sql */ `
|
||||||
|
INSERT INTO files ([path], [date], [createdAt], [updatedAt], priority, [image], excerptHtml, contentHtml)
|
||||||
|
VALUES (@path, @date, @createdAt, @updatedAt, @priority, @image, @excerptHtml, @contentHtml)
|
||||||
|
`)
|
||||||
|
|
||||||
|
const ftStmt = this.db.prepare(/* sql */ `
|
||||||
|
INSERT INTO files_tag ([path], tag)
|
||||||
|
VALUES (@path, @tag)
|
||||||
|
`)
|
||||||
|
|
||||||
|
const qStmt = this.db.prepare(/* sql */ `
|
||||||
|
INSERT INTO q ([path], title, tag, category, content)
|
||||||
|
VALUES (@path, @title, @tag, @category, @content)
|
||||||
|
`)
|
||||||
|
|
||||||
|
this.db.transaction(() => {
|
||||||
|
// eslint-disable-next-line array-callback-return
|
||||||
|
ps.map((p) => {
|
||||||
|
const {
|
||||||
|
path,
|
||||||
|
date,
|
||||||
|
createdAt,
|
||||||
|
updatedAt,
|
||||||
|
priority,
|
||||||
|
image,
|
||||||
|
excerptHtml,
|
||||||
|
contentHtml,
|
||||||
|
title,
|
||||||
|
tag,
|
||||||
|
category,
|
||||||
|
content,
|
||||||
|
} = zPost.parse(p)
|
||||||
|
|
||||||
|
fStmt.run({
|
||||||
|
path,
|
||||||
|
priority,
|
||||||
|
image,
|
||||||
|
excerptHtml,
|
||||||
|
contentHtml,
|
||||||
|
date: date ? date.getTime() : null,
|
||||||
|
createdAt: createdAt ? createdAt.getTime() : null,
|
||||||
|
updatedAt: updatedAt ? updatedAt.getTime() : null,
|
||||||
|
})
|
||||||
|
|
||||||
|
qStmt.run({
|
||||||
|
path,
|
||||||
|
title,
|
||||||
|
category,
|
||||||
|
content,
|
||||||
|
tag: tag ? tag.join(' ') : undefined,
|
||||||
|
})
|
||||||
|
|
||||||
|
if (tag) {
|
||||||
|
Array.from(new Set(tag)).map((t) => {
|
||||||
|
ftStmt.run({
|
||||||
|
path,
|
||||||
|
tag: t,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})()
|
||||||
|
}
|
||||||
|
|
||||||
|
public get(id: string) {
|
||||||
|
const r = this.db
|
||||||
|
.prepare(
|
||||||
|
/* sql */ `
|
||||||
|
SELECT
|
||||||
|
[date],
|
||||||
|
title,
|
||||||
|
[image],
|
||||||
|
GROUP_CONCAT(ft.tag, ' ') tag,
|
||||||
|
category,
|
||||||
|
contentHtml content
|
||||||
|
FROM files f
|
||||||
|
JOIN q ON q.path = f.path
|
||||||
|
LEFT JOIN files_tag ft ON ft.path = f.path
|
||||||
|
WHERE f.path = @id
|
||||||
|
GROUP BY f.path
|
||||||
|
`
|
||||||
|
)
|
||||||
|
.get({ id })
|
||||||
|
|
||||||
|
if (!r) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
...r,
|
||||||
|
date: r.date ? new Date(r.date) : undefined,
|
||||||
|
tag: r.tag ? r.tag.split(/ /g) : undefined,
|
||||||
|
} as {
|
||||||
|
date?: Date
|
||||||
|
title: string
|
||||||
|
image?: string
|
||||||
|
tag?: string[]
|
||||||
|
category?: string
|
||||||
|
content: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public q(
|
||||||
|
q: string,
|
||||||
|
opts: {
|
||||||
|
offset: number
|
||||||
|
limit: number
|
||||||
|
tag?: string
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
return this._search(q, {
|
||||||
|
...opts,
|
||||||
|
orderedBy: 'RANK',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
public by(opts: { tag?: string; offset: number; limit: number }) {
|
||||||
|
return this._search('', {
|
||||||
|
...opts,
|
||||||
|
orderedBy: 'priority DESC, [date] DESC, createdAt DESC, updatedAt DESC',
|
||||||
|
where: ['[date] IS NOT NULL'],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private _search(
|
||||||
|
q: string,
|
||||||
|
opts: {
|
||||||
|
offset: number
|
||||||
|
limit: number
|
||||||
|
orderedBy: string
|
||||||
|
tag?: string
|
||||||
|
where?: string[]
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
const $where: string[] = []
|
||||||
|
if (q) {
|
||||||
|
$where.push('q = @q')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opts.tag) {
|
||||||
|
$where.push('ft.tag = @tag')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opts.where) {
|
||||||
|
$where.push(...opts.where)
|
||||||
|
}
|
||||||
|
|
||||||
|
const fromSegment = /* sql */ `
|
||||||
|
FROM files f
|
||||||
|
JOIN q ON q.path = f.path
|
||||||
|
${opts.tag ? `LEFT JOIN files_tag ft ON ft.path = f.path` : ''}
|
||||||
|
WHERE ${$where.join(' AND ') || 'TRUE'}
|
||||||
|
${opts.tag ? 'GROUP BY f.path' : ''}
|
||||||
|
`
|
||||||
|
|
||||||
|
const cond = {
|
||||||
|
q,
|
||||||
|
tag: opts.tag,
|
||||||
|
}
|
||||||
|
|
||||||
|
const count =
|
||||||
|
this.db
|
||||||
|
.prepare(
|
||||||
|
/* sql */ `
|
||||||
|
SELECT COUNT(f.path) [count]
|
||||||
|
${fromSegment}
|
||||||
|
`
|
||||||
|
)
|
||||||
|
.get(cond)?.count || 0
|
||||||
|
|
||||||
|
const result = this.db
|
||||||
|
.prepare(
|
||||||
|
/* sql */ `
|
||||||
|
SELECT
|
||||||
|
f.path [path],
|
||||||
|
[date],
|
||||||
|
title,
|
||||||
|
[image],
|
||||||
|
category,
|
||||||
|
excerptHtml excerpt
|
||||||
|
${fromSegment}
|
||||||
|
ORDER BY ${opts.orderedBy}
|
||||||
|
LIMIT ${opts.limit} OFFSET ${opts.offset}
|
||||||
|
`
|
||||||
|
)
|
||||||
|
.all(cond) as {
|
||||||
|
path: string
|
||||||
|
date?: Date
|
||||||
|
title: string
|
||||||
|
image?: string
|
||||||
|
category?: string
|
||||||
|
excerpt: string
|
||||||
|
}[]
|
||||||
|
|
||||||
|
return {
|
||||||
|
result,
|
||||||
|
count,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import path from 'path'
|
||||||
|
|
||||||
|
export const builtPath = (...ps: string[]): string =>
|
||||||
|
path.join(__dirname, '../built', ...ps)
|
||||||
|
|
||||||
|
export const dstMediaPath = (...ps: string[]): string =>
|
||||||
|
path.join(__dirname, '../static/media', ...ps)
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
import express from 'express'
|
||||||
|
import morgan from 'morgan'
|
||||||
|
import * as z from 'zod'
|
||||||
|
|
||||||
|
import { Database } from './db'
|
||||||
|
|
||||||
|
const app = express()
|
||||||
|
app.use(morgan('dev'))
|
||||||
|
|
||||||
|
const db = new Database({ readonly: true })
|
||||||
|
|
||||||
|
app.get('/', (req, res) => {
|
||||||
|
const { path } = z
|
||||||
|
.object({
|
||||||
|
path: z.string(),
|
||||||
|
})
|
||||||
|
.parse(req.query)
|
||||||
|
|
||||||
|
const r = db.get(path)
|
||||||
|
if (!r) {
|
||||||
|
res.sendStatus(404)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json(r)
|
||||||
|
})
|
||||||
|
|
||||||
|
app.get('/q', (req, res) => {
|
||||||
|
const { q, tag, page: _page = '1' } = z
|
||||||
|
.object({
|
||||||
|
q: z.string().optional(),
|
||||||
|
tag: z.string().optional(),
|
||||||
|
page: z
|
||||||
|
.string()
|
||||||
|
.refine((s) => /^\d+$/.test(s))
|
||||||
|
.optional(),
|
||||||
|
})
|
||||||
|
.parse(req.query)
|
||||||
|
|
||||||
|
const perPage = 5
|
||||||
|
const offset = (parseInt(_page) - 1) * perPage
|
||||||
|
|
||||||
|
if (q) {
|
||||||
|
res.json(
|
||||||
|
db.q(q, {
|
||||||
|
offset,
|
||||||
|
limit: perPage,
|
||||||
|
tag,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json(
|
||||||
|
db.by({
|
||||||
|
offset,
|
||||||
|
limit: perPage,
|
||||||
|
tag,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
app.use((err: Error, _: express.Request, res: express.Response) => {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.error(err.stack)
|
||||||
|
res.status(500).send(err)
|
||||||
|
})
|
||||||
|
|
||||||
|
export default app
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
import fs from 'fs'
|
||||||
|
import path from 'path'
|
||||||
|
|
||||||
|
import yaml from 'js-yaml'
|
||||||
|
import * as z from 'zod'
|
||||||
|
|
||||||
|
export const THEME_FILENAME = 'theme.yml'
|
||||||
|
|
||||||
|
export const zTheme = z
|
||||||
|
.object({
|
||||||
|
title: z.string(),
|
||||||
|
awsm: z.string().optional(),
|
||||||
|
description: z.string().optional(),
|
||||||
|
keywords: z.array(z.string()).optional(),
|
||||||
|
nav: z
|
||||||
|
.array(
|
||||||
|
z
|
||||||
|
.object({
|
||||||
|
name: z.string(),
|
||||||
|
to: z.string(),
|
||||||
|
})
|
||||||
|
.or(
|
||||||
|
z.object({
|
||||||
|
name: z.string(),
|
||||||
|
href: z.string(),
|
||||||
|
})
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.optional(),
|
||||||
|
author: z
|
||||||
|
.object({
|
||||||
|
url: z.string().optional(),
|
||||||
|
email: z.string().optional(),
|
||||||
|
name: z.string(),
|
||||||
|
})
|
||||||
|
.nonstrict(),
|
||||||
|
analytics: z
|
||||||
|
.object({
|
||||||
|
plausible: z.string().optional(),
|
||||||
|
})
|
||||||
|
.optional(),
|
||||||
|
comment: z
|
||||||
|
.object({
|
||||||
|
remark42: z
|
||||||
|
.object({
|
||||||
|
host: z.string(),
|
||||||
|
siteId: z.string(),
|
||||||
|
})
|
||||||
|
.optional(),
|
||||||
|
})
|
||||||
|
.optional(),
|
||||||
|
})
|
||||||
|
.nonstrict()
|
||||||
|
|
||||||
|
export type ITheme = z.infer<typeof zTheme>
|
||||||
|
|
||||||
|
export function getTheme() {
|
||||||
|
return zTheme.parse(
|
||||||
|
yaml.safeLoad(fs.readFileSync(path.join('built', THEME_FILENAME), 'utf-8'))
|
||||||
|
)
|
||||||
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 1.4 KiB |
@@ -0,0 +1,11 @@
|
|||||||
|
/* global WebComponents */
|
||||||
|
WebComponents.waitFor(() => {
|
||||||
|
// At this point we are guaranteed that all required polyfills have
|
||||||
|
// loaded, and can use web components API's.
|
||||||
|
// The standard pattern is to load element definitions that call
|
||||||
|
// `customElements.define` here.
|
||||||
|
// Note: returning the import's promise causes the custom elements
|
||||||
|
// polyfill to wait until all definitions are loaded and then upgrade
|
||||||
|
// the document in one batch, for better performance.
|
||||||
|
return import('https://unpkg.com/@patarapolw/make-html-x-card')
|
||||||
|
})
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
# STORE
|
||||||
|
|
||||||
|
**This directory is not required, you can delete it if you don't want to use it.**
|
||||||
|
|
||||||
|
This directory contains your Vuex Store files.
|
||||||
|
Vuex Store option is implemented in the Nuxt.js framework.
|
||||||
|
|
||||||
|
Creating a file in this directory automatically activates the option in the framework.
|
||||||
|
|
||||||
|
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/vuex-store).
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ES2018",
|
||||||
|
"module": "ESNext",
|
||||||
|
"moduleResolution": "Node",
|
||||||
|
"lib": ["ESNext", "ESNext.AsyncIterable", "DOM"],
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"allowJs": true,
|
||||||
|
"sourceMap": true,
|
||||||
|
"strict": true,
|
||||||
|
"noEmit": true,
|
||||||
|
"experimentalDecorators": true,
|
||||||
|
"baseUrl": ".",
|
||||||
|
"paths": {
|
||||||
|
"~/*": ["./*"],
|
||||||
|
"@/*": ["./*"]
|
||||||
|
},
|
||||||
|
"types": ["@types/node", "@nuxt/types", "@nuxtjs/axios"]
|
||||||
|
},
|
||||||
|
"exclude": ["node_modules", ".nuxt", "dist"]
|
||||||
|
}
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -1,53 +0,0 @@
|
|||||||
---
|
|
||||||
title: 千里之外
|
|
||||||
date: 2020-04-20
|
|
||||||
tag:
|
|
||||||
- song
|
|
||||||
---
|
|
||||||
|
|
||||||
<iframe width="560" height="315" src="https://www.youtube.com/embed/ocDo3ySyHSI" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
|
||||||
|
|
||||||
<!-- excerpt -->
|
|
||||||
|
|
||||||
## 周杰伦
|
|
||||||
|
|
||||||
### 千里之外(& 费玉清)
|
|
||||||
|
|
||||||
作词:方文山
|
|
||||||
作曲:周杰伦
|
|
||||||
|
|
||||||
(周)屋簷如悬崖 风铃如沧海 我等燕归来
|
|
||||||
时间被安排 演一场意外 妳悄然走开
|
|
||||||
故事在城外 浓雾散不开 看不清对白
|
|
||||||
妳听不出来 风声不存在 是我在感慨
|
|
||||||
梦醒来 是谁在窗台 把结局打开
|
|
||||||
那薄如蝉翼的未来 禁不起谁来拆
|
|
||||||
|
|
||||||
(费)我送你离开 千里之外 你无声黑白
|
|
||||||
沉默年代 或许不该 太遥远的相爱
|
|
||||||
我送妳离开 天涯之外 妳是否还在
|
|
||||||
琴声何来 生死难猜 用一生 去等待
|
|
||||||
|
|
||||||
(周)闻泪声入林 寻梨花白 只得一行青苔
|
|
||||||
天在山之外 雨落花台 我两鬓斑白
|
|
||||||
闻泪声入林 寻梨花白 只得一行青苔
|
|
||||||
天在山之外 雨落花台 我等妳来
|
|
||||||
|
|
||||||
更多更详尽歌词 在 ※ Mojim.com 魔镜歌词网
|
|
||||||
(费)一身琉璃白 透明著尘埃 妳无瑕的爱
|
|
||||||
妳从雨中来 诗化了悲哀 我淋湿现在
|
|
||||||
|
|
||||||
(周)芙蓉水面采 船行影犹在 妳却不回来
|
|
||||||
被岁月覆蓋 妳说的花开 过去成空白
|
|
||||||
|
|
||||||
(费)梦醒来 是谁在窗台 把结局打开
|
|
||||||
(周)那薄如蝉翼的未来
|
|
||||||
(周)禁不起谁来拆
|
|
||||||
(费)我送你离开 千里之外 你无声黑白 沉默年代 或许不该 太遥远的相爱
|
|
||||||
(周)我送妳离开 天涯之外 妳是否还在 琴声何来 生死难猜 用一生
|
|
||||||
(费)我送妳离开 千里之外 妳无声黑白 沉默年代 或许不该 太遥远的相爱
|
|
||||||
(周)我送妳离开 天涯之外
|
|
||||||
(周)妳是否还在
|
|
||||||
(周)琴声何来
|
|
||||||
(费)生死难猜
|
|
||||||
(合)用一生去等待
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
---
|
|
||||||
title: 虫儿飞
|
|
||||||
date: 2020-04-10
|
|
||||||
tag:
|
|
||||||
- song
|
|
||||||
---
|
|
||||||
|
|
||||||
<iframe width="560" height="315" src="https://www.youtube.com/embed/4CazJNOLoM0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
|
||||||
|
|
||||||
<!-- excerpt -->
|
|
||||||
|
|
||||||
黑黑的天空低垂
|
|
||||||
亮亮的繁星相随
|
|
||||||
虫儿飞 虫儿飞
|
|
||||||
你在思念谁
|
|
||||||
|
|
||||||
天上的星星流泪
|
|
||||||
地上的玫瑰枯萎
|
|
||||||
冷风吹 冷风吹
|
|
||||||
只要有你陪
|
|
||||||
|
|
||||||
虫儿飞 花儿睡
|
|
||||||
一双又一对才美
|
|
||||||
不怕天黑 只怕心碎
|
|
||||||
不管累不累
|
|
||||||
也不管东南西北
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
---
|
|
||||||
title: "千字文 - 1/1"
|
|
||||||
date: "2019-08-11"
|
|
||||||
tag:
|
|
||||||
- 千字文
|
|
||||||
- 汉字
|
|
||||||
---
|
|
||||||
|
|
||||||
```pug parsed
|
|
||||||
.w-100.mt-3
|
|
||||||
h3.text-center 天地玄黃,宇宙洪荒。
|
|
||||||
.w-100
|
|
||||||
figure.d-inline-block
|
|
||||||
img(src="https://upload.wikimedia.org/wikipedia/commons/a/ab/天-order.gif" height=100 data-no-cache)
|
|
||||||
figcaption.text-center tian1
|
|
||||||
figure.d-inline-block
|
|
||||||
img(src="https://upload.wikimedia.org/wikipedia/commons/f/fb/地-order.gif" height=100 data-no-cache)
|
|
||||||
figcaption.text-center di4
|
|
||||||
figure.d-inline-block
|
|
||||||
img(src="https://upload.wikimedia.org/wikipedia/commons/d/d3/玄-order.gif" height=100 data-no-cache)
|
|
||||||
figcaption.text-center xuan2
|
|
||||||
figure.d-inline-block
|
|
||||||
img(src="https://upload.wikimedia.org/wikipedia/commons/e/e7/黄-order.gif" height=100 data-no-cache)
|
|
||||||
figcaption.text-center huang2
|
|
||||||
.w-100
|
|
||||||
figure.d-inline-block
|
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/23431.gif" height=100 data-no-cache)
|
|
||||||
figcaption.text-center yu3
|
|
||||||
figure.d-inline-block
|
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/23449.gif" height=100 data-no-cache)
|
|
||||||
figcaption.text-center zhou4
|
|
||||||
figure.d-inline-block
|
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/27946.gif" height=100 data-no-cache)
|
|
||||||
figcaption.text-center hong2
|
|
||||||
figure.d-inline-block
|
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/33618.gif" height=100 data-no-cache)
|
|
||||||
figcaption.text-center huang1
|
|
||||||
```
|
|
||||||
|
|
||||||
<style>
|
|
||||||
img[height="100"] {
|
|
||||||
height: 100px;
|
|
||||||
}
|
|
||||||
|
|
||||||
figure {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.w-100 {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mt-3 {
|
|
||||||
margin-top: 0.75rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.d-inline-block {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-center {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
table td:first-child {
|
|
||||||
width: 10em;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<!-- excerpt_separator -->
|
|
||||||
|
|
||||||
| | | |
|
|
||||||
| --- | --- | --- |
|
|
||||||
宇宙 | yǔzhòu | universe / cosmos
|
|
||||||
宇航 | yǔháng | space flight
|
|
||||||
宇航员 | yǔhángyuán | astronaut
|
|
||||||
宇宙飞船 | yǔzhòufēichuán | spacecraft
|
|
||||||
防洪 | fánghóng | flood control / flood prevention
|
|
||||||
山洪 | shānhóng | mountain flash flood / mountain torrent
|
|
||||||
荒 | huāng | desolate / shortage / scarce / out of practice / absurd / uncultivated / to neglect
|
|
||||||
荒野 | huāngyě | wilderness
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
---
|
|
||||||
title: "千字文 - 2/1"
|
|
||||||
date: "2019-08-20"
|
|
||||||
tag:
|
|
||||||
- 千字文
|
|
||||||
- 汉字
|
|
||||||
---
|
|
||||||
|
|
||||||
```pug parsed
|
|
||||||
.w-100.mt-3
|
|
||||||
h3.text-center 龍師火帝,鳥官人皇。
|
|
||||||
.w-100
|
|
||||||
figure.d-inline-block
|
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/40845.gif" height=100 data-no-cache)
|
|
||||||
figcaption.text-center long2
|
|
||||||
figure.d-inline-block
|
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24107.gif" height=100 data-no-cache)
|
|
||||||
figcaption.text-center shi1
|
|
||||||
figure.d-inline-block
|
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/28779.gif" height=100 data-no-cache)
|
|
||||||
figcaption.text-center huo3
|
|
||||||
figure.d-inline-block
|
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/24093.gif" height=100 data-no-cache)
|
|
||||||
figcaption.text-center di4
|
|
||||||
.w-100
|
|
||||||
figure.d-inline-block
|
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/40165.gif" height=100 data-no-cache)
|
|
||||||
figcaption.text-center niao3
|
|
||||||
figure.d-inline-block
|
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/23448.gif" height=100 data-no-cache)
|
|
||||||
figcaption.text-center guan1
|
|
||||||
figure.d-inline-block
|
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/20154.gif" height=100 data-no-cache)
|
|
||||||
figcaption.text-center ren2
|
|
||||||
figure.d-inline-block
|
|
||||||
img(src="https://www.mdbg.net/chinese/rsc/img/stroke_anim/30343.gif" height=100 data-no-cache)
|
|
||||||
figcaption.text-center huang1
|
|
||||||
```
|
|
||||||
|
|
||||||
<!-- excerpt_separator -->
|
|
||||||
|
|
||||||
<style>
|
|
||||||
img[height="100"] {
|
|
||||||
height: 100px;
|
|
||||||
}
|
|
||||||
|
|
||||||
figure {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.w-100 {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mt-3 {
|
|
||||||
margin-top: 0.75rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.d-inline-block {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-center {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
table td:first-child {
|
|
||||||
width: 10em;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
| | | |
|
|
||||||
| --- | --- | --- |
|
|
||||||
官方 | guānfāng | government / official (approved or issued by an authority)
|
|
||||||
官员 (官員) | guānyuán | official (in an organization or government) / administrator
|
|
||||||
法官 | fǎguān | judge
|
|
||||||
警官 | jǐngguān | constable / police officer
|
|
||||||
感官 | gǎnguān | sense / sense organ
|
|
||||||
指挥官 (指揮官) | zhǐhuīguān | commander
|
|
||||||
收官 | shōuguān | final part of a go game (see 官子) / endgame / to finish up / to come to the final stage
|
|
||||||
-1
Submodule template deleted from 0260f4b19f.
@@ -1,4 +1,5 @@
|
|||||||
title: polv's Chinese Learning Diary
|
title: polv's Chinese Learning Diary
|
||||||
|
awsm: tasman
|
||||||
banner: ZhDiary
|
banner: ZhDiary
|
||||||
baseUrl: https://zhdiary.polv.cc
|
baseUrl: https://zhdiary.polv.cc
|
||||||
description: polv's Chinese Learning Diary
|
description: polv's Chinese Learning Diary
|
||||||
@@ -7,7 +8,7 @@ keywords:
|
|||||||
- patarapolw
|
- patarapolw
|
||||||
- chinese
|
- chinese
|
||||||
- mandarin
|
- mandarin
|
||||||
tabs:
|
nav:
|
||||||
- name: 千字文
|
- name: 千字文
|
||||||
to: /post/2019/08/千字文
|
to: /post/2019/08/千字文
|
||||||
author:
|
author:
|
||||||
@@ -19,7 +20,7 @@ sidebar:
|
|||||||
twitter: ChinesePol
|
twitter: ChinesePol
|
||||||
analytics:
|
analytics:
|
||||||
plausible: zhdiary.polv.cc
|
plausible: zhdiary.polv.cc
|
||||||
comments:
|
comment:
|
||||||
remark42:
|
remark42:
|
||||||
host: https://remark42.polv.cc
|
host: https://remark42.polv.cc
|
||||||
siteId: zhdiary
|
siteId: zhdiary
|
||||||
Reference in new issue
Block a user