jekyll-text-theme 1.4.3 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -6
  3. data/_data/locale.yml +21 -3
  4. data/_data/variables.yml +31 -0
  5. data/_includes/{blog → components}/article-data.html +4 -2
  6. data/_includes/{info → components}/follow-me.html +1 -1
  7. data/_includes/{blog → components}/footer.html +1 -1
  8. data/_includes/components/header.html +42 -0
  9. data/_includes/{blog → components}/license.html +0 -0
  10. data/_includes/{blog → components}/tags.html +5 -6
  11. data/_includes/icon/clear.svg +3 -0
  12. data/_includes/icon/link.svg +1 -0
  13. data/_includes/icon/omit.svg +1 -0
  14. data/_includes/icon/search.svg +3 -0
  15. data/_includes/icon/{mail.svg → social/mail.svg} +0 -0
  16. data/_includes/scripts/all.html +244 -0
  17. data/_includes/scripts/common.html +30 -0
  18. data/_includes/scripts/data.html +27 -0
  19. data/_includes/scripts/home.html +26 -0
  20. data/_includes/scripts/page-post.html +32 -0
  21. data/_includes/scripts/post.html +183 -0
  22. data/_includes/scripts/utils.html +180 -0
  23. data/_includes/snippets/get-lang.html +2 -2
  24. data/_includes/snippets/get-sources.html +5 -0
  25. data/_includes/utils/chart.html +17 -0
  26. data/_includes/utils/comment-disqus.html +0 -3
  27. data/_includes/utils/comment-gitalk.html +15 -12
  28. data/_includes/utils/google-analytics.html +6 -8
  29. data/_includes/utils/mathjax.html +10 -4
  30. data/_includes/utils/mermaid.html +5 -4
  31. data/_layouts/all.html +10 -131
  32. data/_layouts/base.html +38 -0
  33. data/_layouts/error-404.html +1 -1
  34. data/_layouts/home.html +81 -68
  35. data/_layouts/page.html +3 -3
  36. data/_layouts/post.html +32 -172
  37. data/_sass/animate/_fade-in-down.scss +10 -0
  38. data/_sass/animate/_fade-in.scss +8 -0
  39. data/_sass/colors/{_colors.chocolate.scss → _chocolate.scss} +9 -3
  40. data/_sass/colors/{_colors.dark.scss → _dark.scss} +10 -3
  41. data/_sass/colors/{_colors.default.scss → _default.scss} +10 -4
  42. data/_sass/colors/{_colors.forest.scss → _forest.scss} +9 -3
  43. data/_sass/colors/{_colors.ocean.scss → _ocean.scss} +9 -3
  44. data/_sass/colors/{_colors.orange.scss → _orange.scss} +9 -3
  45. data/_sass/common/_classes.scss +15 -0
  46. data/_sass/{settings → common}/_highlighting.scss +0 -12
  47. data/_sass/common/_reset.scss +171 -0
  48. data/_sass/common/_variables.scss +64 -0
  49. data/_sass/common/classes/_animation.scss +4 -0
  50. data/_sass/common/classes/_clearfix.scss +7 -0
  51. data/_sass/{mixins → common/classes}/_flex.scss +0 -0
  52. data/_sass/common/classes/_link.scss +161 -0
  53. data/_sass/common/classes/_media.scss +18 -0
  54. data/_sass/common/classes/_shadow.scss +14 -0
  55. data/_sass/common/classes/_shape.scss +19 -0
  56. data/_sass/common/classes/_space.scss +40 -0
  57. data/_sass/common/classes/_split-line.scss +24 -0
  58. data/_sass/common/classes/_transform.scss +4 -0
  59. data/_sass/common/classes/_transition.scss +4 -0
  60. data/_sass/common/classes/_user-select.scss +6 -0
  61. data/_sass/common/components/_button.scss +72 -0
  62. data/_sass/components/_article.content.extra.scss +41 -0
  63. data/_sass/components/_article.content.scss +127 -69
  64. data/_sass/components/_article.data.scss +11 -11
  65. data/_sass/components/_follow-me.scss +27 -34
  66. data/_sass/components/_footer.scss +4 -4
  67. data/_sass/components/_header.scss +35 -22
  68. data/_sass/components/_license.scss +7 -7
  69. data/_sass/components/_main.scss +23 -0
  70. data/_sass/components/_pagination.scss +12 -0
  71. data/_sass/components/_tags.scss +30 -15
  72. data/_sass/components/_toc.scss +32 -19
  73. data/_sass/layout/_all.scss +82 -0
  74. data/_sass/layout/_default.scss +19 -0
  75. data/_sass/{blog/_page.error-404.scss → layout/_error-404.scss} +1 -1
  76. data/_sass/layout/_home.scss +61 -0
  77. data/_sass/layout/_post.scss +80 -0
  78. data/assets/css/blog.scss +29 -34
  79. data/assets/images/logo/logo.svg +1 -1
  80. metadata +56 -38
  81. data/_includes/blog/header.html +0 -56
  82. data/_layouts/blog-base.html +0 -36
  83. data/_layouts/blog-default.html +0 -7
  84. data/_sass/base/_animate.scss +0 -19
  85. data/_sass/base/_base.scss +0 -83
  86. data/_sass/base/_image&icon.scss +0 -23
  87. data/_sass/base/_links.scss +0 -73
  88. data/_sass/base/_text.scss +0 -56
  89. data/_sass/blog/_layout.base.scss +0 -3
  90. data/_sass/blog/_layout.default.scss +0 -21
  91. data/_sass/blog/_layout.post.scss +0 -68
  92. data/_sass/blog/_page.all.scss +0 -35
  93. data/_sass/blog/_page.index.scss +0 -50
  94. data/_sass/components/_wrapper.scss +0 -29
  95. data/_sass/mixins/_link.scss +0 -67
  96. data/_sass/mixins/_media.scss +0 -12
  97. data/_sass/mixins/_prefix.scss +0 -14
  98. data/_sass/mixins/_shape.scss +0 -19
  99. data/_sass/settings/_base.scss +0 -12
  100. data/_sass/settings/_colors.scss +0 -9
  101. data/_sass/settings/_font.scss +0 -32
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 93c347fb53eec2e1bda0852209a9049932e2d60e
4
- data.tar.gz: ddaee6e856ae386f598f4ae358b7346caeef4c26
3
+ metadata.gz: cb89dc720f2e68655d150b10f7fb344b63ab461e
4
+ data.tar.gz: 89cc55c17ce994c93f655cdee03d873cfda5fc34
5
5
  SHA512:
6
- metadata.gz: 912a7e1d30414c5af48861d85be7be7fba4284eb8c5b169b9d0e83922b8b1a5c91137995c7276694af268a0568376e49d7e1f9c6a0d783ec4ff2727f60fac783
7
- data.tar.gz: 92667fb44eebd026105e1f4e1cd46eb0af28b9cd40eea63193e40830e843c6d760128c5572f91d17452f48f08adef21ef42366dd65767453bd60808c94df57f1
6
+ metadata.gz: cb737051b2a6a944797be9c0d7e93db7beb512768f4dbbcb460bad57a19d2f5959efd9e843cd11d06cce5ad0a5e8fbfcd41f243e504015bce12e3ffe22b2a13a
7
+ data.tar.gz: d0cba3d8ccf1fe07c48f3d2bfeed33cdb6e38f7e7599dafa1d6b2f44e325c45d6cc429ec23ab234ccabfe6824f186c9326af6dd6f298dd3816e48a5fcaf04739
data/README.md CHANGED
@@ -4,13 +4,11 @@
4
4
  [![license](https://img.shields.io/github/license/kitian616/jekyll-TeXt-theme.svg)](https://github.com/kitian616/jekyll-TeXt-theme/blob/master/LICENSE)
5
5
  [![Travis](https://img.shields.io/travis/kitian616/jekyll-TeXt-theme.svg)](https://travis-ci.org/kitian616/jekyll-TeXt-theme)
6
6
 
7
- **==> [English (Beta)](https://github.com/kitian616/jekyll-TeXt-theme/blob/master/README-en.md) <==**
8
-
9
7
  ![TeXt Theme](https://raw.githubusercontent.com/kitian616/jekyll-TeXt-theme/master/screenshots/TeXt-home.png)
10
8
 
11
9
  ![TeXt Theme Details](https://raw.githubusercontent.com/kitian616/jekyll-TeXt-theme/master/screenshots/TeXt-details.png)
12
10
 
13
- **==> [English (Beta)](https://github.com/kitian616/jekyll-TeXt-theme/blob/master/README-en.md) <==**
11
+ [Demo](https://tianqi.name/jekyll-TeXt-theme/) | [English (Beta)](https://github.com/kitian616/jekyll-TeXt-theme/blob/master/README-en.md)
14
12
 
15
13
  TeXt is a succinct theme for blogging.
16
14
 
@@ -20,8 +18,9 @@ TeXt 是针对博客的一款简洁的主题,它虽然简洁但并不简单。
20
18
 
21
19
  - 响应式
22
20
  - 分页([jekyll-paginate](https://github.com/jekyll/jekyll-paginate))
23
- - 文章目录([TOC](http://projects.jga.me/toc/))
21
+ - 文章目录
24
22
  - 文章标签
23
+ - 搜索(标题)
25
24
  - 阅读次数统计([LeanCloud](https://leancloud.cn/))
26
25
  - Emoji([Jemoji](https://github.com/jekyll/jemoji))
27
26
  - 评论([Disqus](https://disqus.com/), [gitalk](https://gitalk.github.io/))
@@ -32,6 +31,7 @@ TeXt 是针对博客的一款简洁的主题,它虽然简洁但并不简单。
32
31
  - Color Theme
33
32
  - 数学公式([MathJax](https://www.mathjax.org/))
34
33
  - 流程图, 序列图,甘特图([mermaid](https://mermaidjs.github.io/))
34
+ - 柱状图,折线图,饼图,雷达图([chartjs](http://www.chartjs.org/))
35
35
  - RSS([jekyll-feed](https://github.com/jekyll/jekyll-feed))
36
36
  - 多语言支持(English | 简体中文 | 繁體中文)
37
37
 
@@ -111,7 +111,7 @@ bundle exec jekyll serve -H 0.0.0.0
111
111
 
112
112
  ### Color Theme
113
113
 
114
- 颜色主题位于文件夹 ./\_sass/colors 中,修改 ./\_sass/settings/colors.scss `@import` 路径即可修改主题,默认主题为 default。
114
+ 颜色主题位于文件夹 ./\_sass/colors 中,修改 ./\_config.yml 中的 text_color_theme 项为以下值即可更换颜色主题,默认主题为 default。
115
115
 
116
116
  | `default` | `dark` | `forest` |
117
117
  | --- | --- | --- |
@@ -171,10 +171,11 @@ bundle exec jekyll serve -H 0.0.0.0
171
171
  | --- | --- | --- |
172
172
  | key | | 评论系统和阅读量统计使用的文章标识符,如果未设置则评论和统计无效。可用字符集:`字母`、`数字` 及 `- _ : .` |
173
173
  | lang | en/zh/zh-Hans/zh-Hant | 该文章的语言,其优先级高于 ./\_config.yml 中设置的值 |
174
- | picture_frame | shadow | 该文章的图片框样式,如果为 `shadow` 则图片带有阴影边框 |
175
174
  | modify_date | | 该文章的修改时间,不影响首页文章排序(`date` 代表发表时间,会影响文章排序) |
176
175
  | comment | true/false | 该文章是否能够评论,默认为 true(当然你也可以通过不设置 key 来实现,但是这样的话统计也失效了) |
177
176
  | mathjax | true/false | 该文章是否需要使用 MathJax 公式,默认为 false(此时只会在该文章页面中解析 MathJax 公式。当然你也可以配置 _config.yml 中的 `mathjax` 项为 true,让网站全局支持 MathJax 公式) |
177
+ | mermaid | true/false | 该文章是否需要使用 Mermaid 绘制流程图 |
178
+ | chart | true/false | 该文章是否需要使用 Chart 绘制图标 |
178
179
 
179
180
  ### 其他资源
180
181
 
data/_data/locale.yml CHANGED
@@ -5,7 +5,7 @@ NAV:
5
5
  zh-Hans: "主页"
6
6
  zh-Hant: "主頁"
7
7
  ALL:
8
- en: "All"
8
+ en: "Archive"
9
9
  zh: "归档"
10
10
  zh-Hans: "归档"
11
11
  zh-Hant: "歸檔"
@@ -21,7 +21,11 @@ READMORE:
21
21
  zh-Hans: "点我阅读更多..."
22
22
  zh-Hant: "「點我閱讀更多」"
23
23
 
24
- COPYRIGHT_DATES: "2018"
24
+ VIEWS:
25
+ en: "views"
26
+ zh: "阅读"
27
+ zh-Hans: "阅读"
28
+ zh-Hant: "閱讀"
25
29
 
26
30
  LAST_UPDATED:
27
31
  en: "Last updated"
@@ -29,6 +33,18 @@ LAST_UPDATED:
29
33
  zh-Hans: "更新于"
30
34
  zh-Hant: "更新於"
31
35
 
36
+ PREVIOUS:
37
+ en: "PREVIOUS"
38
+ zh: "上篇"
39
+ zh-Hans: "上篇"
40
+ zh-Hant: "上篇"
41
+
42
+ NEXT:
43
+ en: "NEXT"
44
+ zh: "下篇"
45
+ zh-Hans: "下篇"
46
+ zh-Hant: "下篇"
47
+
32
48
  ARTICLE_DATE_FORMAT:
33
49
  en: "%b %d, %Y"
34
50
  zh: "%Y年 %m月%d日"
@@ -75,4 +91,6 @@ EMAIL_ME:
75
91
  en: "Send me Email."
76
92
  zh: "给我发邮件。"
77
93
  zh-Hans: "给我发邮件。"
78
- zh-Hant: "給我發郵件。"
94
+ zh-Hant: "給我發郵件。"
95
+
96
+ COPYRIGHT_DATES: "2018"
@@ -0,0 +1,31 @@
1
+ default:
2
+ text_color_theme: default
3
+ paths:
4
+ base: /
5
+ home: /
6
+ all: /all.html
7
+ rss: /feed.xml
8
+ lang: zh
9
+ sources: bootcss
10
+ toc:
11
+ selectors: 'h1,h2,h3'
12
+
13
+ sources:
14
+ bootcss:
15
+ jquery: 'https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js'
16
+ leancloud_js_sdk: '//cdn1.lncld.net/static/js/3.4.1/av-min.js'
17
+ chart: 'https://cdn.bootcss.com/Chart.js/2.7.1/Chart.bundle.min.js'
18
+ gitalk:
19
+ js: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.js'
20
+ css: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.css'
21
+ mathjax: 'https://cdn.bootcss.com/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML'
22
+ mermaid: 'https://cdn.bootcss.com/mermaid/7.1.2/mermaid.min.js'
23
+ unpkg:
24
+ jquery: 'https://unpkg.com/jquery@3.3.1/dist/jquery.min.js'
25
+ leancloud_js_sdk: '//cdn1.lncld.net/static/js/3.4.1/av-min.js'
26
+ chart: 'https://unpkg.com/chart.js@2.7.1/dist/Chart.min.js'
27
+ gitalk:
28
+ js: 'https://unpkg.com/gitalk@1.2.2/dist/gitalk.min.js'
29
+ css: 'https://unpkg.com/gitalk@1.2.2/dist/gitalk.css'
30
+ mathjax: 'https://unpkg.com/mathjax@2.7.3/unpacked/MathJax.js?config=TeX-MML-AM_CHTML'
31
+ mermaid: 'https://unpkg.com/mermaid@7.1.2/dist/mermaid.min.js'
@@ -15,7 +15,7 @@
15
15
  {%- assign cur_page = page -%}
16
16
  {%- endif -%}
17
17
  {%- if cur_page.tags[0] -%}
18
- <ul class="inline-list tag-wrapper">
18
+ <ul class="tag-wrapper">
19
19
  {%- if site.paths.all -%}
20
20
  {%- assign all_path = site.paths.all -%}
21
21
  {%- else -%}
@@ -33,9 +33,11 @@
33
33
  {%- endif -%}
34
34
  <div class="other-wrapper">
35
35
  {%- if site.leancloud.app_id and site.leancloud.app_key and site.leancloud.app_class -%}
36
+ {%- assign __locale = site.data.locale.VIEWS } -%}
37
+ {%- include snippets/locale-to-string.html -%}
36
38
  <div class="view-wrapper">
37
39
  <span class="article-view" id="post-key-{{ cur_page.key }}">0
38
- </span> views
40
+ </span> {{ __return }}
39
41
  </div>
40
42
  {%- endif -%}
41
43
  <div class="date-wrapper">
@@ -1,7 +1,7 @@
1
1
  <div class="follow-me">
2
2
  {%- assign __locale = site.data.locale.FOLLOW_ME -%}
3
3
  {%- include snippets/locale-to-string.html -%}
4
- <ul class="inline-list" itemscope itemtype="http://schema.org/Person">
4
+ <ul itemscope itemtype="http://schema.org/Person">
5
5
  <meta itemprop="name" content="{{ site.author.name }}">
6
6
  <link itemprop="url" href="{{ '/' | prepend: site.url }}">
7
7
  {%- if site.author.weibo -%}
@@ -1,6 +1,6 @@
1
1
  <div class="m-page-footer js-page-footer">
2
2
  <div class="main">
3
- <aside> {%- include info/follow-me.html -%} </aside>
3
+ <aside> {%- include components/follow-me.html -%} </aside>
4
4
  <footer class="site-info">
5
5
  <p>© {{ site.title }} {{ site.data.locale.COPYRIGHT_DATES }}</p>
6
6
  <p>Powered by <a title="Jekyll is a simple, blog-aware, static site generator." href="http://jekyllrb.com/">Jekyll</a> & <a
@@ -0,0 +1,42 @@
1
+ <header class="m-page-header">
2
+ <div class="main clearfix">
3
+ <div class='site-logo'>
4
+ {%- include logo/logo.svg -%}
5
+ {%- assign __path = site.paths.base | default: site.data.variables.default.paths.base -%}
6
+ {%- include snippets/get-nav-url.html -%}
7
+ {%- if site.title -%}
8
+ <a title="{%- if site.description -%}{{ site.description }}{%- endif -%}" href="{{ __return }}">{{ site.title }}</a>
9
+ {%- endif -%}
10
+ </div>
11
+ <nav>
12
+ <ul>
13
+ {%- assign __path = site.paths.home | default: site.data.variables.default.paths.home -%}
14
+ {%- include snippets/get-nav-url.html -%}
15
+ {%- assign href = __return -%}
16
+ {%- assign __locale = site.data.locale.NAV.HOME -%}
17
+ {%- include snippets/locale-to-string.html -%}
18
+ <li><a href="{{ href }}">{{ __return }}</a></li>
19
+ {%- assign __path = site.paths.all | default: site.data.variables.default.paths.all -%}
20
+ {%- include snippets/get-nav-url.html -%}
21
+ {%- assign href = __return -%}
22
+ {%- assign __locale = site.data.locale.NAV.ALL -%}
23
+ {%- include snippets/locale-to-string.html -%}
24
+ <li><a href="{{ href }}">{{ __return }}</a></li>
25
+ {%- for list in site.nav_lists -%}
26
+ {%- assign __path = list.url -%}
27
+ {%- include snippets/get-nav-url.html -%}
28
+ {%- assign href = __return -%}
29
+ {%- assign __locale = list.titles -%}
30
+ {%- include snippets/locale-to-string.html -%}
31
+ <li><a href="{{ href }}">{%- if list.title -%}{{ list.title }}{%- else -%}{{ __return }}{%- endif -%}</a></li>
32
+ {%- endfor -%}
33
+ {%- assign __path = site.paths.rss | default: site.data.variables.default.paths.rss -%}
34
+ {%- include snippets/get-nav-url.html -%}
35
+ {%- assign href = __return -%}
36
+ {%- assign __locale = site.data.locale.NAV.RSS -%}
37
+ {%- include snippets/locale-to-string.html -%}
38
+ <li><a type="application/rss+xml" href="{{ href }}">{{ __return }}</a></li>
39
+ </ul>
40
+ </nav>
41
+ </div>
42
+ </header>
File without changes
@@ -15,11 +15,11 @@
15
15
  {%- if gap_size < 1 -%}
16
16
  {%- assign gap_size = 1 -%}
17
17
  {%- endif -%}
18
- <div class="m-tags">
19
- <ul class="inline-list">
18
+ <div class="m-tags js-tags">
19
+ <ul>
20
20
  <li>
21
- <button type="button" class="js-article-tag js-tag-show-all all pill-button" onclick="tagSelect('')">Show All
22
- <div class="tag-count">{{ site.posts | size }}</div>
21
+ <button type="button" class="js-article-tag js-tag-show-all all pill-button inactive" data-encode="">
22
+ Show All<div class="tag-count">{{ site.posts | size }}</div>
23
23
  </button>
24
24
  </li>
25
25
  {%- for tag in _tags -%}
@@ -43,8 +43,7 @@
43
43
  {%- else -%}
44
44
  {%- assign c_index = 4 -%}
45
45
  {%- endif -%}
46
- <li><button type="button" class="js-article-tag tag-{{ c_index }} pill-button"
47
- data-tag="{{ tag[0] | strip | url_encode }}" onclick="tagSelect('{{ tag[0] | strip | url_encode }}')">
46
+ <li><button type="button" class="js-article-tag tag-{{ c_index }} pill-button inactive" data-encode="{{ tag[0] | strip | url_encode }}">
48
47
  <span>{{ tag[0] | strip }}</span><div class="tag-count">{{ tag[1].size }}</div>
49
48
  </button>
50
49
  </li>
@@ -0,0 +1,3 @@
1
+ <svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>
3
+ </svg>
@@ -0,0 +1 @@
1
+ <svg fill="#000000" width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>
@@ -0,0 +1 @@
1
+ <svg fill="#000000" width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></svg>
@@ -0,0 +1,3 @@
1
+ <svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>
3
+ </svg>
File without changes
@@ -0,0 +1,244 @@
1
+ {%- include snippets/page-title.html -%}
2
+ {%- assign _title = __return -%}
3
+ {%- include snippets/get-sources.html -%}
4
+ {%- assign _sources = __return -%}
5
+ {%- assign __path = '/search.json' -%}
6
+ {%- include snippets/prepend-baseurl.html -%}
7
+ {%- assign _search_path = __return -%}
8
+ <script>
9
+ (function() {
10
+ function queryString() {
11
+ // This function is anonymous, is executed immediately and
12
+ // the return value is assigned to QueryString!
13
+ var i = 0,
14
+ queryObj = {},
15
+ pair;
16
+ var queryStr = window.location.search.substring(1);
17
+ var queryArr = queryStr.split('&');
18
+ for (i = 0; i < queryArr.length; i++) {
19
+ pair = queryArr[i].split('=');
20
+ // If first entry with this name
21
+ if (typeof queryObj[pair[0]] === 'undefined') {
22
+ queryObj[pair[0]] = pair[1];
23
+ // If second entry with this name
24
+ } else if (typeof queryObj[pair[0]] === 'string') {
25
+ queryObj[pair[0]] = [queryObj[pair[0]], pair[1]];
26
+ // If third or later entry with this name
27
+ } else {
28
+ queryObj[pair[0]].push(pair[1]);
29
+ }
30
+ }
31
+ return queryObj;
32
+ }
33
+
34
+ function decodeUrl(str) {
35
+ return str ? decodeURIComponent(str.replace(/\+/g, '%20')) : '';
36
+ }
37
+
38
+ function memorize(f) {
39
+ var cache = {};
40
+ return function () {
41
+ var key = Array.prototype.join.call(arguments, ',');
42
+ if (key in cache) return cache[key];
43
+ else return cache[key] = f.apply(this, arguments);
44
+ };
45
+ };
46
+ function initData(json) {
47
+ var _data = JSON.parse(json), i, j, cur, _tags;
48
+ Object.keys(_data).forEach(function(year) {
49
+ for (i = 0; i < _data[year].length; i++) {
50
+ cur = _data[year][i], _tags = cur.tags;
51
+ cur.title = decodeUrl(cur.title);
52
+ if (_tags && _tags.length > 0) {
53
+ for (j = 0; j < _tags.length; j++) {
54
+ _tags[j] = decodeUrl(_tags[j]);
55
+ }
56
+ }
57
+ }
58
+ });
59
+ return _data;
60
+ }
61
+
62
+ var setUrlQuery = (function() {
63
+ var baseUrl = window.location.href.split('?')[0];
64
+ return function(query) {
65
+ if (typeof query === 'string') {
66
+ window.history.replaceState(null, '', baseUrl + query);
67
+ } else {
68
+ window.history.replaceState(null, '', baseUrl);
69
+ }
70
+ }
71
+ })();
72
+
73
+ var data = initData('{%- include scripts/data.html -%}');
74
+
75
+ var searchByTag = memorize(function(tag) {
76
+ var i, j, cur, _tags, _tag, _data = {};
77
+ Object.keys(data).forEach(function(year) {
78
+ for (i = 0; i < data[year].length; i++) {
79
+ cur = data[year][i], _tags = cur.tags;
80
+ if (_tags && _tags.length > 0) {
81
+ for (j = 0; j < _tags.length; j++) {
82
+ _tag = _tags[j];
83
+ if (_tag === tag) {
84
+ if (!_data[year]) {
85
+ _data[year] = []
86
+ }
87
+ _data[year].push(cur);
88
+ break;
89
+ }
90
+ }
91
+ }
92
+ }
93
+ });
94
+ return _data;
95
+ });
96
+
97
+ var searchByQuery = function(query) {
98
+ var i, j, cur, _title, _data = { _: [] };
99
+ Object.keys(data).forEach(function(year) {
100
+ for (i = 0; i < data[year].length; i++) {
101
+ cur = data[year][i], _title = cur.title;
102
+ if (_title.toLowerCase().indexOf(query.toLowerCase()) >= 0) {
103
+ _data._.push(cur);
104
+ }
105
+ }
106
+ });
107
+ return _data;
108
+ };
109
+
110
+ window.Lazyload.js('{{ _sources.jquery }}', function() {
111
+ var $root = $('.js-all');
112
+ var $searchBox = $('.js-search-box');
113
+ var $searchInput = $searchBox.children('input');
114
+ var $searchClear = $searchBox.children('.icon-clear');
115
+ var $tags = $('.js-tags');
116
+ var $articleTags = $('.js-article-tag');
117
+ var $tagShowAll = $('.js-tag-show-all');
118
+ var $result = $('.js-result');
119
+ var $lastFocusButton = null;
120
+
121
+ function addClass(dom, className) {
122
+ dom.hasClass(className) || dom.addClass(className);
123
+ }
124
+ function removeClass(dom, className) {
125
+ dom.hasClass(className) && dom.removeClass(className);
126
+ }
127
+
128
+ var renderHeading = memorize(function (year) {
129
+ return $('<h2 class="year">' + year + '</h2>');
130
+ });
131
+ var renderItem = memorize(function (key, title, date, url, tags) {
132
+ return $('<li><span class="date">' + date + '</span><a class="link" href="' + url + '">' + title + '</a></li>');
133
+ });
134
+ function render(data) {
135
+ var $dom = $('<div></div>'), $section, $ul, i, cur, date;
136
+ Object.keys(data).sort(function(a, b) {
137
+ return b.localeCompare(a);
138
+ }).forEach(function(year) {
139
+ $section = $('<section></section>'), $ul = $('<ul></ul>');
140
+ (year === '_') || $section.append(renderHeading(year));
141
+ for (i = 0; i < data[year].length; i++) {
142
+ cur = data[year][i];
143
+ $ul.append(renderItem(cur.key, cur.title, cur.date, cur.url, cur.tags));
144
+ }
145
+ $dom.append($section.append($ul));
146
+ })
147
+ return $dom;
148
+ }
149
+
150
+ function searchButtonsByTag(_tag/*raw tag*/) {
151
+ if (!_tag) {
152
+ return $tagShowAll;
153
+ }
154
+ var _buttons = $articleTags.filter('[data-encode="' + _tag + '"]');
155
+ if (_buttons.length === 0) {
156
+ return $tagShowAll;
157
+ }
158
+ return _buttons;
159
+ }
160
+ function buttonFoucs(target) {
161
+ if (target) {
162
+ addClass(target, 'focus');
163
+ $lastFocusButton && !$lastFocusButton.is(target) && removeClass($lastFocusButton, 'focus');
164
+ $lastFocusButton = target;
165
+ }
166
+ }
167
+
168
+ function setIsSearch() {
169
+ addClass($root, 'search');
170
+ }
171
+ function setNotSearch() {
172
+ removeClass($root, 'search');
173
+ }
174
+ function setIsEmpty() {
175
+ removeClass($searchBox, 'not-empty');
176
+ }
177
+ function setNotEmpty() {
178
+ addClass($searchBox, 'not-empty');
179
+ }
180
+ function setSearchBoxVal(val) {
181
+ ($searchInput.val() === val) || $searchInput.val(val);
182
+ }
183
+ function clearSearchBox() {
184
+ setSearchBoxVal(''); queryInput('');
185
+ }
186
+
187
+ function showAll() {
188
+ setNotSearch(); setIsEmpty(); buttonFoucs($tagShowAll); setUrlQuery();
189
+ $result.html(render(data));
190
+ }
191
+ function tagSelect(tag/*decode tag*/, target) {
192
+ var _data, _tag;
193
+ if (tag === '' || tag === undefined) {
194
+ showAll();
195
+ } else {
196
+ $result.html(render(searchByTag(tag)));
197
+ }
198
+ if (target) {
199
+ buttonFoucs(target);
200
+ _tag = target.data('encode');
201
+ if (_tag === '' || typeof _tag !== 'string') {
202
+ setUrlQuery();
203
+ } else {
204
+ setUrlQuery('?tag=' + _tag)
205
+ }
206
+ }
207
+ }
208
+ function queryInput(query) {
209
+ var _data;
210
+ if (query === '' || typeof query !== 'string') {
211
+ showAll();
212
+ } else {
213
+ $result.html(render(searchByQuery(query))); setIsSearch(); setNotEmpty(); setUrlQuery('?q=' + query);
214
+
215
+ }
216
+ }
217
+
218
+ (function() {
219
+ $articleTags.removeClass('inactive');
220
+ var query = queryString(), _tag = query.tag, _q = query.q;
221
+ if (_tag !== undefined) {
222
+ query.tag === undefined || (_tag = query.tag);
223
+ tagSelect(decodeUrl(_tag));
224
+ buttonFoucs(searchButtonsByTag(_tag));
225
+ } else if (_q !== undefined) {
226
+ queryInput(_q); setSearchBoxVal(_q);
227
+ } else {
228
+ showAll();
229
+ }
230
+ })();
231
+
232
+ $tags.on('click', 'button', function() {
233
+ tagSelect($(this).children('span').text(), $(this));
234
+ });
235
+
236
+ $searchInput.on('input', window.throttle(function() {
237
+ queryInput($(this).val());
238
+ }, 400));
239
+ $searchClear.on('click', function() {
240
+ clearSearchBox();
241
+ });
242
+ });
243
+ })();
244
+ </script>