diff --git a/themes/itix/LICENSE b/themes/itix/LICENSE new file mode 100644 index 0000000..9e18be0 --- /dev/null +++ b/themes/itix/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Nicolas Massé + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/themes/itix/README.md b/themes/itix/README.md new file mode 100644 index 0000000..c2ab83b --- /dev/null +++ b/themes/itix/README.md @@ -0,0 +1 @@ +# Theme for www.itix.fr diff --git a/themes/itix/assets/css/.gitignore b/themes/itix/assets/css/.gitignore new file mode 100644 index 0000000..c94d1fd --- /dev/null +++ b/themes/itix/assets/css/.gitignore @@ -0,0 +1 @@ +chroma.css \ No newline at end of file diff --git a/themes/itix/assets/css/itix.css b/themes/itix/assets/css/itix.css new file mode 100644 index 0000000..a6fc294 --- /dev/null +++ b/themes/itix/assets/css/itix.css @@ -0,0 +1,859 @@ +:root { + /* + * Theme colors + */ + --main-color: #1870c9; /* Adjusted to ensure a 4.5:1 contrast ratio for accessibility */ + --main-background-color: #fcfcfc; + --alternate-text-color: #145ca4; + --main-text-color: #092949; /* 50% darker than main-color */ + --active-menu-background-color: #f4f8fb; + --active-menu-color: #0e4377; + --active-menu-border-color: #74abe3; + --hover-menu-background-color: #f4f8fb; + --hover-menu-color: #0e4377; + --hover-menu-border-color: #74abe3; + --post-metadata-color: #555; + --text-selection-background-color: #a2c7ec; + --quote-background-color: #f0f5fa; + --quote-border-color: #589bdd; + --codeblock-background-color: #ebf2f9; + --toc-background-color: #f0f5fa; + --pagination-disabled-color: #555; + --table-border-color: #092949; + + /* + * Layout + */ + --menu-container-width: 25%; + --toolbar-container-width: 25%; + + /* + * Fonts + */ + --default-font-list: "Source Serif Pro", serif; + --mono-font-list: "JetBrains Mono", monospace; + --sans-preferred-font-list: "Source Sans Pro", sans-serif; + +} + +/* + * Fonts + */ +@font-face{ + font-family: 'JetBrains Mono'; + src: url('/fonts/JetBrainsMono-Regular.woff2') format('woff2'), + url('/fonts/JetBrainsMono-Regular.woff') format('woff'), + url('/fonts/JetBrainsMono-Regular.ttf') format('truetype'); + font-weight: 400; + font-style: normal; + + /* + * Core Web Vitals / Cumulative Layout Shift. + * + * Avoid showing invisible text while custom fonts load. + */ + font-display: swap; +} + +@font-face{ + font-family: 'Source Serif Pro'; + src: url('/fonts/SourceSerifPro-Regular.ttf') format('truetype'); + font-weight: 400; + font-style: normal; + + /* + * Core Web Vitals / Cumulative Layout Shift. + * + * Avoid showing invisible text while custom fonts load. + */ + font-display: swap; +} + +@font-face{ + font-family: 'Source Sans Pro'; + src: url('/fonts/SourceSansPro-Regular.ttf') format('truetype'); + font-weight: 400; + font-style: normal; + + /* + * Core Web Vitals / Cumulative Layout Shift. + * + * Avoid showing invisible text while custom fonts load. + */ + font-display: swap; +} + +/* + * General settings + */ + +::selection { + /* Text selection uses the theme main color with some transparency */ + background: var(--text-selection-background-color); +} + +body { + background: var(--main-background-color); + padding: 0; + margin: 0; + font-family: var(--default-font-list); + color: var(--main-text-color); +} + +* { + /* By default in the CSS box model, the width and height you assign to an + * element is applied only to the element's content box. If the element has + * any border or padding, this is then added to the width and height to arrive + * at the size of the box that's rendered on the screen. This means that when + * you set width and height, you have to adjust the value you give to allow + * for any border or padding that may be added. + * + * border-box tells the browser to account for any border and padding in the + * values you specify for an element's width and height. If you set an element's + * width to 100 pixels, that 100 pixels will include any border or padding you + * added, and the content box will shrink to absorb that extra width. + * This typically makes it much easier to size elements. + */ + box-sizing: border-box; +} + +/* + * Heading and figure numbering + */ + +main, #TableOfContents { + /* + * all counters need to be specified on one single line + * and they have to be reset on an enclosing element + */ + counter-reset: h2 figcaption; +} + +h2::before, #TableOfContents > ul > li::before { + content: counter(h2) ".\0000a0\0000a0"; /* \0000a0 => Non-breakable space */ + counter-increment: h2; +} + +h2, #TableOfContents > ul > li { + counter-reset: h3; +} + +h3::before, #TableOfContents > ul > li > ul > li::before { + content: counter(h2) "." counter(h3) ".\0000a0\0000a0"; + counter-increment: h3; +} + +figcaption::before { + /* + * When the numbering is done in CSS, we cannot honor typographical + * conventions of the user language. So, here I chose the english convention + * with no space before the colon and a space after. + */ + content: "Figure " counter(figcaption) ": "; + counter-increment: figcaption; + +} + +/* + * Main content formatting + */ + +h1, h2, h3 { + font-weight: bold; + line-height: 1.5em; +} + +h1, h2, h3, h4, h5, h6 { + margin: 20px 0 20px 0; +} + +h1 { + font-size: 30px; +} + +h2 { + font-size: 24px; +} + +h3 { + font-size: 21px; +} + +h4 { + font-size: 21px; +} + +h5 { + font-size: 20px; +} + +h6 { + font-size: 19px; +} + +figure { + margin: 0; +} + +figure figcaption { + font-style: italic; +} + +ul { + list-style-type: "\2013\0000a0"; + list-style-position: outside; +} + +textarea, +select, +input, +button { + outline: none !important; +} + +main table { + table-layout: fixed; + overflow-x: scroll; + border-collapse: collapse; + width: 100%; + table-layout: auto; +} + +main table td, main table th { + border: 1px solid var(--table-border-color); + padding: 0.2rem 0.5rem; +} + +button { + cursor: pointer; +} + +blockquote { + padding: 10px 20px; + border-left: 3px solid var(--quote-border-color); + color: var(--alternate-text-color); + background: var(--quote-background-color); +} + +blockquote p { + margin-bottom: 0; +} + +blockquote * { + color: var(--alternate-text-color); +} + +a { + color: var(--main-color); +} + +a:hover { + color: var(--alternate-text-color); +} + +/* + * Code block + */ + +pre.chroma { + /* Overide the default chroma background color with ours */ + background: var(--codeblock-background-color); +} + +/* Code block (three backticks in markdown) */ +pre { + background: var(--codeblock-background-color); + padding: 12px 15px; + border-radius: 5px; + font-family: var(--mono-font-list); + + /* Do not wrap lines of code */ + overflow-x: hidden; + + /* Hide scrollbar for IE, Edge and Firefox */ + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ +} + +/* Hide scrollbar for Chrome, Safari and Opera */ +pre::-webkit-scrollbar { + display: none; +} + +/* Inline code (single backticks in markdown) */ +code { + color: var(--alternate-text-color); + background: var(--codeblock-background-color) !important; + padding: 2px 5px; + border-radius: 3px; + font-family: var(--mono-font-list); +} + +/* + * And because there is a code tag inside a pre tag for Markdown code blocks, + * we need to overide some properties + */ +pre code { + background: none !important; + font-family: var(--mono-font-list) !important; + padding: 0; +} + +/* + * Highlighted file has a wrapping div. Some properties are redefined for it + * and reset to their default value for its children. + */ +.highlightedFile { + background: var(--codeblock-background-color); + border-radius: 5px; +} + +.highlightedFile .filename { + border-bottom: 2px solid var(--hover-menu-border-color); + font-family: var(--sans-preferred-font-list) !important; + font-size: larger; + padding: 12px 15px; +} + +.highlightedFile pre { + background: inherit; + border-radius: inherit; + padding: 12px 15px; + margin: 0; +} + + +pre:hover { + /* Show the horizontal scroll bar when hovering code (if needed) */ + overflow-x: auto; +} + +/* + * i18n + */ +.tiny-flag { + vertical-align: middle; + margin-left: 5px; + margin-right: 5px; +} + +/* + * Pagination + */ +.pagination { + list-style: none; + padding: 0; + text-align: center; + font-size: larger; +} + +.pagination .page-item { + display: inline; + margin: 5px; +} + +.pagination .disabled { + color: var(--pagination-disabled-color); +} + +.pagination .active { + font-weight: bold; +} + +/* + * Article list + */ + +.article-list p { + /* Move the excerpt closer to the metadata */ + margin-top: 0.5em; + /* Add spacing around each item of the list */ + margin-bottom: 2.5em; +} + +.article-list h4 { + /* Move the title closer to the metadata */ + margin-bottom: 0.5em; +} + +.article-list .post-metadata { + /* Fade the metadata */ + color: var(--post-metadata-color); +} + +.article-list .continue-reading { + /* Leave some space between the excerpt and the "continue reading" link */ + margin-left: 0.5em; +} + +/* + * Post Metadata (valid for the "list" and "single" views) + */ +.post-metadata .material-icons { + vertical-align: sub; + margin-right: 3px; + margin-left: 5px; + max-height: 1rem; +} + +.post-metadata time { + /* Leave some space between publication date and taxonomies */ + margin-right: 20px; +} + + +article .post-metadata { + /* Leave some space between the metadata and the title */ + margin-top: 20px; +} + +/* + * Single post layout + */ +article { + padding: 50px 35px 20px 35px; + font-size: 16px; + line-height: 1.5em; +} + +article img, article video { + max-width: 100%; + height: auto; + border-radius: 5px; + overflow: hidden; +} + +article p { + text-align: justify; + text-justify: inter-word; +} + +article header { + padding-bottom: 30px; + font-style: normal; + line-height: 1.5em; + + /* Align the site title with the article title */ + padding-top: 11px; +} + +/* Article title */ +article header h1 { + font-size: 30px; + margin: 0; +} + +/* Article subtitle */ +article header h4 { + font-size: 18px; + opacity: 0.6; + padding: 0px 0 8px 0; +} + +/* + * Menu (left side) + */ +.menu-lang { + padding-right: 28px; +} + +.menu-head, .menu-link-list a, .menu-head:hover, .menu-link-list a:hover { + display: block; + text-decoration: none !important; + cursor: pointer; + border-right: 2px solid transparent; +} + +.menu-head.active, .menu-link-list a.active { + border-right: 2px solid var(--active-menu-border-color); + background: var(--active-menu-background-color); + color: var(--active-menu-color); +} + +.menu-head:hover, .menu-link-list a:hover { + border-right: 2px solid var(--hover-menu-border-color); + background: var(--hover-menu-background-color); + color: var(--hover-menu-color); +} + +.menu-footer { + padding: 20px 30px 0 20px; + font-size: 12px; +} + +.menu-head { + padding: 30px 28px 30px 20px; + margin-bottom: 10px; + color: var(--main-text-color); +} + +.menu-title { + --menu-title-size: 30px; + font-size: var(--menu-title-size); + line-height: calc(var(--menu-title-size) * 1.4); +} + +.menu-subtitle { + margin-top: 8px; + font-size: 18px; +} + + +.menu-link-list { + flex-grow: 1; +} + +.menu-link-list a { + font-size: 20px; + margin-bottom: 10px; + padding: 8px 28px 8px 30px; + color: var(--main-text-color); +} + +.menu-content { + position: fixed; + top: 0; + height: 100vh; + width: var(--menu-container-width); + text-align: right; + font-family: var(--sans-preferred-font-list); + padding: 20px 0 50px 0; + display: flex; + flex-direction: column; + justify-content: space-between; + + /* Below the hamburger menu but on top of the overlay */ + z-index: 253; +} + +/* + * Hamburger menu + */ +.menu input.hamburger-menu { + display: block; + width: 80px; + height: 72px; + position: fixed; + top: 0px; + left: 0px; + margin: 0; + + cursor: pointer; + + opacity: 0; /* hide this */ + z-index: 255; /* and place it over the hamburger */ + + -webkit-touch-callout: none; +} + +/* + * Draw the hamburger + */ +.menu div.hamburger-menu { + width: 32px; + height: 4px; + position: fixed; + left: 24px; + + background: var(--main-text-color); + border-radius: 3px; + + z-index: 254; + + transform-origin: center; + transition: transform 0.5s cubic-bezier(0.77,0.2,0.05,1.0), + opacity 0.55s ease; +} + +.menu div.hamburger-menu:nth-child(2) { + top: 25px; +} + +.menu div.hamburger-menu:nth-child(3) { + top: 34px; +} + +.menu div.hamburger-menu:nth-child(4) { + top: 43px; +} + +/* Transform all the slices of hamburger into a crossmark. */ +.menu input.hamburger-menu:checked ~ div.hamburger-menu:nth-child(2) { + opacity: 1; + transform: translate(0, 9px) rotate(45deg); +} + +/* But let's hide the middle one. */ +.menu input.hamburger-menu:checked ~ div.hamburger-menu:nth-child(3) { + opacity: 0; + transform: rotate(0deg) scale(0.2, 0.2); +} + +/* And the last one should go the other direction */ +.menu input.hamburger-menu:checked ~ div.hamburger-menu:nth-child(4) { + transform: translate(0, -9px) rotate(-45deg); +} + +/* On mobile browsers, keep a title displayed on top */ +.menu .mobile-title { + padding: 20px 80px 20px 80px; + margin: 0; + width: 100%; + height: 80px; + line-height: 40px; /* line-height = height - padding-top - padding-bottom */ + text-align: center; + font-size: calc(var(--heading1-size) - 3 * var(--heading-diff)); + font-weight: bold; + position: fixed; + box-shadow: 0 0 16px rgba(0, 0, 0, 0.12); + background-color: var(--main-background-color); +} + +/* But hide them by default. They will be uncovered when needed by media queries */ +.menu .hamburger-menu, .menu .mobile-title { + display: none; +} + +/* + * Toolbar (right side) + */ +.toolbar { + position: fixed; + top: 0; + right: 0; + width: var(--toolbar-container-width); + font-family: var(--sans-preferred-font-list); + display: flex; + flex-direction: column; + justify-content: flex-end; +} + +.actions { + position: fixed; + bottom: 0; + display: flex; + flex-direction: row; + margin-bottom: 50px; + margin-left: 30px; +} + +.actions .action { + display: flex; + flex-direction: column; + cursor: pointer; + margin-right: 10px; +} + +.actions a { + text-decoration: none; + color: var(--main-text-color); +} + +.actions a:visited { + color: var(--main-text-color); +} + +.actions .material-icons { + height: 2rem; + width: auto; +} + +/* + * Search page + */ +.search input { + width: 100%; +} + +@media screen { + /* + * Main part of the page (center) + * + * Enclosed in @media screen block because this style is not desired for + * printing. + */ + main { + padding-left: var(--menu-container-width); + padding-right: var(--toolbar-container-width); + width: 100%; + + min-height: 100vh; + } + + /* Immediate children of main gets a left/right shadow */ + main > * { + box-shadow: 0 0 16px rgba(0, 0, 0, 0.12); + min-height: 100vh; + } +} + +/* + * Table of content (within the toolbar on the right) + */ +.toc { + float: right; + border-radius: 5px; + margin-left: 30px; + margin-right: 60px; + margin-top: 30px; + max-width: 260px; + max-height: 80vh; + overflow: auto; + background: var(--toc-background-color); + padding: 20px; + font-size: 16px; +} + +.toc ul { + list-style: none; + padding: 0; + margin: 0; + line-height: 1.7em; +} + +.toc h4 { + text-align: center; + margin: 0 0 10px 0; +} + +/* Mathjax container */ +mjx-container { + overflow-y: hidden !important; +} + +/* + * Reactive tweaks + */ +@media screen and (max-width: 1440px) { + :root { + --menu-container-width: 20%; + } +} + +@media screen and (max-width: 1280px) { + .toc { + display: none; + } + :root { + --toolbar-container-width: 5%; + } +} + +@media screen and (max-width: 1140px) { + article { + padding: 30px 20px 20px 20px; + } + + main { + padding: 0; + min-height: unset; + } + + .toolbar { + display: none; + } + + .toc { + line-height: 2em; + float: none; + margin-top: 30px; + margin-left: 0; + margin-right: 0; + } + + /* + * On mobile devices, there are no :hover events. So we must always + * propose horizontal scrollbars when needed. + */ + pre { + overflow-x: auto; + } + + .menu .hamburger-menu, .menu .mobile-title { + display: block; + } + + /* + * On mobile, leave some room above the article so that the title + hamburger + * menu do not hide the article title. + */ + main > *:first-child { + padding-top: 110px; + } + + .menu .menu-content { + width: 300px; + left: -300px; + height: 100vh; + background-color: var(--main-background-color); + position: fixed; + transform: none; + transition: transform 0.2s linear; + } + + .menu .menu-overlay { + display: block; + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + transition: background-color 0.2s linear; + + /* + * Put the overlay on the bottom of the stack so that it does not catch + * click events. + */ + z-index: -1; + } + + + /* + * When the hamburger menu is clicked, show the menu content and enable + * the overlay that hides the article content. + */ + .menu input.hamburger-menu:checked ~ .menu-content { + transform: translate(300px, 0); + } + + .menu input.hamburger-menu:checked ~ .menu-overlay { + /* Semi transparent background */ + background-color: rgba(0, 0, 0, 0.5); + + /* Below the hamburger menu, the menu content but over the article content */ + z-index: 250; + } + + /* + * Leave some room between the list items in the term pages so that it is + * easier to click on mobile. Also makes Google happy. + */ + .terms ul li { + line-height: 2em; + } +} + +@media screen and (max-width: 512px) { + /* + * On mobile, hide some post metadata + */ + .post-metadata .opensource, .post-metadata .topic, .post-metadata .reading-time { + display: none; + } +} + +/* + * Tweaks for printing + */ +@media print { + .menu, .menu-content, .hamburger-menu, .toolbar { + display: none !important; + } + + /* Since you cannot scroll horizontally on a paper, wrap the code blocks */ + pre { + white-space: pre-wrap; + word-break: break-all; + word-wrap: break-word; + } +} \ No newline at end of file diff --git a/themes/itix/i18n/en.yaml b/themes/itix/i18n/en.yaml new file mode 100644 index 0000000..c9751f4 --- /dev/null +++ b/themes/itix/i18n/en.yaml @@ -0,0 +1,42 @@ +- id: last_modify_on + translation: Last modified on +- id: published_on + translation: Published on +- id: date_format + translation: "January 2, 2006" +- id: toc + translation: Table of contents +- id: back_to_top + translation: Top of the page +- id: minutes + translation: + one: '{{ .Count }} minute' + other: '{{ .Count }} minutes' +- id: continue_reading + translation: Continue reading +- id: articles_related_to + translation: Articles related to +- id: recent_articles + translation: Recent articles +- id: not_found + translation: This page does not exist! +- id: go_home + translation: Go Home +- id: search + translation: Search +- id: search_here + translation: Search something... +- id: type_blog + translation: Article +- id: type_writing + translation: Writing +- id: type_speaking + translation: Speaking +- id: type_page + translation: Misc. +- id: show_menu + translation: Show the menu +- id: file + translation: 'File "%s"' +- id: rss_feed + translation: 'RSS Feed' diff --git a/themes/itix/i18n/fr.yaml b/themes/itix/i18n/fr.yaml new file mode 100644 index 0000000..97f4d90 --- /dev/null +++ b/themes/itix/i18n/fr.yaml @@ -0,0 +1,42 @@ +- id: last_modify_on + translation: Dernière modification le +- id: published_on + translation: Publié le +- id: date_format + translation: "02/01/2006" +- id: toc + translation: Sommaire +- id: back_to_top + translation: Retour en haut de la page +- id: minutes + translation: + one: '{{ .Count }} minute' + other: '{{ .Count }} minutes' +- id: continue_reading + translation: Continuer la lecture +- id: articles_related_to + translation: Articles concernant +- id: recent_articles + translation: Articles récents +- id: not_found + translation: Cette page n'existe pas ! +- id: go_home + translation: Retour à la page d'accueil +- id: search + translation: Recherche +- id: search_here + translation: Rechercher quelque chose... +- id: type_blog + translation: Article +- id: type_writing + translation: Publication +- id: type_speaking + translation: Conférence +- id: type_page + translation: Divers +- id: show_menu + translation: Afficher le menu +- id: file + translation: 'Fichier "%s"' +- id: rss_feed + translation: 'Flux RSS' diff --git a/themes/itix/layouts/404.html b/themes/itix/layouts/404.html new file mode 100644 index 0000000..a1f13c8 --- /dev/null +++ b/themes/itix/layouts/404.html @@ -0,0 +1,9 @@ +{{ define "main" }} + +
+
+

{{ i18n "not_found" }}

+
+

{{ i18n "go_home" }}

+
+{{ end }} diff --git a/themes/itix/layouts/_default/baseof.html b/themes/itix/layouts/_default/baseof.html new file mode 100644 index 0000000..7e439ca --- /dev/null +++ b/themes/itix/layouts/_default/baseof.html @@ -0,0 +1,14 @@ + + + +{{ partial "head.html" . }} + + + +{{ partial "menu.html" . }} +{{ partial "toolbar.html" . }} +
+{{ block "main" . }}{{- end }} +
+ + diff --git a/themes/itix/layouts/_default/search.html b/themes/itix/layouts/_default/search.html new file mode 100644 index 0000000..6793f86 --- /dev/null +++ b/themes/itix/layouts/_default/search.html @@ -0,0 +1,214 @@ +{{ define "main" }} + +
+
+

{{ .Title }}

+ {{- with .Description }} +

{{ . }}

+ {{- end }} +
+ {{ .Content }} + +
+
+ + +
+{{ end }} diff --git a/themes/itix/layouts/_default/section.html b/themes/itix/layouts/_default/section.html new file mode 100644 index 0000000..38234e3 --- /dev/null +++ b/themes/itix/layouts/_default/section.html @@ -0,0 +1,14 @@ +{{ define "main" }} + +
+
+

{{ .Title }}

+
+ {{ .Content }} + +
+{{ end }} diff --git a/themes/itix/layouts/_default/single.html b/themes/itix/layouts/_default/single.html new file mode 100644 index 0000000..264d86e --- /dev/null +++ b/themes/itix/layouts/_default/single.html @@ -0,0 +1,18 @@ +{{ define "main" }} + +{{- partial "lang-detection.html" . -}} +
+
+

{{ .Title }}

+ {{- with .Description }} +

{{ . }}

+ {{- end }} + {{ partial "post-metadata.html" (dict "current" . "parent" .) -}} +
+ {{ .Content }} + {{- if and (not .Lastmod.IsZero) (ne .Lastmod .PublishDate) }} +
+

{{ i18n "last_modify_on" }} {{ .Lastmod.Format (i18n "date_format") }}

+ {{- end }} +
+{{ end }} diff --git a/themes/itix/layouts/_default/taxonomy.html b/themes/itix/layouts/_default/taxonomy.html new file mode 100644 index 0000000..4b2a3c1 --- /dev/null +++ b/themes/itix/layouts/_default/taxonomy.html @@ -0,0 +1,14 @@ +{{ define "main" }} + +
+
+

{{ .Title }}

+
+ {{ i18n "articles_related_to" }} {{.Parent.Title}} / {{ .Title }}: + {{ .Content }} + {{ range (.Paginate (sort .Pages "Date").Reverse).Pages }} + {{- partial "article-headline.html" (dict "current" . "parent" $.Page) -}} + {{ end }} + {{ template "_internal/pagination.html" . }} +
+{{ end }} diff --git a/themes/itix/layouts/_default/terms.html b/themes/itix/layouts/_default/terms.html new file mode 100644 index 0000000..5fd4900 --- /dev/null +++ b/themes/itix/layouts/_default/terms.html @@ -0,0 +1,14 @@ +{{ define "main" }} + +
+
+

{{ .Title }}

+
+ {{ .Content }} + +
+{{ end }} diff --git a/themes/itix/layouts/blog/list.html b/themes/itix/layouts/blog/list.html new file mode 100644 index 0000000..f52eb5d --- /dev/null +++ b/themes/itix/layouts/blog/list.html @@ -0,0 +1,14 @@ +{{ define "main" }} + +
+
+

Articles

+
+ {{ .Content }} + + {{ range (.Paginate (sort .Pages "Date").Reverse).Pages }} + {{- partial "article-headline.html" (dict "current" . "parent" $.Page) -}} + {{ end }} + {{ template "_internal/pagination.html" . }} +
+{{ end }} diff --git a/themes/itix/layouts/index.html b/themes/itix/layouts/index.html new file mode 100644 index 0000000..55c23bf --- /dev/null +++ b/themes/itix/layouts/index.html @@ -0,0 +1,24 @@ +{{ define "main" }} + +
+
+ + {{ .Content }} +
+
+
+

{{ i18n "recent_articles" }}

+
+ {{ range first 5 (sort ((.Site.GetPage "/blog").Pages) "Date").Reverse }} + {{- partial "article-headline.html" (dict "current" . "parent" $.Page) -}} + {{ end }} +
+
+{{ end }} \ No newline at end of file diff --git a/themes/itix/layouts/partials/article-headline.html b/themes/itix/layouts/partials/article-headline.html new file mode 100644 index 0000000..84dda21 --- /dev/null +++ b/themes/itix/layouts/partials/article-headline.html @@ -0,0 +1,11 @@ + +
+

{{ .current.Title }} +{{- partial "lang-detection.html" .current -}} +{{ if .current.Scratch.Get "en_article_in_fr_site" }} +{{- partial "icons/en.svg" . -}} +{{ end }} +

+{{- partial "post-metadata.html" . -}} +

{{ .current.Summary | plainify | htmlUnescape }} {{ i18n "continue_reading" }}

+
\ No newline at end of file diff --git a/themes/itix/layouts/partials/head.html b/themes/itix/layouts/partials/head.html new file mode 100644 index 0000000..9721db1 --- /dev/null +++ b/themes/itix/layouts/partials/head.html @@ -0,0 +1,146 @@ + +{{.Title}} + + + +{{ $chroma := resources.Get "css/chroma.css" }} +{{ $itix := resources.Get "css/itix.css" }} +{{ $css := slice $chroma $itix | resources.Concat "css/itix.css" | resources.Minify | resources.Fingerprint "sha512" }} + + + + + + + + + + + + + +{{- if .IsHome }} +{{- with .Site.Params.description }} + +{{- else }} + +{{- end }} +{{- else }} +{{- with .Params.description }} + +{{- else }} + +{{- end }} +{{- end }} + + +{{ with .OutputFormats.Get "rss" -}} + {{ printf `` .Rel .MediaType.Type .Permalink site.Title | safeHTML }} +{{ end }} + + + + + + + +{{ template "_internal/opengraph.html" . }} +{{ template "_internal/twitter_cards.html" . }} + + +{{ if eq .Type "search" }} + + +{{ end }} + +{{- if .Site.Params.enablePlausible -}} + +{{- end -}} + +{{- if .Params.enableMathJax -}} + {{- partial "mathjax.html" . -}} +{{- end -}} + + +{{- partial "lang-detection.html" . -}} +{{- if .IsTranslated -}} +{{- range .Translations -}} +{{- if .Scratch.Get "en_article_in_fr_site" -}} + + + +{{ else }} + + +{{ end -}} +{{- end -}} +{{- end -}} + + +{{- if .IsHome -}} + {{- $.Scratch.Set "structured_data" (dict "@context" "http://schema.org" "@type" "WebSite" "name" .Site.Title "url" .Site.BaseURL) -}} + {{- with .Site.Params.subtitle -}} + {{- $.Scratch.SetInMap "structured_data" "description" . -}} + {{- end -}} +{{- else if and .IsPage (eq .Section "blog") -}} + {{- $.Scratch.Set "structured_data" (dict "@context" "http://schema.org" "@type" "BlogPosting" "headline" .Title "image" (slice) "articleSection" .Section) -}} + {{- if and (eq .Lang "fr") (.Scratch.Get "en_article_in_fr_site") -}} + {{- $.Scratch.SetInMap "structured_data" "inLanguage" "en" -}} + {{- range first 1 .Translations -}} + {{- $.Scratch.SetInMap "structured_data" "mainEntityOfPage" (dict "@type" "WebPage" "@id" .Permalink) -}} + {{- end -}} + {{- else -}} + {{- $.Scratch.SetInMap "structured_data" "inLanguage" .Language.Lang -}} + {{- $.Scratch.SetInMap "structured_data" "mainEntityOfPage" (dict "@type" "WebPage" "@id" .Permalink) -}} + {{- end -}} + {{- if not .PublishDate.IsZero -}} + {{- $.Scratch.SetInMap "structured_data" "datePublished" .PublishDate -}} + {{- end -}} + {{- if and (not .Lastmod.IsZero) (ne .Lastmod .PublishDate) -}} + {{- $.Scratch.SetInMap "structured_data" "dateModified" .Lastmod -}} + {{- end -}} +{{- end -}} +{{- with $.Scratch.Get "structured_data" }} + +{{- end }} + + diff --git a/themes/itix/layouts/partials/icons/en.svg b/themes/itix/layouts/partials/icons/en.svg new file mode 100644 index 0000000..fb59cf0 --- /dev/null +++ b/themes/itix/layouts/partials/icons/en.svg @@ -0,0 +1,16 @@ + +British flag + + + + + + + + + + + + + + \ No newline at end of file diff --git a/themes/itix/layouts/partials/icons/fr.svg b/themes/itix/layouts/partials/icons/fr.svg new file mode 100644 index 0000000..34f2b8d --- /dev/null +++ b/themes/itix/layouts/partials/icons/fr.svg @@ -0,0 +1,6 @@ + +French flag + + + + \ No newline at end of file diff --git a/themes/itix/layouts/partials/icons/label.svg b/themes/itix/layouts/partials/icons/label.svg new file mode 100644 index 0000000..631f681 --- /dev/null +++ b/themes/itix/layouts/partials/icons/label.svg @@ -0,0 +1,5 @@ + +label + + + \ No newline at end of file diff --git a/themes/itix/layouts/partials/icons/link.svg b/themes/itix/layouts/partials/icons/link.svg new file mode 100644 index 0000000..4b9f27d --- /dev/null +++ b/themes/itix/layouts/partials/icons/link.svg @@ -0,0 +1,5 @@ + +link + + + \ No newline at end of file diff --git a/themes/itix/layouts/partials/icons/rss_feed.svg b/themes/itix/layouts/partials/icons/rss_feed.svg new file mode 100644 index 0000000..310edb1 --- /dev/null +++ b/themes/itix/layouts/partials/icons/rss_feed.svg @@ -0,0 +1,6 @@ + +rss_feed + + + + \ No newline at end of file diff --git a/themes/itix/layouts/partials/icons/schedule.svg b/themes/itix/layouts/partials/icons/schedule.svg new file mode 100644 index 0000000..f61f578 --- /dev/null +++ b/themes/itix/layouts/partials/icons/schedule.svg @@ -0,0 +1,6 @@ + +schedule + + + + \ No newline at end of file diff --git a/themes/itix/layouts/partials/icons/search.svg b/themes/itix/layouts/partials/icons/search.svg new file mode 100644 index 0000000..f57f43a --- /dev/null +++ b/themes/itix/layouts/partials/icons/search.svg @@ -0,0 +1,5 @@ + +search + + + \ No newline at end of file diff --git a/themes/itix/layouts/partials/icons/vertical_align_top.svg b/themes/itix/layouts/partials/icons/vertical_align_top.svg new file mode 100644 index 0000000..06fdf5b --- /dev/null +++ b/themes/itix/layouts/partials/icons/vertical_align_top.svg @@ -0,0 +1,5 @@ + +back to top + + + \ No newline at end of file diff --git a/themes/itix/layouts/partials/lang-detection.html b/themes/itix/layouts/partials/lang-detection.html new file mode 100644 index 0000000..a196a20 --- /dev/null +++ b/themes/itix/layouts/partials/lang-detection.html @@ -0,0 +1,15 @@ +{{ if and .IsTranslated (eq .Lang "fr") }} + + {{ if and (index .AllTranslations 0).File (index .AllTranslations 1).File }} + {{ $file0 := readFile (index .AllTranslations 0).File.Filename }} + {{ $file1 := readFile (index .AllTranslations 1).File.Filename }} + {{ if eq (sha256 $file0) (sha256 $file1) }} + {{ .Scratch.Set "en_article_in_fr_site" true }} + {{ end }} + {{ else }} + + {{ if eq (index .AllTranslations 0).Plain (index .AllTranslations 1).Plain }} + {{ .Scratch.Set "en_article_in_fr_site" true }} + {{ end }} + {{ end }} +{{ end }} diff --git a/themes/itix/layouts/partials/mathjax.html b/themes/itix/layouts/partials/mathjax.html new file mode 100644 index 0000000..143f716 --- /dev/null +++ b/themes/itix/layouts/partials/mathjax.html @@ -0,0 +1,36 @@ + + + + + + + diff --git a/themes/itix/layouts/partials/menu.html b/themes/itix/layouts/partials/menu.html new file mode 100644 index 0000000..3e7c269 --- /dev/null +++ b/themes/itix/layouts/partials/menu.html @@ -0,0 +1,65 @@ + + diff --git a/themes/itix/layouts/partials/post-metadata.html b/themes/itix/layouts/partials/post-metadata.html new file mode 100644 index 0000000..49a1e72 --- /dev/null +++ b/themes/itix/layouts/partials/post-metadata.html @@ -0,0 +1,43 @@ +
+ + {{- with .current.PublishDate }} + + {{ i18n "published_on" }} + + + {{- end }} + + + {{ range .current.Params.topics -}} + + {{- if or (not $.parent.Data.topic) (ne . $.parent.Data.Term) }} + + {{- partial "icons/link.svg" . -}}{{ . }} + + {{- end -}} + {{- end }} + + + {{ range .current.Params.opensource -}} + + {{- if or (not $.parent.Data.opensource) (ne . $.parent.Data.Term) }} + + {{- partial "icons/label.svg" . -}}{{ . }} + + {{- end -}} + {{- end }} + + + {{- if eq .current.Type "blog" }} + + {{- partial "icons/schedule.svg" . -}} + {{- $minutes := .current.ReadingTime -}} + {{- if gt $minutes 0 -}} + {{- i18n "minutes" $minutes -}} + {{- end -}} + + {{- end }} +
diff --git a/themes/itix/layouts/partials/toolbar.html b/themes/itix/layouts/partials/toolbar.html new file mode 100644 index 0000000..3d7e10d --- /dev/null +++ b/themes/itix/layouts/partials/toolbar.html @@ -0,0 +1,23 @@ + diff --git a/themes/itix/layouts/shortcodes/highlightFile.html b/themes/itix/layouts/shortcodes/highlightFile.html new file mode 100644 index 0000000..80c7e10 --- /dev/null +++ b/themes/itix/layouts/shortcodes/highlightFile.html @@ -0,0 +1,7 @@ + +
+{{- with .Get 0 -}} +
{{ printf (i18n "file") . | safeHTML }}
+{{- end -}} +{{- highlight (trim .Inner "\n") (.Get 1) (.Get 2) -}} +
\ No newline at end of file diff --git a/themes/itix/layouts/shortcodes/highlightWithTitle.html b/themes/itix/layouts/shortcodes/highlightWithTitle.html new file mode 100644 index 0000000..5cf49e9 --- /dev/null +++ b/themes/itix/layouts/shortcodes/highlightWithTitle.html @@ -0,0 +1,7 @@ + +
+{{- with .Get 0 -}} +
{{ . | safeHTML }}
+{{- end -}} +{{- highlight (trim .Inner "\n") (.Get 1) (.Get 2) -}} +
\ No newline at end of file diff --git a/themes/itix/layouts/shortcodes/internalLink.html b/themes/itix/layouts/shortcodes/internalLink.html new file mode 100644 index 0000000..0c0891d --- /dev/null +++ b/themes/itix/layouts/shortcodes/internalLink.html @@ -0,0 +1,31 @@ + +{{ $path := .Get "path" }} +{{ $currentLang := .Page.Lang }} +{{ $title := .Get "title" }} +{{ $sites := .Page.Sites }} +{{ if ne $currentLang (index .Page.Sites 0).Language.Lang }} +{{ $sites = collections.Reverse .Page.Sites }} +{{ end }} +{{ range $sites }} +{{ with .GetPage $path }} + +{{ if ne $title "" }} +{{ $title }} +{{ else }} +{{ .Title }} +{{ end }} + +{{ if and (eq $currentLang "en") (eq .Lang "fr") }} +{{- partial "icons/fr.svg" . -}} +{{ end }} +{{ if (eq $currentLang "fr") }} +{{- partial "lang-detection.html" . -}} +{{ if .Scratch.Get "en_article_in_fr_site" }} +{{- partial "icons/en.svg" . -}} +{{ end }} +{{ end }} +{{ break }} +{{ end }} +{{ end }} diff --git a/themes/itix/layouts/speaking/list.html b/themes/itix/layouts/speaking/list.html new file mode 100644 index 0000000..7903829 --- /dev/null +++ b/themes/itix/layouts/speaking/list.html @@ -0,0 +1,14 @@ +{{ define "main" }} + +
+
+

{{ .Title }}

+
+ {{ .Content }} + +
+{{ end }} diff --git a/themes/itix/layouts/writing/list.html b/themes/itix/layouts/writing/list.html new file mode 100644 index 0000000..5860145 --- /dev/null +++ b/themes/itix/layouts/writing/list.html @@ -0,0 +1,14 @@ +{{ define "main" }} + +
+
+

{{ .Title }}

+
+ {{ .Content }} + +
+{{ end }} diff --git a/themes/itix/static/fonts/JetBrainsMono-Regular.ttf b/themes/itix/static/fonts/JetBrainsMono-Regular.ttf new file mode 100644 index 0000000..b06b6e2 Binary files /dev/null and b/themes/itix/static/fonts/JetBrainsMono-Regular.ttf differ diff --git a/themes/itix/static/fonts/JetBrainsMono-Regular.woff b/themes/itix/static/fonts/JetBrainsMono-Regular.woff new file mode 100644 index 0000000..8d0c65f Binary files /dev/null and b/themes/itix/static/fonts/JetBrainsMono-Regular.woff differ diff --git a/themes/itix/static/fonts/JetBrainsMono-Regular.woff2 b/themes/itix/static/fonts/JetBrainsMono-Regular.woff2 new file mode 100644 index 0000000..124f414 Binary files /dev/null and b/themes/itix/static/fonts/JetBrainsMono-Regular.woff2 differ diff --git a/themes/itix/static/fonts/SourceSansPro-Regular.ttf b/themes/itix/static/fonts/SourceSansPro-Regular.ttf new file mode 100644 index 0000000..b422bf4 Binary files /dev/null and b/themes/itix/static/fonts/SourceSansPro-Regular.ttf differ diff --git a/themes/itix/static/fonts/SourceSerifPro-Regular.ttf b/themes/itix/static/fonts/SourceSerifPro-Regular.ttf new file mode 100644 index 0000000..e6c5dff Binary files /dev/null and b/themes/itix/static/fonts/SourceSerifPro-Regular.ttf differ diff --git a/themes/itix/static/fonts/material-icons.ttf b/themes/itix/static/fonts/material-icons.ttf new file mode 100644 index 0000000..a7c4999 Binary files /dev/null and b/themes/itix/static/fonts/material-icons.ttf differ diff --git a/themes/itix/static/fonts/material-icons.woff2 b/themes/itix/static/fonts/material-icons.woff2 new file mode 100644 index 0000000..84084a5 Binary files /dev/null and b/themes/itix/static/fonts/material-icons.woff2 differ diff --git a/themes/itix/static/js/fuse.js b/themes/itix/static/js/fuse.js new file mode 100644 index 0000000..dabc9fb --- /dev/null +++ b/themes/itix/static/js/fuse.js @@ -0,0 +1,9 @@ +/** + * Fuse.js v6.4.3 - Lightweight fuzzy-search (http://fusejs.io) + * + * Copyright (c) 2020 Kiro Risk (http://kiro.me) + * All Rights Reserved. Apache Software License 2.0 + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +var e,t;e=this,t=function(){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:3,t=new Map;return{get:function(n){var r=n.match(w).length;if(t.has(r))return t.get(r);var i=parseFloat((1/Math.sqrt(r)).toFixed(e));return t.set(r,i),i},clear:function(){t.clear()}}}var _=function(){function e(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=n.getFn,i=void 0===r?x.getFn:r;t(this,e),this.norm=L(3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return r(e,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,u(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();u(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?x.getFn:r,o=new _({getFn:i});return o.setKeys(e.map(b)),o.setSources(t),o.create(),o}function O(e,t){var n=e.matches;t.matches=[],f(n)&&n.forEach((function(e){if(f(e.indices)&&e.indices.length){var n={indices:e.indices,value:e.value};e.key&&(n.key=e.key.src),e.idx>-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function A(e,t){t.score=e.score}function j(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,o=void 0===i?0:i,c=t.expectedLocation,a=void 0===c?0:c,s=t.distance,h=void 0===s?x.distance:s,u=t.ignoreLocation,l=void 0===u?x.ignoreLocation:u,d=r/e.length;if(l)return d;var f=Math.abs(a-o);return h?d+f/h:f?1:d}function E(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:x.minMatchCharLength,n=[],r=-1,i=-1,o=0,c=e.length;o=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}function I(e){for(var t={},n=0,r=e.length;n1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,c=void 0===o?x.location:o,a=i.threshold,s=void 0===a?x.threshold:a,h=i.distance,u=void 0===h?x.distance:h,l=i.includeMatches,d=void 0===l?x.includeMatches:l,f=i.findAllMatches,v=void 0===f?x.findAllMatches:f,y=i.minMatchCharLength,g=void 0===y?x.minMatchCharLength:y,p=i.isCaseSensitive,m=void 0===p?x.isCaseSensitive:p,b=i.ignoreLocation,k=void 0===b?x.ignoreLocation:b;if(t(this,e),this.options={location:c,threshold:s,distance:u,includeMatches:d,findAllMatches:v,minMatchCharLength:g,isCaseSensitive:m,ignoreLocation:k},this.pattern=m?n:n.toLowerCase(),this.chunks=[],this.pattern.length){var M=function(e,t){r.chunks.push({pattern:e,alphabet:I(e),startIndex:t})},w=this.pattern.length;if(w>32){for(var L=0,_=w%32,S=w-_;L3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?x.location:i,c=r.distance,a=void 0===c?x.distance:c,s=r.threshold,h=void 0===s?x.threshold:s,u=r.findAllMatches,l=void 0===u?x.findAllMatches:u,d=r.minMatchCharLength,f=void 0===d?x.minMatchCharLength:d,v=r.includeMatches,y=void 0===v?x.includeMatches:v,p=r.ignoreLocation,m=void 0===p?x.ignoreLocation:p;if(t.length>32)throw new Error(g(32));for(var b,k=t.length,M=e.length,w=Math.max(0,Math.min(o,M)),L=h,_=w,S=f>1||y,O=S?Array(M):[];(b=e.indexOf(t,_))>-1;){var A=j(t,{currentLocation:b,expectedLocation:w,distance:a,ignoreLocation:m});if(L=Math.min(A,L),_=b+k,S)for(var I=0;I=J;U-=1){var q=U-1,B=n[e.charAt(q)];if(S&&(O[q]=+!!B),T[U]=(T[U+1]<<1|1)&B,$&&(T[U]|=(F[U+1]|F[U])<<1|1|F[U+1]),T[U]&N&&(C=j(t,{errors:$,currentLocation:q,expectedLocation:w,distance:a,ignoreLocation:m}))<=L){if(L=C,(_=q)<=w)break;J=Math.max(1,2*w-_)}}var V=j(t,{errors:$+1,currentLocation:w,expectedLocation:w,distance:a,ignoreLocation:m});if(V>L)break;F=T}var G={isMatch:_>=0,score:Math.max(.001,C)};if(S){var H=E(O,f);H.length?y&&(G.indices=H):G.isMatch=!1}return G}(e,n,i,{location:c+o,distance:s,threshold:h,findAllMatches:u,minMatchCharLength:l,includeMatches:r,ignoreLocation:d}),m=p.isMatch,b=p.score,k=p.indices;m&&(y=!0),v+=b,m&&k&&(f=[].concat(a(f),a(k)))}));var p={isMatch:y,score:y?v/this.chunks.length:1};return y&&r&&(p.indices=f),p}}]),e}(),C=[];function P(e,t){for(var n=0,r=C.length;n1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2?arguments[2]:void 0;if(t(this,e),this.options=c({},x,{},r),this.options.useExtendedSearch)throw new Error("Extended search is not available");this._keyStore=new m(this.options.keys),this.setCollection(n,i)}return r(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof _))throw new Error("Incorrect 'index' type");this._myIndex=t||S(this.options.keys,this._docs,{getFn:this.options.getFn})}},{key:"add",value:function(e){f(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n1&&void 0!==arguments[1]?arguments[1]:{},n=t.limit,r=void 0===n?-1:n,i=this.options,o=i.includeMatches,c=i.includeScore,a=i.shouldSort,s=i.sortFn,h=i.ignoreFieldNorm,d=u(e)?u(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return $(d,{ignoreFieldNorm:h}),a&&d.sort(s),l(r)&&r>-1&&(d=d.slice(0,r)),D(d,this._docs,{includeMatches:o,includeScore:c})}},{key:"_searchStringList",value:function(e){var t=P(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(f(n)){var c=t.searchIn(n),a=c.isMatch,s=c.score,h=c.indices;a&&r.push({item:n,idx:i,matches:[{score:s,value:n,norm:o,indices:h}]})}})),r}},{key:"_searchLogical",value:function(e){throw new Error("Logical search is not available")}},{key:"_searchObjectList",value:function(e){var t=this,n=P(e,this.options),r=this._myIndex,i=r.keys,o=r.records,c=[];return o.forEach((function(e){var r=e.$,o=e.i;if(f(r)){var s=[];i.forEach((function(e,i){s.push.apply(s,a(t._findMatches({key:e,value:r[i],searcher:n})))})),s.length&&c.push({idx:o,item:r,matches:s})}})),c}},{key:"_findMatches",value:function(e){var t=e.key,n=e.value,r=e.searcher;if(!f(n))return[];var i=[];if(h(n))n.forEach((function(e){var n=e.v,o=e.i,c=e.n;if(f(n)){var a=r.searchIn(n),s=a.isMatch,h=a.score,u=a.indices;s&&i.push({score:h,key:t,value:n,idx:o,norm:c,indices:u})}}));else{var o=n.v,c=n.n,a=r.searchIn(o),s=a.isMatch,u=a.score,l=a.indices;s&&i.push({score:u,key:t,value:o,norm:c,indices:l})}return i}}]),e}();function $(e,t){var n=t.ignoreFieldNorm,r=void 0===n?x.ignoreFieldNorm:n;e.forEach((function(e){var t=1;e.matches.forEach((function(e){var n=e.key,i=e.norm,o=e.score,c=n?n.weight:null;t*=Math.pow(0===o&&c?Number.EPSILON:o,(c||1)*(r?1:i))})),e.score=t}))}function D(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?x.includeMatches:r,o=n.includeScore,c=void 0===o?x.includeScore:o,a=[];return i&&a.push(O),c&&a.push(A),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return a.length&&a.forEach((function(t){t(e,r)})),r}))}return N.version="6.4.3",N.createIndex=S,N.parseIndex=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?x.getFn:n,i=e.keys,o=e.records,c=new _({getFn:r});return c.setKeys(i),c.setIndexRecords(o),c},N.config=x,N},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Fuse=t(); \ No newline at end of file diff --git a/themes/itix/theme.toml b/themes/itix/theme.toml new file mode 100644 index 0000000..c5214b5 --- /dev/null +++ b/themes/itix/theme.toml @@ -0,0 +1,19 @@ +name = "ITIX" +license = "MIT" +licenselink = "https://github.com/nmasse-itix/hugo-theme-itix/blob/master/LICENSE" +description = "Theme of my personal site: www.itix.fr" +homepage = "https://www.itix.fr/" +tags = ["blog"] +features = ["mobile","elegant"] +min_version = "0.59.0" + +[author] + name = "Nicolas Massé" + homepage = "https://www.itix.fr/" + + +# If porting an existing theme +[original] + name = "amazingrise" + homepage = "https://amazingrise.net/" + repo = "https://github.com/amazingrise/hugo-theme-diary"