rawfeed 0.1.2 → 0.1.4
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 +20 -1
- data/_includes/layout/blog_search.html +4 -4
- data/_includes/layout/capture_scripts.liquid +6 -0
- data/_includes/layout/disqus.html +1 -1
- data/_includes/layout/footer.html +10 -8
- data/_includes/layout/giscus.html +1 -1
- data/_includes/layout/head.html +40 -1
- data/_includes/layout/header.html +15 -15
- data/_includes/layout/maintenance.html +3 -3
- data/_includes/layout/paginator.html +4 -4
- data/_includes/toc +44 -1
- data/_layouts/blog.html +1 -1
- data/_layouts/contact.html +24 -24
- data/_layouts/default.html +10 -8
- data/_layouts/error.html +4 -4
- data/_layouts/home.html +1 -1
- data/_layouts/page.html +1 -3
- data/_layouts/pixels.html +1 -0
- data/_layouts/post.html +3 -5
- data/_layouts/resume.html +2 -2
- data/_layouts/tag_posts.html +1 -1
- data/_sass/components/_markdown.scss +12 -12
- data/_sass/includes/_footer.scss +13 -6
- data/_sass/includes/_header.scss +1 -0
- data/_sass/layouts/_resume.scss +1 -4
- data/_sass/theme/_dark.scss +7 -4
- data/_sass/theme/_light.scss +1 -1
- data/assets/js/avatar.js +9 -0
- data/lib/rawfeed/csp_filters.rb +16 -0
- data/lib/rawfeed/datelang.rb +12 -12
- data/lib/rawfeed/page.rb +2 -0
- data/lib/rawfeed/version.rb +1 -1
- data/lib/rawfeed.rb +1 -0
- metadata +4 -2
- data/assets/js/toc.js +0 -22
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: be86e28f3f858c931e6cb9874b17eb04d07c99314d6c8bc00a914037962b2bcd
         | 
| 4 | 
            +
              data.tar.gz: 7aaa22c4f212a10039e4a8a5494f0c97c1771f0885ded4a6da3483d0eedd96a2
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: dc9c0beeb4ac4c2f6c9082c366f29e59ef0a440bda5cebc9084e9b8b373b998d3fa652004e51b2b78f3c560c2851d3497aea10e4ba46f387c86fb56c880b47e4
         | 
| 7 | 
            +
              data.tar.gz: 1bd79e2a2b544541e0e324499cb1845f00dfc64182c9a07001b2cdc7cd5f2a29831432697ca3b4f807bfae331233e52f66d01871f5443c8c47d55e3a16643d49
         | 
    
        data/README.md
    CHANGED
    
    | @@ -3,7 +3,7 @@ | |
| 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>
         | 
| 6 | 
            +
              <a href="https://badge.fury.io/rb/rawfeed"><img src="https://badge.fury.io/rb/rawfeed.svg?icon=si%3Arubygems" alt="Gem Version" height="18"></a>
         | 
| 7 7 | 
             
              <br>
         | 
| 8 8 | 
             
              <a href="https://williamcanin.github.io/rawfeed" target="_blank">Theme Preview</a>
         | 
| 9 9 | 
             
            </p>
         | 
| @@ -41,6 +41,7 @@ | |
| 41 41 | 
             
            - [x] Maintenance page;
         | 
| 42 42 | 
             
            - [x] Comments on blog posts with Giscus or Disqus (only in production [jekyll build]);
         | 
| 43 43 | 
             
            - [x] Google Analytics (only in production [jekyll build]);
         | 
| 44 | 
            +
            - and more [here](#vendors)
         | 
| 44 45 |  | 
| 45 46 | 
             
            # Installation
         | 
| 46 47 |  | 
| @@ -133,6 +134,24 @@ npm run publish | |
| 133 134 |  | 
| 134 135 | 
             
            For more tasks, see: `bundle exec rake --tasks`
         | 
| 135 136 |  | 
| 137 | 
            +
            # Vendors
         | 
| 138 | 
            +
             | 
| 139 | 
            +
            [ Technologies and Services Used ]
         | 
| 140 | 
            +
             | 
| 141 | 
            +
            This [Jekyll](https://jekyllrb.com) theme was developed using the following services and
         | 
| 142 | 
            +
            technologies, to whom we would like to thank for their work and availability:
         | 
| 143 | 
            +
             | 
| 144 | 
            +
            | Vendor | Link | Use in Theme |
         | 
| 145 | 
            +
            | -------- | ------- | ------- |
         | 
| 146 | 
            +
            | **Bootstrap 5** | [https://getbootstrap.com](https://getbootstrap.com/) | Framework for responsive design and base components |
         | 
| 147 | 
            +
            | **Font Awesome** | [https://fontawesome.com](https://fontawesome.com/) | Providing vector icons |
         | 
| 148 | 
            +
            | **Google Fonts** | [https://fonts.google.com](https://fonts.google.com/) | Styling and appearance of texts (custom fonts) |
         | 
| 149 | 
            +
            | **Google Apps Script** | [https://developers.google.com/apps-script](https://developers.google.com/apps-script) | Email sending and form processing functionality (Contact page). |
         | 
| 150 | 
            +
            | **Google reCAPTCHA** | [https://www.google.com/recaptcha/about/](https://www.google.com/recaptcha/about/) | Form spam protection (if implemented). |
         | 
| 151 | 
            +
            | **Giscus** | [https://giscus.app](https://giscus.app/) | *GitHub Discussions-based commenting system option* |
         | 
| 152 | 
            +
            | **Disqus** | [https://disqus.com](https://disqus.com/) | *Comment system option* |
         | 
| 153 | 
            +
            | **Gulp** | [https://gulpjs.com](https://gulpjs.com/) | Minification and cleaning |
         | 
| 154 | 
            +
             | 
| 136 155 | 
             
            ## Donation
         | 
| 137 156 |  | 
| 138 157 | 
             
            Click on the image below to be redirected the donation forms:
         | 
| @@ -1,16 +1,16 @@ | |
| 1 1 | 
             
            {%- if site.blog.search.enable -%}
         | 
| 2 | 
            -
            <div class="row blog-search"  | 
| 2 | 
            +
            <div class="row blog-search" inert>
         | 
| 3 3 | 
             
              <div class="col-sm">
         | 
| 4 4 | 
             
                <div class="blog-search__wapper">
         | 
| 5 | 
            -
                  <strong>»</strong><input id="blog-search__input" type="text" class="blog-search__input" placeholder="{{ site. | 
| 5 | 
            +
                  <strong>»</strong><input id="blog-search__input" type="text" class="blog-search__input" placeholder="{{ site.strings.blog.search.placeholder }}" aria-label="{{ site.blog.search.placeholder }}">
         | 
| 6 6 | 
             
                  <button id="blog-search__btn-clean" class="blog-search__btn-clean" type="button">
         | 
| 7 | 
            -
                    {{ site. | 
| 7 | 
            +
                    {{ site.strings.blog.search.button_clean.text }}
         | 
| 8 8 | 
             
                  </button>
         | 
| 9 9 | 
             
                </div>
         | 
| 10 10 | 
             
              </div>
         | 
| 11 11 |  | 
| 12 12 | 
             
              <div id="blog-search__results-wrapper" class="row disabled">
         | 
| 13 | 
            -
                <h2 class="blog-subtitle">[ {{ site. | 
| 13 | 
            +
                <h2 class="blog-subtitle">[ {{ site.strings.blog.search.results | default: "results" }} ]</h2>
         | 
| 14 14 | 
             
                <ul id="blog-search__results" class="row blog-list"></ul>
         | 
| 15 15 | 
             
              </div>
         | 
| 16 16 |  | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            {% if site.blog.post.comments.disqus.shortname != "" %}
         | 
| 2 2 | 
             
            <div class="row comments">
         | 
| 3 | 
            -
              <h1 class="comments-title">[ {{ site. | 
| 3 | 
            +
              <h1 class="comments-title">[ {{ site.strings.post.comments | default: "comments" }} ]</h1>
         | 
| 4 4 | 
             
              <div class="comments-content">
         | 
| 5 5 | 
             
                <div id="disqus_thread"></div>
         | 
| 6 6 | 
             
                <script>
         | 
| @@ -3,7 +3,7 @@ | |
| 3 3 | 
             
            <footer class="container-fluid fixed-bottom footer">
         | 
| 4 4 | 
             
              {%- if site.footer.top_button.enable -%}
         | 
| 5 5 | 
             
              <div class="row top">
         | 
| 6 | 
            -
                <div class="col- | 
| 6 | 
            +
                <div class="col-md d-flex justify-content-end">
         | 
| 7 7 | 
             
                  <!-- old: <a id="top-link" class="top-link" href="#top"><i class="fa-regular fa-square-caret-up"></i></a> -->
         | 
| 8 8 | 
             
                   <a id="top-link" class="top-link" href="#top">^</a>
         | 
| 9 9 | 
             
                </div>
         | 
| @@ -12,19 +12,21 @@ | |
| 12 12 |  | 
| 13 13 | 
             
              <div class="row footer-wrapper">
         | 
| 14 14 |  | 
| 15 | 
            -
                {%- if site. | 
| 16 | 
            -
                <div class="col- | 
| 17 | 
            -
                   | 
| 15 | 
            +
                {%- if site.strings.footer.copyright -%}
         | 
| 16 | 
            +
                <div class="col-md footer-copyright-wrap">
         | 
| 17 | 
            +
                  {%- assign year = site.time | date: "%Y" -%}
         | 
| 18 | 
            +
                  {%- assign since = site.strings.footer.copyright.since -%}
         | 
| 19 | 
            +
                <div class="footer-copyright">© {{ site.title | default: theme_name }} {{ since }}{%- if since -%}-{%- endif -%}{{year}} - {{ site.strings.footer.copyright.message }}</div>
         | 
| 18 20 | 
             
                </div>
         | 
| 19 21 | 
             
                {%- endif -%}
         | 
| 20 22 |  | 
| 21 | 
            -
                {%- if site. | 
| 22 | 
            -
                <div class="col- | 
| 23 | 
            -
                    <div class="footer-message">{{ site. | 
| 23 | 
            +
                {%- if site.strings.footer.message -%}
         | 
| 24 | 
            +
                <div class="col-md footer-message-wrap">
         | 
| 25 | 
            +
                    <div class="footer-message">{{ site.strings.footer.message }}</div>
         | 
| 24 26 | 
             
                </div>
         | 
| 25 27 | 
             
                {%- endif -%}
         | 
| 26 28 |  | 
| 27 | 
            -
                <div class="col- | 
| 29 | 
            +
                <div class="col-md footer-made-by-wrap">
         | 
| 28 30 | 
             
                  <div class="footer-made-by">
         | 
| 29 31 | 
             
                    Using the <a href="{{ project_url }}" target="_blank" rel="noopener noreferrer">{{ theme_name }}</a> theme for <a href="https://jekyllrb.com" target="_blank" rel="noopener noreferrer">Jekyll</a>.
         | 
| 30 32 | 
             
                  </div>
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            {%- if site.blog.post.comments.giscus.repo != "" and site.blog.post.comments.giscus.category_id != "" -%}
         | 
| 2 2 | 
             
            <div class="row comments">
         | 
| 3 | 
            -
              <h1 class="comments-title">[ {{ site. | 
| 3 | 
            +
              <h1 class="comments-title">[ {{ site.strings.post.comments | default: "comments" }} ]</h1>
         | 
| 4 4 | 
             
              <div class="row comments-content">
         | 
| 5 5 | 
             
                <script src="https://giscus.app/client.js"
         | 
| 6 6 | 
             
                  data-repo="{{ site.blog.post.comments.giscus.repo }}"
         | 
    
        data/_includes/layout/head.html
    CHANGED
    
    | @@ -9,6 +9,46 @@ | |
| 9 9 | 
             
                <title>{{ page.title }} | {{ site.title | default: theme_name }}</title>
         | 
| 10 10 | 
             
              {%- endif -%}
         | 
| 11 11 |  | 
| 12 | 
            +
              {% comment %} Security {% endcomment %}
         | 
| 13 | 
            +
              {%- if jekyll.environment == 'production' %}
         | 
| 14 | 
            +
                {% comment %} { %- include layout/capture_scripts.liquid -% } {% endcomment %}
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                <script>
         | 
| 17 | 
            +
                  if (window.top !== window.self) {
         | 
| 18 | 
            +
                    // Prevents the site from being displayed inside an <iframe>
         | 
| 19 | 
            +
                    window.top.location = window.self.location;
         | 
| 20 | 
            +
                  }
         | 
| 21 | 
            +
                </script>
         | 
| 22 | 
            +
                <!-- TODO: Colocar os script inline <script> todos em .js para evistar o uso de 'unsafe-inline' em script-src -->
         | 
| 23 | 
            +
                <meta http-equiv="Content-Security-Policy"
         | 
| 24 | 
            +
                  content="
         | 
| 25 | 
            +
                    default-src 'self';
         | 
| 26 | 
            +
                    img-src 'self' data: {{ site.csp.img-src | join: ' ' }};
         | 
| 27 | 
            +
                    script-src 'self' 'unsafe-inline'
         | 
| 28 | 
            +
                      https://cdn.jsdelivr.net
         | 
| 29 | 
            +
                      https://cdnjs.cloudflare.com
         | 
| 30 | 
            +
                      https://giscus.app
         | 
| 31 | 
            +
                    https://disqus.com;
         | 
| 32 | 
            +
                    style-src 'self' 'unsafe-inline'
         | 
| 33 | 
            +
                    https://cdnjs.cloudflare.com
         | 
| 34 | 
            +
                    https://fonts.googleapis.com
         | 
| 35 | 
            +
                    https://cdn.jsdelivr.net
         | 
| 36 | 
            +
                    https://giscus.app
         | 
| 37 | 
            +
                    https://disqus.com;
         | 
| 38 | 
            +
                    font-src 'self' https://fonts.gstatic.com https://cdnjs.cloudflare.com data:;
         | 
| 39 | 
            +
                    connect-src 'self' {{ site.csp.connect-src | join: ' ' }};
         | 
| 40 | 
            +
                    frame-src {{ site.csp.frame-src | join: ' ' }};
         | 
| 41 | 
            +
                    object-src 'none';
         | 
| 42 | 
            +
                    base-uri 'self';
         | 
| 43 | 
            +
                    form-action 'self';
         | 
| 44 | 
            +
                ">
         | 
| 45 | 
            +
                <!-- ⚠️ CSP,HSTS,COOP and enabled in the theme, remember to also configure it in Cloudflare or your server -->
         | 
| 46 | 
            +
                <meta http-equiv="Strict-Transport-Security" content="max-age=31536000; includeSubDomains; preload">
         | 
| 47 | 
            +
                <meta http-equiv="Cross-Origin-Opener-Policy" content="same-origin">
         | 
| 48 | 
            +
                <meta http-equiv="Cross-Origin-Embedder-Policy" content="require-corp">
         | 
| 49 | 
            +
                <!-- ⚠️ CSP,HSTS,COOP enabled in the theme, remember to also configure it in Cloudflare or your server -->
         | 
| 50 | 
            +
              {%- endif -%}
         | 
| 51 | 
            +
             | 
| 12 52 | 
             
              {% comment %} favicon {% endcomment %}
         | 
| 13 53 | 
             
              <link rel="icon" type="image/png" href="{{ '/assets/images/favicon.png' | relative_url }}">
         | 
| 14 54 | 
             
              <link rel="apple-touch-icon" href="{{ '/assets/images/favicon.png' | relative_url }}">
         | 
| @@ -31,7 +71,6 @@ | |
| 31 71 | 
             
              <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
         | 
| 32 72 | 
             
              <link href="https://fonts.googleapis.com/css2?family=SUSE+Mono:ital,wght@0,100..800;1,100..800&display=swap" rel="stylesheet">
         | 
| 33 73 | 
             
              <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inconsolata:400,700&display=swap">
         | 
| 34 | 
            -
              <link href="https://fonts.googleapis.com/css2?family=Special+Elite&display=swap" rel="stylesheet">
         | 
| 35 74 | 
             
              <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"/>
         | 
| 36 75 |  | 
| 37 76 | 
             
              {% comment %} bootstrap {% endcomment %}
         | 
| @@ -25,9 +25,9 @@ | |
| 25 25 | 
             
                    <div class="container">
         | 
| 26 26 | 
             
                      <div class="row">
         | 
| 27 27 | 
             
                        {%- if index.layout == "blog" -%}
         | 
| 28 | 
            -
                          <span>[ <a class="{% if page.url == "/" or page.url == "/index.html" %}menu-active{% endif %}" href="{{home_url}}">{{ site. | 
| 28 | 
            +
                          <span>[ <a class="{% if page.url == "/" or page.url == "/index.html" %}menu-active{% endif %}" href="{{home_url}}">{{ site.strings.menu.blog.title | default: "blog" | downcase }}</a> ]</span>
         | 
| 29 29 | 
             
                        {%- else -%}
         | 
| 30 | 
            -
                          <span>[  | 
| 30 | 
            +
                          <span>[ {{site.strings.menu.home.emoji}}<a class="{% if page.url == "/" or page.url == "/index.html" %}menu-active{% endif %}" href="{{home_url}}">{{ site.strings.menu.home.title | default: "home" | downcase }}</a> ]</span>
         | 
| 31 31 | 
             
                        {%- endif -%}
         | 
| 32 32 | 
             
                      </div>
         | 
| 33 33 | 
             
                    </div>
         | 
| @@ -56,10 +56,10 @@ | |
| 56 56 | 
             
                        <div class="avatar-flipper light-theme {% if site.avatar.open %}avatar-flipper__open-true{% endif %}{% if site.avatar.flip %} can-flip{% endif %}">
         | 
| 57 57 | 
             
                          <div class="avatar-card">
         | 
| 58 58 | 
             
                            <div class="avatar-front">
         | 
| 59 | 
            -
                              <img id="avatarImgLight" class="avatar-img" src="{{ avatar_path_light | relative_url }}" alt="{{ site.title }}" | 
| 59 | 
            +
                              <img id="avatarImgLight" class="avatar-img" src="{{ avatar_path_light | relative_url }}" alt="{{ site.title }}">
         | 
| 60 60 | 
             
                            </div>
         | 
| 61 61 | 
             
                            <div class="avatar-back">
         | 
| 62 | 
            -
                              <img class="avatar-img" src="{{ avatar_path_back | relative_url }}" alt="{{ site.title }} | 
| 62 | 
            +
                              <img class="avatar-img" src="{{ avatar_path_back | relative_url }}" alt="{{ site.title }}">
         | 
| 63 63 | 
             
                            </div>
         | 
| 64 64 | 
             
                          </div>
         | 
| 65 65 | 
             
                        </div>
         | 
| @@ -67,10 +67,10 @@ | |
| 67 67 | 
             
                        <div class="avatar-flipper dark-theme {% if site.avatar.open %} avatar-flipper__open-true{% endif %}{% if site.avatar.flip %} can-flip{% endif %}">
         | 
| 68 68 | 
             
                          <div class="avatar-card">
         | 
| 69 69 | 
             
                            <div class="avatar-front">
         | 
| 70 | 
            -
                              <img id="avatarImgDark" class="avatar-img" src="{{ avatar_path_dark | relative_url }}" alt="{{ site.title }}" | 
| 70 | 
            +
                              <img id="avatarImgDark" class="avatar-img" src="{{ avatar_path_dark | relative_url }}" alt="{{ site.title }}">
         | 
| 71 71 | 
             
                            </div>
         | 
| 72 72 | 
             
                            <div class="avatar-back">
         | 
| 73 | 
            -
                              <img class="avatar-img" src="{{ avatar_path_back | relative_url }}" alt="{{ site.title }} | 
| 73 | 
            +
                              <img class="avatar-img" src="{{ avatar_path_back | relative_url }}" alt="{{ site.title }}">
         | 
| 74 74 | 
             
                            </div>
         | 
| 75 75 | 
             
                          </div>
         | 
| 76 76 | 
             
                        </div>
         | 
| @@ -86,7 +86,7 @@ | |
| 86 86 | 
             
                  <div class="col-sm d-flex justify-content-center column-bottom">
         | 
| 87 87 | 
             
                  {%- if index.layout == "blog" -%}
         | 
| 88 88 | 
             
                    <span class="blog-menu">menu »
         | 
| 89 | 
            -
                       {%- if site.blog.search.enable -%}<a id="blog-search__btn" class="blog-menu__link" href="{{search_url}}">{{ site. | 
| 89 | 
            +
                       {{site.strings.menu.search.emoji}}{%- if site.blog.search.enable -%}<a id="blog-search__btn" class="blog-menu__link" href="{{search_url}}">{{ site.strings.menu.search.title | default: "search" }}</a><strong> . </strong>{%- endif -%}<a class="blog-menu__link{% if page.url == "/blog/tags/" or page.url == "/blog/tags/index.html" %} menu-active{% endif %}" href="{{tags_url}}">{{ site.strings.menu.tags.title | default: "tags" }}</a><strong> . </strong>
         | 
| 90 90 | 
             
                    </span>
         | 
| 91 91 | 
             
                    {% assign sorted_pages = site.pages | sort: 'order' %}
         | 
| 92 92 | 
             
                      {%- for item in sorted_pages -%}
         | 
| @@ -96,11 +96,11 @@ | |
| 96 96 | 
             
                          {%- endunless -%}
         | 
| 97 97 | 
             
                        {%- endif -%}
         | 
| 98 98 | 
             
                      {%- endfor -%}
         | 
| 99 | 
            -
                      <a class="blog-menu__link" href="{{feed_url}}">{{ site. | 
| 99 | 
            +
                      <a class="blog-menu__link" href="{{feed_url}}">{{ site.strings.menu.feed | default: "feed" }}</a><strong> . </strong>
         | 
| 100 100 | 
             
                  {%- else index.layout == "home" -%}
         | 
| 101 101 | 
             
                    {%- if page.url contains "/blog/" -%}
         | 
| 102 | 
            -
                      <span class="blog-menu">{{ site. | 
| 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_url}}"> | 
| 102 | 
            +
                      <span class="blog-menu">{{ site.strings.menu.blog.title }} »
         | 
| 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_url}}">{{site.strings.menu.blog.emoji}}{{site.strings.menu.blog.subtitle}}</a><strong> . </strong>{%- if site.blog.search.enable -%}{{site.strings.menu.search.emoji}}<a id="blog-search__btn" class="blog-menu__link" href="{{search_url}}">{{ site.strings.menu.search.text | default: "search" }}</a><strong> . </strong>{%- endif -%}{{site.strings.menu.tags.emoji}}<a class="blog-menu__link{% if page.url == "/blog/tags/" or page.url == "/blog/tags/index.html" %} menu-active{% endif %}" href="{{tags_url}}">{{ site.strings.menu.tags.text | default: "tags" }}</a><strong> . </strong>{{site.strings.menu.feed.emoji}}<a class="blog-menu__link" href="{{feed_url}}">{{ site.strings.menu.feed.title | default: "feed" }}</a><strong> . </strong>
         | 
| 104 104 | 
             
                      </span>
         | 
| 105 105 | 
             
                    {%- else -%}
         | 
| 106 106 | 
             
                      {%- assign published_pages = site.pages | where_exp:"p","p.path contains '_pages/' and p.published" -%}
         | 
| @@ -109,22 +109,22 @@ | |
| 109 109 | 
             
                      {%- endif -%}
         | 
| 110 110 | 
             
                      {%- if site.pagination.enabled == true -%}
         | 
| 111 111 | 
             
                        {%- if blog_page -%}
         | 
| 112 | 
            -
                          <a href="{{blog_url}}">{{ site. | 
| 112 | 
            +
                          {{ site.strings.menu.blog.emoji }}<a href="{{blog_url}}">{{ site.strings.menu.blog.title }}</a><strong> . </strong>
         | 
| 113 113 | 
             
                        {%- endif -%}
         | 
| 114 114 | 
             
                        {% assign sorted_pages = site.pages | sort: 'order' %}
         | 
| 115 115 | 
             
                        {%- for item in sorted_pages -%}
         | 
| 116 | 
            -
                          {%- if item.path contains '_pages/' -%}
         | 
| 116 | 
            +
                          {%- if item.path contains '_pages/' and item.in_menu -%}
         | 
| 117 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> . </strong>
         | 
| 118 | 
            +
                              {{ item.emoji }}<a class="{% if page.url == item.url %}menu-active{% endif %}" href="{{ item.url | relative_url }}">{{ item.title | downcase }}</a><strong> . </strong>
         | 
| 119 119 | 
             
                            {%- endunless -%}
         | 
| 120 120 | 
             
                          {%- endif -%}
         | 
| 121 121 | 
             
                        {%- endfor -%}
         | 
| 122 122 | 
             
                      {%- else -%}
         | 
| 123 123 | 
             
                        {% assign sorted_pages = site.pages | sort: 'order' %}
         | 
| 124 124 | 
             
                        {%- for item in sorted_pages -%}
         | 
| 125 | 
            -
                          {%- if item.path contains '_pages/' and item.published != false -%}
         | 
| 125 | 
            +
                          {%- if item.path contains '_pages/' and item.published != false and item.in_menu -%}
         | 
| 126 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> . </strong>
         | 
| 127 | 
            +
                              {{ item.emoji }}<a class="{% if page.url == item.url %}menu-active{% endif %}" href="{{ item.url | relative_url }}">{{ item.title | downcase }}</a><strong> . </strong>
         | 
| 128 128 | 
             
                            {%- endunless -%}
         | 
| 129 129 | 
             
                          {%- endif -%}
         | 
| 130 130 | 
             
                        {%- endfor -%}
         | 
| @@ -1,8 +1,8 @@ | |
| 1 1 | 
             
            {% include layout/data.liquid %}
         | 
| 2 2 |  | 
| 3 3 | 
             
            <!DOCTYPE html>
         | 
| 4 | 
            -
            <html lang="{{ site.lang | default: 'en | 
| 5 | 
            -
              {%- include head.html -%}
         | 
| 4 | 
            +
            <html lang="{{ site.lang | default: 'en' }}">
         | 
| 5 | 
            +
              {%- include layout/head.html -%}
         | 
| 6 6 | 
             
              <body>
         | 
| 7 7 | 
             
                <div class="mt-4 maintenance">
         | 
| 8 8 | 
             
                  <div class="container">
         | 
| @@ -25,6 +25,6 @@ | |
| 25 25 | 
             
                    </div>
         | 
| 26 26 | 
             
                  </div>
         | 
| 27 27 | 
             
                </div>
         | 
| 28 | 
            -
                {%- include footer.html -%}
         | 
| 28 | 
            +
                {%- include layout/footer.html -%}
         | 
| 29 29 | 
             
              </body>
         | 
| 30 30 | 
             
            </html>
         | 
| @@ -6,7 +6,7 @@ | |
| 6 6 | 
             
                    {%- if paginator.previous_page -%}
         | 
| 7 7 | 
             
                    <li class="page-item">
         | 
| 8 8 | 
             
                      <a class="page-link blog-pagination__newer" href="{{ paginator.previous_page_path | prepend: site.baseurl | prepend: site.url }}">
         | 
| 9 | 
            -
                        ← {{ site. | 
| 9 | 
            +
                        ← {{ site.strings.post.pagination.newer_text }}
         | 
| 10 10 | 
             
                      </a>
         | 
| 11 11 | 
             
                    </li>
         | 
| 12 12 | 
             
                    {%- endif -%}
         | 
| @@ -14,9 +14,9 @@ | |
| 14 14 | 
             
                    {%- if total_page > 1 -%}
         | 
| 15 15 | 
             
                      <li class="page-item">
         | 
| 16 16 | 
             
                        <span class="page-link blog-pagination__counter">
         | 
| 17 | 
            -
                          [ {{ site. | 
| 17 | 
            +
                          [ {{ site.strings.post.pagination.counter[0] }}
         | 
| 18 18 | 
             
                          {{ paginator.page }}
         | 
| 19 | 
            -
                          {{ site. | 
| 19 | 
            +
                          {{ site.strings.post.pagination.counter[1] }}
         | 
| 20 20 | 
             
                          {{ total_page }} ]
         | 
| 21 21 | 
             
                        </span>
         | 
| 22 22 | 
             
                      </li>
         | 
| @@ -25,7 +25,7 @@ | |
| 25 25 | 
             
                    {%- if paginator.next_page -%}
         | 
| 26 26 | 
             
                    <li class="page-item">
         | 
| 27 27 | 
             
                      <a class="page-link blog-pagination__older" href="{{ paginator.next_page_path | prepend: site.baseurl | prepend: site.url }}">
         | 
| 28 | 
            -
                        {{ site. | 
| 28 | 
            +
                        {{ site.strings.post.pagination.older_text }} →
         | 
| 29 29 | 
             
                      </a>
         | 
| 30 30 | 
             
                    </li>
         | 
| 31 31 | 
             
                    {%- endif -%}
         | 
    
        data/_includes/toc
    CHANGED
    
    | @@ -7,12 +7,46 @@ | |
| 7 7 | 
             
              </div>
         | 
| 8 8 | 
             
              <div class="toc-list-wrapper">
         | 
| 9 9 | 
             
                <ul class="toc-list" role="list"></ul>
         | 
| 10 | 
            -
                <p class="toc-empty" style="display:none">No titles found | 
| 10 | 
            +
                <p class="toc-empty" style="display:none">No titles found. Remove TOC!</p>
         | 
| 11 11 | 
             
              </div>
         | 
| 12 12 | 
             
            </nav>
         | 
| 13 13 |  | 
| 14 14 | 
             
            <script>
         | 
| 15 15 | 
             
            (function () {
         | 
| 16 | 
            +
              const minLayoutWidth = 1830;
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              const toc = document.getElementById('toc');
         | 
| 19 | 
            +
              if (toc) {
         | 
| 20 | 
            +
                const sentinel = document.createElement('div');
         | 
| 21 | 
            +
                toc.parentNode.insertBefore(sentinel, toc);
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                function shouldApplyFixed() {
         | 
| 24 | 
            +
                  return window.innerWidth > minLayoutWidth;
         | 
| 25 | 
            +
                }
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                const observer = new IntersectionObserver(
         | 
| 28 | 
            +
                  ([entry]) => {
         | 
| 29 | 
            +
                    if (shouldApplyFixed()) {
         | 
| 30 | 
            +
                      if (!entry.isIntersecting) {
         | 
| 31 | 
            +
                        toc.classList.add('toc-fixed');
         | 
| 32 | 
            +
                      } else {
         | 
| 33 | 
            +
                        toc.classList.remove('toc-fixed');
         | 
| 34 | 
            +
                      }
         | 
| 35 | 
            +
                    } else {
         | 
| 36 | 
            +
                      toc.classList.remove('toc-fixed');
         | 
| 37 | 
            +
                    }
         | 
| 38 | 
            +
                  },
         | 
| 39 | 
            +
                  { threshold: 0 }
         | 
| 40 | 
            +
                );
         | 
| 41 | 
            +
                observer.observe(sentinel);
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                window.addEventListener('resize', () => {
         | 
| 44 | 
            +
                    if (!shouldApplyFixed()) {
         | 
| 45 | 
            +
                        toc.classList.remove('toc-fixed');
         | 
| 46 | 
            +
                    }
         | 
| 47 | 
            +
                });
         | 
| 48 | 
            +
              }
         | 
| 49 | 
            +
             | 
| 16 50 | 
             
              function slugify(text) {
         | 
| 17 51 | 
             
                if (!text) return '';
         | 
| 18 52 | 
             
                return text.toString().toLowerCase().trim()
         | 
| @@ -126,6 +160,15 @@ | |
| 126 160 | 
             
                  const tocTop = toc.offsetTop;
         | 
| 127 161 |  | 
| 128 162 | 
             
                  function handleScrollFix() {
         | 
| 163 | 
            +
                    if (window.innerWidth <= minLayoutWidth) {
         | 
| 164 | 
            +
                      toc.classList.remove('fixed');
         | 
| 165 | 
            +
                      toc.style.position = '';
         | 
| 166 | 
            +
                      toc.style.top = '';
         | 
| 167 | 
            +
                      toc.style.zIndex = '';
         | 
| 168 | 
            +
                      toc.style.width = '';
         | 
| 169 | 
            +
                      return;
         | 
| 170 | 
            +
                    }
         | 
| 171 | 
            +
             | 
| 129 172 | 
             
                    const scrollTop = window.scrollY || document.documentElement.scrollTop;
         | 
| 130 173 |  | 
| 131 174 | 
             
                    // Fixes pinning behavior in Chrome
         | 
    
        data/_layouts/blog.html
    CHANGED
    
    | @@ -17,7 +17,7 @@ layout: default | |
| 17 17 |  | 
| 18 18 | 
             
              <div id="posts" class="row">
         | 
| 19 19 | 
             
                {%- if page.title -%}
         | 
| 20 | 
            -
                  <h2 class="blog-subtitle">[ {{ site. | 
| 20 | 
            +
                  <h2 class="blog-subtitle">[ {{ site.strings.blog.subtitle | default: "posts" }}:  {{ count_posts }} ]</h2>
         | 
| 21 21 | 
             
                {%- endif -%}
         | 
| 22 22 |  | 
| 23 23 | 
             
                {%- if site.posts.size > 0 -%}
         | 
    
        data/_layouts/contact.html
    CHANGED
    
    | @@ -29,41 +29,41 @@ layout: default | |
| 29 29 | 
             
                <span class="contact-title"><strong>[ {{ page.title | downcase }} ]</strong></span>
         | 
| 30 30 | 
             
                <form id="contactForm" class="mt-4 contact-form">
         | 
| 31 31 | 
             
                  <div class="mb-3">
         | 
| 32 | 
            -
                    {% comment %} <label for="inputName" class="form-label">{{ site. | 
| 32 | 
            +
                    {% comment %} <label for="inputName" class="form-label">{{ site.strings.contact.name | default: "Name" | downcase }}</label> {% endcomment %}
         | 
| 33 33 | 
             
                    <input id="inputName"
         | 
| 34 34 | 
             
                    name="name"
         | 
| 35 35 | 
             
                    type="text"
         | 
| 36 | 
            -
                    placeholder="{{ site. | 
| 36 | 
            +
                    placeholder="{{ site.strings.contact.name.placeholder | default: 'First and last name' }}"
         | 
| 37 37 | 
             
                    class="form-control contact-form__name"
         | 
| 38 38 | 
             
                    required>
         | 
| 39 39 | 
             
                  </div>
         | 
| 40 40 | 
             
                  <div class="mb-3">
         | 
| 41 | 
            -
                    {% comment %} <label for="inputEmail" class="form-label">{{ site. | 
| 41 | 
            +
                    {% comment %} <label for="inputEmail" class="form-label">{{ site.strings.contact.name | default: "Email address" | downcase }}</label> {% endcomment %}
         | 
| 42 42 | 
             
                    <input id="inputEmail"
         | 
| 43 43 | 
             
                    name="email"
         | 
| 44 44 | 
             
                    type="email"
         | 
| 45 | 
            -
                    placeholder="{{ site. | 
| 45 | 
            +
                    placeholder="{{ site.strings.contact.email.placeholder | default: 'Your best email address' }}"
         | 
| 46 46 | 
             
                    class="form-control contact-form__email"
         | 
| 47 47 | 
             
                    aria-describedby="emailHelp"
         | 
| 48 48 | 
             
                    required>
         | 
| 49 49 | 
             
                    <div id="emailHelp" class="form-text contact-form__help">
         | 
| 50 | 
            -
                      {{ site. | 
| 50 | 
            +
                      {{ site.strings.contact.email.help | default: "We'll never share your email with anyone else." }}
         | 
| 51 51 | 
             
                    </div>
         | 
| 52 52 | 
             
                  </div>
         | 
| 53 53 | 
             
                  <textarea id="textMessage"
         | 
| 54 54 | 
             
                  name="message"
         | 
| 55 55 | 
             
                  class="form-control contact-form__message"
         | 
| 56 | 
            -
                  placeholder="{{ site. | 
| 56 | 
            +
                  placeholder="{{ site.strings.contact.message.placeholder | default: 'Write your message here' }}"
         | 
| 57 57 | 
             
                  style="min-height: 150px"
         | 
| 58 58 | 
             
                  required></textarea>
         | 
| 59 | 
            -
                  <small style="display: block; font-size: 8pt; opacity: .6">{{ site. | 
| 59 | 
            +
                  <small style="display: block; font-size: 8pt; opacity: .6">{{ site.strings.contact.message.caracters.warning.content }}</small>
         | 
| 60 60 | 
             
                  <!-- TODO: version: 0.2.0 Make reCaptcha change themes instantly -->
         | 
| 61 61 | 
             
                  <div id="g-recaptcha" class="g-recaptcha mt-2" data-sitekey="{{ site.google.recaptcha.pubkey }}" style="display: inline-block; margin: 5px 0;"></div>
         | 
| 62 62 | 
             
                  <div class="d-flex justify-content-end mb-5">
         | 
| 63 63 | 
             
                    <button id="submitButton"
         | 
| 64 64 | 
             
                    type="submit"
         | 
| 65 65 | 
             
                    class="btn contact-form__submit">
         | 
| 66 | 
            -
                    {{ site. | 
| 66 | 
            +
                    {{ site.strings.contact.button.text | default: 'Send!' }}
         | 
| 67 67 | 
             
                    </button>
         | 
| 68 68 | 
             
                  </div>
         | 
| 69 69 | 
             
                </form>
         | 
| @@ -110,8 +110,8 @@ layout: default | |
| 110 110 | 
             
                const recaptchaResponse = grecaptcha.getResponse();
         | 
| 111 111 | 
             
                if (!recaptchaResponse) {
         | 
| 112 112 | 
             
                  showModal(
         | 
| 113 | 
            -
                    "{{ site. | 
| 114 | 
            -
                    "{{ site. | 
| 113 | 
            +
                    "{{ site.strings.contact.recaptcha.warning.title | default: 'Warning' }}",
         | 
| 114 | 
            +
                    "{{ site.strings.contact.recaptcha.warning.content | default: "Please tick the 'I'm not a robot' box." }}",
         | 
| 115 115 | 
             
                    "warning"
         | 
| 116 116 | 
             
                  );
         | 
| 117 117 | 
             
                  return;
         | 
| @@ -119,17 +119,17 @@ layout: default | |
| 119 119 |  | 
| 120 120 | 
             
                const textarea = document.getElementById('textMessage');
         | 
| 121 121 | 
             
                const text = textarea.value.trim();
         | 
| 122 | 
            -
                if (text.length < {{ site. | 
| 122 | 
            +
                if (text.length < {{ site.strings.contact.message.caracters.min }}) {
         | 
| 123 123 | 
             
                  showModal(
         | 
| 124 | 
            -
                    "{{ site. | 
| 125 | 
            -
                    "{{ site. | 
| 124 | 
            +
                    "{{ site.strings.contact.message.caracters.warning.title | default: 'Warning' }}",
         | 
| 125 | 
            +
                    "{{ site.strings.contact.message.caracters.warning.content | default: "The message must have at least 50 characters." }}",
         | 
| 126 126 | 
             
                    "warning"
         | 
| 127 127 | 
             
                  );
         | 
| 128 128 | 
             
                  return;
         | 
| 129 129 | 
             
                }
         | 
| 130 130 |  | 
| 131 131 | 
             
                submitButton.disabled = true;
         | 
| 132 | 
            -
                submitButton.textContent = "{{ site. | 
| 132 | 
            +
                submitButton.textContent = "{{ site.strings.contact.message.status | default: "Sending...Wait" }}";
         | 
| 133 133 |  | 
| 134 134 | 
             
                const formData = new FormData(form);
         | 
| 135 135 | 
             
                const data = Object.fromEntries(formData.entries());
         | 
| @@ -147,31 +147,31 @@ layout: default | |
| 147 147 | 
             
                    form.reset();
         | 
| 148 148 | 
             
                    grecaptcha.reset();
         | 
| 149 149 | 
             
                    showModal(
         | 
| 150 | 
            -
                      "{{ site. | 
| 151 | 
            -
                      "{{ site. | 
| 150 | 
            +
                      "{{ site.strings.contact.message.success.title | default: 'Message Sent' }}",
         | 
| 151 | 
            +
                      "{{ site.strings.contact.message.success.content | default: 'Your message has been sent successfully!' }}",
         | 
| 152 152 | 
             
                      "success"
         | 
| 153 153 | 
             
                    );
         | 
| 154 154 | 
             
                  } else {
         | 
| 155 155 | 
             
                    showModal(
         | 
| 156 | 
            -
                      "{{ site. | 
| 157 | 
            -
                      "{{ site. | 
| 156 | 
            +
                      "{{ site.strings.contact.message.error.title | default: 'Error' }}",
         | 
| 157 | 
            +
                      "{{ site.strings.contact.message.error.content | default: 'Something went wrong while sending your message.' }}",
         | 
| 158 158 | 
             
                      "error"
         | 
| 159 159 | 
             
                    );
         | 
| 160 | 
            -
                    throw new Error(result.message || "{{ site. | 
| 160 | 
            +
                    throw new Error(result.message || "{{ site.strings.contact.message.error.content | default: "An unknown error has occurred." }}");
         | 
| 161 161 | 
             
                  }
         | 
| 162 162 |  | 
| 163 163 | 
             
                } catch (error) {
         | 
| 164 164 | 
             
                  console.error("Error sending:", error);
         | 
| 165 165 | 
             
                  if (error.message.includes("reCAPTCHA")) {
         | 
| 166 166 | 
             
                      showModal(
         | 
| 167 | 
            -
                        "{{ site. | 
| 168 | 
            -
                        "{{ site. | 
| 167 | 
            +
                        "{{ site.strings.contact.message.error.title | default: 'Error' }}",
         | 
| 168 | 
            +
                        "{{ site.strings.contact.recaptcha.fail | default: "Verification failed. Please reload the page and try again." }}",
         | 
| 169 169 | 
             
                        "error"
         | 
| 170 170 | 
             
                      );
         | 
| 171 171 | 
             
                  } else {
         | 
| 172 172 | 
             
                      showModal(
         | 
| 173 | 
            -
                        "{{ site. | 
| 174 | 
            -
                        "{{ site. | 
| 173 | 
            +
                        "{{ site.strings.contact.message.error.title | default: 'Error' }}",
         | 
| 174 | 
            +
                        "{{ site.strings.contact.recaptcha.error | default: "An error occurred while sending the message. Please try again." }}",
         | 
| 175 175 | 
             
                        "error"
         | 
| 176 176 | 
             
                      );
         | 
| 177 177 | 
             
                  }
         | 
| @@ -179,7 +179,7 @@ layout: default | |
| 179 179 |  | 
| 180 180 | 
             
                } finally {
         | 
| 181 181 | 
             
                  submitButton.disabled = false;
         | 
| 182 | 
            -
                  submitButton.textContent = "{{ site. | 
| 182 | 
            +
                  submitButton.textContent = "{{ site.strings.contact.button.text | default: "Send!" }}";
         | 
| 183 183 | 
             
                }
         | 
| 184 184 | 
             
              });
         | 
| 185 185 | 
             
            </script>
         | 
    
        data/_layouts/default.html
    CHANGED
    
    | @@ -8,7 +8,7 @@ | |
| 8 8 | 
             
            {%- assign index = site.pages | where: "path", "index.md" | first -%}
         | 
| 9 9 |  | 
| 10 10 | 
             
            <!DOCTYPE html>
         | 
| 11 | 
            -
            <html id="top" lang="{{ site.lang | default: 'en | 
| 11 | 
            +
            <html id="top" lang="{{ site.lang | default: 'en' }}" data-theme="light">
         | 
| 12 12 | 
             
              {%- include layout/head.html -%}
         | 
| 13 13 | 
             
              <body data-layout="{{ page.layout | default: '' }}" data-terminal-enabled="{{ site.home.terminal.enable | default: false }}">
         | 
| 14 14 | 
             
                {%- if site.home.terminal.enable and page.url == "/" and index.layout == "home" -%}
         | 
| @@ -28,7 +28,7 @@ | |
| 28 28 | 
             
              </body>
         | 
| 29 29 |  | 
| 30 30 | 
             
              <!-- Scripts -->
         | 
| 31 | 
            -
              <script src="{{ '/assets/vendor/bootstrap/js/bootstrap.bundle.js' | relative_url }}"></script>
         | 
| 31 | 
            +
              <script src="{{ '/assets/vendor/bootstrap/js/bootstrap.bundle.min.js' | relative_url }}"></script>
         | 
| 32 32 |  | 
| 33 33 | 
             
              {%- if page.comments != false and site.blog.post.comments.provider == 'giscus' -%}
         | 
| 34 34 | 
             
              <script>
         | 
| @@ -71,6 +71,7 @@ | |
| 71 71 |  | 
| 72 72 | 
             
                      const openSearch = () => {
         | 
| 73 73 | 
             
                        box.classList.add('is-open');
         | 
| 74 | 
            +
                        box.removeAttribute('inert');
         | 
| 74 75 | 
             
                        box.style.maxHeight = box.scrollHeight + 'px';
         | 
| 75 76 | 
             
                        box.style.opacity = '1';
         | 
| 76 77 | 
             
                        box.addEventListener('transitionend', function onOpened(e) {
         | 
| @@ -89,6 +90,7 @@ | |
| 89 90 | 
             
                          box.style.maxHeight = '0';
         | 
| 90 91 | 
             
                          box.style.opacity = '0';
         | 
| 91 92 | 
             
                        });
         | 
| 93 | 
            +
                        box.setAttribute('inert', '');
         | 
| 92 94 | 
             
                        box.classList.remove('is-open');
         | 
| 93 95 | 
             
                      };
         | 
| 94 96 |  | 
| @@ -158,7 +160,7 @@ | |
| 158 160 | 
             
                        searchInput: document.getElementById('blog-search__input'),
         | 
| 159 161 | 
             
                        resultsContainer: document.getElementById('blog-search__results'),
         | 
| 160 162 | 
             
                        searchResultTemplate: '<li><span class="blog-list__meta"><time datetime="{date}">{date}</time></span> »  <a class="blog-list__link" href="{{ site.url }}{url}">{title}</a></li>',
         | 
| 161 | 
            -
                        noResultsText: '<p>{{ site. | 
| 163 | 
            +
                        noResultsText: '<p>{{ site.strings.blog.no_results | default: "No results found" }}</p>',
         | 
| 162 164 | 
             
                        json: "{{ '/assets/json/blog_search.json' | relative_url }}"
         | 
| 163 165 | 
             
                      })
         | 
| 164 166 | 
             
                    });
         | 
| @@ -174,9 +176,9 @@ | |
| 174 176 | 
             
                  const socialsEl = document.getElementById("terminal-screen--socials");
         | 
| 175 177 |  | 
| 176 178 | 
             
                  const commands = {
         | 
| 177 | 
            -
                    help: `{{ site. | 
| 179 | 
            +
                    help: `{{ site.strings.home.terminal.commands }}`,
         | 
| 178 180 | 
             
                    about: document.getElementById("home-content").innerHTML,
         | 
| 179 | 
            -
                    socials: socialsEl ? socialsEl.innerHTML : `{{ site. | 
| 181 | 
            +
                    socials: socialsEl ? socialsEl.innerHTML : `{{ site.strings.home.terminal.no_socials }}`,
         | 
| 180 182 | 
             
                  };
         | 
| 181 183 |  | 
| 182 184 | 
             
                  function createInputLine() {
         | 
| @@ -185,7 +187,7 @@ | |
| 185 187 |  | 
| 186 188 | 
             
                    const prompt = document.createElement('span');
         | 
| 187 189 | 
             
                    prompt.className = 'prompt';
         | 
| 188 | 
            -
                    prompt.textContent = `[{{ site. | 
| 190 | 
            +
                    prompt.textContent = `[{{ site.strings.home.terminal.user }}@{{ site.strings.home.terminal.hostname }}:~]$`;
         | 
| 189 191 |  | 
| 190 192 | 
             
                    // wrapper para conter input, cursor e measure
         | 
| 191 193 | 
             
                    const wrapper = document.createElement('span');
         | 
| @@ -194,7 +196,7 @@ | |
| 194 196 | 
             
                    const input = document.createElement('input');
         | 
| 195 197 | 
             
                    input.type = 'text';
         | 
| 196 198 | 
             
                    input.className = 'input';
         | 
| 197 | 
            -
                    input.placeholder = `{{ site. | 
| 199 | 
            +
                    input.placeholder = `{{ site.strings.home.terminal.welcome }}`;
         | 
| 198 200 | 
             
                    input.spellcheck = false;
         | 
| 199 201 | 
             
                    input.autocomplete = 'off';
         | 
| 200 202 | 
             
                    input.autocorrect = 'off';
         | 
| @@ -298,7 +300,7 @@ | |
| 298 300 | 
             
                      case cmd === 'about': writeLineHTML(commands.about); break;
         | 
| 299 301 | 
             
                      case cmd === 'socials': writeLineHTML(commands.socials); break;
         | 
| 300 302 | 
             
                      case cmd === 'clear': screen.innerHTML=''; break;
         | 
| 301 | 
            -
                      default: if(cmd) commandsPrint(cmd + `{{ site. | 
| 303 | 
            +
                      default: if(cmd) commandsPrint(cmd + `{{ site.strings.home.terminal.error }}`, mode='text');
         | 
| 302 304 | 
             
                    }
         | 
| 303 305 | 
             
                  }
         | 
| 304 306 |  | 
    
        data/_layouts/error.html
    CHANGED
    
    | @@ -5,11 +5,11 @@ layout: default | |
| 5 5 | 
             
            <div class="container error">
         | 
| 6 6 | 
             
              <div class="row">
         | 
| 7 7 | 
             
                <div class="col-sm text-center">
         | 
| 8 | 
            -
                   {%- if site. | 
| 9 | 
            -
                      <img class="error-image" src="{{ site. | 
| 8 | 
            +
                   {%- if site.strings.error.image -%}
         | 
| 9 | 
            +
                      <img class="error-image" src="{{ site.strings.error.image }}" alt="error 404">
         | 
| 10 10 | 
             
                   {%- endif -%}
         | 
| 11 | 
            -
                  <h1 class="error-title">{{ site. | 
| 12 | 
            -
                  <h2 class="error-description">{{ site. | 
| 11 | 
            +
                  <h1 class="error-title">{{ site.strings.error.title | escape }}</h1>
         | 
| 12 | 
            +
                  <h2 class="error-description">{{ site.strings.error.message | markdownify }}</h2>
         | 
| 13 13 | 
             
                </div>
         | 
| 14 14 | 
             
              </div>
         | 
| 15 15 | 
             
            </div>
         | 
    
        data/_layouts/home.html
    CHANGED
    
    | @@ -9,7 +9,7 @@ layout: default | |
| 9 9 | 
             
                  <div class="terminal-header__btn terminal-header__close" title="close"></div>
         | 
| 10 10 | 
             
                  <div class="terminal-header__btn terminal-header__min" title="minimize"></div>
         | 
| 11 11 | 
             
                  <div class="terminal-header__btn terminal-header__max" title="maximize"></div>
         | 
| 12 | 
            -
                  <div class="terminal-header__title">{{ site. | 
| 12 | 
            +
                  <div class="terminal-header__title">{{ site.strings.home.terminal.user }}@{{ site.strings.home.terminal.hostname }}</div>
         | 
| 13 13 | 
             
                </div>
         | 
| 14 14 |  | 
| 15 15 | 
             
                <div id="screen" class="terminal-screen">
         | 
    
        data/_layouts/page.html
    CHANGED
    
    | @@ -31,10 +31,8 @@ layout: default | |
| 31 31 | 
             
              {%- if page.update_date -%}
         | 
| 32 32 | 
             
                <div class="row page-modified">
         | 
| 33 33 | 
             
                  <time class="dt-modified" datetime="{{ page.date | date_to_xmlschema }}" itemprop="dateModified">
         | 
| 34 | 
            -
                    <strong>{{ site. | 
| 34 | 
            +
                    <strong>{{ site.strings.page.updated_on | default: "Page updated on" }}:</strong> {% datelang page.update_date format:date_format %}
         | 
| 35 35 | 
             
                  </time>
         | 
| 36 36 | 
             
                </div>
         | 
| 37 37 | 
             
              {%- endif -%}
         | 
| 38 38 | 
             
            </div>
         | 
| 39 | 
            -
             | 
| 40 | 
            -
            <script src="{{ '/assets/js/toc.js' | relative_url }}"></script>
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            <!-- TODO: Aqui vai ser um layout para uma página de coleção de imagens com post de texto -->
         | 
    
        data/_layouts/post.html
    CHANGED
    
    | @@ -24,7 +24,7 @@ layout: default | |
| 24 24 | 
             
                      {%- if page.author -%}
         | 
| 25 25 | 
             
                      <span itemprop="author" itemscope itemtype="http://schema.org/Person">
         | 
| 26 26 | 
             
                        <span class="p-author h-card" itemprop="name">
         | 
| 27 | 
            -
                          {{ site. | 
| 27 | 
            +
                          {{ site.strings.post.author | default: "author" }}: {{ page.author }}
         | 
| 28 28 | 
             
                        </span>
         | 
| 29 29 | 
             
                      </span>
         | 
| 30 30 | 
             
                      {%- endif -%}
         | 
| @@ -45,7 +45,7 @@ layout: default | |
| 45 45 | 
             
                {%- if page.update_date -%}
         | 
| 46 46 | 
             
                <div class="row post-modified">
         | 
| 47 47 | 
             
                  <time class="dt-modified" datetime="{{ page.date | date_to_xmlschema }}" itemprop="dateModified">
         | 
| 48 | 
            -
                    <strong>{{ site. | 
| 48 | 
            +
                    <strong>{{ site.strings.post.updated_on | default: "Post updated on" }}:</strong> 
         | 
| 49 49 | 
             
                    {%- if site.datelang -%}
         | 
| 50 50 | 
             
                      {% datelang page.update_date format:date_format %}
         | 
| 51 51 | 
             
                    {%- else -%}
         | 
| @@ -94,7 +94,7 @@ layout: default | |
| 94 94 |  | 
| 95 95 | 
             
                {%- if related_posts.size > 0 -%}
         | 
| 96 96 | 
             
                  <div class="row related-posts">
         | 
| 97 | 
            -
                    <h3 class="related-posts-title">[ {{ site. | 
| 97 | 
            +
                    <h3 class="related-posts-title">[ {{ site.strings.post.related_posts | default: "related posts" }} ]</h3>
         | 
| 98 98 |  | 
| 99 99 | 
             
                    <ul class="related-posts-list">
         | 
| 100 100 | 
             
                      {%- for post in related_posts limit:5 -%}
         | 
| @@ -116,5 +116,3 @@ layout: default | |
| 116 116 | 
             
              {%- endif -%}
         | 
| 117 117 |  | 
| 118 118 | 
             
            </article>
         | 
| 119 | 
            -
             | 
| 120 | 
            -
            <script src="{{ '/assets/js/toc.js' | relative_url }}"></script>
         | 
    
        data/_layouts/resume.html
    CHANGED
    
    | @@ -151,7 +151,7 @@ | |
| 151 151 | 
             
                                      <small>{{ cert.certificate }}</small>
         | 
| 152 152 | 
             
                                    </a>
         | 
| 153 153 | 
             
                                  {%- else -%}
         | 
| 154 | 
            -
                                    < | 
| 154 | 
            +
                                    <strong>{{ cert.course }}</strong>
         | 
| 155 155 | 
             
                                  {%- endif -%}
         | 
| 156 156 | 
             
                                  </div>
         | 
| 157 157 | 
             
                                </div>
         | 
| @@ -264,7 +264,7 @@ | |
| 264 264 | 
             
              </body>
         | 
| 265 265 |  | 
| 266 266 | 
             
              <!-- Scripts -->
         | 
| 267 | 
            -
              <script src="{{ '/assets/vendor/bootstrap/js/bootstrap.bundle.js' | relative_url }}"></script>
         | 
| 267 | 
            +
              <script src="{{ '/assets/vendor/bootstrap/js/bootstrap.bundle.min.js' | relative_url }}"></script>
         | 
| 268 268 |  | 
| 269 269 | 
             
              <script src="{{ '/assets/js/default.js' | relative_url }}"></script>
         | 
| 270 270 |  | 
    
        data/_layouts/tag_posts.html
    CHANGED
    
    | @@ -6,7 +6,7 @@ layout: default | |
| 6 6 |  | 
| 7 7 | 
             
            <div class="container tag-posts">
         | 
| 8 8 | 
             
              <div class="row">
         | 
| 9 | 
            -
                <h1 class="tag-posts-title"><span>[ {{ site. | 
| 9 | 
            +
                <h1 class="tag-posts-title"><span>[ {{ site.strings.tags_posts.title }}: </span>{{ page.title }}<span> ]</span></h1>
         | 
| 10 10 |  | 
| 11 11 | 
             
                <ul class="row tag-posts-list">
         | 
| 12 12 | 
             
                  {%- for post in page.posts -%}
         | 
| @@ -437,22 +437,22 @@ | |
| 437 437 | 
             
                    transition: transform .2s ease;
         | 
| 438 438 | 
             
                  }
         | 
| 439 439 | 
             
                }
         | 
| 440 | 
            -
              }
         | 
| 441 440 |  | 
| 442 | 
            -
             | 
| 443 | 
            -
             | 
| 444 | 
            -
             | 
| 441 | 
            +
                &[open] summary::before {
         | 
| 442 | 
            +
                  transform: rotate(90deg) !important;
         | 
| 443 | 
            +
                }
         | 
| 445 444 |  | 
| 446 | 
            -
             | 
| 447 | 
            -
             | 
| 448 | 
            -
             | 
| 445 | 
            +
                &[open] {
         | 
| 446 | 
            +
                  background: var(--details-bg-color);
         | 
| 447 | 
            +
                  border-color: var(--border-color);
         | 
| 448 | 
            +
                }
         | 
| 449 449 |  | 
| 450 | 
            -
             | 
| 451 | 
            -
             | 
| 452 | 
            -
                 | 
| 450 | 
            +
                p:last-child {
         | 
| 451 | 
            +
                  margin-bottom: 0px;
         | 
| 452 | 
            +
                }
         | 
| 453 453 | 
             
              }
         | 
| 454 454 |  | 
| 455 | 
            -
              details | 
| 456 | 
            -
                margin- | 
| 455 | 
            +
              .details-content-wrapper {
         | 
| 456 | 
            +
                margin-top: 30px;
         | 
| 457 457 | 
             
              }
         | 
| 458 458 | 
             
            }
         | 
    
        data/_sass/includes/_footer.scss
    CHANGED
    
    | @@ -13,9 +13,11 @@ | |
| 13 13 | 
             
                background-color: transparent;
         | 
| 14 14 | 
             
                margin-bottom: 5px;
         | 
| 15 15 | 
             
                margin-right: 2px;
         | 
| 16 | 
            +
             | 
| 16 17 | 
             
                @media (max-width: 1040px) {
         | 
| 17 18 | 
             
                  display: none;
         | 
| 18 19 | 
             
                }
         | 
| 20 | 
            +
             | 
| 19 21 | 
             
                &-link {
         | 
| 20 22 | 
             
                  font-size: 3rem;
         | 
| 21 23 | 
             
                  display: none;
         | 
| @@ -24,21 +26,26 @@ | |
| 24 26 | 
             
                }
         | 
| 25 27 | 
             
              }
         | 
| 26 28 |  | 
| 27 | 
            -
              &-copyright {
         | 
| 29 | 
            +
              &-copyright-wrap {
         | 
| 28 30 | 
             
                text-align: left;
         | 
| 29 | 
            -
             | 
| 31 | 
            +
             | 
| 32 | 
            +
                @media (max-width: 798px) {
         | 
| 30 33 | 
             
                  text-align: center !important;
         | 
| 31 34 | 
             
                }
         | 
| 32 35 | 
             
              }
         | 
| 33 | 
            -
             | 
| 36 | 
            +
             | 
| 37 | 
            +
              &-message-wrap {
         | 
| 34 38 | 
             
                text-align: center;
         | 
| 35 | 
            -
             | 
| 39 | 
            +
             | 
| 40 | 
            +
                @media (max-width: 940px) {
         | 
| 36 41 | 
             
                  display: none;
         | 
| 37 42 | 
             
                }
         | 
| 38 43 | 
             
              }
         | 
| 39 | 
            -
             | 
| 44 | 
            +
             | 
| 45 | 
            +
              &-made-by-wrap {
         | 
| 40 46 | 
             
                text-align: right;
         | 
| 41 | 
            -
             | 
| 47 | 
            +
             | 
| 48 | 
            +
                @media (max-width: 800px) {
         | 
| 42 49 | 
             
                  display: none;
         | 
| 43 50 | 
             
                }
         | 
| 44 51 | 
             
              }
         | 
    
        data/_sass/includes/_header.scss
    CHANGED
    
    
    
        data/_sass/layouts/_resume.scss
    CHANGED
    
    | @@ -16,7 +16,7 @@ | |
| 16 16 | 
             
              body,
         | 
| 17 17 | 
             
              .resume,
         | 
| 18 18 | 
             
              .container-fluid {
         | 
| 19 | 
            -
                background: #fff !important;
         | 
| 19 | 
            +
                background-color: #fff !important;
         | 
| 20 20 | 
             
                box-shadow: none !important;
         | 
| 21 21 | 
             
                border: none !important;
         | 
| 22 22 | 
             
              }
         | 
| @@ -50,8 +50,6 @@ | |
| 50 50 | 
             
                }
         | 
| 51 51 |  | 
| 52 52 | 
             
                .section {
         | 
| 53 | 
            -
                  page-break-inside: avoid;
         | 
| 54 | 
            -
             | 
| 55 53 | 
             
                  &-title {
         | 
| 56 54 | 
             
                    font-size: 12pt;
         | 
| 57 55 | 
             
                    font-weight: 700;
         | 
| @@ -60,7 +58,6 @@ | |
| 60 58 | 
             
                  &-item {
         | 
| 61 59 | 
             
                    font-size: 10.5pt;
         | 
| 62 60 | 
             
                    margin-bottom: 0.4em;
         | 
| 63 | 
            -
                    page-break-inside: avoid;
         | 
| 64 61 |  | 
| 65 62 | 
             
                    a {
         | 
| 66 63 | 
             
                      color: black;
         | 
    
        data/_sass/theme/_dark.scss
    CHANGED
    
    | @@ -1,14 +1,17 @@ | |
| 1 1 | 
             
            $theme-colors: (
         | 
| 2 2 | 
             
              bg: #181818,
         | 
| 3 | 
            -
              text: #bfbfbf | 
| 3 | 
            +
              // default text: #bfbfbf;
         | 
| 4 | 
            +
              text: #d5d5d5,
         | 
| 4 5 | 
             
              text-muted: #9b9b9b,
         | 
| 5 6 | 
             
              // default primary: #66c9e2 | #61b8b8
         | 
| 6 7 | 
             
              // primary dark blue: #668be2
         | 
| 7 8 | 
             
              // primary grovbox: #ebdbb2
         | 
| 8 9 | 
             
              // primary oliva: #639e5b
         | 
| 9 10 | 
             
              // primary oliva2: #75a683
         | 
| 10 | 
            -
              // primary opaque aqua: #61b8b8
         | 
| 11 | 
            -
              primary: #4ce4c8 | 
| 11 | 
            +
              // primary opaque aqua fosco: #61b8b8
         | 
| 12 | 
            +
              // primary opaque aqua 2: #4ce4c8
         | 
| 13 | 
            +
              // primary opaque aqua 3: #5ebdac
         | 
| 14 | 
            +
              primary: #5ebdac,
         | 
| 12 15 | 
             
              shadow-color: rgba(0, 0, 0, 0.1),
         | 
| 13 16 | 
             
              code-color: #f55ca8,
         | 
| 14 17 | 
             
              code-block-header-color: #141414,
         | 
| @@ -57,7 +60,7 @@ $theme-colors: ( | |
| 57 60 | 
             
              resume-border-color: #000000,
         | 
| 58 61 | 
             
              resume-title-text-color: white,
         | 
| 59 62 | 
             
              resume-content-text-color: #d3d3d3,
         | 
| 60 | 
            -
              resume-text-muted-color: # | 
| 63 | 
            +
              resume-text-muted-color: #9d9d9d,
         | 
| 61 64 | 
             
            );
         | 
| 62 65 |  | 
| 63 66 | 
             
            /* matrix */
         | 
    
        data/_sass/theme/_light.scss
    CHANGED
    
    
    
        data/assets/js/avatar.js
    CHANGED
    
    | @@ -1,3 +1,12 @@ | |
| 1 | 
            +
            /* TODO: Colocar cada script para página ideal, por exemplo:
         | 
| 2 | 
            +
              home: home.js [terminal]
         | 
| 3 | 
            +
              blog: blog.js
         | 
| 4 | 
            +
              tag: tag.js
         | 
| 5 | 
            +
              default.js será script que contem em todas páginas. [botão de top]
         | 
| 6 | 
            +
              post: post.js [toc]
         | 
| 7 | 
            +
              page: page.js
         | 
| 8 | 
            +
            */
         | 
| 9 | 
            +
             | 
| 1 10 | 
             
            document.addEventListener("DOMContentLoaded", () => {
         | 
| 2 11 | 
             
              // O alvo do clique agora é o contêiner INTERATIVO
         | 
| 3 12 | 
             
              const flipperAvatars = document.querySelectorAll('.avatar-flipper__open-true');
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            require "jekyll"
         | 
| 2 | 
            +
            require 'digest'
         | 
| 3 | 
            +
            require 'base64'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Rawfeed
         | 
| 6 | 
            +
              module CspFilters
         | 
| 7 | 
            +
                # Generates a SHA256 hash and encodes it in Base64, ready for use in a CSP.
         | 
| 8 | 
            +
                def sha256_base64(input)
         | 
| 9 | 
            +
                  # Calculates the SHA256 hash of the input text.
         | 
| 10 | 
            +
                  hash = Digest::SHA256.digest(input)
         | 
| 11 | 
            +
                  # Encodes the result in strict Base64 (no line breaks).
         | 
| 12 | 
            +
                  Base64.strict_encode64(hash)
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
            end
         | 
| 16 | 
            +
            Liquid::Template.register_filter(Rawfeed::CspFilters)
         | 
    
        data/lib/rawfeed/datelang.rb
    CHANGED
    
    | @@ -36,7 +36,13 @@ module Rawfeed | |
| 36 36 | 
             
                    return "[datelang: invalid date '#{date_input}']" unless date
         | 
| 37 37 |  | 
| 38 38 | 
             
                    formatted = date.strftime(format)
         | 
| 39 | 
            -
             | 
| 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
         | 
| 40 46 | 
             
                  end
         | 
| 41 47 |  | 
| 42 48 | 
             
                  private
         | 
| @@ -44,23 +50,18 @@ module Rawfeed | |
| 44 50 | 
             
                  def parse_args(text, context)
         | 
| 45 51 | 
             
                    args = {}
         | 
| 46 52 |  | 
| 47 | 
            -
                    # captures tokens respecting quoted strings
         | 
| 48 53 | 
             
                    tokens = text.scan(/"[^"]*"|\S+/).map { |t| t.strip }
         | 
| 49 54 |  | 
| 50 55 | 
             
                    tokens.each do |tok|
         | 
| 51 56 | 
             
                      if tok.include?(':')
         | 
| 52 57 | 
             
                        key, raw_val = tok.split(':', 2)
         | 
| 53 | 
            -
                        # value in quotes -> literal
         | 
| 54 58 | 
             
                        if raw_val.start_with?('"') && raw_val.end_with?('"')
         | 
| 55 59 | 
             
                          val = raw_val[1..-2]
         | 
| 56 60 | 
             
                        else
         | 
| 57 | 
            -
                          # unquoted value -> can be a Liquid variable (e.g., site.date.format)
         | 
| 58 | 
            -
                          # we render "{{ value }}" in the context to get its actual content
         | 
| 59 61 | 
             
                          val = Liquid::Template.parse("{{ #{raw_val} }}").render(context).strip
         | 
| 60 62 | 
             
                        end
         | 
| 61 63 | 
             
                        args[key.to_sym] = val
         | 
| 62 64 | 
             
                      else
         | 
| 63 | 
            -
                        # standalone token (e.g: page.date)
         | 
| 64 65 | 
             
                        rendered = Liquid::Template.parse("{{ #{tok} }}").render(context).strip
         | 
| 65 66 | 
             
                        args[:date] = rendered unless rendered.empty?
         | 
| 66 67 | 
             
                      end
         | 
| @@ -74,7 +75,6 @@ module Rawfeed | |
| 74 75 | 
             
                    when Date then input
         | 
| 75 76 | 
             
                    when Time then input.to_date
         | 
| 76 77 | 
             
                    else
         | 
| 77 | 
            -
                      # if it is string like "2025-10-13 12:34:00 -0300" etc, Date.parse works
         | 
| 78 78 | 
             
                      begin
         | 
| 79 79 | 
             
                        Date.parse(input.to_s)
         | 
| 80 80 | 
             
                      rescue ArgumentError
         | 
| @@ -83,13 +83,13 @@ module Rawfeed | |
| 83 83 | 
             
                    end
         | 
| 84 84 | 
             
                  end
         | 
| 85 85 |  | 
| 86 | 
            -
                  def replace_months(str, data)
         | 
| 87 | 
            -
                     | 
| 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|
         | 
| 88 91 | 
             
                      next if i.zero?
         | 
| 89 92 | 
             
                      str = str.gsub(Date::MONTHNAMES[i], m)
         | 
| 90 | 
            -
                    end
         | 
| 91 | 
            -
                    data["months_short"].each_with_index do |m, i|
         | 
| 92 | 
            -
                      next if i.zero?
         | 
| 93 93 | 
             
                      str = str.gsub(Date::ABBR_MONTHNAMES[i], m)
         | 
| 94 94 | 
             
                    end
         | 
| 95 95 | 
             
                    str
         | 
    
        data/lib/rawfeed/page.rb
    CHANGED
    
    | @@ -16,9 +16,11 @@ module Rawfeed | |
| 16 16 | 
             
                    file.puts("layout: page")
         | 
| 17 17 | 
             
                    file.puts("order: #number")
         | 
| 18 18 | 
             
                    file.puts("title: \"#{array[0]}\"")
         | 
| 19 | 
            +
                    file.puts("emoji: 😃  # Add an emoji to the page menu or leave it blank")
         | 
| 19 20 | 
             
                    file.puts("author: \"Your Name\"")
         | 
| 20 21 | 
             
                    file.puts("date: #{array[2]} -0300")
         | 
| 21 22 | 
             
                    file.puts("update_date: ")
         | 
| 23 | 
            +
                    file.puts("in_menu: true")
         | 
| 22 24 | 
             
                    file.puts("reading_time: true")
         | 
| 23 25 | 
             
                    file.puts("published: false")
         | 
| 24 26 | 
             
                    file.puts("permalink: /#{permalink}/")
         | 
    
        data/lib/rawfeed/version.rb
    CHANGED
    
    
    
        data/lib/rawfeed.rb
    CHANGED
    
    
    
        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.4
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - William C. Canin
         | 
| @@ -143,6 +143,7 @@ files: | |
| 143 143 | 
             
            - _includes/endtabs
         | 
| 144 144 | 
             
            - _includes/image
         | 
| 145 145 | 
             
            - _includes/layout/blog_search.html
         | 
| 146 | 
            +
            - _includes/layout/capture_scripts.liquid
         | 
| 146 147 | 
             
            - _includes/layout/data.liquid
         | 
| 147 148 | 
             
            - _includes/layout/disqus.html
         | 
| 148 149 | 
             
            - _includes/layout/footer.html
         | 
| @@ -162,6 +163,7 @@ files: | |
| 162 163 | 
             
            - _layouts/error.html
         | 
| 163 164 | 
             
            - _layouts/home.html
         | 
| 164 165 | 
             
            - _layouts/page.html
         | 
| 166 | 
            +
            - _layouts/pixels.html
         | 
| 165 167 | 
             
            - _layouts/post.html
         | 
| 166 168 | 
             
            - _layouts/resume.html
         | 
| 167 169 | 
             
            - _layouts/tag.html
         | 
| @@ -207,7 +209,6 @@ files: | |
| 207 209 | 
             
            - assets/js/avatar.js
         | 
| 208 210 | 
             
            - assets/js/default.js
         | 
| 209 211 | 
             
            - assets/js/terminal.js
         | 
| 210 | 
            -
            - assets/js/toc.js
         | 
| 211 212 | 
             
            - assets/json/blog_search.json
         | 
| 212 213 | 
             
            - assets/json/datelang.json
         | 
| 213 214 | 
             
            - assets/vendor/bootstrap/css/bootstrap-grid.css
         | 
| @@ -257,6 +258,7 @@ files: | |
| 257 258 | 
             
            - assets/vendor/simple-jekyll-search.js
         | 
| 258 259 | 
             
            - assets/vendor/simple-jekyll-search.min.js
         | 
| 259 260 | 
             
            - lib/rawfeed.rb
         | 
| 261 | 
            +
            - lib/rawfeed/csp_filters.rb
         | 
| 260 262 | 
             
            - lib/rawfeed/datelang.rb
         | 
| 261 263 | 
             
            - lib/rawfeed/draft.rb
         | 
| 262 264 | 
             
            - lib/rawfeed/installer.rb
         | 
    
        data/assets/js/toc.js
    DELETED
    
    | @@ -1,22 +0,0 @@ | |
| 1 | 
            -
            document.addEventListener("DOMContentLoaded", () => {
         | 
| 2 | 
            -
              /* TOC in top */
         | 
| 3 | 
            -
              const toc = document.getElementById('toc');
         | 
| 4 | 
            -
             | 
| 5 | 
            -
              if (!toc) return;
         | 
| 6 | 
            -
             | 
| 7 | 
            -
              const sentinel = document.createElement('div');
         | 
| 8 | 
            -
              toc.parentNode.insertBefore(sentinel, toc);
         | 
| 9 | 
            -
             | 
| 10 | 
            -
              const observer = new IntersectionObserver(
         | 
| 11 | 
            -
                ([entry]) => {
         | 
| 12 | 
            -
                  if (!entry.isIntersecting) {
         | 
| 13 | 
            -
                    toc.classList.add('toc-fixed');
         | 
| 14 | 
            -
                  } else {
         | 
| 15 | 
            -
                    toc.classList.remove('toc-fixed');
         | 
| 16 | 
            -
                  }
         | 
| 17 | 
            -
                },
         | 
| 18 | 
            -
                { threshold: 0 }
         | 
| 19 | 
            -
              );
         | 
| 20 | 
            -
             | 
| 21 | 
            -
              observer.observe(sentinel);
         | 
| 22 | 
            -
            });
         |