About
Based on unchanged hpstr-jekyll-theme-master.zip from GitHub at 2014-08-07 16:44:14 whose features include animated navigation, images, table rules and buttons. Jekyll use Liquid markup language so you will see many {% something %}. Besides, I just discovered MathJax is easy to set up and renders LaTeX nicely.
Highlights
- Disqus
- With Chinese characteristics
- I don’t like the category in permalinks
- I don’t like ‘Latest Posts’ title
- Reading time in decimals
- Clean post tails
- Display post tags
- Display post preview
- Sort by months in archives
- Correct case for categories
- The first paragraph shouldn’t have a bigger font size
- Highlight code in colour
- Old: Generate Table of Contents
Contents
Tree
├── _config.yml
├── _includes
│ ├── head.html
│ ├── navigation.html
│ └── ...
├── _layouts
│ ├── page.html
│ ├── post.html
│ └── ...
├── index.html
├── archives.html
├── categories.html
├── assets
│ ├── less
│ │ ├── variables.less
│ │ └── ...
│ └── ...
└── ..._config.yml
-
Blog info: Change
title,description,owner’sname. -
Disqus (comment system): Input your
disqus_shortnamewhich can be found on https://disqus.com/. Input correctly will get you out of some ‘troubles’ related to Disqus. -
Chinese SNS links (in navigation): Input your SNS ID at
twitter,github, etc. I added Chinese SNS:zhihu,v2ex,weibo,renren,douban. → Don’t worry about using URL or ID, because you will set up icons and icon links later. -
Google Analytics (count blog view; track readers’ locations): Input your Google Analytics ID at
google_analyticswhich can be found at http://www.google.com/analytics/ >Admintab >PROPERTYcolumn >Tracking Info>Tracking Code> find the alphameric starts thatUA-. By the way, Quicklytics and Analytiks let you view statistics at iOS. I use Analytiks but don’t recommend it, because it is way too basic compared to Quicklytics. -
Navigation cleanup: You can use and customise
linksor deletelinkspart. -
Misc.: Change
timezoneto yours which can be found onhttp://en.wikipedia.org/wiki/List_of_tz_database_time_zones. -
Post links: I don’t like the
/:categories/:title/format of permalinks. Categories are susceptible to changes, and post titles are less susceptible to the problem. For now I changepermalinkto/:title/. However, one issue can be arisen, if the post title is too long and broken into ugly multiple lines on your blog, and you want to change the post title. As a result, the old link for the post will be broken. But for now, I have no solution to the problem. -
Number of posts per page: You may want to raise
5paginateif you truncate your post list/index page, afterwards,index.html, (because you will edit the file instead of others,) that is, display post preview instead of full post content. My currentpaginateis set to10. -
Remarks: Note that the markdown engine in use is kramdown, and kramdown use coderay to highlight code blocks, I guess. Given the current code highlighter is pygments, you can ignore coderay settings, I guess. Besides, I have a question.
node_modulesis inexcludelist, why it’s still pushed to GitHub?
head.html
Home Title: I don’t like Latest Posts - lsfalimis, so I change line 2’s (L2) {% if page.title %} to {% if page.title and page.title != site.title %}. Why can’t I leave title in index.html blank? Give it a try. By the way, I know nothing about coding. If there are simpler codes, please leave the comments, thank you!
navigation.html
Use SNS icons: Choose icons at here. Wish I could make icons of V2EX, Zhihu and Douban…
page.html
- Reading time in decimals: The default display of reading time is fraction. It’s quite unpleasing. Given the lesser reading times occur more frequently for my blog, I set up conditionals as follows. Messy code…
{% assign readtime = content | number_of_words | divided_by:site.words_per_minute%}
{% if readtime <= 1 %}1 min. read
{% elsif readtime <= 2%}2 min. read
{% elsif readtime <= 3%}3 min. read
{% elsif readtime <= 4%}4 min. read
{% elsif readtime <= 5%}5 min. read
{% elsif readtime <= 6%}6 min. read
{% elsif readtime <= 7%}7 min. read
{% elsif readtime <= 8%}8 min. read
{% elsif readtime <= 9%}9 min. read
{% elsif readtime <= 10%}10 min. read
{% else %}10+ min. read{% endif %}- Misleading Google Plus ‘+1’ sign: It seems that the post has already gotten a ‘+1’ on Google Plus. No… So I change
+1toShare.
post.html
Redo the steps in page.html here. Next I will talk about Read More. I have no idea how site.related_posts are chosen, so I replace this part with ‘next post’ and ‘previous post’. From {% if site.related_posts.size %} to </div><!-- /.read-more --> are replaced by the code as follows:
<div class="read-more">
<div class="read-more-content">
{% if page.next.url %}
<h3><a href="{{ site.url }}{{ page.next.url }}" title="{{ page.next.title }}">← {{ page.next.title }}</a></h3>
<span>Published {{ page.next.date | date: }}</span>
{% endif %}
{% if page.next.url and page.previous.url%}<hr>{% endif %}
{% if page.previous.url %}
<h3><a href="{{ site.url }}{{ page.previous.url }}" title="{{ page.previous.title }}">{{ page.previous.title }} →</a></h3>
<span>Published {{ page.previous.date | date: }}</span>
{% endif %}
</div><!-- /.read-more-content -->
</div><!-- /.read-more -->index.html
Firstly, redo ‘reading time’ step.
-
Head image: Change
image’sfeature. The one I use comes from Unsplash at which you can find Public Domain images that possess No Copyright. -
Post tags: After post date and before comment hyperlink, I’d like to display tags and the code is:
{% for tag in post.tags %} • <a href="{{ site.url }}/tags/#{{ tag }}" title="Pages tagged {{ tag }}">{{ tag }}</a>{% unless forloop.last %}{% endunless %}{% endfor %}- Post preview: Replace
{{ post.content }}to the the following code, and when you are writing, if need, add<!--more-->in your post markdown file. The part before the tag will be displayed in post preview.
{% if post.content contains '<!--more-->' %}
{{ post.content | split:'<!--more-->' | first %}}
<p><a class="btn btn-info" href="{{ post.url }}">Read more</a></p>
{% else %}
{{ post.content }}
{% endif %}archives.html
I rename posts.html to archives.html.
Sort by months: To do it, another loop to repeat month is needed. Firstly, I capture or declare this_month and next_month; in liquid loop, this_something is like x and another variable is declare to compare with x in conditional in order to realise a loop. forloop.first denote the first loop, and I put a h3 title of this_month here. forloop.last denote the loops except the first loop, and I add a conditional here to produce all other h3 month title that doesn’t include the month in the first loop. The code is as follows:
{% for post in site.posts %}
{% capture this_year %}{{ post.date | date: }}{% endcapture %}
{% capture next_year %}{{ post.previous.date | date: }}{% endcapture %}
{% capture this_month %}{{ post.date | date: }}{% endcapture %}
{% capture next_month %}{{ post.previous.date | date: }}{% endcapture %}
{% if forloop.first %}
<article>
<h2 id="{{ this_year }}-ref">{{ this_year }}</h2>
<h3 id="{{ this_month }}-ref">{{ this_month }}</h3>
{% endif %}
<li class="entry-title"><a href="{{ site.url }}{{ post.url }}" title="{{ post.title }}">{{ post.title }}</a></li>
{% if forloop.last %}
</article>
{% else %}
{% if this_month != next_month %}
<h3 id="{{ next_month }}-ref">{{ next_month }}</h3>
{% endif %}
{% if this_year != next_year %}
</article>
<article>
<h2 id="{{ next_year }}-ref">{{next_year}}</h2>
<h2 id="{{ next_month }}-ref">{{next_month}}</h2>
{% endif %}
{% endif %}
{% endfor %}categories.html
cat tags.html > categories.htmlWith Sublime Text replacing’s case sensitive on, replace tags with categories, replace Tags with Categories, then replace tag with category, and then replace class="category" with class="tag".
Category case: By default, categories are changed by Jekyll to lowercase for better processing. We can capitalise categories, but some special terms are exceptions, such as, ‘iOS’ and ‘LaTeX’. Therefore, I replace <h2 id="{{ this_word }}">{{ this_word }}</h2> with a conditional:
{% if this_word == 'ios' %}<h2 id="{{ this_word }}">iOS</h2>
{% else %}<h2 id="{{ this_word }}">{{ this_word | capitalize }}</h2>{% endif %}variables.less
It’s the first time I saw the code of node.js and less, wow! You can have Grunt generate css from less for you. Download node.pkg from here. Install the pkg and run sudo npm install -g grunt-cli. I prefer Menlo among monospace fonts, so I edit the variables.less, and then given package.json is already written by the theme author, run grunt at the lsfalimis.github.io directory. New CSS files are generated.
Writing
-
Disable lead paragraph effect: Use Inspect Element and find that the keyword
first-child, then search it using Finder, and editmain.cssthat is not under_site: changefont-sizeto1rem. -
Code highlighting: I don’t get how kramdown code highlighting works, and by wrapping the code block with
~~~, I can’t produce coloured highlighting. So I use pygments by the syntax where you can replace bash with languages in the list. I don’t know why LaTeX is actually supported but not in the list.
{% highlight bash %}
code
{% endhighlight %}- LaTeX rendering: For now, I use the simplest method. Include the code in post markdown file. Example see the post.
<script type="text/javascript"
src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>- Display images in columns and rows: You can set the class to
halfif there are two images in a row, orthirdif three; it has feature like hyperlinks and caption.
<figure class="half">
<a href="bigger_jpg1"><img src="jpg1" alt=""></a>
<img src="jpg2" alt=""></a>
<img src="jpg3" alt=""></a>
<img src="jpg4" alt=""></a>
<figcaption>This is a caption.</figcaption>
</figure>-
Displays rules in tables: Append
{: rules="groups"}as a new line to a table. -
Display buttons, mostly, download buttons, like KM Macros using the following code where by default
btn btn-infoclass is blue andbtnclass is black. You can change the colours invariables.less.
<a href="https://github.com/lsfalimis/Qian-KM-Macros" class="btn btn-info">KM Macros</a>- Generate Table of Contents (ToC): It’s a review about kramdown’s feature. Simple include this to let kramdown generate ToC for you:
## Contents
{:.no_toc}
*
{:toc}Appendix: Highlight Liquid codes
We need to look at {% something %} (in my markdown, {{"{% something "}}%}) and {{ something }} (in my markdown, {{"{{ something "}}}}). Note that if we want to display {% something %} and {{ something }}, we we don’t need to escape %} and }}. What we need to escape are {% and {{, because if we put %} or }} in inline code or in a code block in markdown file, Jekyll will not report error. However, if we replace any of them with {% or {{ in markdown file, Jekyll will report error. Therefore we have to wrap {% or {{ with {{" and }}. Let x denote special symbols to escape in Liquid, then in order to highlight them in html, we have to write {{"x"}} in markdown file.
What if I copied and pasted Liquid code from Jekyll configuration files to markdown file? If you haven’t wrapped code blocks, use kramdown’s ~~~ language syntax first, and at the end replace ~~~ with {% highlight language %} and {% endhighlight %}. If you have already wrapped code blocks with {% highlight language %} and {% endhighlight %}, the case I have today, do these:
- Replace
{{with{{"{{. - Replace
}}with"}}}}. - Replace
{%with{{"{%. - Replace
%}with"}}%}. - Replace
{{"{% endhighlight "}}%}with{% endhighlight %}. - Replace
{{"{% highlight language "}}%}with{% highlight language %}. If there are many languages highlighted in your markdown file, do this step for each of them.