rawfeed 0.1.4 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +20 -21
- data/README.md +12 -130
- data/_data/options.yml +270 -0
- data/_data/resume.yml +8 -8
- data/_includes/alert +3 -1
- data/_includes/chart +13 -32
- data/_includes/details +1 -57
- data/_includes/image +12 -4
- data/_includes/layout/blog_search.html +6 -4
- data/_includes/layout/data.liquid +21 -3
- data/_includes/layout/disqus.html +12 -26
- data/_includes/layout/footer.html +33 -17
- data/_includes/layout/giscus.html +27 -19
- data/_includes/layout/head.html +41 -41
- data/_includes/layout/header.html +127 -101
- data/_includes/layout/maintenance.html +6 -10
- data/_includes/layout/paginator.html +6 -4
- data/_includes/socials +7 -5
- data/_includes/tabs +1 -94
- data/_includes/toc +11 -194
- data/_includes/video +4 -1
- data/_layouts/blog.html +8 -7
- data/_layouts/contact.html +90 -196
- data/_layouts/default.html +42 -341
- data/_layouts/error.html +6 -4
- data/_layouts/home.html +45 -36
- data/_layouts/licenses.html +10 -0
- data/_layouts/page.html +4 -4
- data/_layouts/pixel.html +48 -0
- data/_layouts/pixels.html +71 -1
- data/_layouts/post.html +28 -29
- data/_layouts/resume.html +41 -34
- data/_layouts/tag.html +14 -3
- data/_layouts/tag_posts.html +3 -3
- data/_sass/base/_index.scss +39 -3
- data/_sass/components/_badges.scss +10 -0
- data/_sass/components/_markdown.scss +8 -5
- data/_sass/includes/_footer.scss +5 -2
- data/_sass/includes/_header.scss +23 -19
- data/_sass/includes/_highlight.scss +20 -7
- data/_sass/includes/_maintenance.scss +2 -3
- data/_sass/includes/_terminal.scss +35 -12
- data/_sass/layouts/_blog.scss +13 -9
- data/_sass/layouts/_contact.scss +6 -5
- data/_sass/layouts/_default.scss +5 -5
- data/_sass/layouts/_index.scss +3 -0
- data/_sass/layouts/_licenses.scss +7 -0
- data/_sass/layouts/_page.scss +1 -0
- data/_sass/layouts/_pixel.scss +61 -0
- data/_sass/layouts/_pixels.scss +86 -0
- data/_sass/layouts/_post.scss +4 -11
- data/_sass/layouts/_resume.scss +16 -3
- data/_sass/layouts/_tag-posts.scss +1 -2
- data/_sass/layouts/_tag.scss +12 -1
- data/_sass/main.scss +16 -1
- data/_sass/theme/_dark.scss +8 -1
- data/_sass/theme/_light.scss +8 -1
- data/assets/images/blog/.keep +0 -0
- data/assets/images/pixels/luffy.jpg +0 -0
- data/assets/js/blog.coffee +102 -0
- data/assets/js/contact.coffee +105 -0
- data/assets/js/default.coffee +172 -0
- data/assets/js/discus.coffee +30 -0
- data/assets/js/fallback/README.md +3 -0
- data/assets/js/fallback/blog.js +113 -0
- data/assets/js/fallback/contact.js +116 -0
- data/assets/js/{default.js → fallback/default.js} +50 -0
- data/assets/js/fallback/discus.js +32 -0
- data/{_includes/layout/google_analytics.html → assets/js/fallback/google_analytics.js} +7 -3
- data/assets/js/fallback/home.js +275 -0
- data/assets/js/fallback/no_inframe.js +4 -0
- data/assets/js/fallback/page.js +423 -0
- data/assets/js/fallback/pixels.js +1 -0
- data/assets/js/fallback/resume.js +13 -0
- data/assets/js/fallback/tags.js +1 -0
- data/{_includes/layout/capture_scripts.liquid → assets/js/fallback/theme_load.js} +0 -2
- data/assets/js/google_analytics.coffee +24 -0
- data/assets/js/home.coffee +250 -0
- data/assets/js/no_inframe.coffee +9 -0
- data/assets/js/page.coffee +379 -0
- data/assets/js/pixels.coffee +2 -0
- data/assets/js/resume.coffee +9 -0
- data/assets/js/tags.coffee +2 -0
- data/assets/js/theme_load.coffee +6 -0
- data/assets/json/blog_search.json +2 -2
- data/lib/rawfeed/author.rb +59 -0
- data/lib/rawfeed/csp_filters.rb +3 -0
- data/lib/rawfeed/draft.rb +1 -1
- data/lib/rawfeed/layout.rb +7 -0
- data/lib/rawfeed/page.rb +2 -2
- data/lib/rawfeed/pixel.rb +32 -0
- data/lib/rawfeed/post.rb +2 -2
- data/lib/rawfeed/resume.rb +1 -0
- data/lib/rawfeed/typescript_liquid.rb +172 -0
- data/lib/rawfeed/utils.rb +1 -0
- data/lib/rawfeed/version.rb +1 -1
- data/lib/rawfeed/with_class.rb +20 -0
- data/lib/rawfeed.rb +5 -1
- metadata +44 -12
- data/assets/js/avatar.js +0 -59
- data/assets/js/terminal.js +0 -18
    
        data/_layouts/default.html
    CHANGED
    
    | @@ -1,353 +1,54 @@ | |
| 1 | 
            -
            <!-- Theme for Jekyll.rb by: ©  | 
| 2 | 
            -
            {%- if site.maintenance.enable -%}
         | 
| 3 | 
            -
              {%- include layout/maintenance.html -%}
         | 
| 4 | 
            -
            {%- else -%}
         | 
| 5 | 
            -
             | 
| 1 | 
            +
            <!-- Theme for Jekyll.rb by: © rawfeed <https://rawfeed.github.io> -->
         | 
| 6 2 | 
             
            {%- include layout/data.liquid -%}
         | 
| 7 3 |  | 
| 8 | 
            -
            {%-  | 
| 9 | 
            -
             | 
| 10 | 
            -
            <!DOCTYPE html>
         | 
| 11 | 
            -
            <html id="top" lang="{{ site.lang | default: 'en' }}" data-theme="light">
         | 
| 12 | 
            -
              {%- include layout/head.html -%}
         | 
| 13 | 
            -
              <body data-layout="{{ page.layout | default: '' }}" data-terminal-enabled="{{ site.home.terminal.enable | default: false }}">
         | 
| 14 | 
            -
                {%- if site.home.terminal.enable and page.url == "/" and index.layout == "home" -%}
         | 
| 15 | 
            -
                  <div class="default default-terminal" style="max-width: {{ site.layout.width | default: '780px' }} !important;">
         | 
| 16 | 
            -
                    {%- include layout/header.html -%}
         | 
| 17 | 
            -
                  </div>
         | 
| 18 | 
            -
                  <main class="content">{{ content }}</main>
         | 
| 19 | 
            -
                  {%- include layout/footer.html -%}
         | 
| 20 | 
            -
                {%- else -%}
         | 
| 21 | 
            -
                  <div class="default" style="max-width: {{ site.layout.width | default: '780px' }} !important;">
         | 
| 22 | 
            -
                    {%- include layout/header.html -%}
         | 
| 23 | 
            -
                    <main class="content">{{ content }}</main>
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                    {%- include layout/footer.html -%}
         | 
| 26 | 
            -
                  </div>
         | 
| 27 | 
            -
                {%- endif -%}
         | 
| 28 | 
            -
              </body>
         | 
| 29 | 
            -
             | 
| 30 | 
            -
              <!-- Scripts -->
         | 
| 31 | 
            -
              <script src="{{ '/assets/vendor/bootstrap/js/bootstrap.bundle.min.js' | relative_url }}"></script>
         | 
| 32 | 
            -
             | 
| 33 | 
            -
              {%- if page.comments != false and site.blog.post.comments.provider == 'giscus' -%}
         | 
| 34 | 
            -
              <script>
         | 
| 35 | 
            -
                window.giscusThemes = {
         | 
| 36 | 
            -
                  light: "{{ site.blog.post.comments.giscus.theme_light | default: 'light' }}",
         | 
| 37 | 
            -
                  dark: "{{ site.blog.post.comments.giscus.theme_dark | default: 'dark' }}"
         | 
| 38 | 
            -
                };
         | 
| 39 | 
            -
              </script>
         | 
| 40 | 
            -
              {%- endif -%}
         | 
| 41 | 
            -
             | 
| 42 | 
            -
              <script src="{{ '/assets/js/default.js' | relative_url }}"></script>
         | 
| 43 | 
            -
             | 
| 44 | 
            -
              {%- if page.url == '/' and site.home.terminal.enable -%}
         | 
| 45 | 
            -
                <script src="{{ '/assets/js/terminal.js' | relative_url }}"></script>
         | 
| 46 | 
            -
              {%- endif -%}
         | 
| 47 | 
            -
             | 
| 48 | 
            -
              {%- if site.avatar.open -%}
         | 
| 49 | 
            -
                <script src="{{ '/assets/js/avatar.js' | relative_url }}"></script>
         | 
| 50 | 
            -
              {%- endif -%}
         | 
| 51 | 
            -
             | 
| 52 | 
            -
              {%- if site.blog.search.enable -%}
         | 
| 53 | 
            -
                {%- if page.url == '/blog/' or page.url == '/blog/index.html' -%}
         | 
| 54 | 
            -
                  <script src="{{ '/assets/vendor/simple-jekyll-search.min.js' | relative_url }}"></script>
         | 
| 55 | 
            -
             | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
                  <script>
         | 
| 59 | 
            -
                    document.addEventListener("DOMContentLoaded", () => {
         | 
| 60 | 
            -
                      const btn = document.getElementById('blog-search__btn');
         | 
| 61 | 
            -
                      const box = document.querySelector('.blog-search');
         | 
| 62 | 
            -
                      const searchInput = document.getElementById('blog-search__input');
         | 
| 63 | 
            -
                      const blogPosts = document.getElementById('posts');
         | 
| 64 | 
            -
                      const searchResults = document.getElementById('blog-search__results');
         | 
| 65 | 
            -
                      const searchResultsWrapper = document.getElementById('blog-search__results-wrapper');
         | 
| 66 | 
            -
                      const btnSearchClean = document.getElementById('blog-search__btn-clean');
         | 
| 67 | 
            -
                      const blogSeachInput = document.getElementById('blog-search__input');
         | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 70 | 
            -
                      if (!btn || !box) return;
         | 
| 71 | 
            -
             | 
| 72 | 
            -
                      const openSearch = () => {
         | 
| 73 | 
            -
                        box.classList.add('is-open');
         | 
| 74 | 
            -
                        box.removeAttribute('inert');
         | 
| 75 | 
            -
                        box.style.maxHeight = box.scrollHeight + 'px';
         | 
| 76 | 
            -
                        box.style.opacity = '1';
         | 
| 77 | 
            -
                        box.addEventListener('transitionend', function onOpened(e) {
         | 
| 78 | 
            -
                          if (e.propertyName === 'max-height') {
         | 
| 79 | 
            -
                            box.style.maxHeight = 'none';
         | 
| 80 | 
            -
                            box.removeEventListener('transitionend', onOpened);
         | 
| 81 | 
            -
                          }
         | 
| 82 | 
            -
                        });
         | 
| 83 | 
            -
                        blogSeachInput.focus();
         | 
| 84 | 
            -
                      };
         | 
| 85 | 
            -
             | 
| 86 | 
            -
                      const closeSearch = () => {
         | 
| 87 | 
            -
                        box.style.maxHeight = box.scrollHeight + 'px';
         | 
| 88 | 
            -
                        void box.offsetHeight; // reflow force
         | 
| 89 | 
            -
                        requestAnimationFrame(() => {
         | 
| 90 | 
            -
                          box.style.maxHeight = '0';
         | 
| 91 | 
            -
                          box.style.opacity = '0';
         | 
| 92 | 
            -
                        });
         | 
| 93 | 
            -
                        box.setAttribute('inert', '');
         | 
| 94 | 
            -
                        box.classList.remove('is-open');
         | 
| 95 | 
            -
                      };
         | 
| 96 | 
            -
             | 
| 97 | 
            -
                      btn.addEventListener('click', (e) => {
         | 
| 98 | 
            -
                        e.preventDefault();
         | 
| 99 | 
            -
             | 
| 100 | 
            -
                        // if are already in /blog/, toggle
         | 
| 101 | 
            -
                        const pathname = location.pathname.replace(/\/$/, '');
         | 
| 102 | 
            -
                        const isBlog = pathname === '/blog' || pathname === '/blog/index.html';
         | 
| 103 | 
            -
             | 
| 104 | 
            -
                        if (!isBlog) {
         | 
| 105 | 
            -
                          // if are on another page, go to /blog/ and open it
         | 
| 106 | 
            -
                          window.location.href = "{{ search_url }}";
         | 
| 107 | 
            -
                          return;
         | 
| 108 | 
            -
                        }
         | 
| 109 | 
            -
             | 
| 110 | 
            -
                        // toggle
         | 
| 111 | 
            -
                        if (box.classList.contains('is-open')) {
         | 
| 112 | 
            -
                          closeSearch();
         | 
| 113 | 
            -
                          searchInput.value = '';
         | 
| 114 | 
            -
                          blogPosts.classList.remove('disabled');
         | 
| 115 | 
            -
                          searchResultsWrapper.classList.add('disabled');
         | 
| 116 | 
            -
                        } else {
         | 
| 117 | 
            -
                          openSearch();
         | 
| 118 | 
            -
                        }
         | 
| 119 | 
            -
                      });
         | 
| 120 | 
            -
             | 
| 121 | 
            -
                      // opens automatically if arrived from another link with ?search=open
         | 
| 122 | 
            -
                      const params = new URLSearchParams(location.search);
         | 
| 123 | 
            -
                      if (params.get('search') === 'open') {
         | 
| 124 | 
            -
                        setTimeout(openSearch, 30);
         | 
| 125 | 
            -
                      }
         | 
| 126 | 
            -
             | 
| 127 | 
            -
                      /* clean button input blog search
         | 
| 128 | 
            -
                      --------------------------------------------------------------------------------------------------
         | 
| 129 | 
            -
                      */
         | 
| 130 | 
            -
                      function clearSearch() {
         | 
| 131 | 
            -
                        blogSeachInput.value = '';
         | 
| 132 | 
            -
                        blogPosts.classList.remove('disabled');
         | 
| 133 | 
            -
                        searchResults.classList.add('disabled');
         | 
| 134 | 
            -
                        searchResultsWrapper.classList.add('disabled');
         | 
| 135 | 
            -
                        blogSeachInput.focus();
         | 
| 136 | 
            -
                      }
         | 
| 137 | 
            -
                      btnSearchClean.addEventListener('click', clearSearch);
         | 
| 138 | 
            -
                      document.addEventListener('keydown', (e) => {
         | 
| 139 | 
            -
                        if (e.key === 'Escape') {
         | 
| 140 | 
            -
                          clearSearch();
         | 
| 141 | 
            -
                          closeSearch();
         | 
| 142 | 
            -
                        }
         | 
| 143 | 
            -
                      });
         | 
| 4 | 
            +
            {%- if maintenance_.enable != true -%}
         | 
| 144 5 |  | 
| 145 | 
            -
             | 
| 146 | 
            -
                      --------------------------------------------------------------------------------------------------
         | 
| 147 | 
            -
                      */
         | 
| 148 | 
            -
                      searchInput.addEventListener('input', () => {
         | 
| 149 | 
            -
                        if (searchInput.value.trim().length > 0) {
         | 
| 150 | 
            -
                          blogPosts.classList.add('disabled');
         | 
| 151 | 
            -
                          searchResults.classList.remove('disabled');
         | 
| 152 | 
            -
                          searchResultsWrapper.classList.remove('disabled');
         | 
| 153 | 
            -
                        } else {
         | 
| 154 | 
            -
                          blogPosts.classList.remove('disabled');
         | 
| 155 | 
            -
                          searchResults.classList.add('disabled');
         | 
| 156 | 
            -
                          searchResultsWrapper.classList.add('disabled');
         | 
| 157 | 
            -
                        }
         | 
| 158 | 
            -
                      });
         | 
| 159 | 
            -
                      var sjs = SimpleJekyllSearch({
         | 
| 160 | 
            -
                        searchInput: document.getElementById('blog-search__input'),
         | 
| 161 | 
            -
                        resultsContainer: document.getElementById('blog-search__results'),
         | 
| 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>',
         | 
| 163 | 
            -
                        noResultsText: '<p>{{ site.strings.blog.no_results | default: "No results found" }}</p>',
         | 
| 164 | 
            -
                        json: "{{ '/assets/json/blog_search.json' | relative_url }}"
         | 
| 165 | 
            -
                      })
         | 
| 166 | 
            -
                    });
         | 
| 167 | 
            -
                  </script>
         | 
| 168 | 
            -
                {%- endif -%}
         | 
| 169 | 
            -
              {%- endif -%}
         | 
| 170 | 
            -
             | 
| 171 | 
            -
              {%- if site.home.terminal.enable and page.url == "/" -%}
         | 
| 172 | 
            -
              <script>
         | 
| 173 | 
            -
                document.addEventListener("DOMContentLoaded", () => {
         | 
| 174 | 
            -
                  const screen = document.getElementById('screen');
         | 
| 175 | 
            -
                  const terminal = document.getElementById("terminal");
         | 
| 176 | 
            -
                  const socialsEl = document.getElementById("terminal-screen--socials");
         | 
| 177 | 
            -
             | 
| 178 | 
            -
                  const commands = {
         | 
| 179 | 
            -
                    help: `{{ site.strings.home.terminal.commands }}`,
         | 
| 180 | 
            -
                    about: document.getElementById("home-content").innerHTML,
         | 
| 181 | 
            -
                    socials: socialsEl ? socialsEl.innerHTML : `{{ site.strings.home.terminal.no_socials }}`,
         | 
| 182 | 
            -
                  };
         | 
| 183 | 
            -
             | 
| 184 | 
            -
                  function createInputLine() {
         | 
| 185 | 
            -
                    const line = document.createElement('div');
         | 
| 186 | 
            -
                    line.className = 'line';
         | 
| 187 | 
            -
             | 
| 188 | 
            -
                    const prompt = document.createElement('span');
         | 
| 189 | 
            -
                    prompt.className = 'prompt';
         | 
| 190 | 
            -
                    prompt.textContent = `[{{ site.strings.home.terminal.user }}@{{ site.strings.home.terminal.hostname }}:~]$`;
         | 
| 191 | 
            -
             | 
| 192 | 
            -
                    // wrapper para conter input, cursor e measure
         | 
| 193 | 
            -
                    const wrapper = document.createElement('span');
         | 
| 194 | 
            -
                    wrapper.className = 'input-wrapper';
         | 
| 195 | 
            -
             | 
| 196 | 
            -
                    const input = document.createElement('input');
         | 
| 197 | 
            -
                    input.type = 'text';
         | 
| 198 | 
            -
                    input.className = 'input';
         | 
| 199 | 
            -
                    input.placeholder = `{{ site.strings.home.terminal.welcome }}`;
         | 
| 200 | 
            -
                    input.spellcheck = false;
         | 
| 201 | 
            -
                    input.autocomplete = 'off';
         | 
| 202 | 
            -
                    input.autocorrect = 'off';
         | 
| 203 | 
            -
                    input.autocapitalize = 'off';
         | 
| 204 | 
            -
             | 
| 205 | 
            -
                    const cursor = document.createElement('span');
         | 
| 206 | 
            -
                    cursor.className = 'cursor';
         | 
| 207 | 
            -
             | 
| 208 | 
            -
                    const measure = document.createElement('span');
         | 
| 209 | 
            -
                    measure.className = 'measure';
         | 
| 210 | 
            -
             | 
| 211 | 
            -
                    wrapper.appendChild(input);
         | 
| 212 | 
            -
                    wrapper.appendChild(cursor);
         | 
| 213 | 
            -
                    wrapper.appendChild(measure);
         | 
| 214 | 
            -
             | 
| 215 | 
            -
                    line.appendChild(prompt);
         | 
| 216 | 
            -
                    line.appendChild(wrapper);
         | 
| 217 | 
            -
                    screen.appendChild(line);
         | 
| 218 | 
            -
             | 
| 219 | 
            -
                    input.focus();
         | 
| 220 | 
            -
                    screen.scrollTop = screen.scrollHeight;
         | 
| 221 | 
            -
             | 
| 222 | 
            -
                    // Updates the fake cursor position based on the input's selectionStart
         | 
| 223 | 
            -
                    function updateCursor() {
         | 
| 224 | 
            -
                      const sel = input.selectionStart || 0;
         | 
| 225 | 
            -
                      // measure the text to the position of the caret
         | 
| 226 | 
            -
                      measure.textContent = input.value.slice(0, sel);
         | 
| 227 | 
            -
                      const textWidth = measure.offsetWidth; // largura do texto sem scroll
         | 
| 228 | 
            -
                      const visibleLeft = textWidth - input.scrollLeft;
         | 
| 229 | 
            -
                      cursor.style.left = visibleLeft + 'px';
         | 
| 230 | 
            -
             | 
| 231 | 
            -
                      // ensure the caret is visible (for long texts): adjust input's scrollLeft
         | 
| 232 | 
            -
                      const paddingRight = 10;
         | 
| 233 | 
            -
                      if (textWidth - input.scrollLeft > input.clientWidth - paddingRight) {
         | 
| 234 | 
            -
                        input.scrollLeft = textWidth - input.clientWidth + paddingRight;
         | 
| 235 | 
            -
                        cursor.style.left = (textWidth - input.scrollLeft) + 'px';
         | 
| 236 | 
            -
                      } else if (textWidth < input.scrollLeft) {
         | 
| 237 | 
            -
                        input.scrollLeft = textWidth;
         | 
| 238 | 
            -
                        cursor.style.left = (textWidth - input.scrollLeft) + 'px';
         | 
| 239 | 
            -
                      }
         | 
| 240 | 
            -
                    }
         | 
| 241 | 
            -
             | 
| 242 | 
            -
                    // show/hide cursor animation as focus changes
         | 
| 243 | 
            -
                    function onFocus() { cursor.style.opacity = '1'; updateCursor(); }
         | 
| 244 | 
            -
                    function onBlur()  { cursor.style.opacity = '0'; }
         | 
| 245 | 
            -
             | 
| 246 | 
            -
                    input.addEventListener('input', updateCursor);
         | 
| 247 | 
            -
                    input.addEventListener('keydown', (e) => {
         | 
| 248 | 
            -
                      // Update position on keys that do not trigger input immediately (arrows, delete, etc.)
         | 
| 249 | 
            -
                      setTimeout(updateCursor, 0);
         | 
| 250 | 
            -
             | 
| 251 | 
            -
                      if (e.key === 'Enter') {
         | 
| 252 | 
            -
                        e.preventDefault();
         | 
| 253 | 
            -
                        const cmd = input.value.trim().toLowerCase();
         | 
| 254 | 
            -
                        if (cmd) {
         | 
| 255 | 
            -
                          // remove input/cursor/measure and place fixed text
         | 
| 256 | 
            -
                          wrapper.removeChild(input);
         | 
| 257 | 
            -
                          wrapper.removeChild(cursor);
         | 
| 258 | 
            -
                          wrapper.removeChild(measure);
         | 
| 259 | 
            -
                          const cmdText = document.createElement('span');
         | 
| 260 | 
            -
                          cmdText.textContent = cmd;
         | 
| 261 | 
            -
                          wrapper.appendChild(cmdText);
         | 
| 262 | 
            -
                          processCommand(cmd);
         | 
| 263 | 
            -
                        } else {
         | 
| 264 | 
            -
                          // if you enter without command, it just creates a new empty line (with prompt)
         | 
| 265 | 
            -
                          wrapper.removeChild(input);
         | 
| 266 | 
            -
                          wrapper.removeChild(cursor);
         | 
| 267 | 
            -
                          wrapper.removeChild(measure);
         | 
| 268 | 
            -
                          const blank = document.createElement('span');
         | 
| 269 | 
            -
                          blank.textContent = '';
         | 
| 270 | 
            -
                          wrapper.appendChild(blank);
         | 
| 271 | 
            -
                        }
         | 
| 272 | 
            -
                        // New linr input
         | 
| 273 | 
            -
                        createInputLine();
         | 
| 274 | 
            -
                      } else if (e.key === 'Escape') {
         | 
| 275 | 
            -
                        e.preventDefault();
         | 
| 276 | 
            -
                        screen.innerHTML = '';
         | 
| 277 | 
            -
                        createInputLine();
         | 
| 278 | 
            -
                      }
         | 
| 279 | 
            -
                    });
         | 
| 280 | 
            -
             | 
| 281 | 
            -
                    // arrows, mouse click, mouseup (position caret), etc.
         | 
| 282 | 
            -
                    input.addEventListener('keyup', updateCursor);
         | 
| 283 | 
            -
                    input.addEventListener('click', () => {
         | 
| 284 | 
            -
                      // updates after click (selectionStart already set)
         | 
| 285 | 
            -
                      setTimeout(updateCursor, 0);
         | 
| 286 | 
            -
                    });
         | 
| 287 | 
            -
                    input.addEventListener('mouseup', () => setTimeout(updateCursor, 0));
         | 
| 288 | 
            -
                    input.addEventListener('focus', onFocus);
         | 
| 289 | 
            -
                    input.addEventListener('blur', onBlur);
         | 
| 290 | 
            -
             | 
| 291 | 
            -
                    updateCursor();
         | 
| 292 | 
            -
                  }
         | 
| 293 | 
            -
             | 
| 294 | 
            -
                  // processes commands
         | 
| 295 | 
            -
                  function processCommand(cmd) {
         | 
| 296 | 
            -
                    switch(true){
         | 
| 297 | 
            -
                      case cmd === 'help': commandsPrint(commands.help, mode='html'); break;
         | 
| 298 | 
            -
                      case cmd === 'date': commandsPrint(new Date().toString(), mode='text'); break;
         | 
| 299 | 
            -
                      // case cmd.startsWith('echo '): commandsPrint(cmd.split(' ').slice(1).join(' ')); break;
         | 
| 300 | 
            -
                      case cmd === 'about': writeLineHTML(commands.about); break;
         | 
| 301 | 
            -
                      case cmd === 'socials': writeLineHTML(commands.socials); break;
         | 
| 302 | 
            -
                      case cmd === 'clear': screen.innerHTML=''; break;
         | 
| 303 | 
            -
                      default: if(cmd) commandsPrint(cmd + `{{ site.strings.home.terminal.error }}`, mode='text');
         | 
| 304 | 
            -
                    }
         | 
| 305 | 
            -
                  }
         | 
| 6 | 
            +
            {%- assign index = site.pages | where: "path", "index.md" | first -%}
         | 
| 306 7 |  | 
| 307 | 
            -
             | 
| 308 | 
            -
             | 
| 309 | 
            -
             | 
| 8 | 
            +
            {%- if home_.terminal.enable and page.url == "/" and index.layout == "home" -%}
         | 
| 9 | 
            +
              {%- assign default_term = " default-terminal" -%}
         | 
| 10 | 
            +
              {%- assign default_style = "" -%}
         | 
| 11 | 
            +
            {%- else -%}
         | 
| 12 | 
            +
              {%- assign default_term = "" -%}
         | 
| 13 | 
            +
              {%- assign width = default_.width | default: '860' -%}
         | 
| 14 | 
            +
              {%- assign default_style = "max-width: " | append: width | append: "px !important;" -%}
         | 
| 15 | 
            +
            {%- endif -%}
         | 
| 310 16 |  | 
| 311 | 
            -
             | 
| 312 | 
            -
             | 
| 313 | 
            -
                    } else {
         | 
| 314 | 
            -
                      wrapper.textContent = content;
         | 
| 315 | 
            -
                    }
         | 
| 316 | 
            -
                    screen.appendChild(wrapper);
         | 
| 317 | 
            -
                    screen.scrollTop = screen.scrollHeight;
         | 
| 318 | 
            -
                  }
         | 
| 17 | 
            +
            <!DOCTYPE html>
         | 
| 18 | 
            +
            <html id="top" lang="{{ default_.lang | default: 'en-US' }}" data-theme="light">
         | 
| 319 19 |  | 
| 320 | 
            -
             | 
| 321 | 
            -
             | 
| 322 | 
            -
             | 
| 323 | 
            -
                    wrapper.className = 'line-wrapper';
         | 
| 20 | 
            +
              <!-- head -->
         | 
| 21 | 
            +
              {%- include layout/head.html -%}
         | 
| 22 | 
            +
              <!-- head -->
         | 
| 324 23 |  | 
| 325 | 
            -
             | 
| 326 | 
            -
             | 
| 327 | 
            -
                      line.className = 'line';
         | 
| 328 | 
            -
                      if (mode === 'html') {
         | 
| 329 | 
            -
                        line.innerHTML = t;
         | 
| 330 | 
            -
                      } else {
         | 
| 331 | 
            -
                        line.textContent = t;
         | 
| 332 | 
            -
                      }
         | 
| 333 | 
            -
                      wrapper.appendChild(line);
         | 
| 334 | 
            -
                    });
         | 
| 24 | 
            +
              <!-- body -->
         | 
| 25 | 
            +
              <body data-layout="{{ page.layout | default: '' }}" data-terminal-enabled="{{ home_.terminal.enable | default: false }}" style="font-family: {{ default_.font.style }} !important; font-size: {{ default_.font.size }} !important; letter-spacing: {{ default_.font.spacing }} !important;">
         | 
| 335 26 |  | 
| 336 | 
            -
             | 
| 337 | 
            -
             | 
| 338 | 
            -
                  }
         | 
| 27 | 
            +
                <!-- container -->
         | 
| 28 | 
            +
                <div class="container-fluid">
         | 
| 29 | 
            +
                  {%- include layout/header.html -%}
         | 
| 339 30 |  | 
| 340 | 
            -
                   | 
| 341 | 
            -
             | 
| 31 | 
            +
                  <div class="default{{default_term}}" style="{{default_style}}">
         | 
| 32 | 
            +
                    <main class="content">{{ content }}</main>
         | 
| 33 | 
            +
                  </div>
         | 
| 342 34 |  | 
| 343 | 
            -
                   | 
| 344 | 
            -
             | 
| 345 | 
            -
             | 
| 346 | 
            -
             | 
| 347 | 
            -
             | 
| 348 | 
            -
             | 
| 349 | 
            -
                } | 
| 350 | 
            -
             | 
| 351 | 
            -
             | 
| 35 | 
            +
                  {%- include layout/footer.html -%}
         | 
| 36 | 
            +
                </div>
         | 
| 37 | 
            +
                <!-- container -->
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                <!-- scripts -->
         | 
| 40 | 
            +
                <script src="{{ '/assets/vendor/bootstrap/js/bootstrap.bundle.min.js' | relative_url }}"></script>
         | 
| 41 | 
            +
                <script src="{{ '/assets/js/default.js' | relative_url }}"></script>
         | 
| 42 | 
            +
                <script src="{{ '/assets/js/home.js' | relative_url }}"></script>
         | 
| 43 | 
            +
                <script src="{{ '/assets/vendor/simple-jekyll-search.min.js' | relative_url }}"></script>
         | 
| 44 | 
            +
                <script src="{{ '/assets/js/blog.js' | relative_url }}"></script>
         | 
| 45 | 
            +
                <script src="{{ '/assets/js/page.js' | relative_url }}"></script>
         | 
| 46 | 
            +
                <script src="{{ '/assets/js/contact.js' | relative_url }}"></script>
         | 
| 47 | 
            +
                <!-- scripts -->
         | 
| 48 | 
            +
              </body>
         | 
| 49 | 
            +
              <!-- body -->
         | 
| 352 50 | 
             
            </html>
         | 
| 51 | 
            +
             | 
| 52 | 
            +
            {%- else -%}
         | 
| 53 | 
            +
              {%- include layout/maintenance.html -%}
         | 
| 353 54 | 
             
            {%- endif -%}
         | 
    
        data/_layouts/error.html
    CHANGED
    
    | @@ -2,14 +2,16 @@ | |
| 2 2 | 
             
            layout: default
         | 
| 3 3 | 
             
            ---
         | 
| 4 4 |  | 
| 5 | 
            +
            {%- include layout/data.liquid -%}
         | 
| 6 | 
            +
             | 
| 5 7 | 
             
            <div class="container error">
         | 
| 6 8 | 
             
              <div class="row">
         | 
| 7 9 | 
             
                <div class="col-sm text-center">
         | 
| 8 | 
            -
                   {%- if  | 
| 9 | 
            -
                      <img class="error-image" src="{{  | 
| 10 | 
            +
                   {%- if page_.error.image -%}
         | 
| 11 | 
            +
                      <img class="error-image" src="{{ page_.error.image }}" alt="error 404">
         | 
| 10 12 | 
             
                   {%- endif -%}
         | 
| 11 | 
            -
                  <h1 class="error-title">{{  | 
| 12 | 
            -
                  <h2 class="error-description">{{  | 
| 13 | 
            +
                  <h1 class="error-title">{{ page_.error.title | escape }}</h1>
         | 
| 14 | 
            +
                  <h2 class="error-description">{{ page_.error.message | markdownify }}</h2>
         | 
| 13 15 | 
             
                </div>
         | 
| 14 16 | 
             
              </div>
         | 
| 15 17 | 
             
            </div>
         | 
    
        data/_layouts/home.html
    CHANGED
    
    | @@ -2,57 +2,66 @@ | |
| 2 2 | 
             
            layout: default
         | 
| 3 3 | 
             
            ---
         | 
| 4 4 |  | 
| 5 | 
            -
            {%-  | 
| 6 | 
            -
            <div class="d-flex justify-content-center align-items-center mb-5 home home-terminal">
         | 
| 7 | 
            -
              <div id="terminal" class="terminal">
         | 
| 8 | 
            -
                <div class="terminal-header">
         | 
| 9 | 
            -
                  <div class="terminal-header__btn terminal-header__close" title="close"></div>
         | 
| 10 | 
            -
                  <div class="terminal-header__btn terminal-header__min" title="minimize"></div>
         | 
| 11 | 
            -
                  <div class="terminal-header__btn terminal-header__max" title="maximize"></div>
         | 
| 12 | 
            -
                  <div class="terminal-header__title">{{ site.strings.home.terminal.user }}@{{ site.strings.home.terminal.hostname }}</div>
         | 
| 13 | 
            -
                </div>
         | 
| 5 | 
            +
            {%- include layout/data.liquid -%}
         | 
| 14 6 |  | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 7 | 
            +
            {%- if home_.terminal.enable and page.url == "/" -%}
         | 
| 8 | 
            +
              <div class="d-flex justify-content-center align-items-center mb-5 home home-terminal">
         | 
| 9 | 
            +
                <div id="terminal" class="terminal">
         | 
| 10 | 
            +
                  <div class="terminal-header">
         | 
| 11 | 
            +
                    <div class="terminal-header__btn terminal-header__close" title="close"></div>
         | 
| 12 | 
            +
                    <div class="terminal-header__btn terminal-header__min" title="minimize"></div>
         | 
| 13 | 
            +
                    <div class="terminal-header__btn terminal-header__max" title="maximize"></div>
         | 
| 14 | 
            +
                    <div class="terminal-header__title">{{ home_.terminal.user }}@{{ home_.terminal.hostname }}</div>
         | 
| 18 15 | 
             
                  </div>
         | 
| 19 16 |  | 
| 20 | 
            -
                  <div id=" | 
| 21 | 
            -
                     | 
| 22 | 
            -
             | 
| 23 | 
            -
                       | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
                     | 
| 27 | 
            -
             | 
| 17 | 
            +
                  <div id="screen" class="terminal-screen">
         | 
| 18 | 
            +
                    <div id="home-content" style="display:none !important;">
         | 
| 19 | 
            +
                      {{ content }}
         | 
| 20 | 
            +
                      {{ socials_.description.terminal.about.description | markdownify }}
         | 
| 21 | 
            +
                    </div>
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                    <div id="terminal-screen--socials" style="display:none">
         | 
| 24 | 
            +
                      {%- assign menu_separator = default_.separator -%}
         | 
| 25 | 
            +
                      {% assign links = socials_.links %}
         | 
| 26 | 
            +
                      {% for item in links %}
         | 
| 27 | 
            +
                        <a class="socials-link" title="{{ item.title }}" href="{{ item.url }}" target="_blank">{{ item.title }}</a><strong class="separator">{{menu_separator}}</strong>
         | 
| 28 | 
            +
                      {% endfor %}
         | 
| 29 | 
            +
                    </div>
         | 
| 28 30 |  | 
| 31 | 
            +
                  </div>
         | 
| 29 32 | 
             
                </div>
         | 
| 30 33 | 
             
              </div>
         | 
| 31 | 
            -
            </div>
         | 
| 32 34 |  | 
| 33 | 
            -
             | 
| 34 | 
            -
              <div class=" | 
| 35 | 
            -
                <div class=" | 
| 36 | 
            -
                  <div class=" | 
| 37 | 
            -
                    {{  | 
| 35 | 
            +
              <!-- For responsive/mobile (disable terminal) --->
         | 
| 36 | 
            +
              <div class="home-text">
         | 
| 37 | 
            +
                <div class="container home">
         | 
| 38 | 
            +
                  <div class="row">
         | 
| 39 | 
            +
                    <div class="content" style="{%- if page.text_center -%} text-align: center; {%- endif -%}">
         | 
| 40 | 
            +
                      {{ content }}
         | 
| 41 | 
            +
                      {{ socials_.description.text | markdownify }}
         | 
| 42 | 
            +
                    </div>
         | 
| 38 43 | 
             
                  </div>
         | 
| 39 44 | 
             
                </div>
         | 
| 45 | 
            +
                {%- include socials pos="center" -%}
         | 
| 40 46 | 
             
              </div>
         | 
| 41 | 
            -
              {%- include socials pos="center" -%}
         | 
| 42 | 
            -
            </div>
         | 
| 43 47 |  | 
| 44 48 | 
             
            {%- else -%}
         | 
| 45 | 
            -
            <div class=" | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 49 | 
            +
              <div class="home">
         | 
| 50 | 
            +
                <div class="row">
         | 
| 51 | 
            +
                  <div class="content" style="{%- if page.text_center -%} text-align: center; {%- endif -%}">
         | 
| 52 | 
            +
                    {{ content }}
         | 
| 53 | 
            +
                    {{ socials_.description.text | markdownify }}
         | 
| 54 | 
            +
                  </div>
         | 
| 49 55 | 
             
                </div>
         | 
| 50 56 | 
             
              </div>
         | 
| 51 | 
            -
            </div>
         | 
| 52 57 | 
             
            {%- endif -%}
         | 
| 53 58 |  | 
| 54 | 
            -
            {%- if  | 
| 55 | 
            -
              {%- if page.url == "/" and  | 
| 56 | 
            -
                {%-  | 
| 59 | 
            +
            {%- if home_.terminal.enable == false -%}
         | 
| 60 | 
            +
              {%- if page.url == "/" and socials_.enable -%}
         | 
| 61 | 
            +
                {%- if page.text_center -%}
         | 
| 62 | 
            +
                  {%- include socials pos="center" -%}
         | 
| 63 | 
            +
                {%- else -%}
         | 
| 64 | 
            +
                  {%- include socials pos="left" -%}
         | 
| 65 | 
            +
                {%- endif -%}
         | 
| 57 66 | 
             
              {%- endif -%}
         | 
| 58 67 | 
             
            {%- endif -%}
         | 
| @@ -0,0 +1,10 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            layout: default
         | 
| 3 | 
            +
            ---
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            {%- include layout/data.liquid -%}
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            <div class="licenses{% if default_.background_focus %} background_focus{% endif %} {% if default_.rounding %} rounding{% endif %}">
         | 
| 8 | 
            +
              <h1 class="licenses-title">{{ page.title | capitalize }}</h1>
         | 
| 9 | 
            +
              <div class="licenses-content">{{ content }}</div>
         | 
| 10 | 
            +
            </div>
         | 
    
        data/_layouts/page.html
    CHANGED
    
    | @@ -4,13 +4,13 @@ layout: default | |
| 4 4 |  | 
| 5 5 | 
             
            {%- include layout/data.liquid -%}
         | 
| 6 6 |  | 
| 7 | 
            -
            <div class=" | 
| 7 | 
            +
            <div id="page" class="page{% if default_.background_focus %} background_focus{% endif %} {% if default_.rounding %} rounding{% endif %}">
         | 
| 8 8 | 
             
              {%- if page.date or page.reading_time -%}
         | 
| 9 9 | 
             
                <div class="row">
         | 
| 10 10 | 
             
                  {%- if page.date -%}
         | 
| 11 11 | 
             
                  <time class="dt-published" datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
         | 
| 12 | 
            -
                    {%- if  | 
| 13 | 
            -
                      {% datelang page.date format: | 
| 12 | 
            +
                    {%- if datelang_ -%}
         | 
| 13 | 
            +
                      {% datelang page.date format:datelang_.format %}
         | 
| 14 14 | 
             
                    {%- else -%}
         | 
| 15 15 | 
             
                      {{ page.date | date: "%b %-d, %Y" }}
         | 
| 16 16 | 
             
                    {%- endif -%}
         | 
| @@ -31,7 +31,7 @@ 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>{{  | 
| 34 | 
            +
                    <strong>{{ page_.updated_on | default: "Page updated on" }}:</strong> {% datelang page.update_date format:datelang_.format %}
         | 
| 35 35 | 
             
                  </time>
         | 
| 36 36 | 
             
                </div>
         | 
| 37 37 | 
             
              {%- endif -%}
         | 
    
        data/_layouts/pixel.html
    ADDED
    
    | @@ -0,0 +1,48 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            layout: default
         | 
| 3 | 
            +
            ---
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            {%- include layout/data.liquid -%}
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            {%- assign menu_separator = default_.separator -%}
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            <article class="pixel{% if default_.background_focus %} background_focus{% endif %} {% if default_.rounding %} rounding{% endif %}" itemscope itemtype="http://schema.org/BlogPosting">
         | 
| 10 | 
            +
              <div class="row">
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                <header class="pixel-header">
         | 
| 13 | 
            +
                  <h1 class="pixel-title p-name" itemprop="name headline">» {{ page.title | escape }}</h1>
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  <div class="row pixel-meta">
         | 
| 16 | 
            +
                    <div class="col-sm d-flex justify-content-start">
         | 
| 17 | 
            +
                      <time class="dt-published" datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
         | 
| 18 | 
            +
                      {%- if datelang_ -%}
         | 
| 19 | 
            +
                        {% datelang page.date format:datelang_.format %}
         | 
| 20 | 
            +
                      {%- else -%}
         | 
| 21 | 
            +
                        {{ page.date | date: "%b %-d, %Y" }}
         | 
| 22 | 
            +
                      {%- endif -%}
         | 
| 23 | 
            +
                      </time>
         | 
| 24 | 
            +
                    </div>
         | 
| 25 | 
            +
                  </div>
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  {%- if page.image.path -%}
         | 
| 28 | 
            +
                  <div class="pixel-image">
         | 
| 29 | 
            +
                    {%- if page.image.width -%}
         | 
| 30 | 
            +
                    <figure style="width: {{ page.image.width }} !important;">
         | 
| 31 | 
            +
                    {%- else -%}
         | 
| 32 | 
            +
                    <figure>
         | 
| 33 | 
            +
                    {%- endif -%}
         | 
| 34 | 
            +
                      <img src="{{ page.image.path | relative_url }}" alt="{{ page.title }}">
         | 
| 35 | 
            +
                      {%- if page.image.caption -%}
         | 
| 36 | 
            +
                        <figcaption>{{ page.image.caption }}</figcaption>
         | 
| 37 | 
            +
                      {%- endif -%}
         | 
| 38 | 
            +
                    </figure>
         | 
| 39 | 
            +
                  </div>
         | 
| 40 | 
            +
                  {%- endif -%}
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                </header>
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                <div class="e-content pixel-content" itemprop="articleBody">
         | 
| 45 | 
            +
                  {{ content }}
         | 
| 46 | 
            +
                </div>
         | 
| 47 | 
            +
              </div>
         | 
| 48 | 
            +
            </article>
         |