用jekyll制作高大上的网站(二)——实际应用
最近公司要制作个文档库,直接就可以将jekyll应用到实际中。
模版使用了Jekyll Clean,这么模版相对内部简单一点,学习成本不会很大,而复杂的Minimal Mistakes就当作参考。
模版使用的CSS是Bootstrap v3.2.0版本的。为了省时点,我就直接将Bootstrap官网中的CSS和JS拉了下来。
一、全局配置
在_config.yml文件中可以有多种设置,包括全局配置、编译选项等。
#网站根目录
baseurl: /docs # 生成的文件路径
destination: ../../dist/docs # 分页
permalink: /:year/:month/:day/:title.html
paginate: 1
paginate_path: "article/:num" # 转换
markdown: kramdown
highlighter: rouge
excerpt_separator: <!--excerpt--> gems: ['jekyll-paginate'] exclude: ['open.bat','Gemfile','Gemfile.lock','Guardfile', 'gulpfile.js'] # Collections
collections:
common:
output: true
permalink: /:collection/:title
ui:
output: true
permalink: /:collection/:title
1)你网站可能会放在域名的某个文件夹下面,那么根目录就要带着那个文件夹,有了“baseurl”的配置,就能方便拼接了。
2)生成的文件路径“destination”,默认是在_site文件夹中,现在放到了我自定义的文件夹下面。
3)分页中为了方便演示,每页仅显示1条记录,文章保存方式是年月日+标题,分页的目录会在“article”,分页比较特殊,下面会详解。
4)markdown就是文章编辑语言,使用了kramdown,kramdown是markdown的超级。highlighter就是代码高亮的方式,使用了rouge。
5)excerpt_separator与文章摘要相关,后面也会详解。
6)collections就是定义一种新的文档类型,例如上面定义了“common”,那么在最终生成的文件中,会专门有一个文件夹,这个后面也会说明下。
二、集合(Collections)
1)与文章的区别
在结构中有一个_post文件夹,这个文件夹内放的就是文章列表,文件名就是按年月日+标题的方式起的,最终生成的将是年月日的文件夹。
如果把所有各种类型的文章都放在这个里面,管理会比较混乱,例如我有随笔、UI库、工具库等要放在网站展示。
随笔的话就可以都放在_post文件夹里,但是UI库等其他类型的文章展示的格式与其不一样、展示的方式也与其不一样。
下图是一张UI库的页面,左边放的是分类,右边放的内容。如果单独放在文件夹中,那么就可以很方便的编辑分类链接。
<h1>基础样式</h1>
<ul>
<li><a href="{{ site.baseurl }}/ui/typeface.html">文本</a></li>
<li><a href="{{ site.baseurl }}/ui/icon.html">图标</a></li>
<li><a href="{{ site.baseurl }}/ui/grid.html">网格</a></li>
<li><a href="{{ site.baseurl }}/ui/border.html">边框</a></li>
<li><a href="{{ site.baseurl }}/ui/layout.html">布局</a></li>
</ul>
2)_data
在上图的右边,还有个页面内容导航,顺便说明下:
kramdown会给h1等自动加上ID,上图中的“h1-h6”就被自动加了ID,里面有英文就用此英文,如果没有就自动生成。
原先我是将这些内容放在_include文件夹下面,_include内放的都是些页面通用部分,后面发现页面越来越多,但是内容都差不多,仅仅是数据不一样,每次都是在复制黏贴。
后面发现jekyll提供了个_data,可以将数据放入此处,再用for循环来输出,此文件夹内可以使用 .yml、.yaml、.json、csv 扩展名。
- id: "const"
name: "普通常量"
children:
- id: "cookie"
name: "cookie"
- id: "menu"
name: "menu"
- id: "to"
name: "分享回调中设置的TO"
- id: "jsbridge"
name: "JSBridge"
在sidenav.html中输出:
<nav class="bs-docs-sidebar hidden-print hidden-xs hidden-sm affix-top">
<ul class="nav bs-docs-sidenav">
{% for data in site.data[page.sidebar][page.sidenav] %}
{% if forloop.first %}
<li class="active">
{% else %}
<li>
{% endif %}
<a href="#{{ data.id }}">{{ data.name }}</a>
{% if data.children %}
<ul class="nav">
{% for sub in data.children %}
<li><a href="#{{ sub.id }}">{{ sub.name }}</a></li>
{% endfor %}
</ul>
{% endif %}
</li>
{% endfor %}
</ul>
<a href="#top" class="back-to-top">返回顶部</a>
</nav>
jekyll用的是liquid模版引擎,有自己的语法,基本常规的都有。
三、文章
1)分类
现在的文章都会有分类,做了区分后,文章能更有调理,下图是博客园的自定义文章分类。
jekyll的文章中要做分类,可以在头信息中设置category或categories。
---
layout: article-detail
title: demo
date: 2016-05-09 08:25:06
sidebar: article
category: tool
author: strick
---
在上图中会显示这个分类的名字,并且会输出这个分类下面文章的个数,点击这个分类名,能够跳转到相应的分类下的文章列表。
要实现这几个功能,可以通过categories的相关属性获取。
<h1>随笔分类</h1>
{% for category in site.categories %}
<ul>
<li><a href="{{ site.baseurl}}/category/{{ category.first }}.html">{{category.first}}({{category.last.size}})</a></li>
</ul>
{% endfor %}
2)文章列表
上面的分类文章列表中,会多个判断:
{% for category in site.categories %}
{% if category.first == page.category %}
{% for post in category.last %}
<div class="article">
<div class="well">
<h1 class="none"><a href="{{ site.baseurl}}{{ post.url }}">{{ post.title }} {{ post.date | date: "(%Y年%m月%d日)" }}</a></h1>
<div class="content">{{ post.excerpt | strip_html }}</div>
</div>
</div>
{% endfor %}
{% endif %}
{% endfor %}
“{{ post.excerpt | strip_html }}”就是在做文章摘要,strip_html是将HTML标签去除。
“{{ post.date | date: "(%Y年%m月%d日)" }}”是在做格式化时间,上面的头信息中设置了“date: 2016-05-09 08:25:06”。
3)分页
jekyll的分页只能在index.html中执行,只能这个文件,其他文件是不能执行,“paginator”对象中的属性都将为空。
在上面的_config.yml中设置了两个关于分页的属性,一个是每页显示的数量,一个是分页文件输出的方式。
paginate: 1
paginate_path: "article/:num"
没有把页码1给输出,我在做分页的时候,就每次都得多做个判断。
页面的样式就直接用了Bootstrap的分页。
<ul class="pagination">
<li>
<a href="{{ site.baseurl}}/article/">
<span>首页</span>
</a>
</li>
<li>
{% if paginator.page == 1 %}
<span>«</span>
{% else %}
{% if paginator.previous_page == 1 %}
<a href="{{ site.baseurl}}/article/">
{% else %}
<a href="{{ site.baseurl}}/article/{{ paginator.previous_page }}">
{% endif %}
<span>«</span>
</a>
{% endif %}
</li>
{% for i in (1..paginator.total_pages) limit:9 offset:{{paginator.page-1}} %}
{% if paginator.page == i %}
<li class="active">
{% else %}
<li>
{% endif %}
{% if i == 1 %}
<a href="{{site.baseurl}}/article">{{i}}</a>
{% else %}
<a href="{{site.baseurl}}/article/{{i}}">{{i}}</a>
{% endif %}
</li>
{% endfor %}
<li>
{% if paginator.page == paginator.total_pages %}
<span>»</span>
{% else %}
<a href="{{ site.baseurl}}/article/{{ paginator.next_page }}">
<span>»</span>
</a>
{% endif %}
</li>
<li>
<a href="{{ site.baseurl}}/article/{{paginator.total_pages}}">
<span>末页</span>
</a>
</li>
<li class="disabled">
<span>第{{paginator.page}}页 / 共{{paginator.total_pages}}页</span>
</li>
</ul>
demo下载:
http://download.csdn.net/download/loneleaf1/9518315
参考资料:
Syntax Highlighting in Jekyll With Rouge
用jekyll制作高大上的网站(二)——实际应用的更多相关文章
- 用jekyll制作高大上的网站(一)——安装与配置
很多人会制作自己的主页,页面美观简洁,一直很在意是怎么做的. 最近公司需要做个文档库的主页,就研究了一些开源的工具,后面发现了jekyll(读杰克尔),将纯文本转换为静态博客网站. 一.Ruby je ...
- 转载: 使用vue全家桶制作博客网站 HTML5 移动网站制作的好教程
使用vue全家桶制作博客网站 前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue. ...
- Cocos2d-x v3.6制作射箭游戏(二)
原文 Cocos2d-x v3.6制作射箭游戏(二) 六 24, 2015by RENSHANin COCOS2D-X 上章我们创建并加载了游戏地图,接下来的两章我们将实现如下的效果. 在开始之前,先 ...
- 阿里云服务器:IIS网站的架设(一、环境设置与安装IIS网站 二、网站的基本设置 三、建立新网站(未完待续))
Windows Server 2012 R2的Internet Information Services (IIS)网站的模块化设计,可以减少被攻击面并减轻管理负担,让系统管理员更容易架设安全的具备高 ...
- Django搭建博客网站(二)
Django搭建自己的博客网站(二) 这里主要讲构建系统数据库Model. Django搭建博客网站(一) model 目前就只提供一个文章model和一个文章分类标签model,在post/mode ...
- swiper 、css3制作移动端网站,折叠导航
swiper .css3制作移动端网站,折叠导航 前几天公司要更新改版移动端的官网,由于网站本身没有多少内容,所以设计师就做成了整屏滑动的样子,起初我并没有看设计稿就一口答应了,拿到手后发现了几个问题 ...
- 用jekyll和github把网站建起来!
先把这些天学习的用jekyll在github上搭建网站的步骤记录下来,留作参考. #安装jekyll 确定系统安装 Git, Ruby, RubyGems, Nodejs, Python2.7. 如何 ...
- Dockerfile自动制作Docker镜像(二)—— 其它常用命令
Dockerfile自动制作Docker镜像(二)-- 其它常用命令 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云服务器 c. 上一篇:Dockerf ...
- 使用Dreamweaver制作简单网站(二)
继续上周没完成的 一.新建iframe.css 1.点击文件-选择新建-css 2.ctrl+s保存为iframe.css 在style文件夹下. 3.回到main.html 右键选择-附加样式表,选 ...
随机推荐
- iOS 属性修饰符记录 --不定时更新
重新审视了一下OC在属性修饰符,特意记录一下来.以后不定时更新 > retain:只有在非ARC下才会有效,所有如果在ARC下使用了retain修饰也白搭 如以下的data属性用retain修饰 ...
- Linux VMware 克隆后无法启动eth0网卡
引: VMware 下LINUX出现:Device eth0 does not seem to be present, delaying initialization.解决办法 VMWare 克隆 复 ...
- Java中有关Null的9件事
对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常 (NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我 ...
- 【实战Java高并发程序设计 5】让普通变量也享受原子操作
[实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...
- 关于ReSharper
Resharper提供以下6个核心功能1. 代码分析(Code Analysis):智能提示代码中存在的问题和修复建议. 2. 编码助手(Coding Assistance):智能提示自动完成功能. ...
- 关于大型网站技术演进的思考(二十)--网站静态化处理—web前端优化—中(12)
Web前端很多优化原则都是从如何提升网络通讯效率的角度提出的,但是这些原则使用的时候还是有很多陷阱在里面,如果我们不能深入理解这些优化原则背后所隐藏的技术原理,很有可能掉进这些陷阱里,最终没有达到最佳 ...
- 浅谈SQL Server数据库分页
数据库分页是老生常谈的问题了.如果使用ORM框架,再使用LINQ的话,一个Skip和Take就可以搞定.但是有时由于限制,需要使用存储过程来实现.在SQLServer中使用存储过程实现分页的已经有很多 ...
- JSP模板继承功能实现
背景 最近刚入职新公司,浏览一下新公司项目,发现项目中大多数JSP页面都是独立的.完整的页面,因此许多页面都会有如下重复的代码: <%@ page language="java&quo ...
- Thread.Sleep引发ThreadAbortException异常
短信平台记录日志模块,是通过异步方式来记录的,即日志工具类里初始化一个Queue对象,公共的写日志方法的处理逻辑是把日志消息放到Queue里.构造器里设定一个死循环,不停的读队,然后把日志消息持久化到 ...
- LInux MySQL 数据库 的一些操作
数据库安装: ………… 创建数据库连接新用户: 1.登录mysql #mysql -u root -p 2.新增用户 insert into mysql.user(Host,User,Password ...