diff --git a/.vscode/settings.json b/.vscode/settings.json index b90b96f..709f75a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,5 +3,7 @@ "editor.formatOnSave": true, "files.associations": { ".env.*": "dotenv" - } + }, + "whitespacepp.backColorWS": "", + "editor.tabSize": 4 } \ No newline at end of file diff --git a/_posts/2020/03/zhlevel-level-2.md b/_posts/2020/03/zhlevel-level-2.md index bbdaf66..053c7cc 100644 --- a/_posts/2020/03/zhlevel-level-2.md +++ b/_posts/2020/03/zhlevel-level-2.md @@ -1,6 +1,6 @@ --- title: ZhLevel Level 2 -date: 2020-03-23T00:00:00+07:00 +date: 2020-03-23T01:00:00+07:00 tag: - zhlevel --- diff --git a/_posts/2020/04/千里之外-song.md b/_posts/2020/04/千里之外-song.md index a295f91..6a2d39a 100644 --- a/_posts/2020/04/千里之外-song.md +++ b/_posts/2020/04/千里之外-song.md @@ -13,41 +13,41 @@ tag: ### 千里之外(& 费玉清) -作词:方文山 +作词:方文山 \ 作曲:周杰伦 -(周)屋簷如悬崖 风铃如沧海 我等燕归来 -时间被安排 演一场意外 妳悄然走开 -故事在城外 浓雾散不开 看不清对白 -妳听不出来 风声不存在 是我在感慨 -梦醒来 是谁在窗台 把结局打开 +(周)屋簷如悬崖 风铃如沧海 我等燕归来 \ +时间被安排 演一场意外 妳悄然走开 \ +故事在城外 浓雾散不开 看不清对白 \ +妳听不出来 风声不存在 是我在感慨 \ +梦醒来 是谁在窗台 把结局打开 \ 那薄如蝉翼的未来 禁不起谁来拆 -(费)我送你离开 千里之外 你无声黑白 -沉默年代 或许不该 太遥远的相爱 -我送妳离开 天涯之外 妳是否还在 +(费)我送你离开 千里之外 你无声黑白 \ +沉默年代 或许不该 太遥远的相爱 \ +我送妳离开 天涯之外 妳是否还在 \ 琴声何来 生死难猜 用一生 去等待 -(周)闻泪声入林 寻梨花白 只得一行青苔 -天在山之外 雨落花台 我两鬓斑白 -闻泪声入林 寻梨花白 只得一行青苔 +(周)闻泪声入林 寻梨花白 只得一行青苔 \ +天在山之外 雨落花台 我两鬓斑白 \ +闻泪声入林 寻梨花白 只得一行青苔 \ 天在山之外 雨落花台 我等妳来 -更多更详尽歌词 在 ※ Mojim.com 魔镜歌词网 -(费)一身琉璃白 透明著尘埃 妳无瑕的爱 +更多更详尽歌词 在 ※ Mojim.com 魔镜歌词网 \ +(费)一身琉璃白 透明著尘埃 妳无瑕的爱 \ 妳从雨中来 诗化了悲哀 我淋湿现在 -(周)芙蓉水面采 船行影犹在 妳却不回来 +(周)芙蓉水面采 船行影犹在 妳却不回来 \ 被岁月覆蓋 妳说的花开 过去成空白 -(费)梦醒来 是谁在窗台 把结局打开 -(周)那薄如蝉翼的未来 -(周)禁不起谁来拆 -(费)我送你离开 千里之外 你无声黑白 沉默年代 或许不该 太遥远的相爱 -(周)我送妳离开 天涯之外 妳是否还在 琴声何来 生死难猜 用一生 -(费)我送妳离开 千里之外 妳无声黑白 沉默年代 或许不该 太遥远的相爱 -(周)我送妳离开 天涯之外 -(周)妳是否还在 -(周)琴声何来 -(费)生死难猜 +(费)梦醒来 是谁在窗台 把结局打开 \ +(周)那薄如蝉翼的未来 \ +(周)禁不起谁来拆 \ +(费)我送你离开 千里之外 你无声黑白 沉默年代 或许不该 太遥远的相爱 \ +(周)我送妳离开 天涯之外 妳是否还在 琴声何来 生死难猜 用一生 \ +(费)我送妳离开 千里之外 妳无声黑白 沉默年代 或许不该 太遥远的相爱 \ +(周)我送妳离开 天涯之外 \ +(周)妳是否还在 \ +(周)琴声何来 \ +(费)生死难猜 \ (合)用一生去等待 diff --git a/_posts/2020/04/祝福-song.md b/_posts/2020/04/祝福-song.md index 4969272..4bf98c4 100644 --- a/_posts/2020/04/祝福-song.md +++ b/_posts/2020/04/祝福-song.md @@ -13,31 +13,31 @@ tag: ## 祝福 -作词:丁晓雯 -作曲:郭子 -编曲:王豫民 +作词:丁晓雯 \ +作曲:郭子 \ +编曲:王豫民 \ -不要问 不要说 一切尽在不言中 -这一刻 偎著烛光 让我们静静的渡过 -莫挥手 莫回头 当我唱起这首歌 怕只怕 泪水轻轻的滑落 +不要问 不要说 一切尽在不言中 \ +这一刻 偎著烛光 让我们静静的渡过 \ +莫挥手 莫回头 当我唱起这首歌 怕只怕 泪水轻轻的滑落 \ 愿心中永远留着我的笑容 伴你走过每一个春夏秋冬 -几许愁 几许忧 人生难免苦与痛 -失去过 才能真正懂得去珍惜和拥有 -情难舍 人难留 今朝一别各西东 冷和热 点点滴滴在心头 +几许愁 几许忧 人生难免苦与痛 \ +失去过 才能真正懂得去珍惜和拥有 \ +情难舍 人难留 今朝一别各西东 冷和热 点点滴滴在心头 \ 愿心中永远留着我的笑容 伴你走过每一个春夏秋冬 -*伤离别 离别虽然在眼前 说再见 再见不会太遥远 -更多更详尽歌词 +*伤离别 离别虽然在眼前 说再见 再见不会太遥远 \ +更多更详尽歌词 \  若有缘 有缘就能期待明天 你和我重逢在灿烂的季节 Repeat * -伤离别 离别虽然在眼前 说再见 再见不会太遥远 -伤离别 离别虽然在眼前 说再见 再见不会太遥远 +伤离别 离别虽然在眼前 说再见 再见不会太遥远 \ +伤离别 离别虽然在眼前 说再见 再见不会太遥远 \ 若有缘 有缘就能期待明天 你和我重逢在灿烂的季节 -不要问 不要说 一切尽在不言中 -这一刻 偎著烛光 让我们静静的渡过 -莫挥手 莫回头 当我唱起这首歌 +不要问 不要说 一切尽在不言中 \ +这一刻 偎著烛光 让我们静静的渡过 \ +莫挥手 莫回头 当我唱起这首歌 \ 愿心中留着笑容 陪你度过每个春夏秋冬 diff --git a/_posts/2020/04/虫儿飞-song.md b/_posts/2020/04/虫儿飞-song.md index 9b4466e..d2f1060 100644 --- a/_posts/2020/04/虫儿飞-song.md +++ b/_posts/2020/04/虫儿飞-song.md @@ -9,18 +9,18 @@ tag: -黑黑的天空低垂 -亮亮的繁星相随 -虫儿飞 虫儿飞 +黑黑的天空低垂 \ +亮亮的繁星相随 \ +虫儿飞 虫儿飞 \ 你在思念谁 -天上的星星流泪 -地上的玫瑰枯萎 -冷风吹 冷风吹 +天上的星星流泪 \ +地上的玫瑰枯萎 \ +冷风吹 冷风吹 \ 只要有你陪 -虫儿飞 花儿睡 -一双又一对才美 -不怕天黑 只怕心碎 -不管累不累 +虫儿飞 花儿睡 \ +一双又一对才美 \ +不怕天黑 只怕心碎 \ +不管累不累 \ 也不管东南西北 diff --git a/packages/nuxt/scripts/make-html.ts b/packages/nuxt/scripts/make-html.ts index f09b75d..5779f75 100644 --- a/packages/nuxt/scripts/make-html.ts +++ b/packages/nuxt/scripts/make-html.ts @@ -22,10 +22,20 @@ export class MakeHTML { backslashEscapesHTMLTags: true, emoji: true, underline: true, + disableForced4SpacesIndentedSublists: true, metadata: true, }) constructor() { + this.mdConverter.addExtension( + { + type: 'lang', + regex: /\\\n/g, + replace: '
', + }, + 'commonmark-simple-linebreak' + ) + /** * ! For some reasons default underscore italic fails to render... */ diff --git a/packages/nuxt/server/db.ts b/packages/nuxt/server/db.ts index 16d448d..6016bd1 100644 --- a/packages/nuxt/server/db.ts +++ b/packages/nuxt/server/db.ts @@ -47,7 +47,7 @@ export class Database { priority INT, -- q.title [image] TEXT, - -- q.tag.split(/ /g) + -- m2o files_tag -- q.category -- q.content excerptHtml TEXT NOT NULL, @@ -58,6 +58,12 @@ export class Database { 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 */ ` @@ -77,6 +83,11 @@ export class Database { 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) @@ -118,6 +129,15 @@ export class Database { content, tag: tag ? tag.join(' ') : undefined, }) + + if (tag) { + Array.from(new Set(tag)).map((t) => { + ftStmt.run({ + path, + tag: t, + }) + }) + } }) })() } @@ -130,12 +150,14 @@ export class Database { [date], title, [image], - tag, + GROUP_CONCAT(ft.tag, ' ') tag, category, contentHtml content FROM files f - JOIN q ON q.path = f.path + 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 }) @@ -163,6 +185,7 @@ export class Database { opts: { offset: number limit: number + tag?: string } ) { return this._search(q, { @@ -171,17 +194,11 @@ export class Database { }) } - public by( - q: string, - opts: { - offset: number - limit: number - } - ) { - return this._search(q, { + 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', + where: ['[date] IS NOT NULL'], }) } @@ -191,15 +208,36 @@ export class Database { offset: number limit: number orderedBy: string - where?: 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 - WHERE ${q ? `q = @q` : 'TRUE'} ${opts.where ? `AND ${opts.where}` : ''} + ${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( @@ -208,7 +246,7 @@ export class Database { ${fromSegment} ` ) - .get({ q })?.count || 0 + .get(cond)?.count || 0 const result = this.db .prepare( @@ -218,7 +256,6 @@ export class Database { [date], title, [image], - tag, category, excerptHtml excerpt ${fromSegment} @@ -226,12 +263,11 @@ export class Database { LIMIT ${opts.limit} OFFSET ${opts.offset} ` ) - .all({ q }) as { + .all(cond) as { path: string date?: Date title: string image?: string - tag?: string[] category?: string excerpt: string }[] diff --git a/packages/nuxt/server/index.ts b/packages/nuxt/server/index.ts index 5be1ad6..0c57e72 100644 --- a/packages/nuxt/server/index.ts +++ b/packages/nuxt/server/index.ts @@ -42,18 +42,20 @@ app.get('/q', (req, res) => { if (q) { res.json( - db.q(`${q} ${tag ? `tag:${tag}` : ''}`, { + db.q(q, { offset, limit: perPage, + tag, }) ) return } res.json( - db.by(tag ? `tag:${tag}` : '', { + db.by({ offset, limit: perPage, + tag, }) ) })