jekyll-text-theme 1.4.3 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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>