Jekyll博客中添加分类与多目录存放博客的方法

2023-05-16


categories: [Frontend]
tags: Frontend HTML

写在前面

最近发现一个问题, 博客数量越来越多了, 都放在_posts下实在是有点不方便, 于是想着分个类, Google 了一圈, 找到了一篇不错的博客, 如下:

Jekyll个人博客添加分类Category功能;

于是就跟着这个教程走了, 中途也发现一些问题, 因为我的 Jekyll 不是完全本地配置的, 还用了远程主题, 配置起来要兼顾原有主题.

博客结构

首先看一下我的原始目录:

.  zorchp.github.io
├── 404.html
├── categories.html
├── archive.html
├── index.html
├── about.html
+++++++++++++++++++++++++++++++
├── _config.yml
├── _data
│   ├── authors.yml
│   ├── licenses.yml
│   ├── locale.yml
│   ├── navigation.yml
│   └── variables.yml
+++++++++++++++++++++++++++++++
├── _drafts
│   └── xxx
├── _post
│   └── XXX
├── _includes
│   ├── article-footer.html
│   ├── article-info.html
│   └── head
+++++++++++++++++++++++++++++++
├── _sass
│   └── custom.scss
├── assets
│   ├── fonts
│   ├── images
│   ├── js
│   └── ...
└── README.md

上面就是一个基本的目录结构了, 简单介绍一下分割线分开的四个部分:

  • *.html 主页的HTML 文件, 例如404 是找不到内容时候显示的页面, index 是主页, archive 是归档页面, about是关于页面
  • *.yaml 配置信息, _config 是全局的配置文件, _data 里面的是导航栏(navigation), 基本变量(variables)等信息
  • *.html 博客的内容与博客页面的修改内容
  • *.css, *.js 样式与 js 代码, 媒体文件

然后就是要更改的内容了, 这里分为配置信息与 html 样式两个部分.

其中 _drafts 是草稿, 其实就是不会被渲染出来的页面(相当于在线博客的草稿箱了), 具体可参考 Jekyll 的文档.

基本配置

yaml 配置部分

_config.yaml

主配置

需要改的地方是:

# 之前是通过日期作子目录的方式, 注释掉
# permalink   : date
# 添加category内容
permalink: /:categories/:title/

navigation.yaml

  - titles:
        # @start locale config
        en      : &EN       Categories
        en-GB   : *EN
        en-US   : *EN
        en-CA   : *EN
        en-AU   : *EN
        zh-Hans : &ZH_HANS  分类
        zh      : *ZH_HANS
        zh-CN   : *ZH_HANS
        zh-SG   : *ZH_HANS
        zh-Hant : &ZH_HANT  分類
        zh-TW   : *ZH_HANT
        zh-HK   : *ZH_HANT
        # @end locale config
    url: categories/

加上上面这段. 添加导航栏部分的分类按钮.

注意 url 部分, 改成目录样式, 之前是 html 文件.

variables.yaml

default:
  text_skin: default
  highlight_theme: default
  lang: zh
  paths:
    root: /
    home: /
    archive:  /archive/

注意这个变量配置, 需要改一下, 之前是用文件来索引的, 现在要用目录来索引, 要不然会找不到归档页面.

html 页面的添加与修改

categories.html

新建这个文件, 注意 yaml 头的永久重定向链接, 需要写成

---
layout: page
permalink: /categories/
---


<div id="archives">
    {% for category in site.categories %}
    <div class="archive-group">
        {% capture category_name %}{{ category | first }}{% endcapture %}
        <div id="#{{ category_name | slugize }}"></div>
        <p></p>

        <h3 class="category-head">{{ category_name }} ({{
            site.categories[category_name].size() }})</h3>
        <a name="{{ category_name | slugize }}"></a>
        {%for post in site.categories[category_name] %}
        <article class="archive-item">
            <h4><a href="{{ site.baseurl }}{{ post.url }}">{{ post.title
                }}</a></h4>
        </article>
        {%endfor %}
    </div>
    {%endfor %}
</div>

_includes/article-info.html

这个文件是从 jekyll-TeXt-theme 这里拷贝来的, 需要改的部分在注释里面写了.

{%- assign _author = site.data.authors[include.article.author] | default: site.author -%}

{%- if include.html != false -%}

{%- include snippets/assign.html
target=site.data.variables.default.page.show_date
source0=layout.show_date source1=include.article.show_date -%}
{%- assign _show_date = __return -%}
{%- if _show_date and include.article.date -%}
{%- assign _show_date = true -%}
{%- else -%}
{%- assign _show_date = false -%}
{%- endif -%}

{%- include snippets/assign.html
target=site.data.variables.default.page.show_tags
source0=layout.show_tags source1=include.article.show_tags -%}
{%- assign _show_tags = __return -%}
{%- if _show_tags and include.article.tags[0] -%}
{%- assign _show_tags = true -%}
{%- else -%}
{%- assign _show_tags = false -%}
{%- endif -%}

<!--添加分类-->
{%if page.categories.size > 0 %}
<div class="blog-tags">
    Category:
    {%if post %}
    {%assign categories = post.categories %}
    {%else %}
    {%assign categories = page.categories %}
    {%endif %}
    {%for category in categories %}
    <a href="/categories/#{{category|slugize}}">{{category}}</a>
    {%unless forloop.last %}&nbsp;{% endunless %}
    {%endfor %}
</div>
{%endif %}
<!--添加分类-->
{%- assign _show_author = include.article.author -%}

{%- include snippets/assign.html target=site.data.variables.default.page.pageview
source0=layout.pageview source1=page.pageview -%}
{%- assign _pageview = __return -%}
{%- if _pageview or include.show_pageview -%}
{%- assign _pageview = true -%}
{%- else -%}
{%- assign _pageview = false -%}
{%- endif -%}

{%- assign _paths_archive = site.paths.archive | default: site.data.variables.default.paths.archive -%}

{%- if _show_tags or _show_author or _show_date or _pageview -%}
<div class="article__info clearfix">
    {%- if _show_tags -%}

    <ul class="left-col menu">
        {%- assign _tag_path = _paths_archive | append: '?tag=' -%}
        {%- include snippets/prepend-baseurl.html path=_tag_path -%}

        {%- for _tag in include.article.tags -%}
        {%- assign _tag_path = __return -%}
        {%- assign _tag_encode = _tag | strip | url_encode } -%}
        <li>
            <a class="button button--secondary button--pill button--sm"
               href="{{ _tag_path | append: _tag_encode | replace: '//', '/' }}">{{
                _tag }}</a>
        </li>
        {%- endfor -%}
    </ul>
    {%- endif -%}

    {%- if _show_author or _show_date or _pageview -%}
    <ul class="right-col menu">
        {%- if _show_author -%}
        <li><i class="fas fa-user"></i> <span>{{ _author.name }}</span></li>
        {%- endif -%}

        {%- if _show_date -%}
        <li>
            {%- include snippets/get-locale-string.html
            key='ARTICLE_DATE_FORMAT' -%}
            <i class="far fa-calendar-alt"></i> <span>{{ include.article.date | date: __return }}</span>
        </li>
        {%- endif -%}

        {%- if _pageview -%}
        {%- if site.pageview.provider -%}
        {%- include snippets/get-locale-string.html key='VIEWS' -%}
        {%- assign _locale_views = __return -%}
        <li><i class="far fa-eye"></i> <span class="js-pageview"
                                             data-page-key="{{ include.article.key }}">0</span>
            {{ _locale_views }}
        </li>
        {%- endif -%}
        {%- endif -%}
    </ul>
    {%- endif -%}

</div>
{%- endif -%}
{%- endif -%}


{%- if include.semantic != false -%}
{%- if _author -%}
<meta itemprop="author" content="{{ _author.name }}"/>
{%- endif -%}
{%- if include.article.date -%}
<meta itemprop="datePublished"
      content="{{ include.article.date | date_to_xmlschema }}">
{%- endif -%}
{%- if include.article.tags[0] -%}
{%- assign _keywords = include.article.tags | join: ',' %}
<meta itemprop="keywords" content="{{ _keywords }}">
{%- endif -%}
{%- endif -%}

主体部分

这里就是针对博客实际部分, 也就是 _posts 目录, 这时候可以先将之前的文件分成多个文件夹, 例如:

.
├── ASM
├── C_C++
├── DSA
├── Debug
├── English
├── Frontend
├── GUI
├── LaTeX
├── Linux-shell
├── Maths
├── Python
├── SQL-Database
├── UsefulTips
└── forJobs

下面以一个博客为例, 说一下添加的方法:

---
categories: [Debug]
tags: MacOS Debug Tips
---

其实就是添加了 categories: [Debug] 这部分而已…

一个技巧

之前文件很多, 那么如何批量修改(在文件的 yaml 头部分添加一行分类)呢?

首先要自己分类一下, 这个得自己来, 因为 tags 条目不尽相同.

然后就是我的思路了:

用万能的 Python!

import os
from glob import glob


def show():
    print(os.getcwd())
    fs = glob("*.md")
    for i in fs:
        with open(i, "a+") as f:
            f.seek(0)
            f.seek(4)
            # print(f.tell())
            content = f.read()
            f.seek(0)
            f.seek(4)
            f.truncate()
            f.write("categories: [Maths]")
            f.write("\n")
            f.write(content)
        print(i, "ok")


if __name__ == "__main__":
    show()

将这个文件放在需要批量操作的博客目录中: _posts/XXX 子目录

然后改一下 17 行的分类具体内容, 运行即可.

主要思路就是文件的偏移量, 然后追加写入即可, 这里需要注意, 即使使用文件尾追加的 a+ 模式, 并且修改了文件指针(使用 seek 系统调用), 还是只会在文件末尾添加行, 这就需要先保存文件的剩余内容, 然后截断文件(使用 truncate 系统调用), 最后补上即可.

这里还要注意一点, 就是如果你的文件没有 yaml 头(即用---开始的头), 并且文件的开始是中文(非 ASCII 字符), 那就会引起错误, 要解决这个问题, 只能先挑选出来出问题的文件, 这里可以用另一个 python 文件来做(Python 我滴神, 用 C++一晚上写不出来, 还是基础不牢).

def get_all_non_standard():
    fs = glob("./**/*.md", recursive=True) # 递归遍历所有文件
    # print(len(fs))
    for i in fs:
        with open(i, "r") as f:
            if f.readline() == "---\n":
                continue
            else:
                print(i)

这个简单的函数, 用来找所有存在 yaml 头的博客, 然后分别修改即可.

后记

重构之后的博客,可以看这里!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jekyll博客中添加分类与多目录存放博客的方法 的相关文章

  • Java 集合

    ArrayList 默认长度为10 indexOf lastIndexOf 通过equals方法判断索引 span class token keyword public span span class token keyword int s
  • Java 多线程知识

    参考链接 xff1a https www cnblogs com kingsleylam p 6014441 html https blog csdn net ly0724ok article details 117030234 https
  • Java I/O

    参考链接 xff1a https blog csdn net m0 71563599 article details 125120982 https www cnblogs com shamo89 p 9860582 html https
  • 最小生成树 prim算法(附代码)

    prim算法是以一个根节点开始慢慢往下延伸 xff0c 不断寻找距生成树最短的距离的节点 xff0c 然后将该节点纳入生成树的集合中 xff0c 然后再将该节点影响的其他未纳入生成树节点的距离更新 xff08 缩小与生成树的距离 xff09
  • cdr x4检测显示软件产品已被禁用警告弹窗,如何解决教程分享

    偶尔翻开移动硬盘 xff0c 找到这货 xff0c CorelDraw X4简体中文正式版 网上现在比较难下载得到了 xff0c X4是我最常用的一个 现在把它分享出来 xff0c 有需要的可以去下载使用 orelDRAW X4打开显示被禁
  • 数据结构与算法题目集(中文) 6-1 单链表逆转 (20 分)

    本题要求实现一个函数 xff0c 将给定的单链表逆转 函数接口定义 xff1a List Reverse List L 其中List结构定义如下 xff1a typedef struct Node PtrToNode struct Node
  • HTML5 Table 布局实现 商品列表

    运行结果如上 下面说说设计过程 xff1a 一开始试探的做的时候 xff0c 是建立了一个table xff0c 这个table里面放一本图书的信息 然后建立了一个列 xff0c 然后建立了个td xff0c td里面放图片 xff0c t
  • POJ 1050 To the Max(动态规划)

    Given a two dimensional array of positive and negative integers a sub rectangle is any contiguous sub array of size 1 1
  • web前端 背景色属性bgcolor

    通过 lt body gt 元素中的bgcolor属性来设定网页的背景颜色 其语法格式如下 xff1a lt body bgcolor 61 34 value 34 gt 颜色是属性值的设定有三种方法 xff1a 1 颜色名称 规定颜色值为
  • java连接数据库步骤

    1 加载驱动 Class forname 数据库驱动名 2 建立数据库连接 使用DriverManager类的getConnection 静态方法来获取数据库连接对象 xff0c 其语法格式如下所示 Connection conn 61 D
  • 怎么从零开始运行github / 现成的项目

    这篇博客是作为非计软科班出身的我记录的一些经验 xff0c 希望得到交流和批评 目录 环境配置 通过文件命名了解项目 demo 代码运行的入口 设定参数的文件 build 通过代码了解项目 64 装饰器 一些交流时用到的术语 API 交流或
  • 生产环境中使用Kolla部署OpenStack-allinone云平台(红帽8版本)

    CentOS8系统中使用Kolla部署OpenStack allinone云平台 Kolla概述和openstack所有结点linux系统初始配置 kolla是openstack下面用于自动化部署的一个项目 xff0c 它基于docker和
  • vue2项目-request配置put请求Content-Type为x-www-form-urlencoded

    在项目中遇到需要使用put请求的接口 使用的方式是x www form urlencoded 步骤梳理 在项目的request js文件是默认配置了json方式的 span class token keyword import span a
  • STM32学习第一课——新建工程与点亮LED灯

    第一次接触到32位的MCU与之前所学的51单片机和430单片机都是有所不同的 xff0c STM32是用库函数来写程序的这样一来不管是从代码的编写和移植都会方便很多 以下是今天所学的东西 xff1a 1 新建工程 个人觉得不用去新建一个工程
  • 基于arm架构的ubuntu18 .04安装Anaconda3 + pytorch+python3.9

    记录一下项目踩坑经历 xff08 查了很多资料 xff0c 感觉都是对有基础的人来说的 xff0c 对于刚接触深度学习环境的小白并不友好 xff0c 很多细节并没有 xff0c 各种坑无数 xff0c 我也是花了好长时间才弄清楚 xff09
  • MathType7应用中文版特色功能介绍

    MathType 是由美国Design Science公司开发的功能强大的数学公式编辑器 xff0c 它同时支持Windows和Macintosh 操作系统 xff0c 与常见的文字处理软件和演示程序配合使用 xff0c 能够在各种文档中加
  • QT的延时函数

    延时函数在收发数据的时候用处很大 在其他方面也有用处 这里提供四种方法 1 多线程程序 使用QThread sleep 或者QThread msleep 或QThread usleep 或QThread wait 进行延时处理 Sleep不
  • ios基础篇(八)—— iOS触摸事件

    iOS中的事件 iOS事件中分为三大类 xff0c 触摸事件 xff0c 加速器事件 xff0c 远程控制事件 响应者对象 在iOS 中 不是任何对象都是能处理事件的 xff0c 只有继承于UIResponder 的对象才能接受并且处理事件
  • 牛客C++ACM模式输入输出11道题分析与总结

    tags C 43 43 Interview 写在前面 感觉好久没写博客了 最近看的书多 但是真正沉淀下来的东西却很少 这次总结一下C 43 43 刷题中常用的一些IO操作 也就是ACM模式中的一些基本操作 看到知识星球里面推荐了牛客的一个
  • C++类内初始化vector的一个小坑与分析解决

    tags C 43 43 Debug STL 问题 先来看这样一份代码 vector span class token operator lt span vector span class token operator lt span sp

随机推荐