草庐IT

GitHub Pages 和 Jekyll 笔记

Milton 2023-03-28 原文

GitHub Pages 和 Jekyll 笔记

快速创建(使用默认的Jekyll引擎)

1. 新建仓库

新建一个空仓库, 名称为username.github.io, 其中 username 就是你的GitHub账号名称

2. 增加文件

Clone到本地, 在里面建两个文件 _config.ymlindex.md

_config.yml 是 Jekyll 的配置文件

theme: jekyll-theme-minimal
title: My Homepage
description: For daily notes

index.md 是站点的首页

# Test Page

It's a test page

## Header 2

content

3. 提交

将内容提交到仓库

git add -A
git commit -m "update"
git push

4. 等待发布

此时在仓库首页, 能看到一个棕色的小点, 表示有action正在执行, 点击能看到acion的详情, 等action执行完毕, 就能通过 https://username.github.io 访问网站了.

GitHub Pages 上的Jekyll

大部分的 Jekyll 选项都可以通过 _config.yml 配置使用, 配置项参考, 但是有一些在 GitHub Pages 中是固定的, 不可更改

lsi: false
safe: true
source: [your repo's top level directory]
incremental: false
highlighter: rouge
gist:
  noscript: false
kramdown:
  math_engine: mathjax
  syntax_highlighter: rouge

默认设置下, Jekyll 不处理以下文件和目录

  • 目录 /node_modules
  • 目录 /vendor
  • _, ., 或#开头的文件或目录
  • ~结尾的文件或目录
  • 在配置文件的 exclude 中设置的文件或目录

如果需要 Jekyll 处理以上情况的文件或目录, 需要在配置文件的 include 中单独设置.

Jekyll使用

整体目录结构

一个 Jekyll 网站整体的目录结构如下

├── _config.yml
├── _data
│   └── members.yml
├── _drafts
│   ├── begin-with-the-crazy-ideas.md
│   └── on-simplicity-in-technology.md
├── _includes
│   ├── footer.html
│   └── header.html
├── _layouts
│   ├── default.html
│   └── post.html
├── _posts
│   ├── 2007-10-29-why-every-programmer-should-play-nethack.md
│   └── 2009-04-26-barcamp-boston-4-roundup.md
├── _sass
│   ├── _base.scss
│   └── _layout.scss
├── _site
├── .jekyll-cache
│   └── Jekyll
│       └── Cache
│           └── [...]
├── .jekyll-metadata
└── index.html # can also be an 'index.md' with valid front matter

设置模板

通过指定模板, 可以使 Jekyll 生成不同式样的页面, GitHub Pages 支持的模板, 可以在这里查看 https://pages.github.com/themes/, 当前支持的模板有

  • Architect
  • Cayman
  • Dinky
  • Hacker
  • Leap day
  • Merlot
  • Midnight
  • Minima
  • Minimal
  • Modernist
  • Slate
  • Tactile
  • Time machine

设置全局变量

完整的配置项参考 https://jekyllrb.com/docs/configuration/

组合/列表变量

https://jekyllrb.com/docs/collections/

通过collections_dir指定目录, 如果使用这个配置, 那么_posts目录和_drafts目录也要挪到这个目录下

collections_dir: mycollections # 选择指定一个目录来将所有合集和posts存储在同一个位置

通过collections变量定义不同的collection, 如果是使用页面, 对应的要在上面指定的目录下, 创建一个同名但是以_开头的目录, 例如下面的设置, 需要创建一个mycollections/_collection01目录

collections:
  collection01: # 你的collection名称
    output: true 
  • 通过collections指定的页面合集, 文件名不需要使用固定格式
    _posts目录是一种特殊的collection, 文件名格式是固定的

如果需要对一个collection中的页面进行分组, 可以通过在collection下的页面头部添加变量进行区分, 具体方法参考 https://stackoverflow.com/questions/37277738/can-i-create-nested-collections-in-jekyll

  1. 创建一个目录 _sections 下面放置页面合集
  2. 每个页面上添加变量chapter, 分别使用值01, 02, ... 用于区分不同的chapter
  3. 创建layout, _layouts/chapter.html, 内容为
---
layout: default
---

<h1>Chapter {{ page.chapter }}</h1>

{% for section in site.sections %}
{% if section.chapter == page.chapter %}
{{ section.output }}
{% endif %}
{% endfor %}
  1. 创建页面 chapter01.md, 内容为
---
chapter: 01
layout: chapter
---
  1. 在全局设置 _config.yml 中设置 _sections 目录不输出
collections:
  sections:
    output: false
  chapters:
    output: true

数据文件

放置到 _data 目录, 支持 YAML, JSON, CSV 和 TSV 文件(扩展名为 .yml, .yaml, .json, .tsv, 和 .csv).

例如 _data/members.yml

- name: Eric Mill
  github: konklone

- name: Parker Moore
  github: parkr

- name: Liu Fengyun
  github: liufengyun

或者_data/members.csv

name,github
Eric Mill,konklone
Parker Moore,parkr
Liu Fengyun,liufengyun

通过site.data.members引用数据中的值, 例如

<ul>
{% for member in site.data.members %}
  <li>
    <a href="https://github.com/{{ member.github }}">
      {{ member.name }}
    </a>
  </li>
{% endfor %}
</ul>

_data 目录支持子目录, 对应的在引用变量中要增加子目录名作为变量路径, 例如
文件 _data/orgs/jekyll.yml

username: jekyll
name: Jekyll
members:
  - name: Tom Preston-Werner
    github: mojombo

  - name: Parker Moore
    github: parkr

_data/orgs/doeorg.yml

username: doeorg
name: Doe Org
members:
  - name: John Doe
    github: jdoe

上面的数据可以通过site.data.orgs进行引用, 例如

<ul>
{% for org_hash in site.data.orgs %}
{% assign org = org_hash[1] %}
  <li>
    <a href="https://github.com/{{ org.username }}">
      {{ org.name }}
    </a>
    ({{ org.members | size }} members)
  </li>
{% endfor %}
</ul>

静态文件

在 _config.yml 中定义一个路径下的全部文件, 属性增加image = true

defaults:
  - scope:
      path: "assets/img"
    values:
      image: true

然后可以在变量中进行过滤

{% assign image_files = site.static_files | where: "image", true %}
{% for myimage in image_files %}
  {{ myimage.path }}
{% endfor %}

设置页面变量

在任何 Jekyll 处理的页面文件的最开始(如果是UTF-8, 需要确认没有BOM), 以三横线开始和结束的一段YAML代码用于设置当前页面的页面变量, 例如

---
layout: post
title: Blogging Like a Hacker
---

这里可以引用之前定义的变量, 也可以定义新的值, 例如

---
food: Pizza
---

<h1>{{ page.food }}</h1>

预定义的变量

  • 全局变量: layout, permalink, published
  • 帖子变量: date, category, categories, tags

变量处理引擎 Liquid

  • 日期格式: STRFTIME, 常用的 2022-10-23 12:12:12格式对应的是%Y-%m-%d %H:%M:%S

插件

GitHub Pages 默认启用以下的 Jekyll 插件, 不能禁用

  • jekyll-coffeescript
  • jekyll-default-layout
  • jekyll-gist
  • jekyll-github-metadata
  • jekyll-optional-front-matter
  • jekyll-paginate
  • jekyll-readme-index
  • jekyll-titles-from-headings
  • jekyll-relative-links

可以通过 _config.yml 添加新的插件.

代码高亮

GitHub Pages 中的代码高亮和 GitHub 是一样的, 默认情况下由 Jekyll 处理代码高亮, Jekyll 使用的代码高亮解析是 Rouge.

页面类型

Jekyll 的页面分为不同的类型, 主要有 Page, Posts

Pages

Pages 用于做单独的页面, 单独创建, 可以放在任意目录, 生成时会放到 _site 目录下

Posts

Posts 用于日常的文章发表, 创建时放到 _posts 目录下, 文件名需要使用如下固定的格式

YEAR-MONTH-DAY-title.MARKUP

例如

2011-12-31-new-years-eve-is-awesome.md
2012-09-12-how-to-write-a-blog.md

每个文章的固定格式如下, 前面的front matter可以为空

---
layout: post
title:  "Welcome to Jekyll!"
---

# Welcome

**Hello world**, this is my first Jekyll blog post.

I hope you like it!

静态文件

静态文件例如图片, ZIP, PDF, 可以都放置在 assets 目录下, 再从文章中连接, 例如

... which is shown in the screenshot below:
![My helpful screenshot](/assets/screenshot.jpg)

或者链接到PDF

... you can [get the PDF](/assets/mydoc.pdf) directly.

文章列表

使用以下方式创建文章列表

<ul>
  {% for post in site.posts %}
    <li>
      <a href="{{ post.url }}">{{ post.title }}</a>
    </li>
  {% endfor %}
</ul>

分类和标签

Tag 和 Category 都有单数复数的区分, 如果是单数, 后面的整个值都作为一个标签或分类, 如果是复数, 则按空格分隔
tag: classic hollywood会被当成标签"classic hollywood", 如果是tags: classic hollywood, 则会被当成标签 "classic"和"hollywood".

使用tag或category创建文章目录, 可以使用下面的形式, 注意site.tagssite.categories的for循环中, 每个标签或分类会产生两个单元, 一个单元是名称, 另一个单元才是文章列表

{% for tag in site.tags %}
  <h3>{{ tag[0] }}</h3>
  <ul>
    {% for post in tag[1] %}
      <li><a href="{{ post.url }}">{{ post.title }}</a></li>
    {% endfor %}
  </ul>
{% endfor %}

分类与标签的区别在与, 分类可以直接由文章的目录路径来定义, 在_post 目录上层的目录, 都会被当成分类, 例如如果文章位于路径 movies/horror/_posts/2019-05-21-bride-of-chucky.markdown, 那么 movies 和 horror a自动成为这个文章的分类.

当文章中使用 front matter 定义了类别, 会在列表中添加这篇文章. 取决于 front matter 中是否定义了分类, 例如 category: classic hollywood, 或 categories: classic hollywood, 帖子就会相应地产生这样的链接 movies/horror/classic%20hollywood/2019/05/21/bride-of-chucky.html 或 movies/horror/classic/hollywood/2019/05/21/bride-of-chucky.html

在页面上列出所有标签和标签下的文章 https://talk.jekyllrb.com/t/how-to-list-all-posts-for-any-given-tag/1402/2

根目录下创建文件 tags.html, 或者创建目录和文件 tags/index.html, 使用如下的内容

---
layout: default
---

{% assign sorted_tags = site.tags | sort %}
{% for tag in sorted_tags %}
{% assign vids = tag[1] | sort %}

{% if vids != empty %}

  <h2 id="{{tag[0] | uri_escape | downcase}}">{{tag[0]}}</H2>
     <p>
      {% for p in vids %}
     <a href="{{ p.url }}">{{ p.title }}</a> <span class="entry-date"><time datetime="{{ p.date | date_to_xmlschema }}" itemprop="datePublished">{{ p.date | date: "%B %d, %Y" }}</time></span>
     <br />
      {% endfor %}
    </p>
  
{% endif %}

{% endfor %}

对应的展示效果 http://ephotopros.com/tags/

文章摘要

默认使用的是正文内容的第一段, 可以通过excerpt_separator定义, 例如

---
excerpt_separator: <!--more-->
---

Excerpt with multiple paragraphs

Here's another paragraph in the excerpt.
<!--more-->
Out-of-excerpt

在列表中引用摘要

<ul>
  {% for post in site.posts %}
    <li>
      <a href="{{ post.url }}">{{ post.title }}</a>
      {{ post.excerpt }}
    </li>
  {% endfor %}
</ul>

草稿

草稿可以放到 _drafts 目录下

.
├── _drafts
│   └── a-draft-post.md
...

Jekyll 实例参考

有关GitHub Pages 和 Jekyll 笔记的更多相关文章

  1. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  2. ruby - 在没有 root 的情况下安装 Jekyll - 2

    我想在共享服务器上建立一个jekyll博客。当我尝试安装Jekyll时,我得到“您没有写权限”。我该如何在没有root或sudo的情况下解决这个问题?更多细节:我在共享服务器上有空间,但没有根访问权限。我无法安装Ruby,尽管托管公司应我的要求安装了它。当我尝试安装Jekyll时我使用user@hosting.org[~]#geminstalljekyll这是我得到的回应:ERROR:Whileexecutinggem...(Gem::FilePermissionError)Youdon'thavewritepermissionsintothe/usr/lib/ruby/gems/1.

  3. ruby - 每个页面上的 Jekyll 分页 - 2

    据我们所知,Jekyll默认分页仅支持index.html,我想创建blog.html并在那里包含分页。有什么解决办法吗? 最佳答案 如果您创建一个名为/blog的目录并在其中放置一个index.html文件,那么您可以向_config.yml表示paginate_path:"blog/page:num"。不是使用根文件夹中的默认index.html作为分页器模板,而是使用/blog/index.html。分页器将根据需要生成类似/blog/page2/和/blog/page3/的页面。这将使您到达yourwebsite.com/b

  4. ruby - Jekyll 2.0 中的 SCSS 生成错误 - 2

    我的项目布局如下:-Project-css-import.scss-_sass/main.scssimport.scss的内容是:------@import"main.scss";我期望发生的是将main.scss导入到import.scss中,然后,import.scss将在生成的_site/目录中编译为import.css。相反,我收到以下错误Conversionerror:Therewasanerrorconverting'css/import.scss'.jekyll2.0.3|Error:InvalidCSSafter"-":expectednumberorfunction,

  5. ruby - 忽略 Jekyll 中的特定标签 - 2

    我正在使用Jekyll构建一个站点,我的代码中有一些看起来像{{}}(液体标签)的东西。我希望它在Jekyll完成生成网站后最终出现在输出html中,但Jekyll将其解释为其他任何标记。有没有办法让Jekyll只忽略这个标签的这个特定实例? 最佳答案 使用{%raw%}标签:{%raw%}{{...}}{%endraw%}此代码段将生成{{...}}。 关于ruby-忽略Jekyll中的特定标签,我们在StackOverflow上找到一个类似的问题: htt

  6. ruby - 如何停止 jekyll 本地服务器 - 2

    我刚刚在本地设置了我的第一个Jekyll项目。我已经让服务器运行,但我忘了使用自动标志。所以现在我想停止服务器并使用标志重新启动。但是,在我启动服务器后的命令行中,我没有得到新的提示,所以我无法输入任何新命令。我不太习惯命令行,所以我真的很感激知道我应该做什么!我正在使用MacOSX和terminal.app,如果有区别的话! 最佳答案 psaux|grepjekyll|awk'{print$2}'|xargskill-9 关于ruby-如何停止jekyll本地服务器,我们在StackO

  7. css - Jekyll 和自定义 CSS - 2

    有没有一种方法可以在jekyll站点中包含自定义css标签,同时将markdown用于入口文件?例如,当我想突出显示某个段落时? 最佳答案 Markdown和YAMLFrontMatter都内置了这个。但你可以自己制作。比如说,您有foo.css想要包含在某些帖子中。在_posts/2013-02-03-higligting-foo.markdown中:---css:footitle:"DrupalImagecachesecurityvulnarabilitywithDDOSattackexplained"tags:[drupal,

  8. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  9. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  10. ruby - jekyll 观看 haml 和 sass - 2

    我已经有一个在不同文件夹中包含.haml和.scss文件的项目。我按照这里的指南http://winstonyw.com/2013/02/24/jekyll_haml_sass_and_github_pages/创建了_plugins/haml.rb和_plugins/sass.rb我将我所有的.scss文件移动到./assets/css/文件夹中为了确保,我还创建了layouts文件夹并将所有.haml文件放在其中。我运行了jekyllserve--watch并且这些.haml/.scss文件没有在_sites中转换为.html或.css文件。我也无法通过浏览器访问它们。我在这里试过

随机推荐