rawfeed 0.1.1 → 0.1.3
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.
- checksums.yaml +4 -4
- data/README.md +3 -7
- data/_data/resume.yml +35 -0
- data/_includes/layout/data.liquid +1 -0
- data/_includes/toc +1 -1
- data/_includes/video +2 -3
- data/_layouts/blog.html +7 -2
- data/_layouts/page.html +31 -0
- data/_layouts/post.html +25 -8
- data/_layouts/resume.html +43 -0
- data/_layouts/tag_posts.html +3 -2
- data/_sass/base/_reset.scss +33 -4
- data/_sass/components/_markdown.scss +5 -1
- data/_sass/layouts/_blog.scss +1 -1
- data/_sass/layouts/_page.scss +12 -0
- data/_sass/layouts/_post.scss +17 -23
- data/_sass/layouts/_resume.scss +32 -1
- data/assets/json/blog_search.json +2 -2
- data/assets/json/datelang.json +290 -0
- data/lib/rawfeed/datelang.rb +101 -0
- data/lib/rawfeed/draft.rb +1 -1
- data/lib/rawfeed/page.rb +2 -1
- data/lib/rawfeed/reading_time.rb +17 -0
- data/lib/rawfeed/version.rb +1 -1
- data/lib/rawfeed.rb +5 -0
- metadata +4 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5c77c26cafbcdaddf6d5297d5ec37d0e6912e305b31055c412d5f3fb595e6011
|
|
4
|
+
data.tar.gz: ee87b78c301ed6862181631c4b71938c8fbeb67133262f915218dc63943e9706
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fb7020880c461a817305c26e2a5076cd7418b2509aaf0207e5b3352e071f4ea86595a24bb9a9791043e23d122686131066b3fb33f062fc0a5c2f16f9e676dd6e
|
|
7
|
+
data.tar.gz: 99d68cc1a6ea32e42c900f8e3bf2d6bc4561bad407ee50bd83449586e562ba6aba4bcfcf4b8023acc30260f98e893e2fe8ae52ba0ff46e157128c08fcf0c9a9e
|
data/README.md
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
<br>
|
|
4
4
|
<small>Rawfeed — A raw Jekyll theme for minimalists</small>
|
|
5
5
|
<br>
|
|
6
|
+
<a href="https://badge.fury.io/rb/rawfeed"><img src="https://badge.fury.io/rb/rawfeed.svg" alt="Gem Version" height="18"></a>
|
|
7
|
+
<br>
|
|
6
8
|
<a href="https://williamcanin.github.io/rawfeed" target="_blank">Theme Preview</a>
|
|
7
9
|
</p>
|
|
8
10
|
|
|
@@ -58,13 +60,7 @@ iwr -useb https://raw.githubusercontent.com/williamcanin/rawfeed/refs/heads/main
|
|
|
58
60
|
|
|
59
61
|
# Usage
|
|
60
62
|
|
|
61
|
-
**
|
|
62
|
-
|
|
63
|
-
```shell
|
|
64
|
-
npm install
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
**(2)** - For **rawfeed** manipulation commands, use:
|
|
63
|
+
After installation, run the command below to see the **rawfeed** command menu:
|
|
68
64
|
|
|
69
65
|
```shell
|
|
70
66
|
npm run help
|
data/_data/resume.yml
CHANGED
|
@@ -141,6 +141,32 @@ body:
|
|
|
141
141
|
- I collaborated with engineering teams to deploy **Keras** and **Matlab** models in production
|
|
142
142
|
environments, impacting **millions of platform** users.
|
|
143
143
|
|
|
144
|
+
# section: [Certificates]
|
|
145
|
+
# Full links will only appear in print mode. Online and PDF modes are clickable.
|
|
146
|
+
# TODO: Bugfix: Quando tem muitos certificados, existe uma quebra de espaço absurda na impressão
|
|
147
|
+
certificates:
|
|
148
|
+
enable: true
|
|
149
|
+
caption: Certificates
|
|
150
|
+
section:
|
|
151
|
+
- course: LPIC-2
|
|
152
|
+
certificate: https://github.com/williamcanin/rawfeed
|
|
153
|
+
period:
|
|
154
|
+
year: 2020
|
|
155
|
+
hours: 20 hours
|
|
156
|
+
company:
|
|
157
|
+
name: Linux Professional Institute
|
|
158
|
+
site: https://www.lpi.org
|
|
159
|
+
|
|
160
|
+
- course: LPIC-1
|
|
161
|
+
certificate: https://github.com/williamcanin/rawfeed
|
|
162
|
+
period:
|
|
163
|
+
year: 2018
|
|
164
|
+
hours: 19 hours
|
|
165
|
+
company:
|
|
166
|
+
caption:
|
|
167
|
+
name: Linux Professional Institute
|
|
168
|
+
site: https://www.lpi.org
|
|
169
|
+
|
|
144
170
|
# section: [Publications]
|
|
145
171
|
# Full links will only appear in print mode. Online and PDF modes are clickable.
|
|
146
172
|
publications:
|
|
@@ -182,3 +208,12 @@ body:
|
|
|
182
208
|
details: |
|
|
183
209
|
- I led a class of **Computer Engineering** students in the modern **AI course**.
|
|
184
210
|
It was over **170 hours** of classes.
|
|
211
|
+
|
|
212
|
+
# section: [Markdown]
|
|
213
|
+
# Here you can put text in markdown formatting
|
|
214
|
+
markdown:
|
|
215
|
+
enable: true
|
|
216
|
+
caption: Notes
|
|
217
|
+
content: |
|
|
218
|
+
- I led a class of **Computer Engineering** students in the modern **AI course**.
|
|
219
|
+
It was over **170 hours** of classes.
|
data/_includes/toc
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
function buildTOC(tocEl) {
|
|
24
|
-
const selector = tocEl.dataset.tocSelector || '.post-content';
|
|
24
|
+
const selector = tocEl.dataset.tocSelector || '.post-content' || '.page-content';
|
|
25
25
|
const maxLevel = parseInt(tocEl.dataset.tocMaxLevel || '3', 10);
|
|
26
26
|
const offset = parseInt(tocEl.dataset.tocScrollOffset || '20', 10);
|
|
27
27
|
const root = document.querySelector(selector);
|
data/_includes/video
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
{% assign video_id = include.url | split: "v=" | last | split: "&" | first %}
|
|
2
1
|
<div class="video-wrapper">
|
|
3
|
-
<iframe src="
|
|
4
|
-
frameborder="0" allowfullscreen>
|
|
2
|
+
<iframe src="{{ include.url }}" title="{{ include.title | default: 'Video' }}"
|
|
3
|
+
frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen>
|
|
5
4
|
</iframe>
|
|
6
5
|
<noscript>
|
|
7
6
|
<p>The video is not available for embedding. Watch it on <a href="{{ include.url }}" target="_blank">YouTube</a>.
|
data/_layouts/blog.html
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
layout: default
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
+
{%- include layout/data.liquid -%}
|
|
6
|
+
|
|
5
7
|
{%- if page.pagination.enabled == true and site.pagination.enabled == true -%}
|
|
6
8
|
{%- assign count_posts = paginator.total_posts -%}
|
|
7
9
|
{%- else -%}
|
|
@@ -28,8 +30,11 @@ layout: default
|
|
|
28
30
|
|
|
29
31
|
{%- for post in posts -%}
|
|
30
32
|
<li class="blog-list__item">
|
|
31
|
-
{%-
|
|
32
|
-
|
|
33
|
+
{%- if site.datelang -%}
|
|
34
|
+
<span class="blog-list__meta">{% datelang post.date format:date_format %}</span> »
|
|
35
|
+
{%- else -%}
|
|
36
|
+
<span class="blog-list__meta">{{ post.date | date: "%b %-d, %Y" }}</span> »
|
|
37
|
+
{%- endif -%}
|
|
33
38
|
<a class="blog-list__link" href="{{ post.url | relative_url }}">
|
|
34
39
|
{{ post.title | escape }}
|
|
35
40
|
</a>
|
data/_layouts/page.html
CHANGED
|
@@ -2,8 +2,39 @@
|
|
|
2
2
|
layout: default
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
+
{%- include layout/data.liquid -%}
|
|
6
|
+
|
|
5
7
|
<div class="container page">
|
|
8
|
+
{%- if page.date or page.reading_time -%}
|
|
9
|
+
<div class="row">
|
|
10
|
+
{%- if page.date -%}
|
|
11
|
+
<time class="dt-published" datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
|
|
12
|
+
{%- if site.datelang -%}
|
|
13
|
+
{% datelang page.date format:date_format %}
|
|
14
|
+
{%- else -%}
|
|
15
|
+
{{ page.date | date: "%b %-d, %Y" }}
|
|
16
|
+
{%- endif -%}
|
|
17
|
+
</time>
|
|
18
|
+
{%- endif -%}
|
|
19
|
+
{%- if page.reading_time -%}
|
|
20
|
+
<div class="page-reading_time">
|
|
21
|
+
<p>[ {{ page.content | reading_time }} ]</p>
|
|
22
|
+
</div>
|
|
23
|
+
{%- endif -%}
|
|
24
|
+
</div>
|
|
25
|
+
{%- endif -%}
|
|
26
|
+
|
|
6
27
|
<div class="row">
|
|
7
28
|
<div class="page-content">{{ content }}</div>
|
|
8
29
|
</div>
|
|
30
|
+
|
|
31
|
+
{%- if page.update_date -%}
|
|
32
|
+
<div class="row page-modified">
|
|
33
|
+
<time class="dt-modified" datetime="{{ page.date | date_to_xmlschema }}" itemprop="dateModified">
|
|
34
|
+
<strong>{{ site.text.page.updated_on | default: "Page updated on" }}:</strong> {% datelang page.update_date format:date_format %}
|
|
35
|
+
</time>
|
|
36
|
+
</div>
|
|
37
|
+
{%- endif -%}
|
|
9
38
|
</div>
|
|
39
|
+
|
|
40
|
+
<script src="{{ '/assets/js/toc.js' | relative_url }}"></script>
|
data/_layouts/post.html
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
layout: default
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
+
{%- include layout/data.liquid -%}
|
|
6
|
+
|
|
5
7
|
<article class="container post" itemscope itemtype="http://schema.org/BlogPosting">
|
|
6
8
|
<div class="row">
|
|
7
9
|
|
|
@@ -11,7 +13,11 @@ layout: default
|
|
|
11
13
|
<div class="row post-meta">
|
|
12
14
|
<div class="col-sm d-flex justify-content-start">
|
|
13
15
|
<time class="dt-published" datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
|
|
14
|
-
{
|
|
16
|
+
{%- if site.datelang -%}
|
|
17
|
+
{% datelang page.date format:date_format %}
|
|
18
|
+
{%- else -%}
|
|
19
|
+
{{ page.date | date: "%b %-d, %Y" }}
|
|
20
|
+
{%- endif -%}
|
|
15
21
|
</time>
|
|
16
22
|
</div>
|
|
17
23
|
<div class="col-sm d-flex justify-content-end">
|
|
@@ -23,6 +29,11 @@ layout: default
|
|
|
23
29
|
</span>
|
|
24
30
|
{%- endif -%}
|
|
25
31
|
</div>
|
|
32
|
+
{%- if site.reading_time.enable -%}
|
|
33
|
+
<div class="post-reading_time">
|
|
34
|
+
[ {{ page.content | reading_time }} ]
|
|
35
|
+
</div>
|
|
36
|
+
{%- endif -%}
|
|
26
37
|
</div>
|
|
27
38
|
|
|
28
39
|
</header>
|
|
@@ -33,11 +44,14 @@ layout: default
|
|
|
33
44
|
|
|
34
45
|
{%- if page.update_date -%}
|
|
35
46
|
<div class="row post-modified">
|
|
36
|
-
<
|
|
37
|
-
<
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
47
|
+
<time class="dt-modified" datetime="{{ page.date | date_to_xmlschema }}" itemprop="dateModified">
|
|
48
|
+
<strong>{{ site.text.post.updated_on | default: "Post updated on" }}:</strong>
|
|
49
|
+
{%- if site.datelang -%}
|
|
50
|
+
{% datelang page.update_date format:date_format %}
|
|
51
|
+
{%- else -%}
|
|
52
|
+
{{ page.date | date: "%b %-d, %Y" }}
|
|
53
|
+
{%- endif -%}
|
|
54
|
+
</time>
|
|
41
55
|
</div>
|
|
42
56
|
{%- endif -%}
|
|
43
57
|
|
|
@@ -85,8 +99,11 @@ layout: default
|
|
|
85
99
|
<ul class="related-posts-list">
|
|
86
100
|
{%- for post in related_posts limit:5 -%}
|
|
87
101
|
<li class="related-posts-list__item">
|
|
88
|
-
{%-
|
|
89
|
-
|
|
102
|
+
{%- if site.datelang -%}
|
|
103
|
+
<span class="related-posts-list__meta">{% datelang post.date format:date_format %}</span> »
|
|
104
|
+
{%- else -%}
|
|
105
|
+
<span class="related-posts-list__meta">{{ post.date | date: "%b %-d, %Y" }}</span> »
|
|
106
|
+
{%- endif -%}
|
|
90
107
|
<a class="related-posts-list__link" href="{{ post.url | relative_url }}">{{ post.title }}</a>
|
|
91
108
|
{%- if post.draft -%}
|
|
92
109
|
<span class="draft-badge">[ this is a draft ]</span>
|
data/_layouts/resume.html
CHANGED
|
@@ -139,6 +139,43 @@
|
|
|
139
139
|
{%- endfor -%}
|
|
140
140
|
</section>
|
|
141
141
|
{%- endif -%}
|
|
142
|
+
{%- if resume.body.certificates.enable -%}
|
|
143
|
+
<section class="row section certificate">
|
|
144
|
+
<h2 class="section-title">{{ resume.body.certificates.caption }}</h2>
|
|
145
|
+
{%- for cert in resume.body.certificates.section -%}
|
|
146
|
+
<div class="section-item">
|
|
147
|
+
<div class="row">
|
|
148
|
+
<div class="title"><span class="marker">• </span>
|
|
149
|
+
{%- if cert.certificate -%}
|
|
150
|
+
<a href="{{ cert.certificate }}" target="_blank">{{ cert.course }}
|
|
151
|
+
<small>{{ cert.certificate }}</small>
|
|
152
|
+
</a>
|
|
153
|
+
{%- else -%}
|
|
154
|
+
<span>{{ cert.course }}</span>
|
|
155
|
+
{%- endif -%}
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
<div class="row">
|
|
159
|
+
<div class="period">
|
|
160
|
+
-
|
|
161
|
+
{%- if cert.period.year-%} <span class="time">{{ cert.period.year }}</span>{%- endif-%}
|
|
162
|
+
{%- if cert.period.hours-%} — <span class="hours">{{ cert.period.hours }}</span>{%- endif-%}
|
|
163
|
+
</div>
|
|
164
|
+
</div>
|
|
165
|
+
<div class="row">
|
|
166
|
+
<div class="company">
|
|
167
|
+
{%- if cert.company.site -%}
|
|
168
|
+
- <a href="{{ cert.company.site }}" target="_blank">{{ cert.company.name }}
|
|
169
|
+
</a>
|
|
170
|
+
{%- else -%}
|
|
171
|
+
- <span>{{ cert.company.name }}</span>
|
|
172
|
+
{%- endif -%}
|
|
173
|
+
</div>
|
|
174
|
+
</div>
|
|
175
|
+
</div>
|
|
176
|
+
{%- endfor -%}
|
|
177
|
+
</section>
|
|
178
|
+
{%- endif -%}
|
|
142
179
|
{%- if resume.body.publications.enable -%}
|
|
143
180
|
<section class="row section publications">
|
|
144
181
|
<h2 class="section-title">{{ resume.body.publications.caption }}</h2>
|
|
@@ -213,6 +250,12 @@
|
|
|
213
250
|
{%- endfor -%}
|
|
214
251
|
</section>
|
|
215
252
|
{%- endif -%}
|
|
253
|
+
{%- if resume.body.markdown.enable -%}
|
|
254
|
+
<section class="row section markdown">
|
|
255
|
+
<h2 class="section-title">{{ resume.body.markdown.caption }}</h2>
|
|
256
|
+
<div class="section-content">{{ resume.body.markdown.content | markdownify }}</div>
|
|
257
|
+
</section>
|
|
258
|
+
{%- endif -%}
|
|
216
259
|
</div>
|
|
217
260
|
</div>
|
|
218
261
|
</div>
|
data/_layouts/tag_posts.html
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
layout: default
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
+
{%- include layout/data.liquid -%}
|
|
6
|
+
|
|
5
7
|
<div class="container tag-posts">
|
|
6
8
|
<div class="row">
|
|
7
9
|
<h1 class="tag-posts-title"><span>[ {{ site.text.tags_posts.title }}: </span>{{ page.title }}<span> ]</span></h1>
|
|
@@ -9,8 +11,7 @@ layout: default
|
|
|
9
11
|
<ul class="row tag-posts-list">
|
|
10
12
|
{%- for post in page.posts -%}
|
|
11
13
|
<li class="tag-posts-list__item">
|
|
12
|
-
{
|
|
13
|
-
<span class="tag-posts-list__meta">{{ post.date | date: date_format }}</span> »
|
|
14
|
+
<span class="tag-posts-list__meta">{% datelang post.date format:date_format %}</span> »
|
|
14
15
|
<a class="tag-posts-list__link" href="{{ post.url | relative_url }}">{{ post.title }}</a>
|
|
15
16
|
{%- if post.draft -%}
|
|
16
17
|
<span class="draft-badge">[ this is a draft ]</span>
|
data/_sass/base/_reset.scss
CHANGED
|
@@ -1,10 +1,39 @@
|
|
|
1
|
-
*{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
* {
|
|
2
|
+
|
|
3
|
+
input,
|
|
4
|
+
a,
|
|
5
|
+
button {
|
|
6
|
+
|
|
7
|
+
&:focus,
|
|
8
|
+
&:hover,
|
|
9
|
+
&:active {
|
|
10
|
+
outline: 0 !important;
|
|
5
11
|
}
|
|
6
12
|
}
|
|
13
|
+
|
|
7
14
|
li {
|
|
8
15
|
list-style: none;
|
|
9
16
|
}
|
|
17
|
+
|
|
18
|
+
/* reset table values in <pre> */
|
|
19
|
+
pre {
|
|
20
|
+
code {
|
|
21
|
+
|
|
22
|
+
table,
|
|
23
|
+
tbody {
|
|
24
|
+
all: unset !important;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
table {
|
|
28
|
+
tbody {
|
|
29
|
+
|
|
30
|
+
td,
|
|
31
|
+
tr {
|
|
32
|
+
border: none !important;
|
|
33
|
+
background-color: transparent !important;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
10
39
|
}
|
|
@@ -41,12 +41,16 @@
|
|
|
41
41
|
background-color: var(--blockquote-bg-color);
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
li {
|
|
45
|
+
list-style: disc !important;
|
|
46
|
+
}
|
|
47
|
+
|
|
44
48
|
.task-list {
|
|
45
49
|
margin-left: 0;
|
|
46
50
|
padding-left: 18px;
|
|
47
51
|
|
|
48
52
|
&-item {
|
|
49
|
-
list-style-type: none;
|
|
53
|
+
list-style-type: none !important;
|
|
50
54
|
|
|
51
55
|
&-checkbox {
|
|
52
56
|
position: relative;
|
data/_sass/layouts/_blog.scss
CHANGED
data/_sass/layouts/_page.scss
CHANGED
|
@@ -2,4 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
.page {
|
|
4
4
|
@extend %markdown;
|
|
5
|
+
|
|
6
|
+
.dt-published,
|
|
7
|
+
.dt-modified {
|
|
8
|
+
font-weight: normal !important;
|
|
9
|
+
font-family: "SUSE Mono", sans-serif;
|
|
10
|
+
color: var(--text-muted-color);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
&-reading_time {
|
|
14
|
+
margin-top: 15px;
|
|
15
|
+
color: var(--text-muted-color);
|
|
16
|
+
}
|
|
5
17
|
}
|
data/_sass/layouts/_post.scss
CHANGED
|
@@ -14,7 +14,19 @@
|
|
|
14
14
|
list-style: disc;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
+
.comments {
|
|
18
|
+
&-title {
|
|
19
|
+
font-size: 1rem !important;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
&-reading_time {
|
|
24
|
+
color: var(--text-muted-color);
|
|
25
|
+
margin: 12px 0px;
|
|
26
|
+
}
|
|
27
|
+
|
|
17
28
|
&-title {
|
|
29
|
+
margin-top: 0px !important;
|
|
18
30
|
font-size: 1.3rem !important;
|
|
19
31
|
font-weight: bold;
|
|
20
32
|
margin-bottom: 40px !important;
|
|
@@ -46,6 +58,10 @@
|
|
|
46
58
|
.related-posts {
|
|
47
59
|
margin-bottom: 80px;
|
|
48
60
|
|
|
61
|
+
li {
|
|
62
|
+
list-style: none !important;
|
|
63
|
+
}
|
|
64
|
+
|
|
49
65
|
&-title {
|
|
50
66
|
font-size: 1.05rem;
|
|
51
67
|
font-weight: bold;
|
|
@@ -65,7 +81,7 @@
|
|
|
65
81
|
|
|
66
82
|
&__meta {
|
|
67
83
|
display: inline-block;
|
|
68
|
-
min-width:
|
|
84
|
+
min-width: 115px !important;
|
|
69
85
|
font-family: "SUSE Mono", sans-serif;
|
|
70
86
|
font-optical-sizing: auto;
|
|
71
87
|
font-style: normal;
|
|
@@ -80,28 +96,6 @@
|
|
|
80
96
|
}
|
|
81
97
|
}
|
|
82
98
|
|
|
83
|
-
/* reset table values in <pre> */
|
|
84
|
-
pre {
|
|
85
|
-
code {
|
|
86
|
-
|
|
87
|
-
table,
|
|
88
|
-
tbody {
|
|
89
|
-
all: unset !important;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
table {
|
|
93
|
-
tbody {
|
|
94
|
-
|
|
95
|
-
td,
|
|
96
|
-
tr {
|
|
97
|
-
border: none !important;
|
|
98
|
-
background-color: transparent !important;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
99
|
&-end {
|
|
106
100
|
margin: 40px 0px;
|
|
107
101
|
font-size: 1.2rem;
|
data/_sass/layouts/_resume.scss
CHANGED
|
@@ -169,7 +169,8 @@
|
|
|
169
169
|
}
|
|
170
170
|
}
|
|
171
171
|
|
|
172
|
-
.time
|
|
172
|
+
.time,
|
|
173
|
+
.hours {
|
|
173
174
|
font-size: 9.5pt;
|
|
174
175
|
color: var(--resume-text-muted-color);
|
|
175
176
|
}
|
|
@@ -252,6 +253,26 @@
|
|
|
252
253
|
|
|
253
254
|
}
|
|
254
255
|
|
|
256
|
+
.certificate {
|
|
257
|
+
margin-bottom: 12px;
|
|
258
|
+
|
|
259
|
+
.company {
|
|
260
|
+
margin-left: 12px;
|
|
261
|
+
|
|
262
|
+
.caption {
|
|
263
|
+
font-weight: bold;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
.period {
|
|
268
|
+
margin-left: 12px;
|
|
269
|
+
|
|
270
|
+
.caption {
|
|
271
|
+
font-weight: bold;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
255
276
|
.publications {
|
|
256
277
|
.section-item {
|
|
257
278
|
.row {
|
|
@@ -297,6 +318,16 @@
|
|
|
297
318
|
margin-top: 12px;
|
|
298
319
|
}
|
|
299
320
|
}
|
|
321
|
+
|
|
322
|
+
.markdown {
|
|
323
|
+
margin-bottom: 12px;
|
|
324
|
+
|
|
325
|
+
.section-content {
|
|
326
|
+
ul {
|
|
327
|
+
padding: 0 !important;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
300
331
|
}
|
|
301
332
|
|
|
302
333
|
a {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
layout: none
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
{%- assign date_format =
|
|
5
|
+
{%- assign date_format = site.datelang.format -%}
|
|
6
6
|
|
|
7
7
|
[
|
|
8
8
|
{% for post in site.posts %}
|
|
@@ -10,7 +10,7 @@ layout: none
|
|
|
10
10
|
"title" : "{{ post.title | escape }}",
|
|
11
11
|
"tags" : "{{ post.tags | join: ', ' }}",
|
|
12
12
|
"url" : "{{ site.baseurl }}{{ post.url }}",
|
|
13
|
-
"date" : "{
|
|
13
|
+
"date" : "{% datelang post.date format:date_format %}"
|
|
14
14
|
} {% unless forloop.last %},{% endunless %}
|
|
15
15
|
{% endfor %}
|
|
16
16
|
]
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
{
|
|
2
|
+
"en_US": {
|
|
3
|
+
"months_full": [
|
|
4
|
+
"",
|
|
5
|
+
"January",
|
|
6
|
+
"February",
|
|
7
|
+
"March",
|
|
8
|
+
"April",
|
|
9
|
+
"May",
|
|
10
|
+
"June",
|
|
11
|
+
"July",
|
|
12
|
+
"August",
|
|
13
|
+
"September",
|
|
14
|
+
"October",
|
|
15
|
+
"November",
|
|
16
|
+
"December"
|
|
17
|
+
],
|
|
18
|
+
"months_short": [
|
|
19
|
+
"",
|
|
20
|
+
"Jan",
|
|
21
|
+
"Feb",
|
|
22
|
+
"Mar",
|
|
23
|
+
"Apr",
|
|
24
|
+
"May",
|
|
25
|
+
"Jun",
|
|
26
|
+
"Jul",
|
|
27
|
+
"Aug",
|
|
28
|
+
"Sep",
|
|
29
|
+
"Oct",
|
|
30
|
+
"Nov",
|
|
31
|
+
"Dec"
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
"pt_PT": {
|
|
35
|
+
"months_full": [
|
|
36
|
+
"",
|
|
37
|
+
"Janeiro",
|
|
38
|
+
"Fevereiro",
|
|
39
|
+
"Março",
|
|
40
|
+
"Abril",
|
|
41
|
+
"Maio",
|
|
42
|
+
"Junho",
|
|
43
|
+
"Julho",
|
|
44
|
+
"Agosto",
|
|
45
|
+
"Setembro",
|
|
46
|
+
"Outubro",
|
|
47
|
+
"Novembro",
|
|
48
|
+
"Dezembro"
|
|
49
|
+
],
|
|
50
|
+
"months_short": [
|
|
51
|
+
"",
|
|
52
|
+
"Jan",
|
|
53
|
+
"Fev",
|
|
54
|
+
"Mar",
|
|
55
|
+
"Abr",
|
|
56
|
+
"Mai",
|
|
57
|
+
"Jun",
|
|
58
|
+
"Jul",
|
|
59
|
+
"Ago",
|
|
60
|
+
"Set",
|
|
61
|
+
"Out",
|
|
62
|
+
"Nov",
|
|
63
|
+
"Dez"
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
"es_ES": {
|
|
67
|
+
"months_full": [
|
|
68
|
+
"",
|
|
69
|
+
"Enero",
|
|
70
|
+
"Febrero",
|
|
71
|
+
"Marzo",
|
|
72
|
+
"Abril",
|
|
73
|
+
"Mayo",
|
|
74
|
+
"Junio",
|
|
75
|
+
"Julio",
|
|
76
|
+
"Augusto",
|
|
77
|
+
"Setiembre",
|
|
78
|
+
"Octubre",
|
|
79
|
+
"Noviembre",
|
|
80
|
+
"Diciembre"
|
|
81
|
+
],
|
|
82
|
+
"months_short": [
|
|
83
|
+
"",
|
|
84
|
+
"Ene",
|
|
85
|
+
"Feb",
|
|
86
|
+
"Mar",
|
|
87
|
+
"Abr",
|
|
88
|
+
"May",
|
|
89
|
+
"Jun",
|
|
90
|
+
"Jul",
|
|
91
|
+
"Aug",
|
|
92
|
+
"Set",
|
|
93
|
+
"Oct",
|
|
94
|
+
"Nov",
|
|
95
|
+
"Dic"
|
|
96
|
+
]
|
|
97
|
+
},
|
|
98
|
+
"fr_FR": {
|
|
99
|
+
"months_full": [
|
|
100
|
+
"",
|
|
101
|
+
"Janvier",
|
|
102
|
+
"Février",
|
|
103
|
+
"Mars",
|
|
104
|
+
"Avril",
|
|
105
|
+
"Mai",
|
|
106
|
+
"Juin",
|
|
107
|
+
"Juillet",
|
|
108
|
+
"Août",
|
|
109
|
+
"Septembre",
|
|
110
|
+
"Octobre",
|
|
111
|
+
"Novembre",
|
|
112
|
+
"Décembre"
|
|
113
|
+
],
|
|
114
|
+
"months_short": [
|
|
115
|
+
"",
|
|
116
|
+
"Jan",
|
|
117
|
+
"Fév",
|
|
118
|
+
"Mar",
|
|
119
|
+
"Avr",
|
|
120
|
+
"Mai",
|
|
121
|
+
"Juin",
|
|
122
|
+
"Juil",
|
|
123
|
+
"Aoû",
|
|
124
|
+
"Sep",
|
|
125
|
+
"Oct",
|
|
126
|
+
"Nov",
|
|
127
|
+
"Déc"
|
|
128
|
+
]
|
|
129
|
+
},
|
|
130
|
+
"it_IT": {
|
|
131
|
+
"months_full": [
|
|
132
|
+
"",
|
|
133
|
+
"Gennaio",
|
|
134
|
+
"Febbraio",
|
|
135
|
+
"Marzo",
|
|
136
|
+
"Aprile",
|
|
137
|
+
"Maggio",
|
|
138
|
+
"Giugno",
|
|
139
|
+
"Luglio",
|
|
140
|
+
"Agosto",
|
|
141
|
+
"Settembre",
|
|
142
|
+
"Ottobre",
|
|
143
|
+
"Novembre",
|
|
144
|
+
"Dicembre"
|
|
145
|
+
],
|
|
146
|
+
"months_short": [
|
|
147
|
+
"",
|
|
148
|
+
"Gen",
|
|
149
|
+
"Feb",
|
|
150
|
+
"Mar",
|
|
151
|
+
"Apr",
|
|
152
|
+
"Mag",
|
|
153
|
+
"Giu",
|
|
154
|
+
"LuG",
|
|
155
|
+
"Ago",
|
|
156
|
+
"Set",
|
|
157
|
+
"Ott",
|
|
158
|
+
"Nov",
|
|
159
|
+
"Dic"
|
|
160
|
+
]
|
|
161
|
+
},
|
|
162
|
+
"de_DE": {
|
|
163
|
+
"months_full": [
|
|
164
|
+
"",
|
|
165
|
+
"Januar",
|
|
166
|
+
"Februar",
|
|
167
|
+
"März",
|
|
168
|
+
"April",
|
|
169
|
+
"Mai",
|
|
170
|
+
"Juni",
|
|
171
|
+
"Juli",
|
|
172
|
+
"August",
|
|
173
|
+
"September",
|
|
174
|
+
"Oktober",
|
|
175
|
+
"November",
|
|
176
|
+
"Dezember"
|
|
177
|
+
],
|
|
178
|
+
"months_short": [
|
|
179
|
+
"",
|
|
180
|
+
"Jan",
|
|
181
|
+
"Feb",
|
|
182
|
+
"Mär",
|
|
183
|
+
"Apr",
|
|
184
|
+
"Mai",
|
|
185
|
+
"Jun",
|
|
186
|
+
"Jul",
|
|
187
|
+
"Aug",
|
|
188
|
+
"Sep",
|
|
189
|
+
"Okt",
|
|
190
|
+
"Nov",
|
|
191
|
+
"Dez"
|
|
192
|
+
]
|
|
193
|
+
},
|
|
194
|
+
"ru_RU": {
|
|
195
|
+
"months_full": [
|
|
196
|
+
"",
|
|
197
|
+
"январь",
|
|
198
|
+
"февраль",
|
|
199
|
+
"март",
|
|
200
|
+
"апрель",
|
|
201
|
+
"май",
|
|
202
|
+
"июнь",
|
|
203
|
+
"июль",
|
|
204
|
+
"август",
|
|
205
|
+
"сентябрь",
|
|
206
|
+
"октябрь",
|
|
207
|
+
"ноябрь",
|
|
208
|
+
"декабрь"
|
|
209
|
+
],
|
|
210
|
+
"months_short": [
|
|
211
|
+
"",
|
|
212
|
+
"янв.",
|
|
213
|
+
"февр.",
|
|
214
|
+
"март",
|
|
215
|
+
"апр.",
|
|
216
|
+
"май",
|
|
217
|
+
"июн.",
|
|
218
|
+
"июл.",
|
|
219
|
+
"авг.",
|
|
220
|
+
"сент.",
|
|
221
|
+
"окт.",
|
|
222
|
+
"нояб.",
|
|
223
|
+
"дек."
|
|
224
|
+
]
|
|
225
|
+
},
|
|
226
|
+
"jp_JP": {
|
|
227
|
+
"months_full": [
|
|
228
|
+
"",
|
|
229
|
+
"一月",
|
|
230
|
+
"二月",
|
|
231
|
+
"三月",
|
|
232
|
+
"四月",
|
|
233
|
+
"五月",
|
|
234
|
+
"六月",
|
|
235
|
+
"七月",
|
|
236
|
+
"八月",
|
|
237
|
+
"九月",
|
|
238
|
+
"十月",
|
|
239
|
+
"十一月",
|
|
240
|
+
"十二月"
|
|
241
|
+
],
|
|
242
|
+
"months_short": [
|
|
243
|
+
"",
|
|
244
|
+
"1月",
|
|
245
|
+
"2月",
|
|
246
|
+
"3月",
|
|
247
|
+
"4月",
|
|
248
|
+
"5月",
|
|
249
|
+
"6月",
|
|
250
|
+
"7月",
|
|
251
|
+
"8月",
|
|
252
|
+
"9月",
|
|
253
|
+
"10月",
|
|
254
|
+
"11月",
|
|
255
|
+
"12月"
|
|
256
|
+
]
|
|
257
|
+
},
|
|
258
|
+
"ch_CH": {
|
|
259
|
+
"months_full": [
|
|
260
|
+
"",
|
|
261
|
+
"一月",
|
|
262
|
+
"二月",
|
|
263
|
+
"三月",
|
|
264
|
+
"四月",
|
|
265
|
+
"五月",
|
|
266
|
+
"六月",
|
|
267
|
+
"七月",
|
|
268
|
+
"八月",
|
|
269
|
+
"九月",
|
|
270
|
+
"十月",
|
|
271
|
+
"十一月",
|
|
272
|
+
"十二月"
|
|
273
|
+
],
|
|
274
|
+
"months_short": [
|
|
275
|
+
"",
|
|
276
|
+
"一月",
|
|
277
|
+
"二月",
|
|
278
|
+
"三月",
|
|
279
|
+
"四月",
|
|
280
|
+
"五月",
|
|
281
|
+
"六月",
|
|
282
|
+
"七月",
|
|
283
|
+
"八月",
|
|
284
|
+
"九月",
|
|
285
|
+
"十月",
|
|
286
|
+
"十一月",
|
|
287
|
+
"十二月"
|
|
288
|
+
]
|
|
289
|
+
}
|
|
290
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require "json"
|
|
3
|
+
require "date"
|
|
4
|
+
require "jekyll"
|
|
5
|
+
|
|
6
|
+
module Rawfeed
|
|
7
|
+
module Datelang
|
|
8
|
+
class Main < Liquid::Tag
|
|
9
|
+
def initialize(tag_name, text, tokens)
|
|
10
|
+
super
|
|
11
|
+
@markup = text.strip
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def render(context)
|
|
15
|
+
site = context.registers[:site]
|
|
16
|
+
page = context.registers[:page] || {}
|
|
17
|
+
config = site.config
|
|
18
|
+
|
|
19
|
+
locale = config.dig("datelang", "lang") || "en_US"
|
|
20
|
+
|
|
21
|
+
json_path = File.join(site.source, "assets", "json", "datelang.json")
|
|
22
|
+
json_path = File.expand_path("../../assets/json/datelang.json", __dir__) unless File.exist?(json_path)
|
|
23
|
+
|
|
24
|
+
return "[datelang error: datelang.json not found]" unless File.exist?(json_path)
|
|
25
|
+
|
|
26
|
+
translations = JSON.parse(File.read(json_path))
|
|
27
|
+
data = translations[locale] || translations["en_US"]
|
|
28
|
+
|
|
29
|
+
args = parse_args(@markup, context)
|
|
30
|
+
date_input = args[:date] || page["date"] || page[:date]
|
|
31
|
+
format = args[:format] || "%b %-d, %Y"
|
|
32
|
+
|
|
33
|
+
return "[datelang: no date]" unless date_input && date_input.to_s.strip != ""
|
|
34
|
+
|
|
35
|
+
date = parse_date(date_input)
|
|
36
|
+
return "[datelang: invalid date '#{date_input}']" unless date
|
|
37
|
+
|
|
38
|
+
formatted = date.strftime(format)
|
|
39
|
+
|
|
40
|
+
# Automatically detects month type based on format
|
|
41
|
+
if format.include?("%B")
|
|
42
|
+
replace_months(formatted, data, :full)
|
|
43
|
+
else
|
|
44
|
+
replace_months(formatted, data, :short)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
def parse_args(text, context)
|
|
51
|
+
args = {}
|
|
52
|
+
|
|
53
|
+
tokens = text.scan(/"[^"]*"|\S+/).map { |t| t.strip }
|
|
54
|
+
|
|
55
|
+
tokens.each do |tok|
|
|
56
|
+
if tok.include?(':')
|
|
57
|
+
key, raw_val = tok.split(':', 2)
|
|
58
|
+
if raw_val.start_with?('"') && raw_val.end_with?('"')
|
|
59
|
+
val = raw_val[1..-2]
|
|
60
|
+
else
|
|
61
|
+
val = Liquid::Template.parse("{{ #{raw_val} }}").render(context).strip
|
|
62
|
+
end
|
|
63
|
+
args[key.to_sym] = val
|
|
64
|
+
else
|
|
65
|
+
rendered = Liquid::Template.parse("{{ #{tok} }}").render(context).strip
|
|
66
|
+
args[:date] = rendered unless rendered.empty?
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
args
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def parse_date(input)
|
|
74
|
+
case input
|
|
75
|
+
when Date then input
|
|
76
|
+
when Time then input.to_date
|
|
77
|
+
else
|
|
78
|
+
begin
|
|
79
|
+
Date.parse(input.to_s)
|
|
80
|
+
rescue ArgumentError
|
|
81
|
+
nil
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def replace_months(str, data, type)
|
|
87
|
+
months_key = (type == :full ? "months_full" : "months_short")
|
|
88
|
+
months = data[months_key] || []
|
|
89
|
+
|
|
90
|
+
months.each_with_index do |m, i|
|
|
91
|
+
next if i.zero?
|
|
92
|
+
str = str.gsub(Date::MONTHNAMES[i], m)
|
|
93
|
+
str = str.gsub(Date::ABBR_MONTHNAMES[i], m)
|
|
94
|
+
end
|
|
95
|
+
str
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
Liquid::Template.register_tag("datelang", Rawfeed::Datelang::Main)
|
data/lib/rawfeed/draft.rb
CHANGED
|
@@ -16,7 +16,7 @@ module Rawfeed
|
|
|
16
16
|
file.puts("title: \"#{array[0]}\"")
|
|
17
17
|
file.puts("description: \"Description of your post\"")
|
|
18
18
|
file.puts("author: \"Your Name\"")
|
|
19
|
-
file.puts("date: #{array[2]}")
|
|
19
|
+
file.puts("date: #{array[2]} -0300")
|
|
20
20
|
file.puts("update_date: ")
|
|
21
21
|
file.puts("comments: false")
|
|
22
22
|
file.puts("tags: [tag1, tag2]")
|
data/lib/rawfeed/page.rb
CHANGED
|
@@ -17,8 +17,9 @@ module Rawfeed
|
|
|
17
17
|
file.puts("order: #number")
|
|
18
18
|
file.puts("title: \"#{array[0]}\"")
|
|
19
19
|
file.puts("author: \"Your Name\"")
|
|
20
|
-
file.puts("date: #{array[2]}")
|
|
20
|
+
file.puts("date: #{array[2]} -0300")
|
|
21
21
|
file.puts("update_date: ")
|
|
22
|
+
file.puts("reading_time: true")
|
|
22
23
|
file.puts("published: false")
|
|
23
24
|
file.puts("permalink: /#{permalink}/")
|
|
24
25
|
file.puts("---")
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require "jekyll"
|
|
2
|
+
|
|
3
|
+
module Rawfeed
|
|
4
|
+
module ReadingTimeFilter
|
|
5
|
+
def reading_time(input)
|
|
6
|
+
site_config = Jekyll.sites.first.config rescue {}
|
|
7
|
+
words_per_minute = site_config&.dig("reading_time", "words_per_minute") || 180
|
|
8
|
+
message = site_config&.dig("reading_time", "message") || ["Read this post in", "Read this post in less than"]
|
|
9
|
+
minutes_text = site_config&.dig("reading_time", "minutes_label") || ["minute", "minutes"]
|
|
10
|
+
words = input.split.size;
|
|
11
|
+
minutes = ( words / words_per_minute ).floor
|
|
12
|
+
minutes_label = minutes == 1 ? "#{minutes_text[0]}" : "#{minutes_text[1]}"
|
|
13
|
+
minutes > 0 ? "#{message[0]} #{minutes} #{minutes_label}" : "#{message[1]} 1 #{minutes_text[0]}"
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
Liquid::Template.register_filter(Rawfeed::ReadingTimeFilter)
|
data/lib/rawfeed/version.rb
CHANGED
data/lib/rawfeed.rb
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# author: William C. Canin
|
|
3
|
+
|
|
1
4
|
require_relative "rawfeed/version"
|
|
2
5
|
require_relative "rawfeed/draft"
|
|
3
6
|
require_relative "rawfeed/post"
|
|
4
7
|
require_relative "rawfeed/page"
|
|
5
8
|
require_relative "rawfeed/resume"
|
|
6
9
|
require_relative "rawfeed/layout"
|
|
10
|
+
require "rawfeed/datelang"
|
|
11
|
+
require "rawfeed/reading_time"
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rawfeed
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- William C. Canin
|
|
@@ -209,6 +209,7 @@ files:
|
|
|
209
209
|
- assets/js/terminal.js
|
|
210
210
|
- assets/js/toc.js
|
|
211
211
|
- assets/json/blog_search.json
|
|
212
|
+
- assets/json/datelang.json
|
|
212
213
|
- assets/vendor/bootstrap/css/bootstrap-grid.css
|
|
213
214
|
- assets/vendor/bootstrap/css/bootstrap-grid.css.map
|
|
214
215
|
- assets/vendor/bootstrap/css/bootstrap-grid.min.css
|
|
@@ -256,11 +257,13 @@ files:
|
|
|
256
257
|
- assets/vendor/simple-jekyll-search.js
|
|
257
258
|
- assets/vendor/simple-jekyll-search.min.js
|
|
258
259
|
- lib/rawfeed.rb
|
|
260
|
+
- lib/rawfeed/datelang.rb
|
|
259
261
|
- lib/rawfeed/draft.rb
|
|
260
262
|
- lib/rawfeed/installer.rb
|
|
261
263
|
- lib/rawfeed/layout.rb
|
|
262
264
|
- lib/rawfeed/page.rb
|
|
263
265
|
- lib/rawfeed/post.rb
|
|
266
|
+
- lib/rawfeed/reading_time.rb
|
|
264
267
|
- lib/rawfeed/resume.rb
|
|
265
268
|
- lib/rawfeed/utils.rb
|
|
266
269
|
- lib/rawfeed/version.rb
|