rawfeed 0.0.1 → 0.1.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 (134) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +21 -0
  3. data/README.md +153 -1
  4. data/_data/resume.yml +184 -0
  5. data/_includes/alert +3 -0
  6. data/_includes/chart +34 -0
  7. data/_includes/details +57 -0
  8. data/_includes/enddetails +2 -0
  9. data/_includes/endtabs +2 -0
  10. data/_includes/image +61 -0
  11. data/_includes/layout/blog_search.html +18 -0
  12. data/_includes/layout/data.liquid +3 -0
  13. data/_includes/layout/disqus.html +30 -0
  14. data/_includes/layout/footer.html +34 -0
  15. data/_includes/layout/giscus.html +21 -0
  16. data/_includes/layout/google_analytics.html +11 -0
  17. data/_includes/layout/head.html +59 -0
  18. data/_includes/layout/header.html +143 -0
  19. data/_includes/layout/maintenance.html +30 -0
  20. data/_includes/layout/paginator.html +35 -0
  21. data/_includes/socials +22 -0
  22. data/_includes/tabs +94 -0
  23. data/_includes/toc +160 -0
  24. data/_includes/video +10 -0
  25. data/_layouts/blog.html +46 -0
  26. data/_layouts/contact.html +285 -0
  27. data/_layouts/default.html +248 -0
  28. data/_layouts/error.html +15 -0
  29. data/_layouts/home.html +58 -0
  30. data/_layouts/page.html +9 -0
  31. data/_layouts/post.html +103 -0
  32. data/_layouts/resume.html +260 -0
  33. data/_layouts/tag.html +22 -0
  34. data/_layouts/tag_posts.html +27 -0
  35. data/_sass/base/_index.scss +63 -0
  36. data/_sass/base/_reset.scss +10 -0
  37. data/_sass/base/_typography.scss +0 -0
  38. data/_sass/components/_badges.scss +24 -0
  39. data/_sass/components/_button.scss +17 -0
  40. data/_sass/components/_forms.scss +42 -0
  41. data/_sass/components/_gifs.scss +5 -0
  42. data/_sass/components/_index.scss +5 -0
  43. data/_sass/components/_markdown.scss +453 -0
  44. data/_sass/includes/_footer.scss +45 -0
  45. data/_sass/includes/_header.scss +240 -0
  46. data/_sass/includes/_highlight.scss +87 -0
  47. data/_sass/includes/_index.scss +9 -0
  48. data/_sass/includes/_maintenance.scss +16 -0
  49. data/_sass/includes/_paginator.scss +22 -0
  50. data/_sass/includes/_rouge-dark.scss +81 -0
  51. data/_sass/includes/_rouge-light.scss +121 -0
  52. data/_sass/includes/_terminal.scss +208 -0
  53. data/_sass/layouts/_blog.scss +96 -0
  54. data/_sass/layouts/_contact.scss +55 -0
  55. data/_sass/layouts/_default.scss +14 -0
  56. data/_sass/layouts/_error.scss +18 -0
  57. data/_sass/layouts/_home.scss +19 -0
  58. data/_sass/layouts/_index.scss +10 -0
  59. data/_sass/layouts/_page.scss +5 -0
  60. data/_sass/layouts/_post.scss +109 -0
  61. data/_sass/layouts/_resume.scss +330 -0
  62. data/_sass/layouts/_tag-posts.scss +48 -0
  63. data/_sass/layouts/_tag.scss +22 -0
  64. data/_sass/main.scss +128 -0
  65. data/_sass/theme/_dark.scss +79 -0
  66. data/_sass/theme/_index.scss +13 -0
  67. data/_sass/theme/_light.scss +56 -0
  68. data/assets/css/style.scss +5 -0
  69. data/assets/images/avatar_back.png +0 -0
  70. data/assets/images/avatar_dark.png +0 -0
  71. data/assets/images/avatar_light.png +0 -0
  72. data/assets/images/favicon.png +0 -0
  73. data/assets/js/avatar.js +50 -0
  74. data/assets/js/blog_search.js +102 -0
  75. data/assets/js/default.js +148 -0
  76. data/assets/js/terminal.js +15 -0
  77. data/assets/js/toc.js +20 -0
  78. data/assets/json/blog_search.json +16 -0
  79. data/assets/vendor/bootstrap/css/bootstrap-grid.css +4124 -0
  80. data/assets/vendor/bootstrap/css/bootstrap-grid.css.map +1 -0
  81. data/assets/vendor/bootstrap/css/bootstrap-grid.min.css +7 -0
  82. data/assets/vendor/bootstrap/css/bootstrap-grid.min.css.map +1 -0
  83. data/assets/vendor/bootstrap/css/bootstrap-grid.rtl.css +4123 -0
  84. data/assets/vendor/bootstrap/css/bootstrap-grid.rtl.css.map +1 -0
  85. data/assets/vendor/bootstrap/css/bootstrap-grid.rtl.min.css +7 -0
  86. data/assets/vendor/bootstrap/css/bootstrap-grid.rtl.min.css.map +1 -0
  87. data/assets/vendor/bootstrap/css/bootstrap-reboot.css +488 -0
  88. data/assets/vendor/bootstrap/css/bootstrap-reboot.css.map +1 -0
  89. data/assets/vendor/bootstrap/css/bootstrap-reboot.min.css +7 -0
  90. data/assets/vendor/bootstrap/css/bootstrap-reboot.min.css.map +1 -0
  91. data/assets/vendor/bootstrap/css/bootstrap-reboot.rtl.css +485 -0
  92. data/assets/vendor/bootstrap/css/bootstrap-reboot.rtl.css.map +1 -0
  93. data/assets/vendor/bootstrap/css/bootstrap-reboot.rtl.min.css +7 -0
  94. data/assets/vendor/bootstrap/css/bootstrap-reboot.rtl.min.css.map +1 -0
  95. data/assets/vendor/bootstrap/css/bootstrap-utilities.css +4266 -0
  96. data/assets/vendor/bootstrap/css/bootstrap-utilities.css.map +1 -0
  97. data/assets/vendor/bootstrap/css/bootstrap-utilities.min.css +7 -0
  98. data/assets/vendor/bootstrap/css/bootstrap-utilities.min.css.map +1 -0
  99. data/assets/vendor/bootstrap/css/bootstrap-utilities.rtl.css +4257 -0
  100. data/assets/vendor/bootstrap/css/bootstrap-utilities.rtl.css.map +1 -0
  101. data/assets/vendor/bootstrap/css/bootstrap-utilities.rtl.min.css +7 -0
  102. data/assets/vendor/bootstrap/css/bootstrap-utilities.rtl.min.css.map +1 -0
  103. data/assets/vendor/bootstrap/css/bootstrap.css +10878 -0
  104. data/assets/vendor/bootstrap/css/bootstrap.css.map +1 -0
  105. data/assets/vendor/bootstrap/css/bootstrap.min.css +7 -0
  106. data/assets/vendor/bootstrap/css/bootstrap.min.css.map +1 -0
  107. data/assets/vendor/bootstrap/css/bootstrap.rtl.css +10842 -0
  108. data/assets/vendor/bootstrap/css/bootstrap.rtl.css.map +1 -0
  109. data/assets/vendor/bootstrap/css/bootstrap.rtl.min.css +7 -0
  110. data/assets/vendor/bootstrap/css/bootstrap.rtl.min.css.map +1 -0
  111. data/assets/vendor/bootstrap/js/bootstrap.bundle.js +7075 -0
  112. data/assets/vendor/bootstrap/js/bootstrap.bundle.js.map +1 -0
  113. data/assets/vendor/bootstrap/js/bootstrap.bundle.min.js +7 -0
  114. data/assets/vendor/bootstrap/js/bootstrap.bundle.min.js.map +1 -0
  115. data/assets/vendor/bootstrap/js/bootstrap.esm.js +5202 -0
  116. data/assets/vendor/bootstrap/js/bootstrap.esm.js.map +1 -0
  117. data/assets/vendor/bootstrap/js/bootstrap.esm.min.js +7 -0
  118. data/assets/vendor/bootstrap/js/bootstrap.esm.min.js.map +1 -0
  119. data/assets/vendor/bootstrap/js/bootstrap.js +5249 -0
  120. data/assets/vendor/bootstrap/js/bootstrap.js.map +1 -0
  121. data/assets/vendor/bootstrap/js/bootstrap.min.js +7 -0
  122. data/assets/vendor/bootstrap/js/bootstrap.min.js.map +1 -0
  123. data/assets/vendor/simple-jekyll-search.js +433 -0
  124. data/assets/vendor/simple-jekyll-search.min.js +6 -0
  125. data/lib/rawfeed/draft.rb +31 -0
  126. data/lib/rawfeed/installer.rb +37 -0
  127. data/lib/rawfeed/layout.rb +138 -0
  128. data/lib/rawfeed/page.rb +33 -0
  129. data/lib/rawfeed/post.rb +60 -0
  130. data/lib/rawfeed/resume.rb +59 -0
  131. data/lib/rawfeed/utils.rb +74 -0
  132. data/lib/rawfeed/version.rb +1 -1
  133. data/lib/rawfeed.rb +5 -7
  134. metadata +145 -2
@@ -0,0 +1,59 @@
1
+ {%- include layout/data.liquid -%}
2
+
3
+ <head>
4
+ <meta name="viewport" content="width=device-width, initial-scale=1">
5
+ <meta charset="utf-8">
6
+ {%- if page.url == "/" -%}
7
+ <title>{{ site.title | default: theme_name }} | {{ site.url | prepend: site.baseurl }}</title>
8
+ {%- else -%}
9
+ <title>{{ page.title }} | {{ site.title | default: theme_name }}</title>
10
+ {%- endif -%}
11
+
12
+ {% comment %} favicon {% endcomment %}
13
+ <link rel="icon" type="image/png" href="{{ '/assets/images/favicon.png' | relative_url }}">
14
+ <link rel="apple-touch-icon" href="{{ '/assets/images/favicon.png' | relative_url }}">
15
+
16
+ {% comment %} SEO (jekyll-seo-tag) {% endcomment %}
17
+ {%- seo -%}
18
+ <meta property="og:locale:alternate" content="en_US">
19
+
20
+ {%- if site.google.site_verification != "" -%}
21
+ <!-- Google Site Verification -->
22
+ <meta name="google-site-verification" content="{{ site.google.site_verification }}">
23
+ <!-- Google Site Verification -->
24
+ {%- endif -%}
25
+
26
+ {% comment %} Fonts {% endcomment %}
27
+ {%- comment -%}
28
+ TODO: version: 0.2.0: place fonts used in the project instead of using Google Fonts.
29
+ {%- endcomment -%}
30
+ <link rel="preconnect" href="https://fonts.googleapis.com">
31
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
32
+ <link href="https://fonts.googleapis.com/css2?family=SUSE+Mono:ital,wght@0,100..800;1,100..800&display=swap" rel="stylesheet">
33
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inconsolata:400,700&amp;display=swap">
34
+ <link href="https://fonts.googleapis.com/css2?family=Special+Elite&display=swap" rel="stylesheet">
35
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"/>
36
+
37
+ {% comment %} bootstrap {% endcomment %}
38
+ <link rel="stylesheet" href="{{ '/assets/vendor/bootstrap/css/bootstrap.min.css' | relative_url }}">
39
+
40
+ {% comment %} fixes FOUC/flicker in firefox {% endcomment %}
41
+ <script>
42
+ (function() {
43
+ const savedTheme = localStorage.getItem('theme') || 'light';
44
+ document.documentElement.setAttribute('data-theme', savedTheme);
45
+ })();
46
+ </script>
47
+
48
+ {% comment %} load theme {% endcomment %}
49
+ <link rel="stylesheet" href="{{ '/assets/css/style.css' | relative_url }}">
50
+
51
+ {% comment %} feed {% endcomment %}
52
+ <link rel="alternate" type="application/atom+xml" title="{{ site.title }}" href="{{ '/feed.xml' | relative_url }}">
53
+
54
+ {%- if jekyll.environment == 'production' and site.google.analytics.enable == true and site.google.analytics.id != "" -%}
55
+ <!-- Google Analytics -->
56
+ {%- include google_analytics.html -%}
57
+ <!-- Google Analytics -->
58
+ {%- endif -%}
59
+ </head>
@@ -0,0 +1,143 @@
1
+ {%- include layout/data.liquid -%}
2
+
3
+ {%- assign index = site.pages | where: "path", "index.md" | first -%}
4
+
5
+ {%- for item in site.defaults -%}
6
+ {%- if item.scope.path == "_posts" -%}
7
+ {%- assign blog_page = item.values.published -%}
8
+ {%- endif -%}
9
+ {%- endfor -%}
10
+
11
+ <div class="modal fade" id="avatarModal" tabindex="-1" aria-hidden="true">
12
+ <div class="modal-dialog modal-dialog-centered">
13
+ <div class="modal-content bg-transparent border-0 shadow-none">
14
+ <div class="modal-body d-flex justify-content-center">
15
+ <img id="modalAvatar" class="avatar-img" src="" alt="">
16
+ </div>
17
+ </div>
18
+ </div>
19
+ </div>
20
+
21
+ <header class="container header">
22
+ <div class="header-wrapper">
23
+ <div class="row ">
24
+ <div class="col-sm-2 d-flex flex-column justify-content-end">
25
+ <div class="container">
26
+ <div class="row">
27
+ {%- if index.layout == "blog" -%}
28
+ <span>[&nbsp;<a class="{% if page.url == "/" or page.url == "/index.html" %}menu-active{% endif %}" href="/">{{ site.text.menu.blog | default: "blog" | downcase }}</a>&nbsp;]</span>
29
+ {%- else -%}
30
+ <span>[&nbsp;<a class="{% if page.url == "/" or page.url == "/index.html" %}menu-active{% endif %}" href="/">{{ site.text.menu.home | default: "home" | downcase }}</a>&nbsp;]</span>
31
+ {%- endif -%}
32
+ </div>
33
+ </div>
34
+ </div>
35
+ <div class="col-sm-8 d-flex flex-column justify-content-end">
36
+ <div class="container">
37
+ <div class="row">
38
+ <span class="title">{{ site.title | default: theme_name }}</span>
39
+ </div>
40
+ <div class="row">
41
+ <small class="description">
42
+ {{ site.description | default: "A raw Jekyll theme for minimalists" }}
43
+ </small>
44
+ </div>
45
+ </div>
46
+ </div>
47
+ <div class="col-sm-2 d-flex justify-content-end avatar">
48
+ {%- assign images_ = site.static_files | map: "path" -%}
49
+ {%- assign avatar_path_light = "/assets/images/" | append: site.avatar.image.front.light -%}
50
+ {%- assign avatar_path_dark = "/assets/images/" | append: site.avatar.image.front.dark -%}
51
+ {%- assign avatar_path_back = "/assets/images/" | append: site.avatar.image.back -%}
52
+
53
+ {%- if images_ contains avatar_path_light and images_ contains avatar_path_dark and images_ contains avatar_path_back -%}
54
+ <div class="avatar-wrapper">
55
+
56
+ <div class="avatar-flipper light-theme {% if site.avatar.open %}avatar-flipper__open-true{% endif %}{% if site.avatar.flip %} can-flip{% endif %}">
57
+ <div class="avatar-card">
58
+ <div class="avatar-front">
59
+ <img id="avatarImgLight" class="avatar-img" src="{{ avatar_path_light | relative_url }}" alt="{{ site.title }}" width="70">
60
+ </div>
61
+ <div class="avatar-back">
62
+ <img class="avatar-img" src="{{ avatar_path_back | relative_url }}" alt="{{ site.title }} - Verso" width="70">
63
+ </div>
64
+ </div>
65
+ </div>
66
+
67
+ <div class="avatar-flipper dark-theme {% if site.avatar.open %} avatar-flipper__open-true{% endif %}{% if site.avatar.flip %} can-flip{% endif %}">
68
+ <div class="avatar-card">
69
+ <div class="avatar-front">
70
+ <img id="avatarImgDark" class="avatar-img" src="{{ avatar_path_dark | relative_url }}" alt="{{ site.title }}" width="70">
71
+ </div>
72
+ <div class="avatar-back">
73
+ <img class="avatar-img" src="{{ avatar_path_back | relative_url }}" alt="{{ site.title }} - Verso" width="70">
74
+ </div>
75
+ </div>
76
+ </div>
77
+
78
+ </div>
79
+ {%- endif -%}
80
+ </div>
81
+ </div>
82
+
83
+ <div class="menu-separator"></div>
84
+
85
+ <div class="row">
86
+ <div class="col-sm d-flex justify-content-center column-bottom">
87
+ {%- if index.layout == "blog" -%}
88
+ <span class="blog-menu">menu&nbsp;»
89
+ &nbsp;{%- if site.blog.search.enable -%}<a id="blog-search__btn" class="blog-menu__link" href="/blog/?search=open">{{ site.text.menu.search | default: "search" }}</a><strong>&nbsp;.&nbsp;</strong>{%- endif -%}<a class="blog-menu__link{% if page.url == "/blog/tags/" or page.url == "/blog/tags/index.html" %} menu-active{% endif %}" href="/blog/tags/">{{ site.text.menu.tags | default: "tags" }}</a><strong>&nbsp;.&nbsp;</strong>
90
+ </span>
91
+ {% assign sorted_pages = site.pages | sort: 'order' %}
92
+ {%- for item in sorted_pages -%}
93
+ {%- if item.path contains '_pages/' and item.published != false -%}
94
+ {%- unless item.url contains "/tags/" or item.url contains "404.html" -%}
95
+ <a class="{% if page.url == item.url %}menu-active{% endif %}" href="{{ item.url | relative_url }}">{{ item.title | downcase }}</a><strong>&nbsp;.&nbsp;</strong>
96
+ {%- endunless -%}
97
+ {%- endif -%}
98
+ {%- endfor -%}
99
+ <a class="blog-menu__link" href="/feed.xml">{{ site.text.menu.feed | default: "feed" }}</a><strong>&nbsp;.&nbsp;</strong>
100
+ {%- else index.layout == "home" -%}
101
+ {%- if page.url contains "/blog/" -%}
102
+ <span class="blog-menu">{{ site.text.menu.blog }}&nbsp;»
103
+ <a class="blog-menu__link{% if page.url == "/blog/" or page.url == "/blog/index.html" or page.url contains "/blog/page/" %} menu-active{% endif %}" href="/blog/">posts</a><strong>&nbsp;.&nbsp;</strong>{%- if site.blog.search.enable -%}<a id="blog-search__btn" class="blog-menu__link" href="/blog/?search=open">{{ site.text.menu.search | default: "search" }}</a><strong>&nbsp;.&nbsp;</strong>{%- endif -%}<a class="blog-menu__link{% if page.url == "/blog/tags/" or page.url == "/blog/tags/index.html" %} menu-active{% endif %}" href="/blog/tags/">{{ site.text.menu.tags | default: "tags" }}</a><strong>&nbsp;.&nbsp;</strong><a class="blog-menu__link" href="/feed.xml">{{ site.text.menu.feed | default: "feed" }}</a><strong>&nbsp;.&nbsp;</strong>
104
+ </span>
105
+ {%- else -%}
106
+ {%- assign published_pages = site.pages | where_exp:"p","p.path contains '_pages/' and p.published" -%}
107
+ {%- if published_pages.size > 0 -%}
108
+ <span class="blog-menu">menu&nbsp;»</span>&nbsp;
109
+ {%- endif -%}
110
+ {%- if site.pagination.enabled == true -%}
111
+ {%- if blog_page -%}
112
+ <a href="/blog/">{{ site.text.menu.blog }}</a><strong>&nbsp;.&nbsp;</strong>
113
+ {%- endif -%}
114
+ {% assign sorted_pages = site.pages | sort: 'order' %}
115
+ {%- for item in sorted_pages -%}
116
+ {%- if item.path contains '_pages/' -%}
117
+ {%- unless item.url contains "blog" or item.url contains "404.html" -%}
118
+ <a class="{% if page.url == item.url %}menu-active{% endif %}" href="{{ item.url | relative_url }}">{{ item.title | downcase }}</a><strong>&nbsp;.&nbsp;</strong>
119
+ {%- endunless -%}
120
+ {%- endif -%}
121
+ {%- endfor -%}
122
+ {%- else -%}
123
+ {% assign sorted_pages = site.pages | sort: 'order' %}
124
+ {%- for item in sorted_pages -%}
125
+ {%- if item.path contains '_pages/' and item.published != false -%}
126
+ {%- unless item.url contains "/tags/" or item.url contains "404.html" -%}
127
+ <a class="{% if page.url == item.url %}menu-active{% endif %}" href="{{ item.url | relative_url }}">{{ item.title | downcase }}</a><strong>&nbsp;.&nbsp;</strong>
128
+ {%- endunless -%}
129
+ {%- endif -%}
130
+ {%- endfor -%}
131
+ {%- endif -%}
132
+ {%- endif -%}
133
+ {%- endif -%}
134
+ </div>
135
+ </div>
136
+
137
+ <div class="row justify-content-end">
138
+ <div class="col-sm-2 d-flex justify-content-end">
139
+ <span id="toggle-theme"><i class="fa-solid fa-moon"></i></span>
140
+ </div>
141
+ </div>
142
+ </div>
143
+ </header>
@@ -0,0 +1,30 @@
1
+ {% include layout/data.liquid %}
2
+
3
+ <!DOCTYPE html>
4
+ <html lang="{{ site.lang | default: 'en-US' }}">
5
+ {%- include head.html -%}
6
+ <body>
7
+ <div class="mt-4 maintenance">
8
+ <div class="container">
9
+ {%- if site.maintenance.gif != "" -%}
10
+ <div class="row">
11
+ <div class="col-sm text-center">
12
+ {%- if site.maintenance.gif == "local" -%}
13
+ <img class="maintenance-gif" src="{{ '/assets/gifs/under_maintenance.gif' | relative_url }}" alt="under maintenance">
14
+ {%- else -%}
15
+ <img class="maintenance-gif" src="{{ site.maintenance.gif }}" alt="under maintenance">
16
+ {%- endif -%}
17
+ </div>
18
+ </div>
19
+ {%- endif -%}
20
+ <div class="row mt-5 text-center">
21
+ <h1 class="maintenance-title">[&nbsp;{{ site.maintenance.title }}&nbsp;]</h1>
22
+ </div>
23
+ <div class="row text-center">
24
+ <h3 class="maintenance-subtitle">{{ site.maintenance.subtitle }}</h3>
25
+ </div>
26
+ </div>
27
+ </div>
28
+ {%- include footer.html -%}
29
+ </body>
30
+ </html>
@@ -0,0 +1,35 @@
1
+ {%- if page.pagination.enabled == true and site.pagination.enabled == true -%}
2
+ {%- assign total_page = paginator.total_pages -%}
3
+ {%- if total_page > 1 -%}
4
+ <nav>
5
+ <ul class="pagination justify-content-center blog-pagination">
6
+ {%- if paginator.previous_page -%}
7
+ <li class="page-item">
8
+ <a class="page-link blog-pagination__newer" href="{{ paginator.previous_page_path | prepend: site.baseurl | prepend: site.url }}">
9
+ &larr;&nbsp;{{ site.text.post.pagination.newer_text }}
10
+ </a>
11
+ </li>
12
+ {%- endif -%}
13
+
14
+ {%- if total_page > 1 -%}
15
+ <li class="page-item">
16
+ <span class="page-link blog-pagination__counter">
17
+ [&nbsp;{{ site.text.post.pagination.counter[0] }}
18
+ {{ paginator.page }}
19
+ {{ site.text.post.pagination.counter[1] }}
20
+ {{ total_page }}&nbsp;]
21
+ </span>
22
+ </li>
23
+ {%- endif -%}
24
+
25
+ {%- if paginator.next_page -%}
26
+ <li class="page-item">
27
+ <a class="page-link blog-pagination__older" href="{{ paginator.next_page_path | prepend: site.baseurl | prepend: site.url }}">
28
+ {{ site.text.post.pagination.older_text }}&nbsp;&rarr;
29
+ </a>
30
+ </li>
31
+ {%- endif -%}
32
+ </ul>
33
+ </nav>
34
+ {%- endif -%}
35
+ {%- endif -%}
data/_includes/socials ADDED
@@ -0,0 +1,22 @@
1
+ <div class="container socials">
2
+ <div class="row">
3
+
4
+ {%- assign pos = "justify-content-center" -%}
5
+
6
+ {%- if include.pos == "left" -%}
7
+ {%- assign pos = "justify-content-start" -%}
8
+ {%- elsif include.pos == "right" -%}
9
+ {%- assign pos = "justify-content-end" -%}
10
+ {%- endif -%}
11
+
12
+ <div class="col-sm d-flex {{pos}}"><strong>.&nbsp;</strong>
13
+ {% assign links = site.socials.links %}
14
+ {% for item in links %}
15
+ <a class="socials-link" title="{{ item.title }}" href="{{ item.url }}" target="_blank">
16
+ {{ item.title }}
17
+ </a><strong>&nbsp;.&nbsp;</strong>
18
+ {% endfor %}
19
+ </div>
20
+
21
+ </div>
22
+ </div>
data/_includes/tabs ADDED
@@ -0,0 +1,94 @@
1
+ <div class="tabs-start" aria-hidden="true"></div>
2
+
3
+ <script>
4
+ (function () {
5
+ if (window.__simple_tabs_installed) return;
6
+ window.__simple_tabs_installed = true;
7
+
8
+ function processTabs() {
9
+ var starts = Array.from(document.querySelectorAll('.tabs-start'));
10
+ starts.forEach(function (start) {
11
+ var end = start.nextSibling;
12
+ while (end && !(end.nodeType === 1 && end.classList && end.classList.contains('tabs-end'))) {
13
+ end = end.nextSibling;
14
+ }
15
+ if (!end) return;
16
+
17
+ var node = start.nextSibling;
18
+ var tabs = [];
19
+ var currentTab = null;
20
+ while (node && node !== end) {
21
+ var next = node.nextSibling;
22
+ if (node.nodeType === Node.TEXT_NODE && !node.textContent.trim()) {
23
+ node = next; continue;
24
+ }
25
+ var text = (node.textContent || '').trim();
26
+ var m = text.match(/^\s*tab\d*\s*:\s*(.+)$/i);
27
+ if (m) {
28
+ currentTab = { title: m[1].trim(), nodes: [] };
29
+ tabs.push(currentTab);
30
+ if (node.parentNode) node.parentNode.removeChild(node);
31
+ } else if (currentTab) {
32
+ currentTab.nodes.push(node);
33
+ } else {
34
+ }
35
+ node = next;
36
+ }
37
+
38
+ if (tabs.length === 0) {
39
+ return;
40
+ }
41
+
42
+ var wrap = document.createElement('div');
43
+ wrap.className = 'tabs-wrap';
44
+
45
+ var nav = document.createElement('div');
46
+ nav.className = 'tabs-nav';
47
+
48
+ var panels = document.createElement('div');
49
+ panels.className = 'tabs-panels';
50
+
51
+ tabs.forEach(function (tab, i) {
52
+ var btn = document.createElement('button');
53
+ btn.type = 'button';
54
+ btn.className = 'tab-btn' + (i === 0 ? ' active' : '');
55
+ btn.setAttribute('data-idx', i);
56
+ btn.textContent = tab.title;
57
+ btn.addEventListener('click', function () {
58
+ var idx = +this.getAttribute('data-idx');
59
+ wrap.querySelectorAll('.tab-btn').forEach(function (b) {
60
+ b.classList.toggle('active', +b.getAttribute('data-idx') === idx);
61
+ });
62
+ wrap.querySelectorAll('.tab-panel').forEach(function (p, pi) {
63
+ p.classList.toggle('active', pi === idx);
64
+ });
65
+ });
66
+ nav.appendChild(btn);
67
+
68
+ var panel = document.createElement('div');
69
+ panel.className = 'tab-panel' + (i === 0 ? ' active' : '');
70
+ tab.nodes.forEach(function (n) {
71
+ panel.appendChild(n.cloneNode(true));
72
+ });
73
+ panels.appendChild(panel);
74
+ });
75
+
76
+ wrap.appendChild(nav);
77
+ wrap.appendChild(panels);
78
+
79
+ start.parentNode.insertBefore(wrap, start);
80
+
81
+ var cur = start;
82
+ while (cur) {
83
+ var nx = cur.nextSibling;
84
+ if (cur.parentNode) cur.parentNode.removeChild(cur);
85
+ if (cur === end) break;
86
+ cur = nx;
87
+ }
88
+ });
89
+ }
90
+
91
+ if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', processTabs);
92
+ else processTabs();
93
+ })();
94
+ </script>
data/_includes/toc ADDED
@@ -0,0 +1,160 @@
1
+ <nav class="toc" id="toc" data-toc-selector="{{ include.selector | default: '.post-content' }}"
2
+ data-toc-max-level="{{ include.max_level | default: 3 }}"
3
+ data-toc-scroll-offset="{{ include.scroll_offset | default: 20 }}">
4
+ <div class="toc-head">
5
+ <h2>{{ include.title | default: "TOC" }}</h2>
6
+ <button class="toc-toggle" aria-expanded="true" type="button">{{ include.btn_hidden }}</button>
7
+ </div>
8
+ <div class="toc-list-wrapper">
9
+ <ul class="toc-list" role="list"></ul>
10
+ <p class="toc-empty" style="display:none">No titles found.</p>
11
+ </div>
12
+ </nav>
13
+
14
+ <script>
15
+ (function () {
16
+ function slugify(text) {
17
+ if (!text) return '';
18
+ return text.toString().toLowerCase().trim()
19
+ .normalize('NFKD').replace(/[\u0300-\u036f]/g, '')
20
+ .replace(/[^\w\s-]/g, '').replace(/\s+/g, '-').replace(/--+/g, '-');
21
+ }
22
+
23
+ function buildTOC(tocEl) {
24
+ const selector = tocEl.dataset.tocSelector || '.post-content';
25
+ const maxLevel = parseInt(tocEl.dataset.tocMaxLevel || '3', 10);
26
+ const offset = parseInt(tocEl.dataset.tocScrollOffset || '20', 10);
27
+ const root = document.querySelector(selector);
28
+
29
+ if (!root) {
30
+ tocEl.querySelector('.toc-empty').textContent = `Content not found (${selector})`;
31
+ tocEl.querySelector('.toc-empty').style.display = 'block';
32
+ return;
33
+ }
34
+
35
+ const headings = Array.from(root.querySelectorAll(Array(maxLevel).fill(0).map((_, i) => `h${i + 1}`).join(',')))
36
+ .filter(h => !tocEl.contains(h))
37
+ .filter(h => parseInt(h.tagName.substring(1)) <= maxLevel);
38
+
39
+ if (headings.length === 0) {
40
+ tocEl.querySelector('.toc-empty').style.display = 'block';
41
+ return;
42
+ }
43
+
44
+ const tocRoot = tocEl.querySelector('.toc-list');
45
+ tocRoot.innerHTML = '';
46
+
47
+ const idCounts = {};
48
+ headings.forEach(h => {
49
+ if (!h.id) {
50
+ let id = slugify(h.textContent);
51
+ if (!id) id = 'section';
52
+ if (idCounts[id]) { idCounts[id] += 1; id = id + '-' + idCounts[id]; }
53
+ else idCounts[id] = 1;
54
+ h.id = id;
55
+ }
56
+ });
57
+
58
+ // Build hierarchical tree
59
+ const stack = [{ level: 0, ul: tocRoot }];
60
+ headings.forEach((h, i) => {
61
+ const level = parseInt(h.tagName.substring(1));
62
+ const li = document.createElement('li');
63
+ const a = document.createElement('a');
64
+ a.href = '#' + h.id;
65
+ a.textContent = h.textContent.trim();
66
+ a.addEventListener('click', e => {
67
+ e.preventDefault();
68
+ window.scrollTo({ top: h.getBoundingClientRect().top + window.scrollY - offset, behavior: 'smooth' });
69
+ history.replaceState(null, '', '#' + h.id);
70
+
71
+ // // Clicking on the TOC menu closes the TOC
72
+ // const wrapper = tocEl.querySelector('.toc-list-wrapper');
73
+ // const toggle = tocEl.querySelector('.toc-toggle');
74
+ // wrapper.style.display = 'none';
75
+ // toggle.setAttribute('aria-expanded', 'false');
76
+ // toggle.textContent = '{ { include.btn_show } }';
77
+ });
78
+ li.appendChild(a);
79
+
80
+ while (stack.length > 1 && level <= stack[stack.length - 1].level) stack.pop();
81
+ const parent = stack[stack.length - 1].ul;
82
+ parent.appendChild(li);
83
+
84
+ const next = headings[i + 1];
85
+ if (next) {
86
+ const nextLevel = parseInt(next.tagName.substring(1));
87
+ if (nextLevel > level) {
88
+ const newUl = document.createElement('ul');
89
+ li.appendChild(newUl);
90
+ stack.push({ level, ul: newUl });
91
+ }
92
+ }
93
+ });
94
+
95
+ // Active Highlight
96
+ const links = tocRoot.querySelectorAll('a');
97
+ function onScroll() {
98
+ const fromTop = window.scrollY + offset + 1;
99
+ let current = headings[0];
100
+ for (let i = 0; i < headings.length; i++) {
101
+ if (headings[i].offsetTop <= fromTop) current = headings[i];
102
+ }
103
+ links.forEach(l => l.classList.toggle('active', l.getAttribute('href') === '#' + current.id));
104
+ }
105
+ window.addEventListener('scroll', onScroll, { passive: true });
106
+ onScroll();
107
+ }
108
+
109
+ document.addEventListener('DOMContentLoaded', function () {
110
+ document.querySelectorAll('.toc').forEach(toc => {
111
+ buildTOC(toc);
112
+ const toggle = toc.querySelector('.toc-toggle');
113
+ const wrapper = toc.querySelector('.toc-list-wrapper');
114
+
115
+ wrapper.style.display = 'none';
116
+ toggle.setAttribute('aria-expanded', 'false');
117
+ toggle.textContent = '{{ include.btn_show }}';
118
+
119
+ toggle.addEventListener('click', () => {
120
+ const expanded = toggle.getAttribute('aria-expanded') === 'true';
121
+ wrapper.style.display = expanded ? 'none' : 'block';
122
+ toggle.setAttribute('aria-expanded', (!expanded).toString());
123
+ toggle.textContent = expanded ? '{{ include.btn_show }}' : '{{ include.btn_hidden }}';
124
+ });
125
+
126
+ const tocTop = toc.offsetTop;
127
+
128
+ function handleScrollFix() {
129
+ const scrollTop = window.scrollY || document.documentElement.scrollTop;
130
+
131
+ // Fixes pinning behavior in Chrome
132
+ if (scrollTop >= tocTop) {
133
+ toc.classList.add('fixed');
134
+ toc.style.position = 'fixed';
135
+ toc.style.top = '0';
136
+ toc.style.zIndex = '9999';
137
+ // toc.style.width = toc.offsetWidth + 'px';
138
+ } else {
139
+ toc.classList.remove('fixed');
140
+ toc.style.position = '';
141
+ toc.style.top = '';
142
+ toc.style.width = '';
143
+ }
144
+
145
+ // // Automatically closes the TOC if it is open and scrolled to it.
146
+ // const rect = toc.getBoundingClientRect();
147
+ // if (rect.top <= 0 && toggle.getAttribute('aria-expanded') === 'true') {
148
+ // wrapper.style.display = 'none';
149
+ // toggle.setAttribute('aria-expanded', 'false');
150
+ // toggle.textContent = '{ { include.btn_show } }';
151
+ // }
152
+ }
153
+
154
+ window.addEventListener('scroll', handleScrollFix, { passive: true });
155
+ window.addEventListener('resize', handleScrollFix);
156
+ handleScrollFix();
157
+ });
158
+ });
159
+ })();
160
+ </script>
data/_includes/video ADDED
@@ -0,0 +1,10 @@
1
+ {% assign video_id = include.url | split: "v=" | last | split: "&" | first %}
2
+ <div class="video-wrapper">
3
+ <iframe src="https://www.youtube.com/embed/{{ video_id }}" title="{{ include.title | default: 'Video' }}"
4
+ frameborder="0" allowfullscreen>
5
+ </iframe>
6
+ <noscript>
7
+ <p>The video is not available for embedding. Watch it on <a href="{{ include.url }}" target="_blank">YouTube</a>.
8
+ </p>
9
+ </noscript>
10
+ </div>
@@ -0,0 +1,46 @@
1
+ ---
2
+ layout: default
3
+ ---
4
+
5
+ {%- if page.pagination.enabled == true and site.pagination.enabled == true -%}
6
+ {%- assign count_posts = paginator.total_posts -%}
7
+ {%- else -%}
8
+ {%- for _ in site.posts -%}
9
+ {%- capture count_posts -%} {{ count_posts | plus: 1 }} {%- endcapture -%}
10
+ {%- endfor -%}
11
+ {%- endif -%}
12
+
13
+ <div class="container blog">
14
+ {%- include layout/blog_search.html -%}
15
+
16
+ <div id="posts" class="row">
17
+ {%- if page.title -%}
18
+ <h2 class="blog-subtitle">[&nbsp;{{ site.text.blog.subtitle | default: "posts" }}:&nbsp;&nbsp;{{ count_posts }}&nbsp;]</h2>
19
+ {%- endif -%}
20
+
21
+ {%- if site.posts.size > 0 -%}
22
+ <ul class="row blog-list">
23
+ {%- if page.pagination.enabled == true and site.pagination.enabled == true -%}
24
+ {%- assign posts = paginator.posts -%}
25
+ {%- else -%}
26
+ {% assign posts = site.posts %}
27
+ {%- endif -%}
28
+
29
+ {%- for post in posts -%}
30
+ <li class="blog-list__item">
31
+ {%- assign date_format = "%b %-d,%Y" -%}
32
+ <span class="blog-list__meta">{{ post.date | date: date_format }}</span>&nbsp;»&nbsp;
33
+ <a class="blog-list__link" href="{{ post.url | relative_url }}">
34
+ {{ post.title | escape }}
35
+ </a>
36
+ {%- if post.draft -%}
37
+ <span class="draft-badge">[&nbsp;this is a draft&nbsp;]</span>
38
+ {%- endif -%}
39
+ </li>
40
+ {%- endfor -%}
41
+ </ul>
42
+ {%- endif -%}
43
+
44
+ {%- include layout/paginator.html -%}
45
+ </div>
46
+ </div>