# 初始化 shokaX 及安装

  1. 安装 nodeJSNodeJS 官网

  2. 安装 PNPMnpm install pnpm -g

  3. 安装 Hexonpm install hexo-cli -g

  4. git 克隆:shokaX-can 即食罐头.git

  5. 安装依赖: pnpm install

  6. 安装密码插件: npm install --save hexo-blog-encrypt

  7. 添加 scriptsviews 目录,添加以下脚本

    • shokax/scripts/addFooterMinHeight.js
    shokax/scripts/addFooterMinHeight.js
    hexo.extend.filter.register('theme_inject', function(injects) {
        injects.style.push('views/addFooterMinHeight.styl');
    });
    • shokax/scripts/addFooterMinHeight.js
    /scripts/sakura.js
    hexo.extend.filter.register('theme_inject', function(injects) {
        injects.head.file('sakura', 'views/sakura.pug', {}, {cache: true});
    });
    • shokax/scripts/create-time.js
    shokax/scripts/create-time.js
    hexo.extend.filter.register('theme_inject', function(injects) {
        injects.status.file('timer', 'views/create-time.pug', {}, {cache: true});
    });
    • shokax/view/create-time.pug
    shokax/view/create-time.pug
    div(style="width: 100%;text-align:center;")
        span(id="time")
    script.
        function createtime() {
            const n = new Date("#{theme.createTime}");
            now.setTime(now.getTime() + 250), days = (now - n) / 1e3 / 60 / 60 / 24, dnum = Math.floor(days), hours = (now - n) / 1e3 / 60 / 60 - 24 * dnum, hnum = Math.floor(hours), 1 == String(hnum).length && (hnum = "0" + hnum), minutes = (now - n) / 1e3 / 60 - 1440 * dnum - 60 * hnum, mnum = Math.floor(minutes), 1 == String(mnum).length && (mnum = "0" + mnum), seconds = (now - n) / 1e3 - 86400 * dnum - 3600 * hnum - 60 * mnum, snum = Math.round(seconds), 1 == String(snum).length && (snum = "0" + snum), document.getElementById("time").innerHTML = "此站已存活" + dnum + " 天 " + hnum + " 小时 " + mnum + " 分 " + snum + " 秒"
        }
        const now = new Date;
        setInterval("createtime()", 250)
    • shokax/views/sakura.pug
    shokax/views/sakura.pug
    script.
          window.sakuraConfig = {
            sakura: 30,
            xSpeed: 0.5,
            ySpeed: 0.5,
            rSpeed: 0.03,
            direction: "TopRight",
            zIndex: -1
          };
    script(src="https://cdn.jsdelivr.net/gh/minz71/sakura-rain/sakura-rain.js" defer)
    • shokax/views/addFooterMinHeight.styl
    shokax/views/addFooterMinHeight.styl
    main {
        >.inner {
            min-height: 90vh;
        }
    }
  8. siteInit.ts 添加代码

    window.addEventListener('hexo-blog-decrypt', siteRefresh, {
        passive: true
    });
  9. 安装一键部署插件: npm install hexo-deployer-git --save

  10. 创建 hexo-start.bathexo-d.bat

    hexo-start.bat
    @echo off
    d:
    cd project/shokax
    call hexo clean
    start cmd /k "hexo s"
    timeout /t 5
    start http://localhost:4000
    hexo-d.bat
    @echo off
    d:
    cd project/shokax
    echo Cleaning...
    call hexo clean
    echo Generating...
    call hexo g
    echo Archiving...
    call hexo a
    echo Deploying...
    call hexo d
    echo Done!
    pause
  11. 图片放大功能暂未修复 —— 待发布 vendors-0.5-dev

# post 文件配置模板

---
title: 文章标题
date: 文章发布的时间
comment: false   # true/false 对应开启 / 关闭本文章评论
sticky  : true   # 置顶文章
tags:
- 文章标签1
- 文章标签2
categories:
    - [计算机科学, Linux]
cover: cover.png # 文章顶部和文章介绍图(将覆盖文章主页轮播图)
audio:
  - https://music.163.com/song?id=1387098940
audio: false
---

# 代码块

语法: [language] [title] [url] [link text] [mark] [command]

选项 描述
language 1. 支持的语言戳此
2. 如果不需要代码高亮,但希望显示代码块样式,则设为 raw
title 代码块的标题文字
url 代码块标题右侧显示的链接
link text 上述链接显示的标题

示例

```java 行高亮 https://www.google.com google
import java.util.Scanner;
行高亮google
import java.util.Scanner;

# 标签卡

语法

;;;[id] [text]
content
;;;
;;;[id] [text]
content
;;;

示例

;;;id1 卡片 1
这里是卡片 1 的内容
** 加粗 **
[success]{.label .success}
;;;
;;;id1 卡片 2
这里是卡片 2 的内容
:::danger
危险危险
:::
- 第一行
- 第二行
;;;
;;;id2 ②号标签卡片 1
这里是卡片 1 的内容
;;;
;;;id2 ②号标签卡片 2
这里是卡片 2 的内容
;;;

这里是卡片 1 的内容
** 加粗 **
success

这里是卡片 2 的内容

危险危险

  • 第一行
  • 第二行

这里是卡片 1 的内容

这里是卡片 2 的内容

# links (链接块)

文章内嵌

{% links %}
- site: # 主标题
  owner: # 站点所有者(选填)
  url: # 站点链接
  desc: # 站点描述(选填)
  image: # 站点图像(选填)
  color: # 站点颜色(选填)
# 多链接参考 yaml 列表格式
{% endlinks %}


外部文件

# path 为一个 yaml 文件
{% linksfile [path] %}

示例

# 隐藏文字

!!balabala!! 鼠标放置时显示内容。
!!balabala!!{.bulr} 鼠标选中时显示内容

balabala 鼠标放置时显示内容。
balabala 鼠标选中时显示内容

# 折叠块

语法

+++[style] [title]
content
+++

示例

+++ 默认默认 这里是一段文字
++下划线++
+++
+++primary 紫色
:::info
参考信息
:::
- 第一行
- 第二行
+++
+++info  蓝色
;;;id3 卡片 1
这里是卡片 1 的内容
;;;
;;;id3 卡片 2
这里是卡片 2 的内容
;;;
+++
+++success 绿色
+++
+++warning 黄色
[label]{.label .success}
+++
+++danger 红色
[danger]{.label .danger}
+++
默认默认 这里是一段文字

下划线

紫色

参考信息

  • 第一行
  • 第二行
蓝色

这里是卡片 1 的内容

这里是卡片 2 的内容

绿色
黄色

label

红色

danger

# 提醒块

语法

::: type [no-icon]
:::

示例

:::default
默认默认
:::

默认默认

:::primary
基本基本
:::

基本基本

:::info
提示提示
:::

提示提示

:::success
成功成功
:::

成功成功

:::warning
警告警告
:::

警告警告

:::danger
危险危险
:::

危险危险

# 文字特效

示例

++下划线++

下划线

++波浪线++{.wavy}

波浪线

++着重点++{.dot}

着重点

++紫色下划线++{.primary}

紫色下划线

++绿色波浪线++{.wavy .success}

绿色波浪线

++黄色着重点++{.dot .warning}

黄色着重点

~~删除线~~

删除线

~~红色删除线~~{.danger}

红色删除线

==荧光高亮==

荧光高亮

[赤橙黄绿青蓝紫]{.rainbow}

赤橙黄绿青蓝紫

[红色]{.red}

红色

[粉色]{.pink}

粉色

[橙色]{.orange}

橙色

[黄色]{.yellow}

黄色

[绿色]{.green}

绿色

[靛青]{.aqua}

靛青

[蓝色]{.blue}

蓝色

[紫色]{.purple}

紫色

[灰色]{.grey}

灰色

快捷键 [Ctrl]{.kbd} + [C]{.kbd .red}

快捷键 Ctrl + C

H~2~0

H20

29^th^

29th

# label 标签块

语法

[:icon:text]{.style}

示例

[default]{.label}

default

[primary]{.label .primary}

primary

[info]{.label .info}

info

[:heavy_check_mark:success]{.label .success}

✔️success

[warning]{.label .warning}

warning

[:broken_heart:danger]{.label .danger}

💔danger

# 练习题与答案

---
title: 练习题与答案
quiz: true
---
1. 编译时多态主要指运算符重载与函数重载,而运行时多态主要指虚函数。 {.quiz .true}
2. 有基类 `SHAPE`,派生类 `CIRCLE`,声明如下变量:  {.quiz .multi}
    ```cpp
    SHAPE shape1,*p1;
    CIRCLE circle1,*q1;
    ```
    下列哪些项是 “派生类对象替换基类对象”。
    - `p1=&circle1;` {.correct}
    - `q1=&shape1;`
    - `shape1=circle1;` {.correct}
    - `circle1=shape1;`
{.options}
    > - :heavy_check_mark: 令基类对象的指针指向派生类对象
    > - :x: 派生类指针指向基类的引用
    > - :heavy_check_mark: 派生类对象给基类对象赋值
    > - :x: 基类对象给派生类对象赋值
    > {.options}
3. 下列叙述正确的是 []{.gap} 。 {.quiz}
    - 虚函数只能定义成无参函数
    - 虚函数不能有返回值
    - 能定义虚构造函数
    - A、B、C 都不对 {.correct}
{.options}
10. 如果定义 `int e=8; double f=6.4, g=8.9;`,则表达式 `f+int (e/3*int (f+g)/2)%4` 的值为 [9.4]{.gap}。 {.quiz .fill}
    > 注意运算顺序和数据类型
    > [8.4]{.mistake}
  1. 编译时多态主要指运算符重载与函数重载,而运行时多态主要指虚函数。

  2. 有基类 SHAPE ,派生类 CIRCLE ,声明如下变量:

    SHAPE shape1,*p1;
    CIRCLE circle1,*q1;

    下列哪些项是 “派生类对象替换基类对象”。

    • p1=&circle1;
    • q1=&shape1;
    • shape1=circle1;
    • circle1=shape1;
    • ✔️ 令基类对象的指针指向派生类对象
    • ❌ 派生类指针指向基类的引用
    • ✔️ 派生类对象给基类对象赋值
    • ❌ 基类对象给派生类对象赋值
  3. 下列叙述正确的是

    • 虚函数只能定义成无参函数
    • 虚函数不能有返回值
    • 能定义虚构造函数
    • A、B、C 都不对
  4. 如果定义 int e=8; double f=6.4, g=8.9; ,则表达式 f+int (e/3*int (f+g)/2)%4 的值为 9.4

    注意运算顺序和数据类型
    8.4

# 说明

标签 含义
{.quiz} 选择题
{.quiz .multi} 多选题
{.quiz .true} 正确的判断题
{.quiz .false} 错误的判断题
{.quiz .fill} 填空题
[]{.gap} 空白下划线
[答案内容]{.gap} 答案内容带下划线
{.options} ABCDE 选项
{.correct} 选择题的正确选项
> 答案解析
[8.4]{.mistake} 错题备注

# 媒体

{% media audio %}
- title: 列表 1
  list:
    - https://music.163.com/#/playlist?id=2943811283
    - https://music.163.com/#/playlist?id=2297706586
- title: 列表 2
  list:
    - https://music.163.com/#/playlist?id=2031842656
{% endmedia %}


{% media video %}
- name: "测试 1"
  url: https://www.youtube.com/watch?v=CPDUE3IK3nc
{% endmedia %}