first commit
7
.gitignore
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
files
|
||||
_posts
|
||||
images
|
||||
htmldoc
|
||||
htmldoc.md
|
||||
.jekyll-cache
|
||||
.jekyll-metadata
|
5
Gemfile
Normal file
@ -0,0 +1,5 @@
|
||||
source "https://rubygems.org"
|
||||
|
||||
# gem "github-pages", group: :jekyll_plugins
|
||||
gem "jekyll-text-theme"
|
||||
gem "sass-embedded", "1.76.0"
|
182
Gemfile.lock
Normal file
@ -0,0 +1,182 @@
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
activesupport (7.2.1.1)
|
||||
base64
|
||||
bigdecimal
|
||||
concurrent-ruby (~> 1.0, >= 1.3.1)
|
||||
connection_pool (>= 2.2.5)
|
||||
drb
|
||||
i18n (>= 1.6, < 2)
|
||||
logger (>= 1.4.2)
|
||||
minitest (>= 5.1)
|
||||
securerandom (>= 0.3)
|
||||
tzinfo (~> 2.0, >= 2.0.5)
|
||||
addressable (2.8.7)
|
||||
public_suffix (>= 2.0.2, < 7.0)
|
||||
base64 (0.2.0)
|
||||
bigdecimal (3.1.8)
|
||||
colorator (1.1.0)
|
||||
concurrent-ruby (1.3.4)
|
||||
connection_pool (2.4.1)
|
||||
drb (2.2.1)
|
||||
em-websocket (0.5.3)
|
||||
eventmachine (>= 0.12.9)
|
||||
http_parser.rb (~> 0)
|
||||
eventmachine (1.2.7)
|
||||
ffi (1.17.0-aarch64-linux-gnu)
|
||||
ffi (1.17.0-aarch64-linux-musl)
|
||||
ffi (1.17.0-arm-linux-gnu)
|
||||
ffi (1.17.0-arm-linux-musl)
|
||||
ffi (1.17.0-arm64-darwin)
|
||||
ffi (1.17.0-x86-linux-gnu)
|
||||
ffi (1.17.0-x86-linux-musl)
|
||||
ffi (1.17.0-x86_64-darwin)
|
||||
ffi (1.17.0-x86_64-linux-gnu)
|
||||
ffi (1.17.0-x86_64-linux-musl)
|
||||
forwardable-extended (2.6.0)
|
||||
gemoji (4.1.0)
|
||||
google-protobuf (4.28.2)
|
||||
bigdecimal
|
||||
rake (>= 13)
|
||||
google-protobuf (4.28.2-aarch64-linux)
|
||||
bigdecimal
|
||||
rake (>= 13)
|
||||
google-protobuf (4.28.2-arm64-darwin)
|
||||
bigdecimal
|
||||
rake (>= 13)
|
||||
google-protobuf (4.28.2-x86-linux)
|
||||
bigdecimal
|
||||
rake (>= 13)
|
||||
google-protobuf (4.28.2-x86_64-darwin)
|
||||
bigdecimal
|
||||
rake (>= 13)
|
||||
google-protobuf (4.28.2-x86_64-linux)
|
||||
bigdecimal
|
||||
rake (>= 13)
|
||||
html-pipeline (2.14.3)
|
||||
activesupport (>= 2)
|
||||
nokogiri (>= 1.4)
|
||||
http_parser.rb (0.8.0)
|
||||
i18n (1.14.6)
|
||||
concurrent-ruby (~> 1.0)
|
||||
jekyll (4.3.4)
|
||||
addressable (~> 2.4)
|
||||
colorator (~> 1.0)
|
||||
em-websocket (~> 0.5)
|
||||
i18n (~> 1.0)
|
||||
jekyll-sass-converter (>= 2.0, < 4.0)
|
||||
jekyll-watch (~> 2.0)
|
||||
kramdown (~> 2.3, >= 2.3.1)
|
||||
kramdown-parser-gfm (~> 1.0)
|
||||
liquid (~> 4.0)
|
||||
mercenary (>= 0.3.6, < 0.5)
|
||||
pathutil (~> 0.9)
|
||||
rouge (>= 3.0, < 5.0)
|
||||
safe_yaml (~> 1.0)
|
||||
terminal-table (>= 1.8, < 4.0)
|
||||
webrick (~> 1.7)
|
||||
jekyll-feed (0.17.0)
|
||||
jekyll (>= 3.7, < 5.0)
|
||||
jekyll-paginate (1.1.0)
|
||||
jekyll-sass-converter (3.0.0)
|
||||
sass-embedded (~> 1.54)
|
||||
jekyll-sitemap (1.4.0)
|
||||
jekyll (>= 3.7, < 5.0)
|
||||
jekyll-text-theme (2.2.6)
|
||||
jekyll (>= 3.6, < 5.0)
|
||||
jekyll-feed (~> 0.1)
|
||||
jekyll-paginate (~> 1.1)
|
||||
jekyll-sitemap (~> 1.0)
|
||||
jemoji (~> 0.8)
|
||||
jekyll-watch (2.2.1)
|
||||
listen (~> 3.0)
|
||||
jemoji (0.13.0)
|
||||
gemoji (>= 3, < 5)
|
||||
html-pipeline (~> 2.2)
|
||||
jekyll (>= 3.0, < 5.0)
|
||||
kramdown (2.4.0)
|
||||
rexml
|
||||
kramdown-parser-gfm (1.1.0)
|
||||
kramdown (~> 2.0)
|
||||
liquid (4.0.4)
|
||||
listen (3.9.0)
|
||||
rb-fsevent (~> 0.10, >= 0.10.3)
|
||||
rb-inotify (~> 0.9, >= 0.9.10)
|
||||
logger (1.6.1)
|
||||
mercenary (0.4.0)
|
||||
minitest (5.25.1)
|
||||
nokogiri (1.16.7-aarch64-linux)
|
||||
racc (~> 1.4)
|
||||
nokogiri (1.16.7-arm-linux)
|
||||
racc (~> 1.4)
|
||||
nokogiri (1.16.7-arm64-darwin)
|
||||
racc (~> 1.4)
|
||||
nokogiri (1.16.7-x86-linux)
|
||||
racc (~> 1.4)
|
||||
nokogiri (1.16.7-x86_64-darwin)
|
||||
racc (~> 1.4)
|
||||
nokogiri (1.16.7-x86_64-linux)
|
||||
racc (~> 1.4)
|
||||
pathutil (0.16.2)
|
||||
forwardable-extended (~> 2.6)
|
||||
public_suffix (6.0.1)
|
||||
racc (1.8.1)
|
||||
rake (13.2.1)
|
||||
rb-fsevent (0.11.2)
|
||||
rb-inotify (0.11.1)
|
||||
ffi (~> 1.0)
|
||||
rexml (3.3.8)
|
||||
rouge (4.4.0)
|
||||
safe_yaml (1.0.5)
|
||||
sass-embedded (1.76.0-aarch64-linux-gnu)
|
||||
google-protobuf (>= 3.25, < 5.0)
|
||||
sass-embedded (1.76.0-aarch64-linux-musl)
|
||||
google-protobuf (>= 3.25, < 5.0)
|
||||
sass-embedded (1.76.0-arm-linux-gnueabihf)
|
||||
google-protobuf (>= 3.25, < 5.0)
|
||||
sass-embedded (1.76.0-arm-linux-musleabihf)
|
||||
google-protobuf (>= 3.25, < 5.0)
|
||||
sass-embedded (1.76.0-arm64-darwin)
|
||||
google-protobuf (>= 3.25, < 5.0)
|
||||
sass-embedded (1.76.0-x86-linux-gnu)
|
||||
google-protobuf (>= 3.25, < 5.0)
|
||||
sass-embedded (1.76.0-x86-linux-musl)
|
||||
google-protobuf (>= 3.25, < 5.0)
|
||||
sass-embedded (1.76.0-x86_64-darwin)
|
||||
google-protobuf (>= 3.25, < 5.0)
|
||||
sass-embedded (1.76.0-x86_64-linux-gnu)
|
||||
google-protobuf (>= 3.25, < 5.0)
|
||||
sass-embedded (1.76.0-x86_64-linux-musl)
|
||||
google-protobuf (>= 3.25, < 5.0)
|
||||
securerandom (0.3.1)
|
||||
terminal-table (3.0.2)
|
||||
unicode-display_width (>= 1.1.1, < 3)
|
||||
tzinfo (2.0.6)
|
||||
concurrent-ruby (~> 1.0)
|
||||
unicode-display_width (2.6.0)
|
||||
webrick (1.8.2)
|
||||
|
||||
PLATFORMS
|
||||
aarch64-linux
|
||||
aarch64-linux-gnu
|
||||
aarch64-linux-musl
|
||||
arm-linux
|
||||
arm-linux-gnu
|
||||
arm-linux-gnueabihf
|
||||
arm-linux-musl
|
||||
arm-linux-musleabihf
|
||||
arm64-darwin
|
||||
x86-linux
|
||||
x86-linux-gnu
|
||||
x86-linux-musl
|
||||
x86_64-darwin
|
||||
x86_64-linux-gnu
|
||||
x86_64-linux-musl
|
||||
|
||||
DEPENDENCIES
|
||||
jekyll-text-theme
|
||||
sass-embedded (= 1.76.0)
|
||||
|
||||
BUNDLED WITH
|
||||
2.5.15
|
97
_config.yml
Normal file
@ -0,0 +1,97 @@
|
||||
# Bienvenue à Jekyll !
|
||||
#
|
||||
# Ce fichier de configuration est destiné aux paramètres qui affectent l'ensemble de votre blog, des valeurs
|
||||
# que vous êtes censé configurer une fois et rarement besoin de modifier par la suite.
|
||||
# Pour des raisons techniques, ce fichier n'est *PAS* rechargé automatiquement lorsque vous utilisez
|
||||
# 'jekyll serve'. Si vous modifiez ce fichier, veuillez redémarrer le processus de serveur.
|
||||
#
|
||||
# Modification octobre 2024
|
||||
|
||||
## => Paramètres du site
|
||||
##############################
|
||||
theme : jekyll-text-theme
|
||||
text_skin : dark # "default" (par défaut), "dark", "forest", "ocean", "chocolate", "orange".
|
||||
highlight_theme : tomorrow-night-bright # "default" (par défaut), "tomorrow", "tomorrow-night", "tomorrow-night-eighties", "tomorrow-night-blue", "tomorrow-night-bright".
|
||||
url : https://static.rnmkcy.eu # le nom d'hôte et le protocole de base pour votre site, par exemple https://www.someone.com
|
||||
baseurl : # ne comprend pas le nom d'hôte
|
||||
title : YannStatic
|
||||
description : > # cela signifie qu'il faut ignorer les nouvelles lignes jusqu'à "Language & timezone".
|
||||
Expérimentations et tests
|
||||
|
||||
## => Language and Timezone
|
||||
##############################
|
||||
lang : fr # le language du site, par défaut "en"
|
||||
timezone : Europe/Paris # voir https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||
|
||||
|
||||
## => Chemins
|
||||
##############################
|
||||
paths:
|
||||
root : # title link url, "/" (default)
|
||||
home : # home layout url, "/" (default)
|
||||
archive : # "/archive.html" (default)
|
||||
rss : # "/feed.xml" (default)
|
||||
|
||||
|
||||
## => Post
|
||||
##############################
|
||||
## excerpt
|
||||
excerpt_separator:
|
||||
|
||||
## license
|
||||
license: # "CC-BY-4.0", "CC-BY-SA-4.0", "CC-BY-NC-4.0", "CC-BY-ND-4.0"
|
||||
|
||||
## TOC
|
||||
toc:
|
||||
selectors: h1,h2,h3 # "h1,h2,h3" (default)
|
||||
|
||||
|
||||
## => Paginate
|
||||
##############################
|
||||
paginate: 10
|
||||
## paginate_path: /page:num # don't change this unless for special need
|
||||
|
||||
|
||||
## => Sources
|
||||
##############################
|
||||
sources: # bootcdn (default), unpkg
|
||||
|
||||
|
||||
## => Recherche
|
||||
##############################
|
||||
search:
|
||||
provider: "custom" # "default" (default), false, "custom"
|
||||
|
||||
## => Build
|
||||
##############################
|
||||
markdown : kramdown
|
||||
highlighter : rouge
|
||||
permalink : date
|
||||
|
||||
# http://jekyllrb.com/docs/configuration/options/
|
||||
exclude: [LISEZMOI.md,.jekyll-cache/,.git/,Gemfile,Gemfile.lock,static]
|
||||
include: [search.json]
|
||||
|
||||
defaults:
|
||||
- scope:
|
||||
path: ""
|
||||
type: posts
|
||||
values:
|
||||
layout: article
|
||||
sharing: true
|
||||
license: false # true
|
||||
aside:
|
||||
toc: true
|
||||
show_edit_on_github: true
|
||||
show_subscribe: true
|
||||
pageview: true
|
||||
|
||||
|
||||
## => Plugins
|
||||
##############################
|
||||
plugins:
|
||||
- jekyll-feed
|
||||
- jekyll-paginate
|
||||
- jekyll-sitemap
|
||||
- jemoji
|
||||
|
0
_data/authors.yml
Normal file
16
_data/licenses.yml
Normal file
@ -0,0 +1,16 @@
|
||||
CC-BY-4.0:
|
||||
name: Attribution 4.0 International
|
||||
url: https://creativecommons.org/licenses/by/4.0/deed.fr
|
||||
image: https://i.creativecommons.org/l/by/4.0/88x31.png
|
||||
CC-BY-SA-4.0:
|
||||
name: Attribution-ShareAlike 4.0 International
|
||||
url: https://creativecommons.org/licenses/by-sa/4.0/deed.fr
|
||||
image: https://i.creativecommons.org/l/by-sa/4.0/88x31.png
|
||||
CC-BY-NC-4.0:
|
||||
name: Attribution-NonCommercial 4.0 International
|
||||
url: https://creativecommons.org/licenses/by-nc/4.0/deed.fr
|
||||
image: https://i.creativecommons.org/l/by-nc/4.0/88x31.png
|
||||
CC-BY-ND-4.0:
|
||||
name: Attribution-NoDerivatives 4.0 International
|
||||
url: https://creativecommons.org/licenses/by-nd/4.0/deed.fr
|
||||
image: https://i.creativecommons.org/l/by-nd/4.0/88x31.png
|
66
_data/locale.yml
Normal file
@ -0,0 +1,66 @@
|
||||
# @start locale config
|
||||
## => English
|
||||
########################
|
||||
en: &EN
|
||||
SUBSCRIBE : "Subscribe"
|
||||
READMORE : "Read more"
|
||||
SEARCH : "Search"
|
||||
CANCEL : "Cancel"
|
||||
VIEWS : "views"
|
||||
LAST_UPDATED : "Last updated"
|
||||
PREVIOUS : "PREVIOUS"
|
||||
NEXT : "NEXT"
|
||||
ARTICLE_DATE_FORMAT : "%b %d, %Y"
|
||||
ARTICLE_LIST_DATE_FORMAT: "%b %d"
|
||||
STATISTICS : "[POST_COUNT] post articles, [PAGE_COUNT] pages."
|
||||
LICENSE_ANNOUNCE : "This work is licensed under a [LICENSE] license."
|
||||
POST_ON_GITHUB : "Edit on Github"
|
||||
FOLLOW_ME : "Follow me on [NAME]."
|
||||
FOLLOW_US : "Follow us on [NAME]."
|
||||
EMAIL_ME : "Send me an Email."
|
||||
EMAIL_US : "Send us an Email."
|
||||
COPYRIGHT_DATES : "2020"
|
||||
|
||||
en-GB:
|
||||
<<: *EN
|
||||
en-US:
|
||||
<<: *EN
|
||||
en-CA:
|
||||
<<: *EN
|
||||
en-AU:
|
||||
<<: *EN
|
||||
|
||||
## => French
|
||||
########################
|
||||
fr: &FR
|
||||
SUBSCRIBE : "S'abonner"
|
||||
READMORE : "Plus"
|
||||
SEARCH : "Recherche"
|
||||
CANCEL : "Annuler"
|
||||
VIEWS : "vues"
|
||||
LAST_UPDATED : "Dernière modification"
|
||||
PREVIOUS : "PRÉCÉDENT"
|
||||
NEXT : "SUIVANT"
|
||||
ARTICLE_DATE_FORMAT : "%d %b, %Y"
|
||||
ARTICLE_LIST_DATE_FORMAT: "%d %b"
|
||||
STATISTICS : "[POST_COUNT] articles, [PAGE_COUNT] pages."
|
||||
LICENSE_ANNOUNCE : "[LICENSE]"
|
||||
POST_ON_GITHUB : "Modifier sur Github"
|
||||
FOLLOW_ME : "Suivez-moi sur [NAME]."
|
||||
FOLLOW_US : "Suivez-nous sur [NAME]."
|
||||
EMAIL_ME : "Envoyez-moi un courriel."
|
||||
EMAIL_US : "Envoyez-nous un courriel"
|
||||
COPYRIGHT_DATES : "2020"
|
||||
DONATE : "Faites un don de [NAME]."
|
||||
|
||||
fr-BE:
|
||||
<<: *FR
|
||||
fr-CA:
|
||||
<<: *FR
|
||||
fr-CH:
|
||||
<<: *FR
|
||||
fr-FR:
|
||||
<<: *FR
|
||||
fr-LU:
|
||||
<<: *FR
|
||||
# @end locale config
|
25
_data/navigation.yml
Normal file
@ -0,0 +1,25 @@
|
||||
header:
|
||||
- titles:
|
||||
# @start locale config
|
||||
fr : &FR Etiquettes
|
||||
# @end locale config
|
||||
url: /archive.html
|
||||
|
||||
- titles:
|
||||
# @start locale config
|
||||
fr : &FR Documents
|
||||
# @end locale config
|
||||
url: /htmldoc.html
|
||||
|
||||
- titles:
|
||||
# @start locale config
|
||||
fr : &FR Liens
|
||||
# @end locale config
|
||||
url: /liens_ttrss.html
|
||||
|
||||
- titles:
|
||||
# @start locale config
|
||||
fr : &FR Aide
|
||||
# @end locale config
|
||||
url: /aide-jekyll-text-theme.html
|
||||
|
54
_data/variables.yml
Normal file
@ -0,0 +1,54 @@
|
||||
default:
|
||||
text_skin: default
|
||||
highlight_theme: default
|
||||
lang: fr
|
||||
paths:
|
||||
root: /
|
||||
home: /
|
||||
archive: /archive.html
|
||||
rss: /feed.xml
|
||||
toc:
|
||||
selectors: 'h1,h2,h3'
|
||||
sources: bootcdn
|
||||
|
||||
page:
|
||||
mode: normal
|
||||
type: webpage
|
||||
article_header:
|
||||
align: left
|
||||
theme: light
|
||||
articles:
|
||||
show_cover: true
|
||||
show_excerpt: false
|
||||
show_readmore: false
|
||||
show_info: false
|
||||
show_title: true
|
||||
show_edit_on_github: false
|
||||
show_date: true
|
||||
show_tags: true
|
||||
show_author_profile: false
|
||||
show_subscribe: false
|
||||
full_width: false
|
||||
sharing: false
|
||||
comment: true
|
||||
license: false
|
||||
pageview: false
|
||||
search: default
|
||||
|
||||
sources:
|
||||
bootcdn:
|
||||
font_awesome: 'https://use.fontawesome.com/releases/v5.0.13/css/all.css' # '/assets/css/all.css'
|
||||
jquery: '/assets/js/jquery.min.js'
|
||||
#leancloud_js_sdk: '//cdn.jsdelivr.net/npm/leancloud-storage@3.13.2/dist/av-min.js'
|
||||
#gitalk:
|
||||
# js: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.js'
|
||||
# css: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.css'
|
||||
#valine: 'https://unpkg.com/valine/dist/Valine.min.js' # bootcdn not available
|
||||
unpkg:
|
||||
font_awesome: 'https://unpkg.com/browse/@fortawesome/fontawesome-free@6.4.2/css/all.min.css' # 'https://use.fontawesome.com/releases/v5.0.13/css/all.css'
|
||||
jquery: '/assets/js/jquery.min.js'
|
||||
leancloud_js_sdk: '//cdn.jsdelivr.net/npm/leancloud-storage@3.13.2/dist/av-min.js'
|
||||
gitalk:
|
||||
js: 'https://unpkg.com/gitalk@1.2.2/dist/gitalk.min.js'
|
||||
css: 'https://unpkg.com/gitalk@1.2.2/dist/gitalk.css'
|
||||
valine: 'https//unpkg.com/valine/dist/Valine.min.js'
|
58
_includes/article-footer.html
Normal file
@ -0,0 +1,58 @@
|
||||
{%- include snippets/assign.html
|
||||
target=site.data.variables.default.page.show_author_profile
|
||||
source0=layout.show_author_profile source1=page.show_author_profile -%}
|
||||
{%- assign _show_author_profile = __return -%}
|
||||
|
||||
{%- include snippets/assign.html
|
||||
target=site.data.variables.default.page.show_subscribe
|
||||
source0=layout.show_subscribe source1=page.show_subscribe -%}
|
||||
{%- assign _show_subscribe = __return -%}
|
||||
|
||||
{%- include snippets/assign.html
|
||||
target=site.data.variables.default.page.license
|
||||
source0=layout.license source1=page.license -%}
|
||||
{%- assign _license = __return -%}
|
||||
|
||||
<footer class="article__footer">
|
||||
{%- if page.modify_date -%}
|
||||
{%- include snippets/get-locale-string.html key='ARTICLE_DATE_FORMAT' -%}
|
||||
{%- assign _locale_date_format = __return -%}
|
||||
|
||||
{%- include snippets/get-locale-string.html key='LAST_UPDATED' -%}
|
||||
{%- assign _locale_last_update = __return -%}
|
||||
<span>{{ _locale_last_update }}
|
||||
<time itemprop="dateModified" datetime="{{ page.modify_date | date_to_xmlschema }}">{{ page.modify_date | date: _locale_date_format }}</time>
|
||||
</span>
|
||||
{%- elsif page.date -%}
|
||||
<meta itemprop="dateModified" content="{{ page.date | date_to_xmlschema }}">
|
||||
{%- endif -%}
|
||||
|
||||
{%- include article/footer/custom.html -%}
|
||||
|
||||
{%- if _show_author_profile -%}
|
||||
{%- if page.author -%}
|
||||
{%- assign _author = site.data.authors[page.author] -%}
|
||||
{%- else -%}
|
||||
{%- assign _author = site.author -%}
|
||||
{%- endif -%}
|
||||
{%- include article/footer/author-profile.html author=_author -%}
|
||||
{%- endif -%}
|
||||
<!--
|
||||
<div align="right">
|
||||
{%- if _show_subscribe -%}
|
||||
{%- include article/footer/subscribe.html -%}
|
||||
{%- endif -%}
|
||||
 
|
||||
{%- if _license != false -%}
|
||||
{%- assign _data_license = site.data.licenses-%}
|
||||
{%- if site.license -%}
|
||||
{%- assign _license_data = _data_license[site.license] -%}
|
||||
{%- endif -%}
|
||||
{%- if _license != true -%}
|
||||
{%- assign _license_data = _data_license[_license] -%}
|
||||
{%- endif -%}
|
||||
{%- include article/footer/license.html license=_license_data -%}
|
||||
{%- endif -%}
|
||||
</div>
|
||||
-->
|
||||
</footer>
|
49
_includes/article-header.html
Normal file
@ -0,0 +1,49 @@
|
||||
{%- include snippets/get-article-title.html article=include.article-%}
|
||||
{%- assign _article_title = __return -%}
|
||||
|
||||
{%- if include.html != false -%}
|
||||
|
||||
{%- include snippets/assign.html
|
||||
target=site.data.variables.default.page.show_title
|
||||
source0=layout.show_title source1=include.article.show_title -%}
|
||||
{%- assign _show_title = __return -%}
|
||||
|
||||
{%- include snippets/assign.html
|
||||
target=site.data.variables.default.page.show_edit_on_github
|
||||
source0=layout.show_edit_on_github source1=include.article.show_edit_on_github -%}
|
||||
{%- assign _show_edit_on_github = __return -%}
|
||||
|
||||
{%- if _show_title or _show_edit_on_github -%}
|
||||
<div class="article__header">
|
||||
{%- if _show_title -%}
|
||||
<header><h1 style="color:Tomato;">{{ _article_title }}</h1></header>
|
||||
{%- endif -%}
|
||||
{%- if _show_edit_on_github -%}
|
||||
{%- if site.repository and site.repository_tree -%}
|
||||
{%- include snippets/is_collection.html page=include.article -%}
|
||||
{%- assign _is_article_collection = __return -%}
|
||||
{%- include snippets/get-locale-string.html key='POST_ON_GITHUB' -%}
|
||||
{%- assign _locale_post_on_github = __return -%}
|
||||
{%- if _is_article_collection -%}
|
||||
{%- include snippets/prepend-path.html path=include.article.path prepend_path=site.collections_dir -%}
|
||||
{%- assign _article_path = __return -%}
|
||||
{%- else -%}
|
||||
{%- assign _article_path = include.article.path -%}
|
||||
{%- endif -%}
|
||||
{%- assign _github_path = site.repository | append: '/tree/' | append: site.repository_tree | append: '/' | append: _article_path | replace:'//','/' -%}
|
||||
<span class="split-space"> </span>
|
||||
<a class="edit-on-github"
|
||||
title="{{ _locale_post_on_github }}"
|
||||
href="https://github.com/{{ _github_path }}">
|
||||
<i class="far fa-edit"></i></a>
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
</div>
|
||||
{%- else -%}
|
||||
<header style="display:none;"><h1>{{ _article_title }}</h1></header>
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- if include.semantic != false -%}
|
||||
<meta itemprop="headline" content="{{ _article_title }}">
|
||||
{%- endif -%}
|
102
_includes/article-info.html
Normal file
@ -0,0 +1,102 @@
|
||||
{%- assign _author = site.data.authors[include.article.author] | default: site.author -%}
|
||||
|
||||
{%- if include.html != false -%}
|
||||
|
||||
{%- include snippets/assign.html
|
||||
target=site.data.variables.default.page.show_date
|
||||
source0=layout.show_date source1=include.article.show_date -%}
|
||||
{%- assign _show_date = __return -%}
|
||||
{%- if _show_date and include.article.modif -%}
|
||||
{%- assign _show_date = true -%}
|
||||
{%- else -%}
|
||||
{%- assign _show_date = false -%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- include snippets/assign.html
|
||||
target=site.data.variables.default.page.show_tags
|
||||
source0=layout.show_tags source1=include.article.show_tags -%}
|
||||
{%- assign _show_tags = __return -%}
|
||||
{%- if _show_tags and include.article.tags[0] -%}
|
||||
{%- assign _show_tags = true -%}
|
||||
{%- else -%}
|
||||
{%- assign _show_tags = false -%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- assign _show_author = include.article.author -%}
|
||||
|
||||
{%- include snippets/assign.html target=site.data.variables.default.page.pageview
|
||||
source0=layout.pageview source1=page.pageview -%}
|
||||
{%- assign _pageview = __return -%}
|
||||
{%- if _pageview or include.show_pageview -%}
|
||||
{%- assign _pageview = true -%}
|
||||
{%- else -%}
|
||||
{%- assign _pageview = false -%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- assign _paths_archive = site.paths.archive | default: site.data.variables.default.paths.archive -%}
|
||||
|
||||
{%- if _show_tags or _show_author or _show_date or _pageview -%}
|
||||
<div class="article__info clearfix">
|
||||
{%- if _show_tags -%}
|
||||
|
||||
<ul class="left-col menu">
|
||||
{%- assign _tag_path = _paths_archive | append: '?tag=' -%}
|
||||
{%- include snippets/prepend-baseurl.html path=_tag_path -%}
|
||||
|
||||
{%- for _tag in include.article.tags -%}
|
||||
{%- assign _tag_path = __return -%}
|
||||
{%- assign _tag_encode = _tag | strip | url_encode } -%}
|
||||
<li>
|
||||
<a class="button button--secondary button--pill button--sm"
|
||||
href="{{ _tag_path | append: _tag_encode | replace: '//', '/' }}">{{ _tag }}</a>
|
||||
</li>
|
||||
{%- endfor -%}
|
||||
</ul>
|
||||
{%- endif -%}
|
||||
|
||||
{%- if _show_author or _show_date or _pageview -%}
|
||||
<ul class="right-col menu">
|
||||
{%- if _show_author -%}
|
||||
<li><i class="fas fa-user"></i> <span>{{ _author.name }}</span></li>
|
||||
{%- endif -%}
|
||||
|
||||
{%- if _show_date -%}
|
||||
<li>
|
||||
<i class="far fa-calendar-alt"></i>
|
||||
{%- if include.article.modif != include.article.create -%}
|
||||
<span title="Création" style="color:#FF00FF">{%- assign d = include.article.create | date: "%-d" -%}{%- case d -%}{%- when '1' -%}{{ d }}r{%- when '2' -%} {{ d }}{%- when '3' -%} {{ d }}{%- when '4' -%} {{ d }}{%- when '5' -%} {{ d }}{%- when '6' -%} {{ d }}{%- when '7' -%} {{ d }}{%- when '8' -%} {{ d }}{%- when '9' -%} {{ d }}{%- else -%}{{ d }}{%- endcase -%} {%- assign m = include.article.create | date: "%-m" -%}{%- case m -%}{%- when '1' -%}janv.{%- when '2' -%}févr.{%- when '3' -%}mars {%- when '4' -%}avr. {%- when '5' -%}mai {%- when '6' -%}juin {%- when '7' -%}juil.{%- when '8' -%}août {%- when '9' -%}sept.{%- when '10' -%}oct. {%- when '11' -%}nov. {%- when '12' -%}déc. {%- endcase -%} {{ include.article.create | date: '%Y' }}</span>
|
||||
|
||||
<span title="Modification" style="color:#00FF7F">{%- assign d = include.article.modif | date: "%-d" -%}{%- case d -%}{%- when '1' -%}{{ d }}r{%- when '2' -%} {{ d }}{%- when '3' -%} {{ d }}{%- when '4' -%} {{ d }}{%- when '5' -%} {{ d }}{%- when '6' -%} {{ d }}{%- when '7' -%} {{ d }}{%- when '8' -%} {{ d }}{%- when '9' -%} {{ d }}{%- else -%}{{ d }}{%- endcase -%} {%- assign m = include.article.modif | date: "%-m" -%}{%- case m -%}{%- when '1' -%}janv.{%- when '2' -%}févr.{%- when '3' -%}mars {%- when '4' -%}avr. {%- when '5' -%}mai {%- when '6' -%}juin {%- when '7' -%}juil.{%- when '8' -%}août {%- when '9' -%}sept.{%- when '10' -%}oct. {%- when '11' -%}nov. {%- when '12' -%}déc. {%- endcase -%} {{ include.article.modif | date: '%Y' }}</span>
|
||||
{%- else -%}
|
||||
<span title="Création" style="color:#FF00FF">{%- assign d = include.article.modif | date: "%-d" -%}{%- case d -%}{%- when '1' -%}{{ d }}r{%- when '2' -%} {{ d }}{%- when '3' -%} {{ d }}{%- when '4' -%} {{ d }}{%- when '5' -%} {{ d }}{%- when '6' -%} {{ d }}{%- when '7' -%} {{ d }}{%- when '8' -%} {{ d }}{%- when '9' -%} {{ d }}{%- else -%}{{ d }}{%- endcase -%} {%- assign m = include.article.modif | date: "%-m" -%}{%- case m -%}{%- when '1' -%}janv.{%- when '2' -%}févr.{%- when '3' -%}mars {%- when '4' -%}avr. {%- when '5' -%}mai {%- when '6' -%}juin {%- when '7' -%}juil.{%- when '8' -%}août {%- when '9' -%}sept.{%- when '10' -%}oct. {%- when '11' -%}nov. {%- when '12' -%}déc. {%- endcase -%} {{ include.article.modif | date: '%Y' }}</span>
|
||||
{%- endif -%}
|
||||
</li>
|
||||
{%- endif -%}
|
||||
|
||||
{%- if _pageview -%}
|
||||
{%- if site.pageview.provider -%}
|
||||
{%- include snippets/get-locale-string.html key='VIEWS' -%}
|
||||
{%- assign _locale_views = __return -%}
|
||||
<li><i class="far fa-eye"></i> <span class="js-pageview" data-page-key="{{ include.article.key }}">0</span> {{ _locale_views }}</li>
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
</ul>
|
||||
{%- endif -%}
|
||||
|
||||
</div>
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
|
||||
|
||||
{%- if include.semantic != false -%}
|
||||
{%- if _author -%}
|
||||
<meta itemprop="author" content="{{ _author.name }}"/>
|
||||
{%- endif -%}
|
||||
{%- if include.article.modif -%}
|
||||
<meta itemprop="datePublished" content="{{ include.article.modif | date_to_xmlschema }}">
|
||||
{%- endif -%}
|
||||
{%- if include.article.tags[0] -%}
|
||||
{%- assign _keywords = include.article.tags | join: ',' %}
|
||||
<meta itemprop="keywords" content="{{ _keywords }}">
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
141
_includes/article-list.html
Normal file
@ -0,0 +1,141 @@
|
||||
{%- assign _excerpt_truncate = include.excerpt_truncate | default: 350 -%}
|
||||
|
||||
{%- assign _excerpt_type = include.excerpt_type -%}
|
||||
|
||||
{%- include snippets/get-locale-string.html key='READMORE' -%}
|
||||
{%- assign _locale_readmore = __return -%}
|
||||
|
||||
{%- assign _sorted_list = include.articles | sort: 'modif' -%}
|
||||
{%- assign _sorted_list = _sorted_list | reverse -%}
|
||||
|
||||
{%- if include.type == 'item' -%}
|
||||
<div class="article-list items items--divided">
|
||||
{%- elsif include.type == 'brief' -%}
|
||||
<div class="article-list items">
|
||||
{%- elsif include.type == 'grid' -%}
|
||||
{%- if include.size == 'sm' -%}
|
||||
<div class="article-list grid grid--sm grid--p-3">
|
||||
{%- else -%}
|
||||
<div class="article-list grid grid--p-3">
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- for _article in _sorted_list -%}
|
||||
|
||||
{%- include snippets/prepend-baseurl.html path=_article.url -%}
|
||||
{%- assign _article_url = __return -%}
|
||||
|
||||
{%- if _article.cover -%}
|
||||
{%- include snippets/get-nav-url.html path=_article.cover -%}
|
||||
{%- assign _article_cover = __return -%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- if include.type == 'item' -%}
|
||||
{%- if include.article_type == 'BlogPosting' -%}
|
||||
<!-- <article class="item" itemscope itemtype="http://schema.org/BlogPosting"> -->
|
||||
<article>
|
||||
{%- else -%}
|
||||
<!-- <article class="item"> -->
|
||||
<article>
|
||||
{%- endif -%}
|
||||
{%- if _article.cover and include.show_cover-%}
|
||||
{%- include snippets/get-nav-url.html path=_article.cover -%}
|
||||
{%- assign _article_cover = __return -%}
|
||||
<div class="item__image">
|
||||
{%- if include.cover_size == 'lg' -%}
|
||||
<img class="image image--lg" src="{{ _article_cover }}" />
|
||||
{%- elsif include.cover_size == 'sm' -%}
|
||||
<img class="image image--sm" src="{{ _article_cover }}" />
|
||||
{%- else -%}
|
||||
<img class="image" src="{{ _article_cover }}" />
|
||||
{%- endif -%}
|
||||
</div>
|
||||
{%- endif -%}
|
||||
<div class="item__content">
|
||||
<header><a href="{{ _article_url }}"><h2 itemprop="headline" class="item__header">{{ _article.title }}</h2></a></header>
|
||||
<div class="item__description">
|
||||
{%- if _article.excerpt and include.show_excerpt -%}
|
||||
<div class="article__content" itemprop="description articleBody">
|
||||
{%- if _excerpt_type == 'html' -%}
|
||||
{{ _article.excerpt }}
|
||||
{%- else -%}
|
||||
{{ _article.excerpt | strip_html | strip | truncate: _excerpt_truncate }}
|
||||
{%- endif -%}
|
||||
</div>
|
||||
{%- endif -%}
|
||||
{%- if include.show_readmore -%}
|
||||
<p><a href="{{ _article_url }}">{{ _locale_readmore }}</a></p>
|
||||
{%- endif -%}
|
||||
</div>
|
||||
{%- if include.show_info -%}
|
||||
{%- include snippets/assign.html target=site.data.variables.default.page.pageview
|
||||
source0=_article.pageview -%}
|
||||
{%- assign _show_pageview = __return -%}
|
||||
{%- include article-info.html article=_article show_pageview=_show_pageview -%}
|
||||
{%- endif -%}
|
||||
</div>
|
||||
</article>
|
||||
|
||||
|
||||
{%- elsif include.type == 'brief' -%}
|
||||
{%- assign _tags = '' -%}
|
||||
{%- for _tag in _article.tags -%}
|
||||
{%- assign _tag_encode = _tag | strip | url_encode -%}
|
||||
{%- if forloop.last -%}
|
||||
{%- assign _tags = _tags | append: _tag_encode -%}
|
||||
{%- else -%}
|
||||
{%- assign _tags = _tags | append: _tag_encode | append: ',' -%}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{%- if include.group_by == 'year' -%}
|
||||
{%- assign _currentdate = _article.modif | date: '%Y' -%}
|
||||
{%- if _currentdate != _date -%}
|
||||
{%- unless forloop.first -%}</ul></section>{%- endunless -%}
|
||||
<section><h2 class="article-list__group-header">{{ _currentdate }}</h2><ul class="items">
|
||||
{%- assign _date = _currentdate -%}
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
<li class="item" itemscope itemtype="http://schema.org/BlogPosting" data-tags="{{ _tags }}">
|
||||
<div class="item__content">
|
||||
{%- if include.show_info -%}
|
||||
<span class="item__meta" style="color:#ff9500">{%- assign d = _article.modif | date: "%-d" -%}{%- case d -%}{%- when '1' -%}{{ d }}r{%- when '2' -%} {{ d }}{%- when '3' -%} {{ d }}{%- when '4' -%} {{ d }}{%- when '5' -%} {{ d }}{%- when '6' -%} {{ d }}{%- when '7' -%} {{ d }}{%- when '8' -%} {{ d }}{%- when '9' -%} {{ d }}{%- else -%}{{ d }}{%- endcase -%} {%- assign m = _article.modif | date: "%-m" -%}{%- case m -%}{%- when '1' -%}janv.{%- when '2' -%}févr.{%- when '3' -%}mars {%- when '4' -%}avr. {%- when '5' -%}mai {%- when '6' -%}juin {%- when '7' -%}juil.{%- when '8' -%}août {%- when '9' -%}sept.{%- when '10' -%}oct. {%- when '11' -%}nov. {%- when '12' -%}déc. {%- endcase -%}</span>
|
||||
|
||||
{%- endif -%}
|
||||
<a itemprop="headline" class="item__header" href="{{ _article_url }}">{{ _article.title }}</a></div>
|
||||
</li>
|
||||
|
||||
{%- elsif include.type == 'grid' -%}
|
||||
{%- if include.size == 'sm' -%}
|
||||
<div class="cell cell--12 cell--md-4 cell--lg-3">
|
||||
<div class="card card--flat">
|
||||
{%- if _article.cover -%}
|
||||
<div class="card__image">
|
||||
<img class="image" src="{{ _article_cover }}" />
|
||||
<div class="overlay overlay--bottom">
|
||||
<header>
|
||||
<a href="{{ _article_url }}"><h2 class="card__header">{{ _article.title }}</h2></a>
|
||||
</header>
|
||||
</div>
|
||||
</div>
|
||||
{%- endif -%}
|
||||
</div>
|
||||
</div>
|
||||
{%- else -%}
|
||||
|
||||
<div class="cell cell--12 cell--md-6 cell--lg-4">
|
||||
<div class="card card--flat">
|
||||
{%- if _article.cover -%}
|
||||
<div class="card__image"><img src="{{ _article_cover }}" /></div>
|
||||
{%- endif -%}
|
||||
<div class="card__content">
|
||||
<header>
|
||||
<a href="{{ _article_url }}"><h2 class="card__header">{{ _article.title }}</h2></a>
|
||||
</header>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
|
||||
</div>
|
54
_includes/article-section-navigator.html
Normal file
@ -0,0 +1,54 @@
|
||||
{%- if page.sidebar.nav -%}
|
||||
{%- assign _sidebar_nav = site.data.navigation[page.sidebar.nav] -%}
|
||||
{%- if _sidebar_nav -%}
|
||||
{%- assign _find_cur = false -%}
|
||||
{%- assign _find_next = false -%}
|
||||
|
||||
{%- for _item in _sidebar_nav -%}
|
||||
{%- if _find_next -%} {%- break -%} {%- endif -%}
|
||||
{%- if _item.children -%}
|
||||
|
||||
{%- for _child in _item.children -%}
|
||||
{%- include snippets/get-nav-url.html path=_child.url -%}
|
||||
{%- assign _nav_url = __return -%}
|
||||
{%- include snippets/get-nav-url.html path=page.url -%}
|
||||
{%- assign _page_url = __return -%}
|
||||
|
||||
{%- if _nav_url == _page_url -%}
|
||||
{%- assign _find_cur = true -%}
|
||||
{%- elsif _find_cur and _find_next != true -%}
|
||||
{%- assign _find_next = true -%}
|
||||
{%- assign _next = _child -%}
|
||||
{%- break -%}
|
||||
{%- else -%}
|
||||
{%- assign _previous = _child -%}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- else -%}
|
||||
{%- assign _previous = page.previous -%}
|
||||
{%- assign _next = page.next -%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- if _next or _previous -%}
|
||||
<div class="article__section-navigator clearfix">
|
||||
{%- if _previous -%}
|
||||
{%- include snippets/prepend-baseurl.html path=_previous.url -%}
|
||||
{%- assign _href = __return -%}
|
||||
{%- include snippets/get-locale-string.html key='PREVIOUS' -%}
|
||||
{%- assign _locale_previous = __return -%}
|
||||
<div class="previous"><span>{{ _locale_previous }}</span><a href="{{ _href }}">{{ _previous.title }}</a></div>
|
||||
{%- endif -%}
|
||||
{%- if _next -%}
|
||||
{%- include snippets/prepend-baseurl.html path=_next.url -%}
|
||||
{%- assign _href = __return -%}
|
||||
{%- include snippets/get-locale-string.html key='NEXT' -%}
|
||||
{%- assign _locale_next = __return -%}
|
||||
<div class="next"><span>{{ _locale_next }}</span><a href="{{ _href }}">{{ _next.title }}</a></div>
|
||||
{%- endif -%}
|
||||
</div>
|
||||
{%- endif -%}
|
47
_includes/article/footer/author-profile.html
Normal file
@ -0,0 +1,47 @@
|
||||
{%- assign _author = include.author -%}
|
||||
|
||||
{%- if _author.type == 'organization' -%}
|
||||
{%- assign _author_itemtype = 'http://schema.org/Organization' -%}
|
||||
{%- else -%}
|
||||
{%- assign _author_itemtype = 'http://schema.org/Person' -%}
|
||||
{%- endif -%}
|
||||
|
||||
<div itemscope itemtype="{{ _author_itemtype }}" class="author-profile card card--flat item">
|
||||
{%- if _author.avatar -%}
|
||||
{%- if _author.url -%}
|
||||
<a href="{{ _author.url }}" class="item__image">
|
||||
{%- endif -%}
|
||||
{%- include snippets/get-nav-url.html path=_author.avatar -%}
|
||||
{%- assign _author_avatar = __return -%}
|
||||
<img class="author-profile__avatar" itemprop="image" src="{{ _author_avatar }}" />
|
||||
{%- if _author.url -%}
|
||||
</a>
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
|
||||
|
||||
<div class="item__content">
|
||||
|
||||
{%- if _author.name -%}
|
||||
<meta itemprop="name" content="{{ _author.name }}">
|
||||
<p class="author-profile__name">
|
||||
{%- if _author.url -%}
|
||||
<meta itemprop="url" content="{{ _author.url }}">
|
||||
<a href="{{ _author.url }}">
|
||||
{%- endif -%}
|
||||
{{ _author.name }}
|
||||
{%- if _author.url -%}
|
||||
</a>
|
||||
{%- endif -%}
|
||||
</p>
|
||||
{%- endif -%}
|
||||
|
||||
{%- if _author.bio -%}
|
||||
<p itemprop="description">{{ _author.bio }}</p>
|
||||
{%- endif -%}
|
||||
<div class="author-profile__links">
|
||||
{%- include author-links.html author=_author -%}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
3
_includes/article/footer/custom.html
Normal file
@ -0,0 +1,3 @@
|
||||
<!-- start custom article footer snippet -->
|
||||
|
||||
<!-- end custom article footer snippet -->
|
7
_includes/article/footer/license.html
Normal file
@ -0,0 +1,7 @@
|
||||
{%- include snippets/get-locale-string.html key='LICENSE_ANNOUNCE' -%}
|
||||
{%- assign _license_announce = __return -%}
|
||||
|
||||
{%- if include.license -%}
|
||||
|
||||
<a rel="license" href="{{ include.license.url }}" title="{{ include.license.name }}"><img alt="{{ include.license.name }}" src="{{ include.license.image }}" /></a>
|
||||
{%- endif -%}
|
7
_includes/article/footer/subscribe.html
Normal file
@ -0,0 +1,7 @@
|
||||
{%- assign _paths_rss = site.paths.rss | default: site.data.variables.default.paths.rss -%}
|
||||
{%- include snippets/get-nav-url.html path=_paths_rss -%}
|
||||
{%- assign _paths_rss = __return -%}
|
||||
{%- include snippets/get-locale-string.html key='SUBSCRIBE' -%}
|
||||
{%- assign _locale_nav_subscribe = __return -%}
|
||||
<a type="application/rss+xml" href="{{ _paths_rss }}" title="{{ _locale_nav_subscribe }}"><i class="fa fa-rss fa-2x"></i></a>
|
||||
|
50
_includes/article/top/custom.html
Normal file
@ -0,0 +1,50 @@
|
||||
<!-- start custom article top snippet -->
|
||||
<style>
|
||||
#myBtn {
|
||||
display: none;
|
||||
position: fixed;
|
||||
bottom: 10px;
|
||||
right: 10px;
|
||||
z-index: 99;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
border: none;
|
||||
outline: none;
|
||||
background-color: white;
|
||||
color: black;
|
||||
cursor: pointer;
|
||||
padding: 5px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
#myBtn:hover {
|
||||
background-color: #555;
|
||||
}
|
||||
</style>
|
||||
|
||||
<button onclick="topFunction()" id="myBtn" title="Haut de page">⇧</button>
|
||||
|
||||
<script>
|
||||
//Get the button
|
||||
var mybutton = document.getElementById("myBtn");
|
||||
|
||||
// When the user scrolls down 20px from the top of the document, show the button
|
||||
window.onscroll = function() {scrollFunction()};
|
||||
|
||||
function scrollFunction() {
|
||||
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
|
||||
mybutton.style.display = "block";
|
||||
} else {
|
||||
mybutton.style.display = "none";
|
||||
}
|
||||
}
|
||||
|
||||
// When the user clicks on the button, scroll to the top of the document
|
||||
function topFunction() {
|
||||
document.body.scrollTop = 0;
|
||||
document.documentElement.scrollTop = 0;
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
<!-- end custom article top snippet -->
|
14
_includes/chart.html
Normal file
@ -0,0 +1,14 @@
|
||||
<script>
|
||||
window.Lazyload.js(['/assets/js/jquery.min.js', 'https://cdn.jsdelivr.net/npm/chart.js'], function() {
|
||||
var $canvas = null, $this = null, _ctx = null, _text = '';
|
||||
$('.language-chart').each(function(){
|
||||
$this = $(this);
|
||||
$canvas = $('<canvas></canvas>');
|
||||
_text = $this.text();
|
||||
$this.text('').append($canvas);
|
||||
_ctx = $canvas.get(0).getContext('2d');
|
||||
(_ctx && _text) && (new Chart(_ctx, JSON.parse(_text)) && $this.attr('data-processed', true));
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
15
_includes/footer.html
Normal file
@ -0,0 +1,15 @@
|
||||
<footer class="main">
|
||||
{%- assign _paths_rss = site.paths.rss | default: site.data.variables.default.paths.rss -%}
|
||||
{%- include snippets/get-nav-url.html path=_paths_rss -%}
|
||||
{%- assign _paths_rss = __return -%}
|
||||
{%- include snippets/get-locale-string.html key='SUBSCRIBE' -%}
|
||||
{%- assign _locale_nav_subscribe = __return -%}
|
||||
<a type="application/rss+xml" href="{{ _paths_rss }}" title="{{ _locale_nav_subscribe }}"><i class="fa fa-rss fa-2x"></i></a>
|
||||
 
|
||||
{%- include snippets/get-locale-string.html key='COPYRIGHT_DATES' -%}
|
||||
{%- assign _locale_copyright_dates = __return -%}
|
||||
{{ site.title }} {{ _locale_copyright_dates }},
|
||||
Propulsé par <a title="Jekyll is a simple, blog-aware, static site generator." href="http://jekyllrb.com/">Jekyll</a> & <a
|
||||
title="TeXt is a super customizable Jekyll theme." href="https://github.com/kitian616/jekyll-TeXt-theme">TeXt Theme</a>
|
||||
</footer>
|
||||
|
25
_includes/head.html
Normal file
@ -0,0 +1,25 @@
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
|
||||
{%- include snippets/get-article-title.html article=page -%}
|
||||
<title>{%- if __return -%}{{ __return }} - {{ site.title }}{%- else -%}{{ site.title }}{%- endif -%}</title>
|
||||
|
||||
<meta name="description" content="{%- if page.excerpt -%}{{ page.excerpt | strip_html | strip_newlines | strip | truncate: 160 }}{%- else -%}{{ site.description }}{%- endif -%}">
|
||||
<link rel="canonical" href="{%- include snippets/page-url.html -%}">
|
||||
|
||||
{%- assign _paths_rss = site.paths.rss | default: site.data.variables.default.paths.rss -%}
|
||||
{%- include snippets/get-nav-url.html path=_paths_rss -%}
|
||||
<link rel="alternate" type="application/rss+xml" title="{{ site.title }}" href="{{ __return }}">
|
||||
|
||||
<!-- - include head/favicon.html - -->
|
||||
<link rel="shortcut icon" type="image/png" href="/assets/favicon/favicon.png">
|
||||
|
||||
{%- include snippets/prepend-baseurl.html path='/assets/css/main.css' -%}
|
||||
<link rel="stylesheet" href="{{ __return }}">
|
||||
|
||||
{%- include snippets/get-sources.html -%}
|
||||
{%- assign _sources = __return -%}
|
||||
<link rel="stylesheet" href="{{ _sources.font_awesome }}" >
|
||||
|
||||
{%- include head/custom.html -%}
|
4
_includes/head/custom.html
Normal file
@ -0,0 +1,4 @@
|
||||
<!-- start custom head snippets -->
|
||||
{%- include snippets/prepend-baseurl.html path='/assets/css/expand.css' -%}
|
||||
<link rel="stylesheet" href="{{ __return }}">
|
||||
<!-- end custom head snippets -->
|
24
_includes/head/favicon.html
Normal file
@ -0,0 +1,24 @@
|
||||
<!-- start favicons snippet, use https://realfavicongenerator.net/ -->
|
||||
{%- include snippets/prepend-baseurl.html path='/assets/favicon/apple-touch-icon.png' -%}
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="{{ __return }}">
|
||||
|
||||
{%- include snippets/prepend-baseurl.html path='/assets/favicon/favicon-32x32.png' -%}
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="{{ __return }}">
|
||||
|
||||
{%- include snippets/prepend-baseurl.html path='/assets/favicon/favicon-16x16.png' -%}
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="{{ __return }}">
|
||||
|
||||
{%- include snippets/prepend-baseurl.html path='/assets/favicon/android-chrome-192x192.png' -%}
|
||||
<link rel="icon" type="image/png" sizes="192x192" href="{{ __return }}">
|
||||
|
||||
{%- include snippets/prepend-baseurl.html path='/assets/favicon/android-chrome-512x512.png' -%}
|
||||
<link rel="icon" type="image/png" sizes="512x512" href="{{ __return }}">
|
||||
|
||||
{%- include snippets/prepend-baseurl.html path='/assets/favicon/site.webmanifest' -%}
|
||||
<link rel="manifest" href="{{ __return }}">
|
||||
|
||||
{%- include snippets/prepend-baseurl.html path='/assets/favicon/favicon.ico' -%}
|
||||
<link rel="shortcut icon" href="{{ __return }}">
|
||||
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
<!-- end favicons snippet -->
|
76
_includes/header.html
Normal file
@ -0,0 +1,76 @@
|
||||
{%- if include.theme == 'dark' -%}
|
||||
<header class="header header--dark" {%- if include.background -%} style="background: {{ include.background }};" {%- endif -%}>
|
||||
{%- elsif include.theme == 'light' -%}
|
||||
<header class="header header--light" {%- if include.background -%} style="background: {{ include.background }};" {%- endif -%}>
|
||||
{%- else -%}
|
||||
<header class="header" {%- if include.background -%} style="background: {{ include.background }};" {%- endif -%}>
|
||||
{%- endif -%}
|
||||
<div class="main">
|
||||
<div class="header__title">
|
||||
<div class="header__brand">
|
||||
{%- include svg/logo.svg -%}
|
||||
{%- assign _paths_root = site.paths.root | default: site.data.variables.default.paths.root -%}
|
||||
{%- include snippets/get-nav-url.html path=_paths_root -%}
|
||||
{%- if site.title -%}
|
||||
<a title="{%- if site.description -%}{{ site.description }}{%- endif -%}" href="{{ __return }}">{{ site.title }}</a>
|
||||
{%- endif -%}
|
||||
</div>
|
||||
{%- if site.search.provider -%}
|
||||
<!--<button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button>-->
|
||||
{%- if site.search.provider -%}
|
||||
<!-- <li><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></li> -->
|
||||
<!-- Champ de recherche -->
|
||||
<div id="searchbox" class="search search--dark" style="visibility: visible">
|
||||
<div class="main">
|
||||
<div class="search__header">{{ _locale_search }}</div>
|
||||
<div class="search-bar">
|
||||
<div class="search-box js-search-box">
|
||||
<div class="search-box__icon-search"><i class="fas fa-search"></i></div>
|
||||
<input id="search-input" type="text" />
|
||||
<!-- <div class="search-box__icon-clear js-icon-clear">
|
||||
<a><i class="fas fa-times"></i></a>
|
||||
</div> -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- Script pointing to search-script.js -->
|
||||
<script>{%- include search-providers/custom/search-script.js -%}</script>
|
||||
|
||||
<!-- Configuration -->
|
||||
<script>
|
||||
SimpleJekyllSearch({
|
||||
searchInput: document.getElementById('search-input'),
|
||||
resultsContainer: document.getElementById('results-container'),
|
||||
json: '/search.json',
|
||||
//searchResultTemplate: '<li><a href="{{ site.url }}{url}">{date} {title}</a></li>'
|
||||
searchResultTemplate: '<li><a href="{url}">{date} {title}</a></li>'
|
||||
})
|
||||
</script>
|
||||
<!-- Fin déclaration champ de recherche -->
|
||||
{%- endif -%}
|
||||
|
||||
{%- endif -%}
|
||||
</div>
|
||||
{%- if site.data.navigation.header -%}
|
||||
<nav class="navigation">
|
||||
<ul>
|
||||
{%- for _item in site.data.navigation.header -%}
|
||||
{%- include snippets/get-nav-url.html path=_item.url -%}
|
||||
{%- assign _nav_url = __return -%}
|
||||
{%- include snippets/get-nav-url.html path=page.url -%}
|
||||
{%- assign _page_url = __return -%}
|
||||
{%- include snippets/get-string-from-locale-config.html locale=_item.titles -%}
|
||||
{%- if _nav_url == _page_url or page.nav_key and _item.key and page.nav_key == _item.key -%}
|
||||
<li class="navigation__item navigation__item--active"><a href="{{ _nav_url }}">{%- if _item.title -%}{{ _item.title }}{%- else -%}{{ __return }}{%- endif -%}</a></li>
|
||||
{%- else -%}
|
||||
<li class="navigation__item"><a href="{{ _nav_url }}">{%- if _item.title -%}{{ _item.title }}{%- else -%}{{ __return }}{%- endif -%}</a></li>
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
</ul>
|
||||
</nav>
|
||||
{%- endif -%}
|
||||
</div>
|
||||
</header>
|
||||
|
2
_includes/main/bottom/custom.html
Normal file
@ -0,0 +1,2 @@
|
||||
<!-- start custom main bottom snippet -->
|
||||
<!-- end custom main bottom snippet -->
|
6
_includes/main/top/custom.html
Normal file
@ -0,0 +1,6 @@
|
||||
<!-- start custom main top snippet -->
|
||||
{%- if site.search.provider -%}
|
||||
<div id="results-container" class="search-result js-search-result"></div>
|
||||
{%- endif -%}
|
||||
|
||||
<!-- end custom main top snippet -->
|
3
_includes/mathjax.html
Normal file
@ -0,0 +1,3 @@
|
||||
<script src='https://polyfill.io/v3/polyfill.min.js?features=es6'></script>
|
||||
<script id='MathJax-script' async src='https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js'></script>
|
||||
|
8
_includes/mermaid.html
Normal file
@ -0,0 +1,8 @@
|
||||
<script>
|
||||
window.Lazyload.js('https://unpkg.com/mermaid@8.0.0-rc.8/dist/mermaid.min.js', function() {
|
||||
mermaid.initialize({
|
||||
startOnLoad: true
|
||||
});
|
||||
mermaid.init(undefined, '.language-mermaid');
|
||||
});
|
||||
</script>
|
100
_includes/paginator.html
Normal file
@ -0,0 +1,100 @@
|
||||
{%- if paginator.total_pages > 1 -%}
|
||||
<div class="pagination">
|
||||
|
||||
{%- include snippets/get-locale-string.html key='STATISTICS' -%}
|
||||
{%- assign _locale_statistics = __return -%}
|
||||
|
||||
{%- assign _post_count = site.posts | size -%}
|
||||
{%- assign _page_count = paginator.total_pages -%}
|
||||
<!-- <p>{{ _locale_statistics | replace: '[POST_COUNT]', _post_count | replace: '[PAGE_COUNT]', _page_count }}</p> -->
|
||||
<div class="pagination__menu">
|
||||
<ul class="menu menu--nowrap">
|
||||
{%- assign _max_show = 5 -%}
|
||||
{%- assign _max_show_modulo_two = _max_show | modulo: 2 -%}
|
||||
{%- assign _length = paginator.total_pages -%}
|
||||
{%- assign _length_mimus_one = _length | minus: 1 -%}
|
||||
{%- assign _cur = paginator.page -%}
|
||||
{%- assign _extra = _max_show | minus: 3 -%}
|
||||
{%- assign _extra_half = _extra | divided_by: 2 -%}
|
||||
|
||||
{%- if _max_show > 4 and _max_show_modulo_two == 1 and paginator.total_pages > _max_show -%}
|
||||
{%- assign _condition0 = _extra | divided_by: 2 | plus: 1 -%}
|
||||
{%- assign _condition1 = _length | minus: _extra_half -%}
|
||||
{%- if _cur <= _condition0 -%}
|
||||
{%- assign _n0 = 2 -%}
|
||||
{%- assign _n1 = _extra | plus: 2 -%}
|
||||
{%- elsif _cur >= _condition1 -%}
|
||||
{%- assign _n0 = _length | minus: _extra | minus: 1 -%}
|
||||
{%- assign _n1 = _length | minus: 1 -%}
|
||||
{%- else -%}
|
||||
{%- assign _n0 = _cur | minus: _extra_half -%}
|
||||
{%- assign _n1 = _cur | plus: _extra_half -%}
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- if paginator.previous_page -%}
|
||||
{%- include snippets/prepend-baseurl.html path=paginator.previous_page_path -%}
|
||||
{%- assign _href = __return -%}
|
||||
<li><a class="button button--secondary button--circle" href="{{ _href }}">
|
||||
<i class="fas fa-angle-left"></i>
|
||||
</a></li>
|
||||
{%- else -%}
|
||||
<li><div class="button button--secondary button--circle disabled">
|
||||
<i class="fas fa-angle-left"></i>
|
||||
</div></li>
|
||||
{%- endif -%}
|
||||
|
||||
{%- for page in (1.._length) -%}
|
||||
{%- if page == _cur -%}
|
||||
<li>
|
||||
<div class="button button--primary button--circle focus"><span>{{ page }}</span></div>
|
||||
</li>
|
||||
|
||||
{%- elsif page == 1 -%}
|
||||
{%- assign _home_path = site.paths.home | default: site.data.variables.default.paths.home -%}
|
||||
{%- include snippets/prepend-baseurl.html path=_home_path -%}
|
||||
{%- assign _href = __return -%}
|
||||
<li>
|
||||
<a class="button button--secondary button--circle" href="{{ _href }}"><span>{{ page }}</span></a>
|
||||
</li>
|
||||
|
||||
{%- else -%}
|
||||
{%- if _n0 and _n1 -%}
|
||||
{%- if page > 1 and page < _n0 -%}
|
||||
{%- if page == 2 -%}<li><span class="pagination__omit"><i class="fas fa-ellipsis-h"></i></span></li>{%- endif -%}
|
||||
{%- elsif page > _n1 and page < _length -%}
|
||||
{%- if page == _length_mimus_one -%}<li><span class="pagination__omit"><i class="fas fa-ellipsis-h"></i></span></li>{%- endif -%}
|
||||
{%- else -%}
|
||||
{%- include snippets/prepend-baseurl.html path=site.paginate_path -%}
|
||||
{%- assign _href = __return -%}
|
||||
<li>
|
||||
<a class="button button--secondary button--circle" href="{{ _href | replace: ':num', page }}"><span>{{ page }}</span></a>
|
||||
</li>
|
||||
{%- endif -%}
|
||||
{%- else -%}
|
||||
{%- include snippets/prepend-baseurl.html path=site.paginate_path -%}
|
||||
{%- assign _href = __return -%}
|
||||
<li>
|
||||
<a class="button button--secondary button--circle" href="{{ _href | replace: ':num', page }}"><span>{{ page }}</span></a>
|
||||
</li>
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
|
||||
{%- if paginator.next_page -%}
|
||||
{%- include snippets/prepend-baseurl.html path=paginator.next_page_path -%}
|
||||
{%- assign _href = __return -%}
|
||||
<li><a class="button button--secondary button--circle" href="{{ _href }}">
|
||||
<i class="fas fa-angle-right"></i>
|
||||
</a></li>
|
||||
{%- else -%}
|
||||
<li><div class="button button--secondary button--circle disabled">
|
||||
<i class="fas fa-angle-right"></i>
|
||||
</div></li>
|
||||
{%- endif -%}
|
||||
<li><i> {{ _locale_statistics | replace: '[POST_COUNT]', _post_count | replace: '[PAGE_COUNT]', _page_count }}</i></li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{%- endif -%}
|
135
_includes/scripts/archieve.js
Normal file
@ -0,0 +1,135 @@
|
||||
(function() {
|
||||
var SOURCES = window.TEXT_VARIABLES.sources;
|
||||
function queryString() {
|
||||
// This function is anonymous, is executed immediately and
|
||||
// the return value is assigned to QueryString!
|
||||
var i = 0, queryObj = {}, pair;
|
||||
var queryStr = window.location.search.substring(1);
|
||||
var queryArr = queryStr.split('&');
|
||||
for (i = 0; i < queryArr.length; i++) {
|
||||
pair = queryArr[i].split('=');
|
||||
// If first entry with this name
|
||||
if (typeof queryObj[pair[0]] === 'undefined') {
|
||||
queryObj[pair[0]] = pair[1];
|
||||
// If second entry with this name
|
||||
} else if (typeof queryObj[pair[0]] === 'string') {
|
||||
queryObj[pair[0]] = [queryObj[pair[0]], pair[1]];
|
||||
// If third or later entry with this name
|
||||
} else {
|
||||
queryObj[pair[0]].push(pair[1]);
|
||||
}
|
||||
}
|
||||
return queryObj;
|
||||
}
|
||||
|
||||
var setUrlQuery = (function() {
|
||||
var baseUrl = window.location.href.split('?')[0];
|
||||
return function(query) {
|
||||
if (typeof query === 'string') {
|
||||
window.history.replaceState(null, '', baseUrl + query);
|
||||
} else {
|
||||
window.history.replaceState(null, '', baseUrl);
|
||||
}
|
||||
};
|
||||
})();
|
||||
|
||||
window.Lazyload.js(SOURCES.jquery, function() {
|
||||
var $tags = $('.js-tags');
|
||||
var $articleTags = $tags.find('button');
|
||||
var $tagShowAll = $tags.find('.tag-button--all');
|
||||
var $result = $('.js-result');
|
||||
var $sections = $result.find('section');
|
||||
var sectionArticles = [];
|
||||
var $lastFocusButton = null;
|
||||
var sectionTopArticleIndex = [];
|
||||
var hasInit = false;
|
||||
|
||||
$sections.each(function() {
|
||||
sectionArticles.push($(this).find('.item'));
|
||||
});
|
||||
|
||||
function init() {
|
||||
var i, index = 0;
|
||||
for (i = 0; i < $sections.length; i++) {
|
||||
sectionTopArticleIndex.push(index);
|
||||
index += $sections.eq(i).find('.item').length;
|
||||
}
|
||||
sectionTopArticleIndex.push(index);
|
||||
}
|
||||
|
||||
function searchButtonsByTag(_tag/*raw tag*/) {
|
||||
if (!_tag) {
|
||||
return $tagShowAll;
|
||||
}
|
||||
var _buttons = $articleTags.filter('[data-encode="' + _tag + '"]');
|
||||
if (_buttons.length === 0) {
|
||||
return $tagShowAll;
|
||||
}
|
||||
return _buttons;
|
||||
}
|
||||
function buttonFocus(target) {
|
||||
if (target) {
|
||||
target.addClass('focus');
|
||||
$lastFocusButton && !$lastFocusButton.is(target) && $lastFocusButton.removeClass('focus');
|
||||
$lastFocusButton = target;
|
||||
}
|
||||
}
|
||||
|
||||
function tagSelect (tag/*raw tag*/, target) {
|
||||
var result = {}, $articles;
|
||||
var i, j, k, _tag;
|
||||
|
||||
for (i = 0; i < sectionArticles.length; i++) {
|
||||
$articles = sectionArticles[i];
|
||||
for (j = 0; j < $articles.length; j++) {
|
||||
if (tag === '' || tag === undefined) {
|
||||
result[i] || (result[i] = {});
|
||||
result[i][j] = true;
|
||||
} else {
|
||||
var tags = $articles.eq(j).data('tags').split(',');
|
||||
for (k = 0; k < tags.length; k++) {
|
||||
if (tags[k] === tag) {
|
||||
result[i] || (result[i] = {});
|
||||
result[i][j] = true; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < sectionArticles.length; i++) {
|
||||
result[i] && $sections.eq(i).removeClass('d-none');
|
||||
result[i] || $sections.eq(i).addClass('d-none');
|
||||
for (j = 0; j < sectionArticles[i].length; j++) {
|
||||
if (result[i] && result[i][j]) {
|
||||
sectionArticles[i].eq(j).removeClass('d-none');
|
||||
} else {
|
||||
sectionArticles[i].eq(j).addClass('d-none');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
hasInit || ($result.removeClass('d-none'), hasInit = true);
|
||||
|
||||
|
||||
if (target) {
|
||||
buttonFocus(target);
|
||||
_tag = target.attr('data-encode');
|
||||
if (_tag === '' || typeof _tag !== 'string') {
|
||||
setUrlQuery();
|
||||
} else {
|
||||
setUrlQuery('?tag=' + _tag);
|
||||
}
|
||||
} else {
|
||||
buttonFocus(searchButtonsByTag(tag));
|
||||
}
|
||||
}
|
||||
|
||||
var query = queryString(), _tag = query.tag;
|
||||
init(); tagSelect(_tag);
|
||||
$tags.on('click', 'button', function() {
|
||||
tagSelect($(this).data('encode'), $(this));
|
||||
});
|
||||
|
||||
});
|
||||
})();
|
24
_includes/scripts/article.js
Normal file
@ -0,0 +1,24 @@
|
||||
(function() {
|
||||
var SOURCES = window.TEXT_VARIABLES.sources;
|
||||
window.Lazyload.js(SOURCES.jquery, function() {
|
||||
$(function() {
|
||||
var $this ,$scroll;
|
||||
var $articleContent = $('.js-article-content');
|
||||
var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
|
||||
var scroll = hasSidebar ? '.js-page-main' : 'html, body';
|
||||
$scroll = $(scroll);
|
||||
|
||||
$articleContent.find('.highlight').each(function() {
|
||||
$this = $(this);
|
||||
$this.attr('data-lang', $this.find('code').attr('data-lang'));
|
||||
});
|
||||
$articleContent.find('h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]').each(function() {
|
||||
$this = $(this);
|
||||
$this.append($('<a class="anchor d-print-none" aria-hidden="true"></a>').html('<i class="fas fa-anchor"></i>'));
|
||||
});
|
||||
$articleContent.on('click', '.anchor', function() {
|
||||
$scroll.scrollToAnchor('#' + $(this).parent().attr('id'), 400);
|
||||
});
|
||||
});
|
||||
});
|
||||
})();
|
26
_includes/scripts/aside/affix.js
Normal file
@ -0,0 +1,26 @@
|
||||
(function() {
|
||||
var SOURCES = window.TEXT_VARIABLES.sources;
|
||||
window.Lazyload.js(SOURCES.jquery, function() {
|
||||
var $window = $(window), $pageFooter = $('.js-page-footer');
|
||||
var $pageAside = $('.js-page-aside');
|
||||
var affix;
|
||||
var tocDisabled = false;
|
||||
var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
|
||||
|
||||
affix = $pageAside.affix({
|
||||
offsetBottom: $pageFooter.outerHeight(),
|
||||
scrollTarget: hasSidebar ? '.js-page-main' : null,
|
||||
scroller: hasSidebar ? '.js-page-main' : null,
|
||||
scroll: hasSidebar ? $('.js-page-main').children() : null,
|
||||
disabled: tocDisabled
|
||||
});
|
||||
|
||||
$window.on('resize', window.throttle(function() {
|
||||
affix && affix.setOptions({
|
||||
disabled: tocDisabled
|
||||
});
|
||||
}, 100));
|
||||
|
||||
window.pageAsideAffix = affix;
|
||||
});
|
||||
})();
|
35
_includes/scripts/aside/toc.js
Normal file
@ -0,0 +1,35 @@
|
||||
(function() {
|
||||
var SOURCES = window.TEXT_VARIABLES.sources;
|
||||
var TOC_SELECTOR = window.TEXT_VARIABLES.site.toc.selectors;
|
||||
window.Lazyload.js(SOURCES.jquery, function() {
|
||||
var $window = $(window);
|
||||
var $articleContent = $('.js-article-content');
|
||||
var $tocRoot = $('.js-toc-root'), $col2 = $('.js-col-aside');
|
||||
var toc;
|
||||
var tocDisabled = false;
|
||||
var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
|
||||
var hasToc = $articleContent.find(TOC_SELECTOR).length > 0;
|
||||
|
||||
function disabled() {
|
||||
return $col2.css('display') === 'none' || !hasToc;
|
||||
}
|
||||
|
||||
tocDisabled = disabled();
|
||||
|
||||
toc = $tocRoot.toc({
|
||||
selectors: TOC_SELECTOR,
|
||||
container: $articleContent,
|
||||
scrollTarget: hasSidebar ? '.js-page-main' : null,
|
||||
scroller: hasSidebar ? '.js-page-main' : null,
|
||||
disabled: tocDisabled
|
||||
});
|
||||
|
||||
$window.on('resize', window.throttle(function() {
|
||||
tocDisabled = disabled();
|
||||
toc && toc.setOptions({
|
||||
disabled: tocDisabled
|
||||
});
|
||||
}, 100));
|
||||
|
||||
});
|
||||
})();
|
7
_includes/scripts/common.js
Normal file
@ -0,0 +1,7 @@
|
||||
(function () {
|
||||
var $root = document.getElementsByClassName('root')[0];
|
||||
if (window.hasEvent('touchstart')) {
|
||||
$root.dataset.isTouch = true;
|
||||
document.addEventListener('touchstart', function(){}, false);
|
||||
}
|
||||
})();
|
49
_includes/scripts/components/lightbox.js
Normal file
@ -0,0 +1,49 @@
|
||||
{%- include scripts/utils/imagesLoad.js -%}
|
||||
(function () {
|
||||
var SOURCES = window.TEXT_VARIABLES.sources;
|
||||
window.Lazyload.js(SOURCES.jquery, function() {
|
||||
var $pageGalleryModal = $('.js-page-gallery-modal');
|
||||
var $images = $('.page__content').find('img:not(.lightbox-ignore)');
|
||||
window.imagesLoad($images).then(function() {
|
||||
/* global Gallery */
|
||||
var pageGalleryModal = $pageGalleryModal.modal({ onChange: handleModalChange });
|
||||
var gallery = null;
|
||||
var modalVisible = false;
|
||||
var i, items = [], image, item;
|
||||
if($images && $images.length > 0) {
|
||||
for (i = 0; i < $images.length; i++) {
|
||||
image = $images.eq(i);
|
||||
if (image.get(0).naturalWidth > 800) {
|
||||
items.push({ src: image.attr('src'), w: image.get(0).naturalWidth, h: image.get(0).naturalHeight, $el: image});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(items.length > 0) {
|
||||
gallery = new Gallery('.gallery', items);
|
||||
gallery.setOptions({ disabled: !modalVisible });
|
||||
gallery.init();
|
||||
for (i = 0; i < items.length; i++) {
|
||||
item = items[i];
|
||||
item.$el && (item.$el.addClass('popup-image'), item.$el.on('click', (function() {
|
||||
var index = i;
|
||||
return function() {
|
||||
pageGalleryModal.show();
|
||||
gallery.setOptions({ initialSlide: index });
|
||||
gallery.refresh(true, { animation: false });
|
||||
};
|
||||
})()));
|
||||
}
|
||||
}
|
||||
|
||||
function handleModalChange(visible) {
|
||||
modalVisible = visible;
|
||||
gallery && gallery.setOptions({ disabled: !modalVisible });
|
||||
}
|
||||
|
||||
$pageGalleryModal.on('click', function() {
|
||||
pageGalleryModal.hide();
|
||||
});
|
||||
});
|
||||
});
|
||||
})();
|
86
_includes/scripts/components/search.js
Normal file
@ -0,0 +1,86 @@
|
||||
|
||||
(function () {
|
||||
var SOURCES = window.TEXT_VARIABLES.sources;
|
||||
window.Lazyload.js(SOURCES.jquery, function() {
|
||||
// search panel
|
||||
var search = (window.search || (window.search = {}));
|
||||
var useDefaultSearchBox = window.useDefaultSearchBox === undefined ?
|
||||
true : window.useDefaultSearchBox ;
|
||||
|
||||
var $searchModal = $('.js-page-search-modal');
|
||||
var $searchToggle = $('.js-search-toggle');
|
||||
var searchModal = $searchModal.modal({ onChange: handleModalChange, hideWhenWindowScroll: true });
|
||||
var modalVisible = false;
|
||||
search.searchModal = searchModal;
|
||||
|
||||
var $searchBox = null;
|
||||
var $searchInput = null;
|
||||
var $searchClear = null;
|
||||
|
||||
function getModalVisible() {
|
||||
return modalVisible;
|
||||
}
|
||||
search.getModalVisible = getModalVisible;
|
||||
|
||||
function handleModalChange(visible) {
|
||||
modalVisible = visible;
|
||||
if (visible) {
|
||||
search.onShow && search.onShow();
|
||||
useDefaultSearchBox && $searchInput[0] && $searchInput[0].focus();
|
||||
} else {
|
||||
search.onShow && search.onHide();
|
||||
useDefaultSearchBox && $searchInput[0] && $searchInput[0].blur();
|
||||
setTimeout(function() {
|
||||
useDefaultSearchBox && ($searchInput.val(''), $searchBox.removeClass('not-empty'));
|
||||
search.clear && search.clear();
|
||||
window.pageAsideAffix && window.pageAsideAffix.refresh();
|
||||
}, 400);
|
||||
}
|
||||
}
|
||||
|
||||
$searchToggle.on('click', function() {
|
||||
modalVisible ? searchModal.hide() : searchModal.show();
|
||||
});
|
||||
// Char Code: 83 S, 191 /
|
||||
$(window).on('keyup', function(e) {
|
||||
if (!modalVisible && !window.isFormElement(e.target || e.srcElement) && (e.which === 83 || e.which === 191)) {
|
||||
modalVisible || searchModal.show();
|
||||
}
|
||||
});
|
||||
|
||||
if (useDefaultSearchBox) {
|
||||
$searchBox = $('.js-search-box');
|
||||
$searchInput = $searchBox.children('input');
|
||||
$searchClear = $searchBox.children('.js-icon-clear');
|
||||
search.getSearchInput = function() {
|
||||
return $searchInput.get(0);
|
||||
};
|
||||
search.getVal = function() {
|
||||
return $searchInput.val();
|
||||
};
|
||||
search.setVal = function(val) {
|
||||
$searchInput.val(val);
|
||||
};
|
||||
|
||||
$searchInput.on('focus', function() {
|
||||
$(this).addClass('focus');
|
||||
});
|
||||
$searchInput.on('blur', function() {
|
||||
$(this).removeClass('focus');
|
||||
});
|
||||
$searchInput.on('input', window.throttle(function() {
|
||||
var val = $(this).val();
|
||||
if (val === '' || typeof val !== 'string') {
|
||||
search.clear && search.clear();
|
||||
} else {
|
||||
$searchBox.addClass('not-empty');
|
||||
search.onInputNotEmpty && search.onInputNotEmpty(val);
|
||||
}
|
||||
}, 400));
|
||||
$searchClear.on('click', function() {
|
||||
$searchInput.val(''); $searchBox.removeClass('not-empty');
|
||||
search.clear && search.clear();
|
||||
});
|
||||
}
|
||||
});
|
||||
})();
|
30
_includes/scripts/components/sidebar.js
Normal file
@ -0,0 +1,30 @@
|
||||
(function() {
|
||||
var SOURCES = window.TEXT_VARIABLES.sources;
|
||||
|
||||
window.Lazyload.js(SOURCES.jquery, function() {
|
||||
var $pageMask = $('.js-page-mask');
|
||||
var $pageRoot = $('.js-page-root');
|
||||
var $sidebarShow = $('.js-sidebar-show');
|
||||
var $sidebarHide = $('.js-sidebar-hide');
|
||||
|
||||
function freeze(e) {
|
||||
if (e.target === $pageMask[0]) {
|
||||
e.preventDefault();
|
||||
}
|
||||
}
|
||||
function stopBodyScrolling(bool) {
|
||||
if (bool === true) {
|
||||
window.addEventListener('touchmove', freeze, { passive: false });
|
||||
} else {
|
||||
window.removeEventListener('touchmove', freeze, { passive: false });
|
||||
}
|
||||
}
|
||||
|
||||
$sidebarShow.on('click', function() {
|
||||
stopBodyScrolling(true); $pageRoot.addClass('show-sidebar');
|
||||
});
|
||||
$sidebarHide.on('click', function() {
|
||||
stopBodyScrolling(false); $pageRoot.removeClass('show-sidebar');
|
||||
});
|
||||
});
|
||||
})();
|
3
_includes/scripts/home.js
Normal file
@ -0,0 +1,3 @@
|
||||
/*(function () {
|
||||
|
||||
})();*/
|
111
_includes/scripts/lib/affix.js
Normal file
@ -0,0 +1,111 @@
|
||||
(function() {
|
||||
var SOURCES = window.TEXT_VARIABLES.sources;
|
||||
window.Lazyload.js(SOURCES.jquery, function() {
|
||||
function affix(options) {
|
||||
var $root = this, $window = $(window), $scrollTarget, $scroll,
|
||||
offsetBottom = 0, scrollTarget = window, scroll = window.document, disabled = false, isOverallScroller = true,
|
||||
rootTop, rootLeft, rootHeight, scrollBottom, rootBottomTop,
|
||||
hasInit = false, curState;
|
||||
|
||||
function setOptions(options) {
|
||||
var _options = options || {};
|
||||
_options.offsetBottom && (offsetBottom = _options.offsetBottom);
|
||||
_options.scrollTarget && (scrollTarget = _options.scrollTarget);
|
||||
_options.scroll && (scroll = _options.scroll);
|
||||
_options.disabled !== undefined && (disabled = _options.disabled);
|
||||
$scrollTarget = $(scrollTarget);
|
||||
isOverallScroller = window.isOverallScroller($scrollTarget[0]);
|
||||
$scroll = $(scroll);
|
||||
}
|
||||
function preCalc() {
|
||||
top();
|
||||
rootHeight = $root.outerHeight();
|
||||
rootTop = $root.offset().top + (isOverallScroller ? 0 : $scrollTarget.scrollTop());
|
||||
rootLeft = $root.offset().left;
|
||||
}
|
||||
function calc(needPreCalc) {
|
||||
needPreCalc && preCalc();
|
||||
scrollBottom = $scroll.outerHeight() - offsetBottom - rootHeight;
|
||||
rootBottomTop = scrollBottom - rootTop;
|
||||
}
|
||||
function top() {
|
||||
if (curState !== 'top') {
|
||||
$root.removeClass('fixed').css({
|
||||
left: 0,
|
||||
top: 0
|
||||
});
|
||||
curState = 'top';
|
||||
}
|
||||
}
|
||||
function fixed() {
|
||||
if (curState !== 'fixed') {
|
||||
$root.addClass('fixed').css({
|
||||
left: rootLeft + 'px',
|
||||
top: 0
|
||||
});
|
||||
curState = 'fixed';
|
||||
}
|
||||
}
|
||||
function bottom() {
|
||||
if (curState !== 'bottom') {
|
||||
$root.removeClass('fixed').css({
|
||||
left: 0,
|
||||
top: rootBottomTop + 'px'
|
||||
});
|
||||
curState = 'bottom';
|
||||
}
|
||||
}
|
||||
function setState() {
|
||||
var scrollTop = $scrollTarget.scrollTop();
|
||||
if (scrollTop >= rootTop && scrollTop <= scrollBottom) {
|
||||
fixed();
|
||||
} else if (scrollTop < rootTop) {
|
||||
top();
|
||||
} else {
|
||||
bottom();
|
||||
}
|
||||
}
|
||||
function init() {
|
||||
if(!hasInit) {
|
||||
var interval, timeout;
|
||||
calc(true); setState();
|
||||
// run calc every 100 millisecond
|
||||
interval = setInterval(function() {
|
||||
calc();
|
||||
}, 100);
|
||||
timeout = setTimeout(function() {
|
||||
clearInterval(interval);
|
||||
}, 45000);
|
||||
window.pageLoad.then(function() {
|
||||
setTimeout(function() {
|
||||
clearInterval(interval);
|
||||
clearTimeout(timeout);
|
||||
}, 3000);
|
||||
});
|
||||
$scrollTarget.on('scroll', function() {
|
||||
disabled || setState();
|
||||
});
|
||||
$window.on('resize', function() {
|
||||
disabled || (calc(true), setState());
|
||||
});
|
||||
hasInit = true;
|
||||
}
|
||||
}
|
||||
|
||||
setOptions(options);
|
||||
if (!disabled) {
|
||||
init();
|
||||
}
|
||||
$window.on('resize', window.throttle(function() {
|
||||
init();
|
||||
}, 200));
|
||||
return {
|
||||
setOptions: setOptions,
|
||||
refresh: function() {
|
||||
calc(true, { animation: false }); setState();
|
||||
}
|
||||
};
|
||||
}
|
||||
$.fn.affix = affix;
|
||||
});
|
||||
})();
|
192
_includes/scripts/lib/gallery.js
Normal file
@ -0,0 +1,192 @@
|
||||
(function() {
|
||||
{%- include scripts/lib/swiper.js -%}
|
||||
var SOURCES = window.TEXT_VARIABLES.sources;
|
||||
window.Lazyload.js(SOURCES.jquery, function() {
|
||||
var template =
|
||||
'<div class="swiper gallery__swiper">' +
|
||||
'<div class="swiper__wrapper">' +
|
||||
'</div>' +
|
||||
'<div class="swiper__button swiper__button--prev fas fa-chevron-left"></div>' +
|
||||
'<div class="swiper__button swiper__button--next fas fa-chevron-right"></div>' +
|
||||
'</div>';
|
||||
function setState($item, zoom, translate) {
|
||||
$item.css('transform', 'scale(' + zoom + ') translate(' + translate.x + 'px,' + translate.y + 'px)');
|
||||
}
|
||||
function Gallery(root, items) {
|
||||
this.$root = $(root);
|
||||
this.$swiper = null;
|
||||
this.$swiperWrapper = null;
|
||||
this.$activeItem = null;
|
||||
this.$items = [];
|
||||
this.contentWidth = 0;
|
||||
this.contentHeight = 0;
|
||||
this.swiper = null;
|
||||
this.items = items;
|
||||
this.disabled = false;
|
||||
this.curIndex = 0;
|
||||
this.touchCenter = null;
|
||||
this.lastTouchCenter = null;
|
||||
this.zoomRect = null;
|
||||
this.lastZoomRect = null;
|
||||
this.lastTranslate = null;
|
||||
this.translate = null;
|
||||
this.lastZoom = 1;
|
||||
this.preZoom = 1;
|
||||
this.zoom = 1;
|
||||
}
|
||||
Gallery.prototype.init = function() {
|
||||
var i, item, items = this.items, size, self = this, touchstartFingerCount = 0;
|
||||
this.$root.append(template);
|
||||
this.$swiper = this.$root.find('.gallery__swiper');
|
||||
this.$swiperWrapper = this.$root.find('.swiper__wrapper');
|
||||
this.contentWidth = this.$swiperWrapper && this.$swiperWrapper.width();
|
||||
this.contentHeight = this.$swiperWrapper && this.$swiperWrapper.height();
|
||||
for (i = 0; i < items.length; i++) {
|
||||
item = items[i];
|
||||
size = this._calculateImageSize(item.w, item.h);
|
||||
this.$items.push($(
|
||||
'<div class="swiper__slide">' +
|
||||
'<div class="gallery-item">' +
|
||||
'<div class="gallery-item__content">' +
|
||||
'<img src="' + item.src + '" style="width:' + size.w + 'px;height:' + size.h + 'px"/>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</div>'
|
||||
));
|
||||
}
|
||||
this.$swiperWrapper && this.$swiperWrapper.append(this.$items);
|
||||
this.swiper = this.$swiper && this.$swiper.swiper({
|
||||
onChangeEnd: function() {
|
||||
self._handleChangeEnd.apply(self, Array.prototype.slice.call(arguments));
|
||||
}
|
||||
});
|
||||
$(window).on('resize', function() {
|
||||
if (self.disabled) { return; }
|
||||
self._resizeImageSize();
|
||||
});
|
||||
// Char Code: 37 ⬅, 39 ➡
|
||||
$(window).on('keyup', function(e) {
|
||||
if (window.isFormElement(e.target || e.srcElement) || self.disabled) { return; }
|
||||
if (e.which === 37) {
|
||||
self.swiper && self.swiper.previous();
|
||||
} else if (e.which === 39) {
|
||||
self.swiper && self.swiper.next();
|
||||
}
|
||||
});
|
||||
function getRect(touch0, touch1) {
|
||||
return {
|
||||
o: {
|
||||
x: (touch0.pageX + touch1.pageX) / 2,
|
||||
y: (touch0.pageY + touch1.pageY) / 2
|
||||
},
|
||||
w: Math.abs(touch0.pageX - touch1.pageX),
|
||||
h: Math.abs(touch0.pageY - touch1.pageY)
|
||||
};
|
||||
}
|
||||
function getTouches(e) {
|
||||
return e.touches || e;
|
||||
}
|
||||
function getTouchesCount(e) {
|
||||
if (e.touches) {
|
||||
return e.touches.length;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
this.$swiperWrapper.on('touchstart', function(e) {
|
||||
var touch0, touch1, rect;
|
||||
touchstartFingerCount = getTouchesCount(e);
|
||||
if (touchstartFingerCount > 1) {
|
||||
touch0 = e.touches[0];
|
||||
touch1 = e.touches[1];
|
||||
rect = getRect(touch0, touch1);
|
||||
self.lastZoomRect = { w: rect.w, h: rect.h };
|
||||
self.lastTouchCenter = rect.o;
|
||||
} else {
|
||||
var touch = getTouches(e)[0];
|
||||
self.lastTouchCenter = { x: touch.pageX, y: touch.pageY };
|
||||
}
|
||||
});
|
||||
this.$swiperWrapper.on('touchmove', function(e) {
|
||||
if (touchstartFingerCount === getTouchesCount(e)) {
|
||||
if (touchstartFingerCount > 1) {
|
||||
var touch0 = e.touches[0];
|
||||
var touch1 = e.touches[1];
|
||||
var rect = getRect(touch0, touch1);
|
||||
self.zoomRect = { w: rect.w, h: rect.h };
|
||||
self.touchCenter = rect.o;
|
||||
self._zoom(); self._translate();
|
||||
setState(self.$activeItem, self.zoom, self.translate);
|
||||
} else {
|
||||
var touch = getTouches(e)[0];
|
||||
self.touchCenter = { x: touch.pageX, y: touch.pageY };
|
||||
self._translate();
|
||||
setState(self.$activeItem, self.zoom, self.translate);
|
||||
}
|
||||
}
|
||||
});
|
||||
this.$swiperWrapper.on('touchend', function(e) {
|
||||
self.lastZoom = self.zoom;
|
||||
self.lastTranslate = self.translate;
|
||||
touchstartFingerCount = 0;
|
||||
});
|
||||
this.$root.on('touchmove', function(e) {
|
||||
if (self.disabled) { return; }
|
||||
e.preventDefault();
|
||||
});
|
||||
};
|
||||
|
||||
Gallery.prototype._translate = function() {
|
||||
this.translate = this.touchCenter && this.lastTouchCenter && this.lastTranslate ? {
|
||||
x: (this.touchCenter.x - this.lastTouchCenter.x) / this.zoom + this.lastTranslate.x,
|
||||
y: (this.touchCenter.y - this.lastTouchCenter.y) / this.zoom + this.lastTranslate.y
|
||||
} : { x: 0, y: 0 };
|
||||
}
|
||||
Gallery.prototype._zoom = function() {
|
||||
this.zoom = (this.zoomRect.w + this.zoomRect.h) / (this.lastZoomRect.w + this.lastZoomRect.h) * this.lastZoom;
|
||||
this.zoom > 1 ? this.$activeItem.addClass('zoom') : this.$activeItem.removeClass('zoom');
|
||||
this.preZoom = this.zoom;
|
||||
}
|
||||
|
||||
Gallery.prototype._calculateImageSize = function(w, h) {
|
||||
var scale = 1;
|
||||
if (this.contentWidth > 0 && this.contentHeight > 0 && w > 0 && h > 0) {
|
||||
scale = Math.min(
|
||||
Math.min(w, this.contentWidth) / w,
|
||||
Math.min(h, this.contentHeight) / h);
|
||||
}
|
||||
return { w: Math.floor(w * scale), h: Math.floor(h * scale) };
|
||||
};
|
||||
|
||||
Gallery.prototype._resizeImageSize = function() {
|
||||
var i, $item, $items = this.$items, item, size;
|
||||
this.contentWidth = this.$swiperWrapper && this.$swiperWrapper.width();
|
||||
this.contentHeight = this.$swiperWrapper && this.$swiperWrapper.height();
|
||||
if ($items.length < 1) { return; }
|
||||
for (i = 0; i < $items.length; i++) {
|
||||
item = this.items[i], $item = $items[i];
|
||||
size = this._calculateImageSize(item.w, item.h);
|
||||
item.width = size.w; item.height = size.h;
|
||||
$item && $item.find('img').css({ width: size.w, height: size.h });
|
||||
}
|
||||
};
|
||||
Gallery.prototype._handleChangeEnd = function(index, $dom, preIndex, $preDom) {
|
||||
this.curIndex = index;
|
||||
this.lastZoomRect = null; this.lastZoomRect = null;
|
||||
this.lastTranslate = this.translate = { x: 0, y:0 };
|
||||
this.lastZoom = this.preZoom = this.zoom = 1;
|
||||
this.$activeItem = $dom.find('.gallery-item__content');
|
||||
setState($preDom.find('.gallery-item__content'), this.zoom, this.translate);
|
||||
};
|
||||
|
||||
Gallery.prototype.refresh = function() {
|
||||
this.swiper && this.swiper.refresh();
|
||||
this._resizeImageSize();
|
||||
};
|
||||
Gallery.prototype.setOptions = function(options) {
|
||||
this.disabled = options.disabled;
|
||||
this.swiper && this.swiper.setOptions(options);
|
||||
};
|
||||
window.Gallery = Gallery;
|
||||
});
|
||||
})();
|
143
_includes/scripts/lib/lazyload.js
Normal file
@ -0,0 +1,143 @@
|
||||
(function() {
|
||||
var Set = (function() {
|
||||
var add = function(item) {
|
||||
var i, data = this._data;
|
||||
for (i = 0; i < data.length; i++) {
|
||||
if (data[i] === item) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
this.size ++;
|
||||
data.push(item);
|
||||
return data;
|
||||
};
|
||||
|
||||
var Set = function(data) {
|
||||
this.size = 0;
|
||||
this._data = [];
|
||||
var i;
|
||||
if (data.length > 0) {
|
||||
for (i = 0; i < data.length; i++) {
|
||||
add.call(this, data[i]);
|
||||
}
|
||||
}
|
||||
};
|
||||
Set.prototype.add = add;
|
||||
Set.prototype.get = function(index) { return this._data[index]; };
|
||||
Set.prototype.has = function(item) {
|
||||
var i, data = this._data;
|
||||
for (i = 0; i < data.length; i++) {
|
||||
if (this.get(i) === item) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
Set.prototype.is = function(map) {
|
||||
if (map._data.length !== this._data.length) { return false; }
|
||||
var i, j, flag, tData = this._data, mData = map._data;
|
||||
for (i = 0; i < tData.length; i++) {
|
||||
for (flag = false, j = 0; j < mData.length; j++) {
|
||||
if (tData[i] === mData[j]) {
|
||||
flag = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!flag) { return false; }
|
||||
}
|
||||
return true;
|
||||
};
|
||||
Set.prototype.values = function() {
|
||||
return this._data;
|
||||
};
|
||||
return Set;
|
||||
})();
|
||||
|
||||
window.Lazyload = (function(doc) {
|
||||
var queue = {js: [], css: []}, sources = {js: {}, css: {}}, context = this;
|
||||
var createNode = function(name, attrs) {
|
||||
var node = doc.createElement(name), attr;
|
||||
for (attr in attrs) {
|
||||
if (attrs.hasOwnProperty(attr)) {
|
||||
node.setAttribute(attr, attrs[attr]);
|
||||
}
|
||||
}
|
||||
return node;
|
||||
};
|
||||
var end = function(type, url) {
|
||||
var s, q, qi, cbs, i, j, cur, val, flag;
|
||||
if (type === 'js' || type ==='css') {
|
||||
s = sources[type], q = queue[type];
|
||||
s[url] = true;
|
||||
for (i = 0; i < q.length; i++) {
|
||||
cur = q[i];
|
||||
if (cur.urls.has(url)) {
|
||||
qi = cur, val = qi.urls.values();
|
||||
qi && (cbs = qi.callbacks);
|
||||
for (flag = true, j = 0; j < val.length; j++) {
|
||||
cur = val[j];
|
||||
if (!s[cur]) {
|
||||
flag = false;
|
||||
}
|
||||
}
|
||||
if (flag && cbs && cbs.length > 0) {
|
||||
for (j = 0; j < cbs.length; j++) {
|
||||
cbs[j].call(context);
|
||||
}
|
||||
qi.load = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
var load = function(type, urls, callback) {
|
||||
var s, q, qi, node, i, cur,
|
||||
_urls = typeof urls === 'string' ? new Set([urls]) : new Set(urls), val, url;
|
||||
if (type === 'js' || type ==='css') {
|
||||
s = sources[type], q = queue[type];
|
||||
for (i = 0; i < q.length; i++) {
|
||||
cur = q[i];
|
||||
if (_urls.is(cur.urls)) {
|
||||
qi = cur;
|
||||
break;
|
||||
}
|
||||
}
|
||||
val = _urls.values();
|
||||
if (qi) {
|
||||
callback && (qi.load || qi.callbacks.push(callback));
|
||||
callback && (qi.load && callback());
|
||||
} else {
|
||||
q.push({
|
||||
urls: _urls,
|
||||
callbacks: callback ? [callback] : [],
|
||||
load: false
|
||||
});
|
||||
for (i = 0; i < val.length; i++) {
|
||||
node = null, url = val[i];
|
||||
if (s[url] === undefined) {
|
||||
(type === 'js' ) && (node = createNode('script', { src: url }));
|
||||
(type === 'css') && (node = createNode('link', { rel: 'stylesheet', href: url }));
|
||||
if (node) {
|
||||
node.onload = (function(type, url) {
|
||||
return function() {
|
||||
end(type, url);
|
||||
};
|
||||
})(type, url);
|
||||
(doc.head || doc.body).appendChild(node);
|
||||
s[url] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
return {
|
||||
js: function(url, callback) {
|
||||
load('js', url, callback);
|
||||
},
|
||||
css: function(url, callback) {
|
||||
load('css', url, callback);
|
||||
}
|
||||
};
|
||||
})(this.document);
|
||||
})();
|
64
_includes/scripts/lib/modal.js
Normal file
@ -0,0 +1,64 @@
|
||||
(function() {
|
||||
var SOURCES = window.TEXT_VARIABLES.sources;
|
||||
window.Lazyload.js(SOURCES.jquery, function() {
|
||||
var $body = $('body'), $window = $(window);
|
||||
var $pageRoot = $('.js-page-root'), $pageMain = $('.js-page-main');
|
||||
var activeCount = 0;
|
||||
function modal(options) {
|
||||
var $root = this, visible, onChange, hideWhenWindowScroll = false;
|
||||
var scrollTop;
|
||||
function setOptions(options) {
|
||||
var _options = options || {};
|
||||
visible = _options.initialVisible === undefined ? false : show;
|
||||
onChange = _options.onChange;
|
||||
hideWhenWindowScroll = _options.hideWhenWindowScroll;
|
||||
}
|
||||
function init() {
|
||||
setState(visible);
|
||||
}
|
||||
function setState(isShow) {
|
||||
if (isShow === visible) {
|
||||
return;
|
||||
}
|
||||
visible = isShow;
|
||||
if (visible) {
|
||||
activeCount++;
|
||||
scrollTop = $(window).scrollTop() || $pageMain.scrollTop();
|
||||
$root.addClass('modal--show');
|
||||
$pageMain.scrollTop(scrollTop);
|
||||
activeCount === 1 && ($pageRoot.addClass('show-modal'), $body.addClass('of-hidden'));
|
||||
hideWhenWindowScroll && window.hasEvent('touchstart') && $window.on('scroll', hide);
|
||||
$window.on('keyup', handleKeyup);
|
||||
} else {
|
||||
activeCount > 0 && activeCount--;
|
||||
$root.removeClass('modal--show');
|
||||
$window.scrollTop(scrollTop);
|
||||
activeCount === 0 && ($pageRoot.removeClass('show-modal'), $body.removeClass('of-hidden'));
|
||||
hideWhenWindowScroll && window.hasEvent('touchstart') && $window.off('scroll', hide);
|
||||
$window.off('keyup', handleKeyup);
|
||||
}
|
||||
onChange && onChange(visible);
|
||||
}
|
||||
function show() {
|
||||
setState(true);
|
||||
}
|
||||
function hide() {
|
||||
setState(false);
|
||||
}
|
||||
function handleKeyup(e) {
|
||||
// Char Code: 27 ESC
|
||||
if (e.which === 27) {
|
||||
hide();
|
||||
}
|
||||
}
|
||||
setOptions(options);
|
||||
init();
|
||||
return {
|
||||
show: show,
|
||||
hide: hide,
|
||||
$el: $root
|
||||
};
|
||||
}
|
||||
$.fn.modal = modal;
|
||||
});
|
||||
})();
|
13
_includes/scripts/lib/scroll-to.js
Normal file
@ -0,0 +1,13 @@
|
||||
(function() {
|
||||
var SOURCES = window.TEXT_VARIABLES.sources;
|
||||
window.Lazyload.js(SOURCES.jquery, function() {
|
||||
function scrollToAnchor(anchor, duration, callback) {
|
||||
var $root = this;
|
||||
$root.animate({ scrollTop: $(anchor).position().top }, duration, function() {
|
||||
window.history.replaceState(null, '', window.location.href.split('#')[0] + anchor);
|
||||
callback && callback();
|
||||
});
|
||||
}
|
||||
$.fn.scrollToAnchor = scrollToAnchor;
|
||||
});
|
||||
})();
|
203
_includes/scripts/lib/swiper.js
Normal file
@ -0,0 +1,203 @@
|
||||
(function() {
|
||||
var SOURCES = window.TEXT_VARIABLES.sources;
|
||||
window.Lazyload.js(SOURCES.jquery, function() {
|
||||
function swiper(options) {
|
||||
var $window = $(window), $root = this, $swiperWrapper, $swiperSlides, $swiperButtonPrev, $swiperButtonNext,
|
||||
initialSlide, animation, onChange, onChangeEnd,
|
||||
rootWidth, count, preIndex, curIndex, translateX, CRITICAL_ANGLE = Math.PI / 3;
|
||||
|
||||
function setOptions(options) {
|
||||
var _options = options || {};
|
||||
initialSlide = _options.initialSlide || 0;
|
||||
animation = _options.animation === undefined && true;
|
||||
onChange = onChange || _options.onChange;
|
||||
onChangeEnd = onChangeEnd || _options.onChangeEnd;
|
||||
}
|
||||
|
||||
function init() {
|
||||
$swiperWrapper = $root.find('.swiper__wrapper');
|
||||
$swiperSlides = $root.find('.swiper__slide');
|
||||
$swiperButtonPrev = $root.find('.swiper__button--prev');
|
||||
$swiperButtonNext = $root.find('.swiper__button--next');
|
||||
animation && $swiperWrapper.addClass('swiper__wrapper--animation');
|
||||
calc(true);
|
||||
}
|
||||
|
||||
function preCalc() {
|
||||
rootWidth = $root.width();
|
||||
count = $swiperWrapper.children('.swiper__slide').length;
|
||||
if (count < 2) {
|
||||
$swiperButtonPrev.addClass('d-none');
|
||||
$swiperButtonNext.addClass('d-none');
|
||||
}
|
||||
curIndex = initialSlide || 0;
|
||||
translateX = getTranslateXFromCurIndex();
|
||||
}
|
||||
|
||||
var calc = (function() {
|
||||
var preAnimation, $swiperSlide, $preSwiperSlide;
|
||||
return function (needPreCalc, params) {
|
||||
needPreCalc && preCalc();
|
||||
var _animation = (params && params.animation !== undefined) ? params.animation : animation;
|
||||
if (preAnimation === undefined || preAnimation !== _animation) {
|
||||
preAnimation = _animation ? $swiperWrapper.addClass('swiper__wrapper--animation') :
|
||||
$swiperWrapper.removeClass('swiper__wrapper--animation');
|
||||
}
|
||||
if (preIndex !== curIndex) {
|
||||
($preSwiperSlide = $swiperSlides.eq(preIndex)).removeClass('active');
|
||||
($swiperSlide = $swiperSlides.eq(curIndex)).addClass('active');
|
||||
onChange && onChange(curIndex, $swiperSlides.eq(curIndex), $swiperSlide, $preSwiperSlide);
|
||||
if (onChangeEnd) {
|
||||
if (_animation) {
|
||||
setTimeout(function() {
|
||||
onChangeEnd(curIndex, $swiperSlides.eq(curIndex), $swiperSlide, $preSwiperSlide);
|
||||
}, 400);
|
||||
} else {
|
||||
onChangeEnd(curIndex, $swiperSlides.eq(curIndex), $swiperSlide, $preSwiperSlide);
|
||||
}
|
||||
}
|
||||
preIndex = curIndex;
|
||||
}
|
||||
$swiperWrapper.css('transform', 'translate(' + translateX + 'px, 0)');
|
||||
if (count > 1) {
|
||||
if (curIndex <= 0) {
|
||||
$swiperButtonPrev.addClass('disabled');
|
||||
} else {
|
||||
$swiperButtonPrev.removeClass('disabled');
|
||||
}
|
||||
if (curIndex >= count - 1) {
|
||||
$swiperButtonNext.addClass('disabled');
|
||||
} else {
|
||||
$swiperButtonNext.removeClass('disabled');
|
||||
}
|
||||
}
|
||||
};
|
||||
})();
|
||||
|
||||
function getTranslateXFromCurIndex() {
|
||||
return curIndex <= 0 ? 0 : - rootWidth * curIndex;
|
||||
}
|
||||
|
||||
function moveToIndex(index ,params) {
|
||||
preIndex = curIndex;
|
||||
curIndex = index;
|
||||
translateX = getTranslateXFromCurIndex();
|
||||
calc(false, params);
|
||||
}
|
||||
|
||||
function move(type) {
|
||||
var nextIndex = curIndex, unstableTranslateX;
|
||||
if (type === 'prev') {
|
||||
nextIndex > 0 && nextIndex--;
|
||||
} else if (type === 'next') {
|
||||
nextIndex < count - 1 && nextIndex++;
|
||||
}
|
||||
if (type === 'cur') {
|
||||
moveToIndex(curIndex, { animation: true });
|
||||
return;
|
||||
}
|
||||
unstableTranslateX = translateX % rootWidth !== 0;
|
||||
if (nextIndex !== curIndex || unstableTranslateX) {
|
||||
unstableTranslateX ? moveToIndex(nextIndex, { animation: true }) : moveToIndex(nextIndex);
|
||||
}
|
||||
}
|
||||
|
||||
setOptions(options);
|
||||
init();
|
||||
preIndex = curIndex;
|
||||
|
||||
$swiperButtonPrev.on('click', function(e) {
|
||||
e.stopPropagation();
|
||||
move('prev');
|
||||
});
|
||||
$swiperButtonNext.on('click', function(e) {
|
||||
e.stopPropagation();
|
||||
move('next');
|
||||
});
|
||||
$window.on('resize', function() {
|
||||
calc(true, { animation: false });
|
||||
});
|
||||
|
||||
(function() {
|
||||
var pageX, pageY, velocityX, preTranslateX = translateX, timeStamp, touching;
|
||||
function handleTouchstart(e) {
|
||||
var point = e.touches ? e.touches[0] : e;
|
||||
pageX = point.pageX;
|
||||
pageY = point.pageY;
|
||||
velocityX = 0;
|
||||
preTranslateX = translateX;
|
||||
}
|
||||
function handleTouchmove(e) {
|
||||
if (e.touches && e.touches.length > 1) {
|
||||
return;
|
||||
}
|
||||
var point = e.touches ? e.touches[0] : e;
|
||||
var deltaX = point.pageX - pageX;
|
||||
var deltaY = point.pageY - pageY;
|
||||
velocityX = deltaX / (e.timeStamp - timeStamp);
|
||||
timeStamp = e.timeStamp;
|
||||
if (e.cancelable && Math.abs(Math.atan(deltaY / deltaX)) < CRITICAL_ANGLE) {
|
||||
touching = true;
|
||||
translateX += deltaX;
|
||||
calc(false, { animation: false });
|
||||
}
|
||||
pageX = point.pageX;
|
||||
pageY = point.pageY;
|
||||
}
|
||||
function handleTouchend() {
|
||||
touching = false;
|
||||
var deltaX = translateX - preTranslateX;
|
||||
var distance = deltaX + velocityX * rootWidth;
|
||||
if (Math.abs(distance) > rootWidth / 2) {
|
||||
distance > 0 ? move('prev') : move('next');
|
||||
} else {
|
||||
move('cur');
|
||||
}
|
||||
}
|
||||
$swiperWrapper.on('touchstart', handleTouchstart);
|
||||
$swiperWrapper.on('touchmove', handleTouchmove);
|
||||
$swiperWrapper.on('touchend', handleTouchend);
|
||||
$swiperWrapper.on('touchcancel', handleTouchend);
|
||||
|
||||
(function() {
|
||||
var pressing = false, moved = false;
|
||||
$swiperWrapper.on('mousedown', function(e) {
|
||||
pressing = true; handleTouchstart(e);
|
||||
});
|
||||
$swiperWrapper.on('mousemove', function(e) {
|
||||
pressing && (e.preventDefault(), moved = true, handleTouchmove(e));
|
||||
});
|
||||
$swiperWrapper.on('mouseup', function(e) {
|
||||
pressing && (pressing = false, handleTouchend(e));
|
||||
});
|
||||
$swiperWrapper.on('mouseleave', function(e) {
|
||||
pressing && (pressing = false, handleTouchend(e));
|
||||
});
|
||||
$swiperWrapper.on('click', function(e) {
|
||||
moved && (e.stopPropagation(), moved = false);
|
||||
});
|
||||
})();
|
||||
|
||||
$root.on('touchmove', function(e) {
|
||||
if (e.cancelable & touching) {
|
||||
e.preventDefault();
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
||||
return {
|
||||
setOptions: setOptions,
|
||||
previous: function(){
|
||||
move('prev');
|
||||
},
|
||||
next: function(){
|
||||
move('next');
|
||||
},
|
||||
refresh: function() {
|
||||
calc(true, { animation: false });
|
||||
}
|
||||
};
|
||||
}
|
||||
$.fn.swiper = swiper;
|
||||
});
|
||||
})();
|
28
_includes/scripts/lib/throttle.js
Normal file
@ -0,0 +1,28 @@
|
||||
(function() {
|
||||
window.throttle = function(func, wait) {
|
||||
var args, result, thisArg, timeoutId, lastCalled = 0;
|
||||
|
||||
function trailingCall() {
|
||||
lastCalled = new Date;
|
||||
timeoutId = null;
|
||||
result = func.apply(thisArg, args);
|
||||
}
|
||||
return function() {
|
||||
var now = new Date,
|
||||
remaining = wait - (now - lastCalled);
|
||||
|
||||
args = arguments;
|
||||
thisArg = this;
|
||||
|
||||
if (remaining <= 0) {
|
||||
clearTimeout(timeoutId);
|
||||
timeoutId = null;
|
||||
lastCalled = now;
|
||||
result = func.apply(thisArg, args);
|
||||
} else if (!timeoutId) {
|
||||
timeoutId = setTimeout(trailingCall, remaining);
|
||||
}
|
||||
return result;
|
||||
};
|
||||
};
|
||||
})();
|
107
_includes/scripts/lib/toc.js
Normal file
@ -0,0 +1,107 @@
|
||||
(function() {
|
||||
var SOURCES = window.TEXT_VARIABLES.sources;
|
||||
window.Lazyload.js(SOURCES.jquery, function() {
|
||||
function toc(options) {
|
||||
var $root = this, $window = $(window), $scrollTarget, $scroller, $tocUl = $('<ul class="toc toc--ellipsis"></ul>'), $tocLi, $headings, $activeLast, $activeCur,
|
||||
selectors = 'h1,h2,h3', container = 'body', scrollTarget = window, scroller = 'html, body', disabled = false,
|
||||
headingsPos, scrolling = false, hasRendered = false, hasInit = false;
|
||||
|
||||
function setOptions(options) {
|
||||
var _options = options || {};
|
||||
_options.selectors && (selectors = _options.selectors);
|
||||
_options.container && (container = _options.container);
|
||||
_options.scrollTarget && (scrollTarget = _options.scrollTarget);
|
||||
_options.scroller && (scroller = _options.scroller);
|
||||
_options.disabled !== undefined && (disabled = _options.disabled);
|
||||
$headings = $(container).find(selectors).filter('[id]');
|
||||
$scrollTarget = $(scrollTarget);
|
||||
$scroller = $(scroller);
|
||||
}
|
||||
function calc() {
|
||||
headingsPos = [];
|
||||
$headings.each(function() {
|
||||
headingsPos.push(Math.floor($(this).position().top));
|
||||
});
|
||||
}
|
||||
function setState(element, disabled) {
|
||||
var scrollTop = $scrollTarget.scrollTop(), i;
|
||||
if (disabled || !headingsPos || headingsPos.length < 1) { return; }
|
||||
if (element) {
|
||||
$activeCur = element;
|
||||
} else {
|
||||
for (i = 0; i < headingsPos.length; i++) {
|
||||
if (scrollTop >= headingsPos[i]) {
|
||||
$activeCur = $tocLi.eq(i);
|
||||
} else {
|
||||
$activeCur || ($activeCur = $tocLi.eq(i));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
$activeLast && $activeLast.removeClass('active');
|
||||
($activeLast = $activeCur).addClass('active');
|
||||
}
|
||||
function render() {
|
||||
if(!hasRendered) {
|
||||
$root.append($tocUl);
|
||||
$headings.each(function() {
|
||||
var $this = $(this);
|
||||
$tocUl.append($('<li></li>').addClass('toc-' + $this.prop('tagName').toLowerCase())
|
||||
.append($('<a></a>').text($this.text()).attr('href', '#' + $this.prop('id'))));
|
||||
});
|
||||
$tocLi = $tocUl.children('li');
|
||||
$tocUl.on('click', 'a', function(e) {
|
||||
e.preventDefault();
|
||||
var $this = $(this);
|
||||
scrolling = true;
|
||||
setState($this.parent());
|
||||
$scroller.scrollToAnchor($this.attr('href'), 400, function() {
|
||||
scrolling = false;
|
||||
});
|
||||
});
|
||||
}
|
||||
hasRendered = true;
|
||||
}
|
||||
function init() {
|
||||
var interval, timeout;
|
||||
if(!hasInit) {
|
||||
render(); calc(); setState(null, scrolling);
|
||||
// run calc every 100 millisecond
|
||||
interval = setInterval(function() {
|
||||
calc();
|
||||
}, 100);
|
||||
timeout = setTimeout(function() {
|
||||
clearInterval(interval);
|
||||
}, 45000);
|
||||
window.pageLoad.then(function() {
|
||||
setTimeout(function() {
|
||||
clearInterval(interval);
|
||||
clearTimeout(timeout);
|
||||
}, 3000);
|
||||
});
|
||||
$scrollTarget.on('scroll', function() {
|
||||
disabled || setState(null, scrolling);
|
||||
});
|
||||
$window.on('resize', window.throttle(function() {
|
||||
if (!disabled) {
|
||||
render(); calc(); setState(null, scrolling);
|
||||
}
|
||||
}, 100));
|
||||
}
|
||||
hasInit = true;
|
||||
}
|
||||
|
||||
setOptions(options);
|
||||
if (!disabled) {
|
||||
init();
|
||||
}
|
||||
$window.on('resize', window.throttle(function() {
|
||||
init();
|
||||
}, 200));
|
||||
return {
|
||||
setOptions: setOptions
|
||||
};
|
||||
}
|
||||
$.fn.toc = toc;
|
||||
});
|
||||
})();
|
3
_includes/scripts/page.js
Normal file
@ -0,0 +1,3 @@
|
||||
/*(function () {
|
||||
|
||||
})();*/
|
28
_includes/scripts/utils/imagesLoad.js
Normal file
@ -0,0 +1,28 @@
|
||||
(function() {
|
||||
window.imagesLoad = function(images) {
|
||||
images = images || document.getElementsByTagName('img');
|
||||
var imagesCount = images.length, loadedCount = 0, image;
|
||||
var i, j, loaded = false, cbs = [];
|
||||
imagesCount < 1 && (loaded = true);
|
||||
for (i = 0; i < imagesCount; i++) {
|
||||
image = images[i];
|
||||
image.complete ? handleImageLoad() : image.addEventListener('load', handleImageLoad);
|
||||
}
|
||||
function handleImageLoad() {
|
||||
loadedCount++;
|
||||
if (loadedCount === imagesCount) {
|
||||
loaded = true;
|
||||
if (cbs.length > 0) {
|
||||
for (j = 0; j < cbs.length; j++) {
|
||||
cbs[j]();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return {
|
||||
then: function(cb) {
|
||||
cb && (loaded ? cb() : (cbs.push(cb)));
|
||||
}
|
||||
};
|
||||
};
|
||||
})();
|
39
_includes/scripts/utils/utils.js
Normal file
@ -0,0 +1,39 @@
|
||||
(function() {
|
||||
window.isArray = function(val) {
|
||||
return Object.prototype.toString.call(val) === '[object Array]';
|
||||
};
|
||||
window.isString = function(val) {
|
||||
return typeof val === 'string';
|
||||
};
|
||||
|
||||
window.hasEvent = function(event) {
|
||||
return 'on'.concat(event) in window.document;
|
||||
};
|
||||
|
||||
window.isOverallScroller = function(node) {
|
||||
return node === document.documentElement || node === document.body || node === window;
|
||||
};
|
||||
|
||||
window.isFormElement = function(node) {
|
||||
var tagName = node.tagName;
|
||||
return tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA';
|
||||
};
|
||||
|
||||
window.pageLoad = (function () {
|
||||
var loaded = false, cbs = [];
|
||||
window.addEventListener('load', function () {
|
||||
var i;
|
||||
loaded = true;
|
||||
if (cbs.length > 0) {
|
||||
for (i = 0; i < cbs.length; i++) {
|
||||
cbs[i]();
|
||||
}
|
||||
}
|
||||
});
|
||||
return {
|
||||
then: function(cb) {
|
||||
cb && (loaded ? cb() : (cbs.push(cb)));
|
||||
}
|
||||
};
|
||||
})();
|
||||
})();
|
33
_includes/scripts/variables.html
Normal file
@ -0,0 +1,33 @@
|
||||
{%- include snippets/get-sources.html -%}
|
||||
{%- assign _sources = __return -%}
|
||||
|
||||
{%- include snippets/get-nav-url.html path="/assets/search.js" -%}
|
||||
{%- assign _paths_search_js = __return -%}
|
||||
|
||||
<script>
|
||||
(function() {
|
||||
var TEXT_VARIABLES = {
|
||||
version: '2.2.6',
|
||||
sources: {
|
||||
font_awesome: '{{ _sources.font_awesome }}',
|
||||
jquery: '{{ _sources.jquery }}',
|
||||
leancloud_js_sdk: '{{ _sources.leancloud_js_sdk }}',
|
||||
chart: '{{ _sources.chart }}',
|
||||
gitalk: {
|
||||
js: '{{ _sources.gitalk.js }}',
|
||||
css: '{{ _sources.gitalk.css }}'
|
||||
},
|
||||
valine: '{{ _sources.valine }}'
|
||||
},
|
||||
site: {
|
||||
toc: {
|
||||
selectors: '{{ site.toc.selectors | default: site.data.variables.default.toc.selectors }}'
|
||||
}
|
||||
},
|
||||
paths: {
|
||||
search_js: '{{ _paths_search_js }}'
|
||||
}
|
||||
};
|
||||
window.TEXT_VARIABLES = TEXT_VARIABLES;
|
||||
})();
|
||||
</script>
|
433
_includes/search-providers/custom/search-script.js
Normal file
@ -0,0 +1,433 @@
|
||||
/*!
|
||||
* Simple-Jekyll-Search
|
||||
* Copyright 2015-2020, Christian Fei
|
||||
* Licensed under the MIT License.
|
||||
*/
|
||||
|
||||
(function(){
|
||||
'use strict'
|
||||
|
||||
var _$Templater_7 = {
|
||||
compile: compile,
|
||||
setOptions: setOptions
|
||||
}
|
||||
|
||||
const options = {}
|
||||
options.pattern = /\{(.*?)\}/g
|
||||
options.template = ''
|
||||
options.middleware = function () {}
|
||||
|
||||
function setOptions (_options) {
|
||||
options.pattern = _options.pattern || options.pattern
|
||||
options.template = _options.template || options.template
|
||||
if (typeof _options.middleware === 'function') {
|
||||
options.middleware = _options.middleware
|
||||
}
|
||||
}
|
||||
|
||||
function compile (data) {
|
||||
return options.template.replace(options.pattern, function (match, prop) {
|
||||
const value = options.middleware(prop, data[prop], options.template)
|
||||
if (typeof value !== 'undefined') {
|
||||
return value
|
||||
}
|
||||
return data[prop] || match
|
||||
})
|
||||
}
|
||||
|
||||
'use strict';
|
||||
|
||||
function fuzzysearch (needle, haystack) {
|
||||
var tlen = haystack.length;
|
||||
var qlen = needle.length;
|
||||
if (qlen > tlen) {
|
||||
return false;
|
||||
}
|
||||
if (qlen === tlen) {
|
||||
return needle === haystack;
|
||||
}
|
||||
outer: for (var i = 0, j = 0; i < qlen; i++) {
|
||||
var nch = needle.charCodeAt(i);
|
||||
while (j < tlen) {
|
||||
if (haystack.charCodeAt(j++) === nch) {
|
||||
continue outer;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
var _$fuzzysearch_1 = fuzzysearch;
|
||||
|
||||
'use strict'
|
||||
|
||||
/* removed: const _$fuzzysearch_1 = require('fuzzysearch') */;
|
||||
|
||||
var _$FuzzySearchStrategy_5 = new FuzzySearchStrategy()
|
||||
|
||||
function FuzzySearchStrategy () {
|
||||
this.matches = function (string, crit) {
|
||||
return _$fuzzysearch_1(crit.toLowerCase(), string.toLowerCase())
|
||||
}
|
||||
}
|
||||
|
||||
'use strict'
|
||||
|
||||
var _$LiteralSearchStrategy_6 = new LiteralSearchStrategy()
|
||||
|
||||
function LiteralSearchStrategy () {
|
||||
this.matches = function (str, crit) {
|
||||
if (!str) return false
|
||||
|
||||
str = str.trim().toLowerCase()
|
||||
crit = crit.trim().toLowerCase()
|
||||
|
||||
return crit.split(' ').filter(function (word) {
|
||||
return str.indexOf(word) >= 0
|
||||
}).length === crit.split(' ').length
|
||||
}
|
||||
}
|
||||
|
||||
'use strict'
|
||||
|
||||
var _$Repository_4 = {
|
||||
put: put,
|
||||
clear: clear,
|
||||
search: search,
|
||||
setOptions: __setOptions_4
|
||||
}
|
||||
|
||||
/* removed: const _$FuzzySearchStrategy_5 = require('./SearchStrategies/FuzzySearchStrategy') */;
|
||||
/* removed: const _$LiteralSearchStrategy_6 = require('./SearchStrategies/LiteralSearchStrategy') */;
|
||||
|
||||
function NoSort () {
|
||||
return 0
|
||||
}
|
||||
|
||||
const data = []
|
||||
let opt = {}
|
||||
|
||||
opt.fuzzy = false
|
||||
opt.limit = 10
|
||||
opt.searchStrategy = opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
|
||||
opt.sort = NoSort
|
||||
opt.exclude = []
|
||||
|
||||
function put (data) {
|
||||
if (isObject(data)) {
|
||||
return addObject(data)
|
||||
}
|
||||
if (isArray(data)) {
|
||||
return addArray(data)
|
||||
}
|
||||
return undefined
|
||||
}
|
||||
function clear () {
|
||||
data.length = 0
|
||||
return data
|
||||
}
|
||||
|
||||
function isObject (obj) {
|
||||
return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Object]'
|
||||
}
|
||||
|
||||
function isArray (obj) {
|
||||
return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Array]'
|
||||
}
|
||||
|
||||
function addObject (_data) {
|
||||
data.push(_data)
|
||||
return data
|
||||
}
|
||||
|
||||
function addArray (_data) {
|
||||
const added = []
|
||||
clear()
|
||||
for (let i = 0, len = _data.length; i < len; i++) {
|
||||
if (isObject(_data[i])) {
|
||||
added.push(addObject(_data[i]))
|
||||
}
|
||||
}
|
||||
return added
|
||||
}
|
||||
|
||||
function search (crit) {
|
||||
if (!crit) {
|
||||
return []
|
||||
}
|
||||
return findMatches(data, crit, opt.searchStrategy, opt).sort(opt.sort)
|
||||
}
|
||||
|
||||
function __setOptions_4 (_opt) {
|
||||
opt = _opt || {}
|
||||
|
||||
opt.fuzzy = _opt.fuzzy || false
|
||||
opt.limit = _opt.limit || 10
|
||||
opt.searchStrategy = _opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
|
||||
opt.sort = _opt.sort || NoSort
|
||||
opt.exclude = _opt.exclude || []
|
||||
}
|
||||
|
||||
function findMatches (data, crit, strategy, opt) {
|
||||
const matches = []
|
||||
for (let i = 0; i < data.length && matches.length < opt.limit; i++) {
|
||||
const match = findMatchesInObject(data[i], crit, strategy, opt)
|
||||
if (match) {
|
||||
matches.push(match)
|
||||
}
|
||||
}
|
||||
return matches
|
||||
}
|
||||
|
||||
function findMatchesInObject (obj, crit, strategy, opt) {
|
||||
for (const key in obj) {
|
||||
if (!isExcluded(obj[key], opt.exclude) && strategy.matches(obj[key], crit)) {
|
||||
return obj
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function isExcluded (term, excludedTerms) {
|
||||
for (let i = 0, len = excludedTerms.length; i < len; i++) {
|
||||
const excludedTerm = excludedTerms[i]
|
||||
if (new RegExp(excludedTerm).test(term)) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
/* globals ActiveXObject:false */
|
||||
|
||||
'use strict'
|
||||
|
||||
var _$JSONLoader_2 = {
|
||||
load: load
|
||||
}
|
||||
|
||||
function load (location, callback) {
|
||||
const xhr = getXHR()
|
||||
xhr.open('GET', location, true)
|
||||
xhr.onreadystatechange = createStateChangeListener(xhr, callback)
|
||||
xhr.send()
|
||||
}
|
||||
|
||||
function createStateChangeListener (xhr, callback) {
|
||||
return function () {
|
||||
if (xhr.readyState === 4 && xhr.status === 200) {
|
||||
try {
|
||||
callback(null, JSON.parse(xhr.responseText))
|
||||
} catch (err) {
|
||||
callback(err, null)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getXHR () {
|
||||
return window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP')
|
||||
}
|
||||
|
||||
'use strict'
|
||||
|
||||
var _$OptionsValidator_3 = function OptionsValidator (params) {
|
||||
if (!validateParams(params)) {
|
||||
throw new Error('-- OptionsValidator: required options missing')
|
||||
}
|
||||
|
||||
if (!(this instanceof OptionsValidator)) {
|
||||
return new OptionsValidator(params)
|
||||
}
|
||||
|
||||
const requiredOptions = params.required
|
||||
|
||||
this.getRequiredOptions = function () {
|
||||
return requiredOptions
|
||||
}
|
||||
|
||||
this.validate = function (parameters) {
|
||||
const errors = []
|
||||
requiredOptions.forEach(function (requiredOptionName) {
|
||||
if (typeof parameters[requiredOptionName] === 'undefined') {
|
||||
errors.push(requiredOptionName)
|
||||
}
|
||||
})
|
||||
return errors
|
||||
}
|
||||
|
||||
function validateParams (params) {
|
||||
if (!params) {
|
||||
return false
|
||||
}
|
||||
return typeof params.required !== 'undefined' && params.required instanceof Array
|
||||
}
|
||||
}
|
||||
|
||||
'use strict'
|
||||
|
||||
var _$utils_9 = {
|
||||
merge: merge,
|
||||
isJSON: isJSON
|
||||
}
|
||||
|
||||
function merge (defaultParams, mergeParams) {
|
||||
const mergedOptions = {}
|
||||
for (const option in defaultParams) {
|
||||
mergedOptions[option] = defaultParams[option]
|
||||
if (typeof mergeParams[option] !== 'undefined') {
|
||||
mergedOptions[option] = mergeParams[option]
|
||||
}
|
||||
}
|
||||
return mergedOptions
|
||||
}
|
||||
|
||||
function isJSON (json) {
|
||||
try {
|
||||
if (json instanceof Object && JSON.parse(JSON.stringify(json))) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
} catch (err) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
var _$src_8 = {};
|
||||
(function (window) {
|
||||
'use strict'
|
||||
|
||||
let options = {
|
||||
searchInput: null,
|
||||
resultsContainer: null,
|
||||
json: [],
|
||||
success: Function.prototype,
|
||||
searchResultTemplate: '<li><a href="{url}" title="{desc}">{title}</a></li>',
|
||||
templateMiddleware: Function.prototype,
|
||||
sortMiddleware: function () {
|
||||
return 0
|
||||
},
|
||||
noResultsText: 'No results found',
|
||||
limit: 10,
|
||||
fuzzy: false,
|
||||
debounceTime: null,
|
||||
exclude: []
|
||||
}
|
||||
|
||||
let debounceTimerHandle
|
||||
const debounce = function (func, delayMillis) {
|
||||
if (delayMillis) {
|
||||
clearTimeout(debounceTimerHandle)
|
||||
debounceTimerHandle = setTimeout(func, delayMillis)
|
||||
} else {
|
||||
func.call()
|
||||
}
|
||||
}
|
||||
|
||||
const requiredOptions = ['searchInput', 'resultsContainer', 'json']
|
||||
|
||||
/* removed: const _$Templater_7 = require('./Templater') */;
|
||||
/* removed: const _$Repository_4 = require('./Repository') */;
|
||||
/* removed: const _$JSONLoader_2 = require('./JSONLoader') */;
|
||||
const optionsValidator = _$OptionsValidator_3({
|
||||
required: requiredOptions
|
||||
})
|
||||
/* removed: const _$utils_9 = require('./utils') */;
|
||||
|
||||
window.SimpleJekyllSearch = function (_options) {
|
||||
const errors = optionsValidator.validate(_options)
|
||||
if (errors.length > 0) {
|
||||
throwError('You must specify the following required options: ' + requiredOptions)
|
||||
}
|
||||
|
||||
options = _$utils_9.merge(options, _options)
|
||||
|
||||
_$Templater_7.setOptions({
|
||||
template: options.searchResultTemplate,
|
||||
middleware: options.templateMiddleware
|
||||
})
|
||||
|
||||
_$Repository_4.setOptions({
|
||||
fuzzy: options.fuzzy,
|
||||
limit: options.limit,
|
||||
sort: options.sortMiddleware,
|
||||
exclude: options.exclude
|
||||
})
|
||||
|
||||
if (_$utils_9.isJSON(options.json)) {
|
||||
initWithJSON(options.json)
|
||||
} else {
|
||||
initWithURL(options.json)
|
||||
}
|
||||
|
||||
const rv = {
|
||||
search: search
|
||||
}
|
||||
|
||||
typeof options.success === 'function' && options.success.call(rv)
|
||||
return rv
|
||||
}
|
||||
|
||||
function initWithJSON (json) {
|
||||
_$Repository_4.put(json)
|
||||
registerInput()
|
||||
}
|
||||
|
||||
function initWithURL (url) {
|
||||
_$JSONLoader_2.load(url, function (err, json) {
|
||||
if (err) {
|
||||
throwError('failed to get JSON (' + url + ')')
|
||||
}
|
||||
initWithJSON(json)
|
||||
})
|
||||
}
|
||||
|
||||
function emptyResultsContainer () {
|
||||
options.resultsContainer.innerHTML = ''
|
||||
}
|
||||
|
||||
function appendToResultsContainer (text) {
|
||||
options.resultsContainer.innerHTML += text
|
||||
}
|
||||
|
||||
function registerInput () {
|
||||
options.searchInput.addEventListener('input', function (e) {
|
||||
if (isWhitelistedKey(e.which)) {
|
||||
emptyResultsContainer()
|
||||
debounce(function () { search(e.target.value) }, options.debounceTime)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function search (query) {
|
||||
if (isValidQuery(query)) {
|
||||
emptyResultsContainer()
|
||||
render(_$Repository_4.search(query), query)
|
||||
}
|
||||
}
|
||||
|
||||
function render (results, query) {
|
||||
const len = results.length
|
||||
if (len === 0) {
|
||||
return appendToResultsContainer(options.noResultsText)
|
||||
}
|
||||
for (let i = 0; i < len; i++) {
|
||||
results[i].query = query
|
||||
appendToResultsContainer(_$Templater_7.compile(results[i]))
|
||||
}
|
||||
}
|
||||
|
||||
function isValidQuery (query) {
|
||||
return query && query.length > 0
|
||||
}
|
||||
|
||||
function isWhitelistedKey (key) {
|
||||
return [13, 16, 20, 37, 38, 39, 40, 91].indexOf(key) === -1
|
||||
}
|
||||
|
||||
function throwError (message) {
|
||||
throw new Error('SimpleJekyllSearch --- ' + message)
|
||||
}
|
||||
})(window)
|
||||
|
||||
}());
|
31
_includes/search-providers/custom/search.html
Normal file
@ -0,0 +1,31 @@
|
||||
<div class="search search--dark">
|
||||
<div class="main">
|
||||
<div class="search__header">{{ _locale_search }}</div>
|
||||
<div class="search-bar">
|
||||
<div class="search-box js-search-box">
|
||||
<div class="search-box__icon-search"><i class="fas fa-search"></i></div>
|
||||
<input id="search-input" type="text" />
|
||||
<div class="search-box__icon-clear js-icon-clear">
|
||||
<a><i class="fas fa-times"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<button class="button button--theme-dark button--pill search__cancel js-search-toggle">
|
||||
{{ _locale_cancel }}</button>
|
||||
</div>
|
||||
<div id="results-container" class="search-result js-search-result"></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Script pointing to search-script.js -->
|
||||
<script>{%- include search-providers/custom/search-script.js -%}</script>
|
||||
|
||||
<!-- Configuration -->
|
||||
<script>
|
||||
SimpleJekyllSearch({
|
||||
searchInput: document.getElementById('search-input'),
|
||||
resultsContainer: document.getElementById('results-container'),
|
||||
noResultsText: '<p>Aucun résultat!</p>',
|
||||
json: '/search.json',
|
||||
searchResultTemplate: '<li><a href="{url}">{date} {title}</a> (Création {create})</li>'
|
||||
})
|
||||
</script>
|
||||
|
17
_includes/search-providers/default/search-data.js
Normal file
@ -0,0 +1,17 @@
|
||||
window.TEXT_SEARCH_DATA={
|
||||
{%- for _collection in site.collections -%}
|
||||
{%- unless forloop.first -%},{%- endunless -%}
|
||||
'{{ _collection.label }}':[
|
||||
{%- for _article in _collection.docs -%}
|
||||
{%- unless forloop.first -%},{%- endunless -%}
|
||||
{'title':{{ _article.title | jsonify }},
|
||||
{%- include snippets/prepend-baseurl.html path=_article.url -%}
|
||||
{%- assign _url = __return -%}
|
||||
'url':{{ _url | jsonify }},
|
||||
'create':{{ _article.create | jsonify }},
|
||||
'date':{{ _article.modif | jsonify }}
|
||||
}
|
||||
{%- endfor -%}
|
||||
]
|
||||
{%- endfor -%}
|
||||
};
|
18
_includes/search-providers/default/search.html
Normal file
@ -0,0 +1,18 @@
|
||||
<div class="search search--dark">
|
||||
<div class="main">
|
||||
<div class="search__header">{{ _locale_search }}</div>
|
||||
<div class="search-bar">
|
||||
<div class="search-box js-search-box">
|
||||
<div class="search-box__icon-search"><i class="fas fa-search"></i></div>
|
||||
<input type="text" />
|
||||
<div class="search-box__icon-clear js-icon-clear">
|
||||
<a><i class="fas fa-times"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<button class="button button--theme-dark button--pill search__cancel js-search-toggle">
|
||||
{{ _locale_cancel }}</button>
|
||||
</div>
|
||||
<div class="search-result js-search-result"></div>
|
||||
</div>
|
||||
</div>
|
||||
<script>{%- include search-providers/default/search.js -%}</script>
|
112
_includes/search-providers/default/search.js
Normal file
@ -0,0 +1,112 @@
|
||||
var SOURCES = window.TEXT_VARIABLES.sources;
|
||||
var PAHTS = window.TEXT_VARIABLES.paths;
|
||||
window.Lazyload.js([SOURCES.jquery, PAHTS.search_js], function() {
|
||||
var search = (window.search || (window.search = {}));
|
||||
var searchData = window.TEXT_SEARCH_DATA || {};
|
||||
|
||||
function memorize(f) {
|
||||
var cache = {};
|
||||
return function () {
|
||||
var key = Array.prototype.join.call(arguments, ',');
|
||||
if (key in cache) return cache[key];
|
||||
else return cache[key] = f.apply(this, arguments);
|
||||
};
|
||||
}
|
||||
|
||||
/// search
|
||||
function searchByQuery(query) {
|
||||
var i, j, key, keys, cur, _title, result = {};
|
||||
keys = Object.keys(searchData);
|
||||
for (i = 0; i < keys.length; i++) {
|
||||
key = keys[i];
|
||||
for (j = 0; j < searchData[key].length; j++) {
|
||||
cur = searchData[key][j], _title = cur.title;
|
||||
if ((result[key] === undefined || result[key] && result[key].length < 4 )
|
||||
&& _title.toLowerCase().indexOf(query.toLowerCase()) >= 0) {
|
||||
if (result[key] === undefined) {
|
||||
result[key] = [];
|
||||
}
|
||||
result[key].push(cur);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
var renderHeader = memorize(function(header) {
|
||||
return $('<p class="search-result__header">' + header + '</p>');
|
||||
});
|
||||
|
||||
var renderItem = function(index, title, url) {
|
||||
return $('<li class="search-result__item" data-index="' + index + '"><a class="button" href="' + url + '">' + '___' + title + '</a></li>');
|
||||
};
|
||||
|
||||
function render(data) {
|
||||
if (!data) { return null; }
|
||||
var $root = $('<ul></ul>'), i, j, key, keys, cur, itemIndex = 0;
|
||||
keys = Object.keys(data);
|
||||
for (i = 0; i < keys.length; i++) {
|
||||
key = keys[i];
|
||||
$root.append(renderHeader(key));
|
||||
for (j = 0; j < data[key].length; j++) {
|
||||
cur = data[key][j];
|
||||
$root.append(renderItem(itemIndex++, cur.title, cur.url));
|
||||
}
|
||||
}
|
||||
return $root;
|
||||
}
|
||||
|
||||
// search box
|
||||
var $result = $('.js-search-result'), $resultItems;
|
||||
var lastActiveIndex, activeIndex;
|
||||
|
||||
function clear() {
|
||||
$result.html(null);
|
||||
$resultItems = $('.search-result__item'); activeIndex = 0;
|
||||
}
|
||||
function onInputNotEmpty(val) {
|
||||
$result.html(render(searchByQuery(val)));
|
||||
$resultItems = $('.search-result__item'); activeIndex = 0;
|
||||
$resultItems.eq(0).addClass('active');
|
||||
}
|
||||
|
||||
search.clear = clear;
|
||||
search.onInputNotEmpty = onInputNotEmpty;
|
||||
|
||||
function updateResultItems() {
|
||||
lastActiveIndex >= 0 && $resultItems.eq(lastActiveIndex).removeClass('active');
|
||||
activeIndex >= 0 && $resultItems.eq(activeIndex).addClass('active');
|
||||
}
|
||||
|
||||
function moveActiveIndex(direction) {
|
||||
var itemsCount = $resultItems ? $resultItems.length : 0;
|
||||
if (itemsCount > 1) {
|
||||
lastActiveIndex = activeIndex;
|
||||
if (direction === 'up') {
|
||||
activeIndex = (activeIndex - 1 + itemsCount) % itemsCount;
|
||||
} else if (direction === 'down') {
|
||||
activeIndex = (activeIndex + 1 + itemsCount) % itemsCount;
|
||||
}
|
||||
updateResultItems();
|
||||
}
|
||||
}
|
||||
|
||||
// Char Code: 13 Enter, 37 ⬅, 38 ⬆, 39 ➡, 40 ⬇
|
||||
$(window).on('keyup', function(e) {
|
||||
var modalVisible = search.getModalVisible && search.getModalVisible();
|
||||
if (modalVisible) {
|
||||
if (e.which === 38) {
|
||||
modalVisible && moveActiveIndex('up');
|
||||
} else if (e.which === 40) {
|
||||
modalVisible && moveActiveIndex('down');
|
||||
} else if (e.which === 13) {
|
||||
modalVisible && $resultItems && activeIndex >= 0 && $resultItems.eq(activeIndex).children('a')[0].click();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$result.on('mouseover', '.search-result__item > a', function() {
|
||||
var itemIndex = $(this).parent().data('index');
|
||||
itemIndex >= 0 && (lastActiveIndex = activeIndex, activeIndex = itemIndex, updateResultItems());
|
||||
});
|
||||
});
|
20
_includes/search.html
Normal file
@ -0,0 +1,20 @@
|
||||
{%- include snippets/get-locale-string.html key='CANCEL' -%}
|
||||
{%- assign _locale_cancel = __return -%}
|
||||
{%- include snippets/get-locale-string.html key='SEARCH' -%}
|
||||
{%- assign _locale_search = __return -%}
|
||||
|
||||
{%- if site.search.provider == 'google' -%}
|
||||
<script>window.useDefaultSearchBox = false;</script>
|
||||
{%- endif -%}
|
||||
|
||||
{%- if site.search.provider -%}
|
||||
<script>{%- include scripts/components/search.js -%}</script>
|
||||
{%- endif -%}
|
||||
|
||||
{%- if site.search.provider == 'default' -%}
|
||||
{%- include search-providers/default/search.html -%}
|
||||
{%- elsif site.search.provider == 'google' -%}
|
||||
{%- include search-providers/google-custom-search-engine/search.html -%}
|
||||
{%- elsif site.search.provider == 'custom' -%}
|
||||
{%- include search-providers/custom/search.html -%}
|
||||
{%- endif -%}
|
25
_includes/sidebar/toc.html
Normal file
@ -0,0 +1,25 @@
|
||||
{%- if page.sidebar.nav -%}
|
||||
<div class="sidebar-toc">
|
||||
{%- assign _sidebar_nav = site.data.navigation[page.sidebar.nav] -%}
|
||||
{%- if _sidebar_nav -%}
|
||||
<ul class="toc toc--navigator">
|
||||
{%- for _item in _sidebar_nav -%}
|
||||
<li class="toc-h1">{{ _item.title }}</li>
|
||||
{%- if _item.children -%}
|
||||
{%- for _child in _item.children -%}
|
||||
{%- include snippets/get-nav-url.html path=_child.url -%}
|
||||
{%- assign _nav_url = __return -%}
|
||||
{%- include snippets/get-nav-url.html path=page.url -%}
|
||||
{%- assign _page_url = __return -%}
|
||||
{%- if _nav_url == _page_url -%}
|
||||
<li class="toc-h2 active"><a href="{{ _nav_url }}">{{ _child.title }}</a></li>
|
||||
{%- else -%}
|
||||
<li class="toc-h2"><a href="{{ _nav_url }}">{{ _child.title }}</a></li>
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
</ul>
|
||||
{%- endif -%}
|
||||
</div>
|
||||
{%- endif -%}
|
9
_includes/snippets/assign.html
Normal file
@ -0,0 +1,9 @@
|
||||
{%- if include.source1 == nil -%}
|
||||
{%- if include.source0 == nil -%}
|
||||
{%- assign __return = include.target -%}
|
||||
{%- else -%}
|
||||
{%- assign __return = include.source0 -%}
|
||||
{%- endif -%}
|
||||
{%- else -%}
|
||||
{%- assign __return = include.source1 -%}
|
||||
{%- endif -%}
|
11
_includes/snippets/get-article-title.html
Normal file
@ -0,0 +1,11 @@
|
||||
{%- assign _title = include.article.title | default: layout.title -%}
|
||||
{%- assign _titles = include.article.titles | default: layout.titles -%}
|
||||
|
||||
{%- if _title -%}
|
||||
{%- assign __return = _title -%}
|
||||
{%- elsif _titles -%}
|
||||
{%- include snippets/get-string-from-locale-config.html locale=_titles -%}
|
||||
{%- assign __return = __return -%}
|
||||
{%- else -%}
|
||||
{%- assign __return = nil -%}
|
||||
{%- endif -%}
|
6
_includes/snippets/get-lang.html
Normal file
@ -0,0 +1,6 @@
|
||||
{%- assign __return = site.data.variables.default.lang -%}
|
||||
{%- if page.lang -%}
|
||||
{%- assign __return = page.lang -%}
|
||||
{%- elsif site.lang -%}
|
||||
{%- assign __return = site.lang -%}
|
||||
{%- endif -%}
|
12
_includes/snippets/get-locale-string.html
Normal file
@ -0,0 +1,12 @@
|
||||
{%- include snippets/get-lang.html -%}
|
||||
{%- assign _lang = __return -%}
|
||||
{%- assign _local_lang = site.data.locale[_lang] -%}
|
||||
{%- assign _local_lang_en = site.data.locale.en -%}
|
||||
{%- if _local_lang == nil -%}
|
||||
{%- assign _local_lang = _local_lang_en -%}
|
||||
{%- endif -%}
|
||||
{%- if _local_lang[include.key] -%}
|
||||
{%- assign __return = _local_lang[include.key] -%}
|
||||
{%- else -%}
|
||||
{%- assign __return = _local_lang_en[include.key] -%}
|
||||
{%- endif -%}
|
8
_includes/snippets/get-nav-url.html
Normal file
@ -0,0 +1,8 @@
|
||||
{%- assign _pre7 = include.path | slice: 0, 7 -%}
|
||||
{%- assign _pre8 = include.path | slice: 0, 8 -%}
|
||||
{%- if _pre7 == 'http://' or _pre8 == 'https://' -%}
|
||||
{%- assign __return = include.path -%}
|
||||
{%- else -%}
|
||||
{%- include snippets/prepend-baseurl.html path=include.path -%}
|
||||
{%- assign __return = __return -%}
|
||||
{%- endif -%}
|
2
_includes/snippets/get-sources.html
Normal file
@ -0,0 +1,2 @@
|
||||
{%- assign _sources = site.sources | default: site.data.variables.default.sources -%}
|
||||
{%- assign __return = site.data.variables.sources[_sources] -%}
|
7
_includes/snippets/get-string-from-locale-config.html
Normal file
@ -0,0 +1,7 @@
|
||||
{%- include snippets/get-lang.html -%}
|
||||
{%- assign _lang = __return -%}
|
||||
{%- if include.locale[_lang] -%}
|
||||
{%- assign __return = include.locale[_lang] -%}
|
||||
{%- else -%}
|
||||
{%- assign __return = include.locale.en -%}
|
||||
{%- endif -%}
|
6
_includes/snippets/is_collection.html
Normal file
@ -0,0 +1,6 @@
|
||||
{%- assign _page_path_first_char = include.page.path | slice: 0, 1 -%}
|
||||
{%- if _page_path_first_char == '_' -%}
|
||||
{%- assign __return = true -%}
|
||||
{%- else -%}
|
||||
{%- assign __return = false -%}
|
||||
{%- endif -%}
|
2
_includes/snippets/page-url.html
Normal file
@ -0,0 +1,2 @@
|
||||
{%- include snippets/prepend-baseurl.html path=page.url -%}
|
||||
{{ __return | prepend: site.url }}
|
4
_includes/snippets/prepend-baseurl.html
Normal file
@ -0,0 +1,4 @@
|
||||
{%- assign _include_path_replace_index = include.path | replace: 'index.html', '' -%}
|
||||
{%- include snippets/prepend-path.html
|
||||
path=_include_path_replace_index
|
||||
prepend_path=site.baseurl -%}
|
1
_includes/snippets/prepend-path.html
Normal file
@ -0,0 +1 @@
|
||||
{%- assign __return = include.path | prepend: '/' | prepend: include.prepend_path | replace:'///','/' | replace:'//','/' -%}
|
3
_includes/svg/icon/social/behance.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M1056.000001 193.714286l-292 0 0 70.857143 292 0 0-70.857143zm-144 243.428571q-51.428571 0-83.428571 30t-35.428571 81.428571l233.142857 0q-10.285714-111.428571-114.285714-111.428571zm9.142857 334.285714q36 0 69.714286-18.285714t43.428571-49.714286l126.285714 0q-57.142857 175.428571-244 175.428571-122.285714 0-194.571429-75.428571t-72.285714-198.285714q0-118.857143 74.571429-197.428571t192.285714-78.571429q78.857143 0 137.428571 38.857143t87.428571 102.285714 28.857143 141.714286q0 9.714286-1.142857 26.857143l-376 0q0 63.428571 32.857143 98t95.142857 34.571429zm-762.857143-28.571429l169.142857 0q117.142857 0 117.142857-95.428571 0-102.857143-113.714286-102.857143l-172.571429 0 0 198.285714zm0-306.857143l160.571429 0q44.571429 0 70.571429-20.857143t26-64.857143q0-82.285714-108.571429-82.285714l-148.571429 0 0 168zm-158.285714-290.857143l339.428571 0q49.714286 0 88.571429 8t72.285714 27.142857 51.428571 55.142857 18 88q0 103.428571-98.285714 150.285714 65.142857 18.285714 98.285714 65.714286t33.142857 116.571429q0 42.857143-14 78t-37.714286 59.142857-56.285714 40.571429-69.142857 24-76.571429 7.428571l-349.142857 0 0-720z" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
5
_includes/svg/icon/social/douban.svg
Normal file
@ -0,0 +1,5 @@
|
||||
<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M161.431 147.172l699.701 0 0 78.813-699.701 0 0-78.814z" />
|
||||
<path d="M800.298 616.311l0-308.108-578.031 0 0 308.108 578.031 0zM306.076 386.961l411.23 0 0 150.633-411.23 0 0-150.633z" />
|
||||
<path d="M675.281 793.89c25.15-38.487 48.885-83.129 70.879-133.81l-84.107-30.649c-21.885 60.046-47.337 114.974-76.324 164.459l-146.332 0c-24.225-64.156-51.607-119.031-82.313-164.459l-77.357 30.649c31.9 47.851 57.651 92.383 77.357 133.81l-215.414 0 0 77.957 739.278 0 0-77.957-205.67 0z" />
|
||||
</svg>
|
After Width: | Height: | Size: 619 B |
3
_includes/svg/icon/social/facebook.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M767.428571 6.857143l0 150.857143-89.714286 0q-49.142857 0-66.285714 20.571429t-17.142857 61.714286l0 108 167.428571 0-22.285714 169.142857-145.142857 0 0 433.714286-174.857143 0 0-433.714286-145.714286 0 0-169.142857 145.714286 0 0-124.571429q0-106.285714 59.428571-164.857143t158.285714-58.571429q84 0 130.285714 6.857143z" />
|
||||
</svg>
|
After Width: | Height: | Size: 468 B |
5
_includes/svg/icon/social/flicker.svg
Normal file
@ -0,0 +1,5 @@
|
||||
<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M512 996.693333C245.76 996.693333 27.306667 778.24 27.306667 512 27.306667 245.76 245.76 27.306667 512 27.306667c266.24 0 484.693333 218.453333 484.693333 484.693333C996.693333 778.24 778.24 996.693333 512 996.693333zM512 78.506667C273.066667 78.506667 78.506667 273.066667 78.506667 512S273.066667 945.493333 512 945.493333 945.493333 750.933333 945.493333 512 750.933333 78.506667 512 78.506667z" />
|
||||
<path d="M655.36 512m-129.706667 0a3.8 3.8 0 1 0 259.413333 0 3.8 3.8 0 1 0-259.413333 0Z" />
|
||||
<path d="M368.64 512m-129.706667 0a3.8 3.8 0 1 0 259.413333 0 3.8 3.8 0 1 0-259.413333 0Z" />
|
||||
</svg>
|
After Width: | Height: | Size: 733 B |
3
_includes/svg/icon/social/github.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path class="svgpath" data-index="path_0" fill="#272636" d="M0 525.2c0 223.6 143.3 413.7 343 483.5 26.9 6.8 22.8-12.4 22.8-25.4l0-88.7c-155.3 18.2-161.5-84.6-172-101.7-21.1-36-70.8-45.2-56-62.3 35.4-18.2 71.4 4.6 113.1 66.3 30.2 44.7 89.1 37.2 119 29.7 6.5-26.9 20.5-50.9 39.7-69.6C248.8 728.2 181.7 630 181.7 513.2c0-56.6 18.7-108.7 55.3-150.7-23.3-69.3 2.2-128.5 5.6-137.3 66.5-6 135.5 47.6 140.9 51.8 37.8-10.2 80.9-15.6 129.1-15.6 48.5 0 91.8 5.6 129.8 15.9 12.9-9.8 77-55.8 138.8-50.2 3.3 8.8 28.2 66.7 6.3 135 37.1 42.1 56 94.6 56 151.4 0 117-67.5 215.3-228.8 243.7 26.9 26.6 43.6 63.4 43.6 104.2l0 128.8c0.9 10.3 0 20.5 17.2 20.5C878.1 942.4 1024 750.9 1024 525.3c0-282.9-229.3-512-512-512C229.1 13.2 0 242.3 0 525.2L0 525.2z" />
|
||||
</svg>
|
After Width: | Height: | Size: 867 B |
3
_includes/svg/icon/social/googleplus.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M621.31315 72.459289l-228.995461 0c-60.030212 0-135.601374 8.695033-198.98189 59.797921-47.839565 40.21184-71.180156 95.678106-71.180156 145.682987 0 84.786035 66.730821 170.671101 184.5369 170.671101 11.150968 0 23.341614-1.098008 35.619242-2.167363-5.574972 13.028735-11.122315 23.89113-11.122315 42.407855 0 33.68417 17.73799 54.338582 33.308617 73.894987-50.004881 3.264347-143.401014 8.695033-212.32785 50.005904-65.60416 38.046524-85.59547 93.483114-85.59547 132.624577 0 80.453357 77.794807 155.476027 239.019769 155.476027 191.20988 0 292.377-103.274108 292.377-205.451232 0-75.021647-44.402279-111.99984-93.367481-152.21168l-40.037878-30.447453c-12.219299-9.764388-28.887934-22.821775-28.887934-46.741557 0-23.890107 16.668635-39.142485 31.141254-53.269227 46.654576-35.879162 93.366458-73.925686 93.366458-154.37802 0-82.619696-53.357232-126.096906-78.951143-146.751319l68.926836 0L621.31315 72.459289zM523.497357 737.809909c0 67.367317-56.678884 117.373221-163.419953 117.373221-118.961392 0-195.687868-55.43659-195.687868-132.626623 0-77.18901 71.180156-103.274108 95.619778-111.969141 46.683229-15.223726 106.74107-17.419741 116.765377-17.419741 11.092639 0 16.638959 0 25.536606 1.098008C486.838436 652.994198 523.497357 682.316014 523.497357 737.809909zM434.608887 387.745045c-17.822924 17.36039-47.895847 30.447453-75.658144 30.447453-95.591125 0-138.980331-120.694873-138.980331-193.521528 0-28.281113 5.547343-57.631582 24.496927-80.453357 17.795295-21.75242 48.879244-35.879162 77.794807-35.879162 92.298126 0 140.078339 121.763205 140.078339 200.021569C462.341508 327.916425 460.116841 362.727255 434.608887 387.745045zM842.798567 238.016929 842.798567 127.57763l-55.464219 0 0 110.439298L676.402839 238.016929l0 55.234999 110.930485 0 0 110.438275 55.464219 0L842.797543 293.251927l110.929462 0 0-55.234999L842.798567 238.016929z" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
3
_includes/svg/icon/social/linkedin.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M260.096 155.648c0 27.307008-9.899008 50.516992-29.696 69.632-19.796992 19.115008-45.396992 28.672-76.8 28.672-30.036992 0-54.612992-9.556992-73.728-28.672-19.115008-19.115008-28.672-42.324992-28.672-69.632 0-28.672 9.556992-52.224 28.672-70.656 19.115008-18.432 44.372992-27.648 75.776-27.648 31.403008 0 56.32 9.216 74.752 27.648 18.432 18.432 28.331008 41.984 29.696 70.656 0 0 0 0 0 0m-202.752 808.96c0 0 0-632.832 0-632.832 0 0 196.608 0 196.608 0 0 0 0 632.832 0 632.832 0 0-196.608 0-196.608 0 0 0 0 0 0 0m313.344-430.08c0-58.708992-1.364992-126.292992-4.096-202.752 0 0 169.984 0 169.984 0 0 0 10.24 88.064 10.24 88.064 0 0 4.096 0 4.096 0 40.96-68.267008 105.812992-102.4 194.56-102.4 68.267008 0 123.220992 22.868992 164.864 68.608 41.643008 45.739008 62.464 113.664 62.464 203.776 0 0 0 374.784 0 374.784 0 0-196.608 0-196.608 0 0 0 0-350.208 0-350.208 0-91.476992-33.451008-137.216-100.352-137.216-47.787008 0-81.236992 24.576-100.352 73.728-4.096 8.192-6.144 24.576-6.144 49.152 0 0 0 364.544 0 364.544 0 0-198.656 0-198.656 0 0 0 0-430.08 0-430.08 0 0 0 0 0 0" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
6
_includes/svg/icon/social/mail.svg
Normal file
@ -0,0 +1,6 @@
|
||||
<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M512.091 166.946c116.242 0 232.484-0.014 348.727 0.007 41.522 0.008 76.321 12.188 94.842 53.167 8.25 18.251 6.5 30.831-13.43 43.256-137.452 85.695-274.125 172.655-410.534 260.014-14.762 9.456-24.638 9.569-39.498 0.041C354.353 435.041 216.033 347.399 77.465 260.14c-12.701-8.002-16.368-15.572-12.01-29.962 9.882-32.627 30.845-52.873 63.868-59.66 13.656-2.806 27.953-3.4 41.966-3.431C284.888 166.83 398.492 166.943 512.091 166.946z" />
|
||||
<path d="M510.888 856.021c-117.998 0-235.996 0.134-353.993-0.067-47.671-0.083-79.295-22.331-91.17-61.206-4.28-14.027-2.127-22.232 10.858-30.356 108.193-67.725 215.807-136.366 324.233-203.713 7.275-4.519 21.51-4.25 29.378-0.171 22.589 11.713 44.026 25.859 64.999 40.383 11.823 8.191 21.091 8.623 33.117 0.325 20.993-14.484 43.689-26.52 64.549-41.176 12.159-8.539 20.73-7.176 32.785 0.537 106.04 67.844 212.318 135.315 319.158 201.894 16.481 10.272 18.065 21.564 12.577 37.407-12.35 35.666-45.183 55.999-92.491 56.081C746.889 856.149 628.886 856.021 510.888 856.021z" />
|
||||
<path d="M64.376 326.925c97.051 61.769 192.332 122.409 290.508 184.898-97.877 62.309-192.719 122.68-290.508 184.932C64.376 572.674 64.376 451.511 64.376 326.925z" />
|
||||
<path d="M959.665 327.168c0 124.369 0 244.164 0 369.253-97.913-62.322-192.914-122.792-290.001-184.589C766.993 449.854 861.628 389.595 959.665 327.168z" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
3
_includes/svg/icon/social/medium.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M834.7 279.8l61.3-58.9V208H683.7L532.4 586.4 360.3 208H137.7v12.9l71.6 86.6c7 6.4 10.6 15.8 9.7 25.2V673c2.2 12.3-1.7 24.8-10.3 33.7L128 805v12.7h228.6v-12.9l-80.6-98a39.99 39.99 0 0 1-11.1-33.7V378.7l200.7 439.2h23.3l172.6-439.2v349.9c0 9.2 0 11.1-6 17.2l-62.1 60.3V819h301.2v-12.9l-59.9-58.9c-5.2-4-7.9-10.7-6.8-17.2V297a18.1 18.1 0 0 1 6.8-17.2z"></path>
|
||||
</svg>
|
After Width: | Height: | Size: 497 B |
9
_includes/svg/icon/social/npm.svg
Normal file
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 48 48" version="1.1" width="24px" height="24px">
|
||||
<g id="surface1">
|
||||
<path style=" fill:#D50000;" d="M 0 15 L 48 15 L 48 32 L 24 32 L 24 35 L 13 35 L 13 32 L 0 32 Z "/>
|
||||
<path style=" fill:#FFFFFF;" d="M 3 29 L 8 29 L 8 21 L 11 21 L 11 29 L 13 29 L 13 18 L 3 18 Z "/>
|
||||
<path style=" fill:#FFFFFF;" d="M 16 18 L 16 32 L 21 32 L 21 29 L 26 29 L 26 18 Z M 24 26 L 21 26 L 21 21 L 24 21 Z "/>
|
||||
<path style=" fill:#FFFFFF;" d="M 29 18 L 29 29 L 34 29 L 34 21 L 37 21 L 37 29 L 40 29 L 40 21 L 43 21 L 43 29 L 45 29 L 45 18 Z "/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 666 B |
3
_includes/svg/icon/social/pinterest.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M444.56 671.968c-16.832 85.472-35.936 155.392-57.296 209.776S333.84 978.224 291.104 1008c-5.184-29.776-7.12-62.48-5.824-98.096 1.264-35.616 3.2-66.352 5.824-92.256 2.592-25.904 7.44-55.04 14.576-87.408 7.088-32.368 13.888-60.224 20.4-83.536 6.464-23.296 13.888-50.816 22.336-82.544 8.416-31.712 14.56-58.56 18.448-80.608-12.96-24.576-19.424-53.088-19.424-85.472 0-32.336 5.504-62.16 16.512-89.344 10.976-27.2 28.464-47.888 52.432-62.16 23.968-14.24 50.176-16.192 78.672-5.824 27.2 11.664 42.08 31.744 44.672 60.208 2.592 28.496-1.936 59.92-13.6 94.208-11.648 34.32-22.656 68.32-33.008 101.984-10.384 33.696-11.664 63.44-3.888 89.344 7.76 25.888 28.48 42.08 62.16 48.544 45.312 9.072 85.776-3.872 121.392-38.848 35.616-34.96 60.224-77.984 73.808-129.168 13.6-51.152 17.152-104.56 10.688-160.24-6.48-55.648-24.608-98.384-54.384-128.192-32.368-33.664-71.216-55.648-116.528-66.032-45.328-10.352-89.36-8.736-132.096 4.864-42.72 13.6-81.904 34.32-117.504 62.16-35.648 27.872-62.48 63.792-80.608 107.792-18.16 44.016-23.312 90.016-15.536 137.904 2.592 12.944 7.776 26.224 15.536 39.824 7.776 13.6 14.576 24.96 20.4 34 5.824 9.056 8.416 21.68 7.76 37.872-0.672 16.208-6.8 33.984-18.448 53.408-97.12-22-143.728-97.76-139.84-227.248 3.888-91.936 39.136-169.632 105.856-233.072 66.688-63.424 143.408-100.336 230.176-110.72 108.768-11.648 204.592 7.12 287.456 56.336 82.88 49.232 130.8 121.728 143.728 217.552 10.352 73.808 4.528 145.664-17.488 215.6-22 69.92-59.568 126.576-112.656 169.952-53.072 43.392-115.232 62.48-186.448 57.312-14.256-1.296-27.52-4.224-39.808-8.752-12.32-4.528-22.336-9.056-30.112-13.6-7.76-4.528-18.16-11.328-31.072-20.384C462.688 684.288 452.336 677.152 444.56 671.968z" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
3
_includes/svg/icon/social/qq.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M116.434944 581.71392c-33.540096 78.963712-38.984704 154.297344-12.058624 168.370176 18.572288 9.696256 47.685632-12.382208 74.93632-52.909056 10.790912 44.156928 37.492736 84.13696 75.63264 116.209664-40.003584 14.768128-66.13504 38.8864-66.13504 66.23232 0 44.9536 70.709248 81.301504 157.9776 81.301504 78.715904 0 143.906816-29.538304 155.93984-68.371456 3.231744-0.049152 15.663104-0.049152 18.79552 0 12.0832 38.784 77.324288 68.371456 155.988992 68.371456 87.267328 0 157.9776-36.39808 157.9776-81.301504 0-27.296768-26.104832-51.464192-66.13504-66.23232 38.088704-32.12288 64.888832-72.052736 75.630592-116.209664 27.250688 40.526848 56.290304 62.605312 74.887168 52.909056 26.949632-14.072832 21.630976-89.455616-12.032-168.370176-26.354688-62.058496-62.109696-107.754496-89.45664-117.848064 0.398336-3.929088 0.595968-7.957504 0.595968-11.93472 0-23.967744-6.66112-46.145536-18.049024-64.195584 0.198656-1.39264 0.198656-2.834432 0.198656-4.227072 0-11.037696-2.635776-21.38112-7.113728-30.331904-6.908928-161.308672-111.930368-289.401856-281.86624-289.401856-170.036224 0-275.105792 128.093184-281.94304 289.401856-4.525056 9.00096-7.135232 19.34336-7.135232 30.331904 0 1.39264 0.099328 2.835456 0.149504 4.227072-11.287552 18.050048-17.95072 40.177664-17.95072 64.195584 0 3.97824 0.149504 7.955456 0.497664 11.93472C178.61632 473.959424 142.739456 519.706624 116.434944 581.71392z" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.5 KiB |
4
_includes/svg/icon/social/telegram.svg
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24px" height="24px">
|
||||
<path style="line-height:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;block-progression:tb;isolation:auto;mix-blend-mode:normal" d="M 20.302734 2.984375 C 20.013769 2.996945 19.748583 3.080055 19.515625 3.171875 C 19.300407 3.256634 18.52754 3.5814726 17.296875 4.0976562 C 16.06621 4.61384 14.435476 5.2982348 12.697266 6.0292969 C 9.2208449 7.4914211 5.314238 9.1361259 3.3125 9.9785156 C 3.243759 10.007156 2.9645852 10.092621 2.65625 10.328125 C 2.3471996 10.564176 2.0039062 11.076462 2.0039062 11.636719 C 2.0039062 12.088671 2.2295201 12.548966 2.5019531 12.8125 C 2.7743861 13.076034 3.0504903 13.199244 3.28125 13.291016 C 3.9563403 13.559857 6.0424892 14.392968 6.9492188 14.755859 C 7.2668647 15.707799 8.0129251 17.950071 8.1875 18.501953 L 8.1855469 18.501953 C 8.3275588 18.951162 8.4659791 19.243913 8.6582031 19.488281 C 8.7543151 19.610465 8.8690398 19.721184 9.0097656 19.808594 C 9.0637596 19.842134 9.1235454 19.868148 9.1835938 19.892578 C 9.191962 19.896131 9.2005867 19.897012 9.2089844 19.900391 L 9.1855469 19.894531 C 9.2029579 19.901531 9.2185841 19.911859 9.2363281 19.917969 C 9.2652427 19.927926 9.2852873 19.927599 9.3242188 19.935547 C 9.4612233 19.977694 9.5979794 20.005859 9.7246094 20.005859 C 10.26822 20.005859 10.601562 19.710938 10.601562 19.710938 L 10.623047 19.695312 L 12.970703 17.708984 L 15.845703 20.367188 C 15.897113 20.439837 16.308174 20.998047 17.261719 20.998047 C 17.829844 20.998047 18.280978 20.718791 18.568359 20.423828 C 18.855741 20.128866 19.034757 19.82706 19.115234 19.417969 L 19.115234 19.414062 L 19.115234 19.412109 C 19.171124 19.121728 21.931641 5.265625 21.931641 5.265625 L 21.925781 5.2890625 C 22.01148 4.9067181 22.036735 4.5369631 21.935547 4.1601562 C 21.834358 3.7833495 21.561271 3.4156252 21.232422 3.2226562 C 20.903572 3.0296874 20.591699 2.9718046 20.302734 2.984375 z M 19.908203 5.1738281 C 19.799749 5.7182284 17.343164 18.059965 17.183594 18.878906 L 14.328125 16.240234 C 13.59209 15.559749 12.44438 15.535812 11.679688 16.181641 L 10.222656 17.414062 L 11 14.375 C 11 14.375 16.362547 8.9468594 16.685547 8.6308594 C 16.945547 8.3778594 17 8.2891719 17 8.2011719 C 17 8.0841719 16.939781 8 16.800781 8 C 16.675781 8 16.506016 8.1197812 16.416016 8.1757812 C 15.267511 8.8918132 10.350132 11.694224 7.96875 13.048828 C 7.8792978 12.995267 7.7913128 12.939666 7.6933594 12.900391 C 6.9119785 12.587666 5.4101276 11.985551 4.53125 11.634766 C 6.6055146 10.76177 10.161156 9.2658083 13.472656 7.8730469 C 15.210571 7.142109 16.840822 6.4570977 18.070312 5.9414062 C 19.108158 5.5060977 19.649538 5.2807035 19.908203 5.1738281 z M 17.152344 19.023438 C 17.152344 19.023438 17.154297 19.023438 17.154297 19.023438 C 17.154234 19.023761 17.152444 19.03095 17.152344 19.03125 C 17.154024 19.022709 17.151187 19.029588 17.152344 19.023438 z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible"/>
|
||||
</svg>
|
After Width: | Height: | Size: 3.0 KiB |
3
_includes/svg/icon/social/twitter.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M1024.032 194.432c-37.664 16.704-78.176 28-120.672 33.088 43.36-26.016 76.672-67.168 92.384-116.224-40.608 24.064-85.568 41.568-133.408 50.976-38.336-40.832-92.928-66.336-153.344-66.336-116.032 0-210.08 94.048-210.08 210.08 0 16.48 1.856 32.512 5.44 47.872-174.592-8.768-329.408-92.416-433.024-219.52-18.08 31.04-28.448 67.104-28.448 105.632 0 72.896 37.088 137.184 93.472 174.88-34.432-1.088-66.816-10.528-95.168-26.272-0.032 0.864-0.032 1.76-0.032 2.656 0 101.792 72.416 186.688 168.512 205.984-17.632 4.8-36.192 7.36-55.36 7.36-13.536 0-26.688-1.312-39.52-3.776 26.72 83.456 104.32 144.192 196.256 145.888-71.904 56.352-162.496 89.92-260.928 89.92-16.96 0-33.664-0.992-50.112-2.944 92.96 59.616 203.392 94.4 322.048 94.4 386.432 0 597.728-320.128 597.728-597.76 0-9.12-0.192-18.176-0.608-27.168 41.056-29.632 76.672-66.624 104.832-108.736z" />
|
||||
</svg>
|
After Width: | Height: | Size: 986 B |
6
_includes/svg/icon/social/weibo.svg
Normal file
@ -0,0 +1,6 @@
|
||||
<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M769.226164 496.610234c-14.420098-4.330228-24.309277-7.266877-16.746482-26.214823 16.350218-41.133578 18.046881-76.626289 0.307181-101.939024-33.242099-47.500415-124.194284-44.928286-228.44638-1.280945 0-0.056317-32.73525 14.323848-24.371737-11.64523 16.042013-51.54906 13.626547-94.739726-11.332929-119.662341-56.566349-56.601163-206.976479 2.134908-335.954595 131.078209-96.594075 96.61353-152.681222 198.989775-152.681222 287.52035 0 169.337597 217.152361 272.292366 429.593589 272.292366 278.498445 0 463.752111-161.808592 463.752111-290.273715C893.345701 558.867622 827.968378 514.820945 769.226164 496.610234zM430.163922 866.063936c-169.51781 16.728051-315.851649-59.899262-326.864086-171.202185-11.010389-111.275277 117.530505-215.061482 287.031932-231.823323 169.537265-16.761841 315.876224 59.866496 326.86511 171.119247C728.190884 745.495411 599.705282 849.291856 430.163922 866.063936z" />
|
||||
<path d="M954.16753 186.714824c-67.256246-74.565105-166.457264-102.990607-258.020739-83.522502l-0.037886 0c-21.188318 4.535015-34.695065 25.37929-30.159026 46.527675 4.516584 21.166816 25.352668 34.691993 46.54201 30.174385 65.139769-13.832358 135.634727 6.400627 183.442323 59.368863 47.765615 52.96414 60.740938 125.206957 40.282686 188.537431l0.011263 0.012287c-6.666851 20.629249 4.617954 42.698153 25.271777 49.366027 20.570885 6.662755 42.687913-4.607714 49.362955-25.188838 0-0.037886 0-0.116729 0.011263-0.150519C1039.577146 362.756133 1021.443231 261.206205 954.16753 186.714824" />
|
||||
<path d="M850.886125 279.919669c-32.732179-36.315956-81.068126-50.108381-125.685136-40.621609-18.234261 3.885839-29.856965 21.833398-25.946551 40.085067 3.89915 18.173849 21.833398 29.851845 40.024654 25.893307l0 0.037886c21.809848-4.610786 45.459709 2.113405 61.461789 19.83365 16.018463 17.757107 20.323092 41.949655 13.45043 63.178931l0.035838 0c-5.715614 17.717174 3.983113 36.770584 21.717694 42.511796 17.7397 5.677728 36.76956-3.992328 42.493365-21.756603C892.458972 365.691759 883.686907 316.228458 850.886125 279.919669" />
|
||||
<path d="M447.103928 548.691741c-80.666743-20.985579-171.84317 19.215193-206.880229 90.291746-35.685212 72.492657-1.180599 152.963828 80.321676 179.268757 84.41947 27.224424 183.926645-14.492797 218.521364-92.744074C573.187374 649.021137 530.586496 570.268131 447.103928 548.691741zM385.506979 733.819463c-16.398343 26.160554-51.51015 37.623523-77.954335 25.54824-26.066352-11.868448-33.760211-42.248645-17.360844-67.757975 16.197652-25.400793 50.129884-36.716316 76.378497-25.711046C393.129162 677.216253 401.60838 707.401901 385.506979 733.819463zM439.522702 664.493841c-5.929616 10.131852-19.03498 15.010909-29.304039 10.785123-10.096014-4.15411-13.261002-15.495231-7.522862-25.454038 5.906066-9.908634 18.500485-14.747758 28.572948-10.750309C441.502995 642.817105 445.180975 654.283146 439.522702 664.493841z" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.9 KiB |
3
_includes/svg/icon/social/weixin.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M684.111464 364.088889c10.47478 0 20.949559 0.722399 31.424339 1.805996-28.173545-131.476543-168.680071-229.000353-329.052557-229.000353-179.15485 0-326.162963 122.085362-326.162963 277.401058 0 89.577425 48.761905 163.262081 130.392945 220.33157l-32.507937 98.246208L272.344268 675.442681c40.81552 7.946384 73.684656 16.253968 114.138977 16.253968 10.11358 0 20.22716-0.361199 30.340741-1.444797-6.501587-21.671958-10.11358-44.788713-10.11358-68.266667C406.710406 479.672663 529.156966 364.088889 684.111464 364.088889zM508.568607 275.595062c24.561552 0 40.81552 16.253968 40.81552 40.81552 0 24.561552-16.253968 40.81552-40.81552 40.81552-24.561552 0-49.123104-16.253968-49.123104-40.81552C459.806702 291.84903 484.368254 275.595062 508.568607 275.595062zM280.290653 357.226102c-24.561552 0-49.123104-16.253968-49.123104-40.81552 0-24.561552 24.561552-40.81552 49.123104-40.81552 24.561552 0 40.81552 16.253968 40.81552 40.81552C321.106173 340.610935 304.852205 357.226102 280.290653 357.226102z" p-id="792"></path><path d="M981.739683 618.373192c0-130.392945-130.392945-236.585538-277.039859-236.585538-155.315697 0-277.401058 106.192593-277.401058 236.585538 0 130.754145 122.085362 236.585538 277.401058 236.585538 32.507937 0 65.377072-8.307584 97.885009-16.253968l89.577425 49.123104-24.561552-81.631041C932.977778 757.073721 981.739683 691.696649 981.739683 618.373192zM614.761199 577.557672c-16.253968 0-32.507937-16.253968-32.507937-32.507937 0-16.253968 16.253968-32.507937 32.507937-32.507937 24.561552 0 40.81552 16.253968 40.81552 32.507937C655.57672 561.303704 639.322751 577.557672 614.761199 577.557672zM794.277249 577.557672c-16.253968 0-32.507937-16.253968-32.507937-32.507937 0-16.253968 16.253968-32.507937 32.507937-32.507937 24.561552 0 40.81552 16.253968 40.81552 32.507937C835.092769 561.303704 818.477601 577.557672 794.277249 577.557672z" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.0 KiB |
3
_includes/svg/icon/social/zhihu.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M351.791182 562.469462l192.945407 0c0-45.367257-21.3871-71.939449-21.3871-71.939449L355.897709 490.530013c3.977591-82.182744 7.541767-187.659007 8.816806-226.835262l159.282726 0c0 0-0.86367-67.402109-18.578124-67.402109s-279.979646 0-279.979646 0 16.850783-88.141456 39.318494-127.053698c0 0-83.60514-4.510734-112.121614 106.962104S81.344656 355.077018 76.80834 367.390461c-4.536316 12.313443 24.62791 5.832845 36.941354 0 12.313443-5.832845 68.050885-25.924439 84.252893-103.69571l86.570681 0c1.165546 49.28652 4.596691 200.335724 3.515057 226.835262L109.86113 490.530013c-25.275663 18.147312-33.701566 71.939449-33.701566 71.939449L279.868105 562.469462c-8.497535 56.255235-23.417339 128.763642-44.275389 167.210279-33.05279 60.921511-50.55235 116.65793-169.802314 212.576513 0 0-19.442818 14.257725 40.829917 9.073656 60.273758-5.185093 117.305683-20.739347 156.840094-99.807147 20.553105-41.107233 41.805128-93.250824 58.386782-146.138358l-0.055259 0.185218 167.855986 193.263655c0 0 22.035876-51.847855 5.832845-108.880803L371.045711 650.610918l-42.1244 31.157627-0.045025 0.151449c11.69946-41.020252 20.11206-81.5749 22.726607-116.858498C351.665315 564.212152 351.72876 563.345412 351.791182 562.469462z" p-id="907"></path><path d="M584.918753 182.033893l0 668.840094 70.318532 0 28.807093 80.512708 121.875768-80.512708 153.600307 0L959.520453 182.033893 584.918753 182.033893zM887.150192 778.934538l-79.837326 0-99.578949 65.782216-23.537066-65.782216-24.855084 0L659.341766 256.673847l227.807403 0L887.149169 778.934538z" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
1
_includes/svg/logo.svg
Normal file
After Width: | Height: | Size: 127 KiB |
65
_includes/svg/logo_.svg
Normal file
@ -0,0 +1,65 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="yannick-white.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg2"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
viewBox="0 0 53.000000 64.000000"
|
||||
height="64.000000pt"
|
||||
width="53.000000pt"
|
||||
version="1.0">
|
||||
<defs
|
||||
id="defs12" />
|
||||
<sodipodi:namedview
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="svg2"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:window-y="322"
|
||||
inkscape:window-x="304"
|
||||
inkscape:cy="39.661017"
|
||||
inkscape:cx="-28.739407"
|
||||
inkscape:zoom="2.95"
|
||||
showgrid="false"
|
||||
id="namedview10"
|
||||
inkscape:window-height="625"
|
||||
inkscape:window-width="1226"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
guidetolerance="10"
|
||||
gridtolerance="10"
|
||||
objecttolerance="10"
|
||||
borderopacity="1"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff" />
|
||||
<metadata
|
||||
id="metadata4">
|
||||
Created by potrace 1.13, written by Peter Selinger 2001-2015
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="g6"
|
||||
stroke="none"
|
||||
fill="#000000"
|
||||
transform="matrix(0.1,0,0,-0.1,0,64)">
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path8"
|
||||
d="M 115,539 C 68,487 46,436 59,411 c 12,-21 93,-36 138,-25 26,7 27,6 13,-12 -8,-10 -17,-21 -20,-24 -26,-26 -92,-169 -94,-204 -1,-23 6,-33 32,-49 39,-23 52,-14 52,38 0,45 53,149 89,174 38,28 39,20 2,-55 -42,-86 -45,-101 -22,-107 24,-6 32,0 58,43 12,19 38,51 58,70 38,37 38,29 -2,-45 -27,-52 -56,-152 -48,-165 4,-7 22,3 46,25 21,19 44,35 49,35 6,0 10,5 10,10 0,6 -9,10 -20,10 -11,0 -20,4 -20,8 0,5 18,54 40,111 22,56 40,107 40,112 0,21 -22,5 -89,-63 -39,-40 -71,-68 -71,-63 0,4 8,32 17,61 9,30 14,57 10,61 -8,7 -38,-7 -77,-34 -29,-22 -22,-8 28,54 37,46 72,69 145,97 41,15 47,21 47,46 0,57 -44,52 -118,-15 -58,-52 -123,-84 -169,-85 -26,0 -33,4 -33,20 0,10 10,25 23,31 36,18 67,51 67,70 0,16 -44,39 -75,39 -7,0 -29,-18 -50,-41 z" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
52
_includes/tags.html
Normal file
@ -0,0 +1,52 @@
|
||||
{%- assign _tag_max_size = 1 -%}
|
||||
{%- assign _tag_min_size = 1 -%}
|
||||
{%- assign _tag_cur_size = 1 -%}
|
||||
{%- assign _tags = site.tags | sort -%}
|
||||
{%- for _tag in _tags -%}
|
||||
{%- assign _tag_cur_size = _tag[1].size -%}
|
||||
{%- if _tag_cur_size > _tag_max_size -%}
|
||||
{%- assign _tag_max_size = _tag_cur_size -%}
|
||||
{%- endif -%}
|
||||
{%- if _tag_cur_size < _tag_min_size -%}
|
||||
{%- assign _tag_min_size = _tag_cur_size -%}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{%- assign _tag_gap_size = _tag_max_size | minus: _tag_min_size | plus: 1 | divided_by: 4 -%}
|
||||
{%- if _tag_gap_size < 1 -%}
|
||||
{%- assign _tag_gap_size = 1 -%}
|
||||
{%- endif -%}
|
||||
<div class="site-tags js-tags">
|
||||
<ul class="menu">
|
||||
<li>
|
||||
<button type="button" class="button button--secondary button--pill tag-button tag-button--all" data-encode="">
|
||||
Show All<div class="tag-button__count">{{ site.posts | size }}</div>
|
||||
</button>
|
||||
</li>
|
||||
{%- for _tag in _tags -%}
|
||||
{%- assign _tag_cur_size = _tag[1].size -%}
|
||||
{%- assign _tag_min_1 = _tag_min_size -%}
|
||||
{%- assign _tag_max_1 = _tag_min_1 | plus: _tag_gap_size -%}
|
||||
{%- assign _tag_min_2 = _tag_max_1 -%}
|
||||
{%- assign _tag_max_2 = _tag_min_2 | plus: _tag_gap_size -%}
|
||||
{%- assign _tag_min_3 = _tag_max_2 -%}
|
||||
{%- assign _tag_max_3 = _tag_min_3 | plus: _tag_gap_size -%}
|
||||
{%- assign _tag_min_4 = _tag_max_3 -%}
|
||||
{%- assign _tag_max_4 = _tag_min_4 | plus: _tag_gap_size -%}
|
||||
{%- if _tag_cur_size >= _tag_min_1 and _tag_cur_size < _tag_max_1 -%}
|
||||
{%- assign _c_index = 1 -%}
|
||||
{%- elsif _tag_cur_size >= _tag_min_2 and _tag_cur_size < _tag_max_2 -%}
|
||||
{%- assign _c_index = 2 -%}
|
||||
{%- elsif _tag_cur_size >= _tag_min_3 and _tag_cur_size < _tag_max_3 -%}
|
||||
{%- assign _c_index = 3 -%}
|
||||
{%- elsif _tag_cur_size >= _tag_min_4 and _tag_cur_size < _tag_max_4 -%}
|
||||
{%- assign _c_index = 4 -%}
|
||||
{%- else -%}
|
||||
{%- assign _c_index = 4 -%}
|
||||
{%- endif -%}
|
||||
<li><button type="button" class="button button--pill tag-button tag-button-{{ _c_index }}" data-encode="{{ _tag[0] | strip | url_encode }}">
|
||||
<span>{{ _tag[0] | strip }}</span><div class="tag-button__count">{{ _tag[1].size }}</div>
|
||||
</button>
|
||||
</li>
|
||||
{%- endfor -%}
|
||||
</ul>
|
||||
</div>
|
13
_layouts/404.html
Normal file
@ -0,0 +1,13 @@
|
||||
---
|
||||
layout: page
|
||||
title: 404
|
||||
show_title: false
|
||||
---
|
||||
<div class="layout--404">
|
||||
<div class="sign">
|
||||
<h1>404</h1>
|
||||
<p>Page not found :(</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{ content }}
|
30
_layouts/archive.html
Normal file
@ -0,0 +1,30 @@
|
||||
---
|
||||
layout: page
|
||||
titles:
|
||||
# @start locale config
|
||||
en : &EN Archive
|
||||
en-GB : *EN
|
||||
en-US : *EN
|
||||
en-CA : *EN
|
||||
en-AU : *EN
|
||||
fr : &FR Etiquettes
|
||||
fr-BE : *FR
|
||||
fr-CA : *FR
|
||||
fr-CH : *FR
|
||||
fr-FR : *FR
|
||||
fr-LU : *FR
|
||||
# @end locale config
|
||||
---
|
||||
|
||||
<div class="layout--archive js-all">
|
||||
{%- include tags.html -%}
|
||||
<div class="js-result layout--archive__result d-none">
|
||||
{%- include article-list.html articles=site.posts type='brief' show_info=true reverse=true group_by='year' -%}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
{%- include scripts/archieve.js -%}
|
||||
</script>
|
||||
|
||||
{{ content }}
|
41
_layouts/article.html
Normal file
@ -0,0 +1,41 @@
|
||||
---
|
||||
layout: page
|
||||
type: article
|
||||
---
|
||||
|
||||
<div class="layout--article">
|
||||
{%- include article/top/custom.html -%}
|
||||
|
||||
<div class="article__content" itemprop="articleBody">
|
||||
{%- if page.toc -%}
|
||||
<details>
|
||||
<summary><b>Afficher/cacher Sommaire</b></summary>
|
||||
<!-- affichage sommaire -->
|
||||
<div class="toc-aside js-toc-root"></div>
|
||||
</details>
|
||||
{%- endif -%}
|
||||
{{ content }}
|
||||
</div>
|
||||
|
||||
{%- if page.mathjax -%}
|
||||
{%- include mathjax.html -%}
|
||||
{%- endif -%}
|
||||
|
||||
{% if page.mermaid %}
|
||||
{% include mermaid.html %}
|
||||
{% endif %}
|
||||
|
||||
{% if page.chart %}
|
||||
{% include chart.html %}
|
||||
{% endif %}
|
||||
|
||||
<div class="d-print-none">
|
||||
{%- include article-footer.html -%}
|
||||
{%- include article-section-navigator.html -%}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<script>
|
||||
{%- include scripts/article.js -%}
|
||||
</script>
|
90
_layouts/articles.html
Normal file
@ -0,0 +1,90 @@
|
||||
---
|
||||
layout: page
|
||||
---
|
||||
|
||||
{%- assign _page_articles_data_source = page.articles.data_source | default: layout.articles.data_source -%}
|
||||
|
||||
{%- if _page_articles_data_source -%}
|
||||
{%- assign _keys = _page_articles_data_source | split: '.' -%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- assign _articles = nil -%}
|
||||
{%- for _key in _keys -%}
|
||||
{%- if forloop.first -%}
|
||||
{%- case _key -%}
|
||||
{%- when 'site' -%}
|
||||
{%- assign _articles = site -%}
|
||||
{%- when 'page' -%}
|
||||
{%- assign _articles = page -%}
|
||||
{%- when 'layout' -%}
|
||||
{%- assign _articles = layout -%}
|
||||
{%- when 'paginator' -%}
|
||||
{%- assign _articles = paginator -%}
|
||||
{%- else -%}
|
||||
{%- assign _articles = site[_key] -%}
|
||||
{%- else -%}
|
||||
{%- endcase -%}
|
||||
{%- else -%}
|
||||
{%- assign _articles = _articles[_key] -%}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
|
||||
{%- assign _type = page.articles.type | default: layout.articles.type -%}
|
||||
|
||||
{%- if _articles -%}
|
||||
|
||||
|
||||
<div class="layout--articles">
|
||||
|
||||
{%- if _type == 'grid' -%}
|
||||
{%- if page.articles.size == 'sm' -%}
|
||||
{%- include article-list.html articles=_articles type='grid' size='sm' -%}
|
||||
{%- else -%}
|
||||
{%- include article-list.html articles=_articles type='grid' -%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- elsif _type == 'brief' -%}
|
||||
{%- include snippets/assign.html
|
||||
target=site.data.variables.default.page.articles.show_info
|
||||
source0=layout.articles.show_info source1=page.articles.show_info -%}
|
||||
{%- assign _show_info = __return -%}
|
||||
|
||||
{%- include article-list.html articles=_articles type='brief' show_info=_show_info -%}
|
||||
|
||||
{%- else -%}
|
||||
{%- include snippets/assign.html
|
||||
target=site.data.variables.default.page.articles.show_cover
|
||||
source0=layout.articles.show_cover source1=page.articles.show_cover -%}
|
||||
{%- assign _show_cover = __return -%}
|
||||
|
||||
{%- include snippets/assign.html
|
||||
target=site.data.variables.default.page.articles.show_excerpt
|
||||
source0=layout.articles.show_excerpt source1=page.articles.show_excerpt -%}
|
||||
{%- assign _show_excerpt = __return -%}
|
||||
|
||||
{%- include snippets/assign.html
|
||||
target=site.data.variables.default.page.articles.show_readmore
|
||||
source0=layout.articles.show_readmore source1=page.articles.show_readmore -%}
|
||||
{%- assign _show_readmore = __return -%}
|
||||
|
||||
{%- include snippets/assign.html
|
||||
target=site.data.variables.default.page.articles.show_info
|
||||
source0=layout.articles.show_info source1=page.articles.show_info -%}
|
||||
{%- assign _show_info = __return -%}
|
||||
|
||||
{%- assign _article_type = page.articles.article_type | default: layout.articles.article_type -%}
|
||||
{%- assign _cover_size = page.articles.cover_size | default: layout.articles.cover_size -%}
|
||||
{%- assign _excerpt_type = page.articles.excerpt_type | default: layout.articles.excerpt_type -%}
|
||||
|
||||
{%- include article-list.html articles=_articles type='item'
|
||||
article_type=_article_type
|
||||
show_cover=_show_cover cover_size=_cover_size
|
||||
show_excerpt=_show_excerpt excerpt_type=_excerpt_type
|
||||
show_readmore=_show_readmore show_info=_show_info -%}
|
||||
|
||||
{%- endif -%}
|
||||
|
||||
</div>
|
||||
{%- endif -%}
|
||||
|
||||
{{ content }}
|
25
_layouts/base.html
Normal file
@ -0,0 +1,25 @@
|
||||
---
|
||||
layout: none
|
||||
---
|
||||
<!DOCTYPE html>
|
||||
{%- include snippets/get-lang.html -%}
|
||||
<html lang="{{ __return }}">
|
||||
<head>
|
||||
{%- include analytics.html -%}
|
||||
{%- include head.html -%}
|
||||
<script>
|
||||
{%- include scripts/utils/utils.js -%}
|
||||
{%- include scripts/lib/throttle.js -%}
|
||||
{%- include scripts/lib/lazyload.js -%}
|
||||
</script>
|
||||
{%- include scripts/variables.html -%}
|
||||
</head>
|
||||
<body>
|
||||
<div class="root" data-is-touch="false">
|
||||
{{ content }}
|
||||
</div>
|
||||
<script>
|
||||
{%- include scripts/common.js -%}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
30
_layouts/home.html
Normal file
@ -0,0 +1,30 @@
|
||||
---
|
||||
layout: articles
|
||||
titles:
|
||||
# @start locale config
|
||||
en : &EN Home
|
||||
en-GB : *EN
|
||||
en-US : *EN
|
||||
en-CA : *EN
|
||||
en-AU : *EN
|
||||
fr : &FR Accueil
|
||||
fr-BE : *FR
|
||||
fr-CA : *FR
|
||||
fr-CH : *FR
|
||||
fr-FR : *FR
|
||||
fr-LU : *FR
|
||||
# @end locale config
|
||||
show_title: false
|
||||
articles:
|
||||
data_source: paginator.posts
|
||||
article_type: BlogPosting
|
||||
show_cover: false
|
||||
show_excerpt: true
|
||||
show_readmore: true
|
||||
show_info: true
|
||||
---
|
||||
<script>
|
||||
{%- include scripts/home.js -%}
|
||||
</script>
|
||||
|
||||
{{ content }}
|
178
_layouts/landing.html
Normal file
@ -0,0 +1,178 @@
|
||||
---
|
||||
layout: page
|
||||
header: false
|
||||
full_width: true
|
||||
article_header:
|
||||
type: overlay
|
||||
align: center
|
||||
height: 80vh
|
||||
---
|
||||
<div class="layout--landing">
|
||||
<div class="heros">
|
||||
{%- for _section in page.data.sections -%}
|
||||
{%- include snippets/get-nav-url.html path=_section.background_image.src -%}
|
||||
{%- assign _url = __return -%}
|
||||
{%- if _section.theme == 'light' -%}
|
||||
<section class="hero hero--center hero--light" id="hero-{{ forloop.index }}"
|
||||
{%- elsif _section.theme == 'dark' -%}
|
||||
<section class="hero hero--center hero--dark" id="hero-{{ forloop.index }}"
|
||||
{%- else -%}
|
||||
<section class="hero hero--center" id="hero-{{ forloop.index }}"
|
||||
{%- endif -%}
|
||||
{%- if _section.background_color -%}
|
||||
style="background-image: url({{ _url }}); background-color: {{ _section.background_color }};">
|
||||
{%- else -%}
|
||||
style="background-image: url({{ _url }});">
|
||||
{%- endif -%}
|
||||
|
||||
<div class="hero__content">
|
||||
<div class="mb-5">
|
||||
|
||||
<h3>{{ _section.title }}</h3>
|
||||
{%- if _section.excerpt-%}
|
||||
<p>{{ _section.excerpt }}</p>
|
||||
{%- endif -%}
|
||||
|
||||
{%- if _section.actions -%}
|
||||
<ul class="menu">
|
||||
{%- for _action in _section.actions -%}
|
||||
{%- include snippets/get-nav-url.html path=_action.url -%}
|
||||
{%- assign _url = __return -%}
|
||||
{%- assign _type = _action.type | default: 'outline-info' -%}
|
||||
<li><a class="button button--{{ _type }} button--pill button--lg" href="{{ _url }}">{{ _action.text }}</a></li>
|
||||
{%- endfor -%}
|
||||
</ul>
|
||||
{%- endif -%}
|
||||
|
||||
</div>
|
||||
|
||||
{%- if _section.children -%}
|
||||
{%- assign _size = _section.children | size -%}
|
||||
<div class="grid--container">
|
||||
<div class="grid grid--p-3">
|
||||
|
||||
{%- for child in _section.children -%}
|
||||
|
||||
{%- if _size >= 2 -%}
|
||||
{%- assign _cell_md_col = 6 -%}
|
||||
{%- else -%}
|
||||
{%- assign _cell_md_col = 12 | divided_by: _size -%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- if _size >= 4 -%}
|
||||
{%- assign _cell_lg_col = 3 -%}
|
||||
{%- else -%}
|
||||
{%- assign _cell_lg_col = 12 | divided_by: _size -%}
|
||||
{%- endif -%}
|
||||
|
||||
<div class="cell cell--12 cell--md-{{ _cell_md_col }} cell--lg-{{ _cell_lg_col }} ">
|
||||
|
||||
<div class="mb-5">
|
||||
<h4>{{ child.title }}</h4>
|
||||
|
||||
{%- if child.excerpt-%}
|
||||
<p>{{ child.excerpt }}</p>
|
||||
{%- endif -%}
|
||||
|
||||
{%- if child.actions -%}
|
||||
<ul class="menu">
|
||||
{%- for _action in child.actions -%}
|
||||
{%- include snippets/get-nav-url.html path=_action.url -%}
|
||||
{%- assign _url = __return -%}
|
||||
{%- assign _type = _action.type | default: 'outline-info' -%}
|
||||
<li><a class="button button--{{ _type }} button--pill button--lg" href="{{ _url }}">{{ _action.text }}</a></li>
|
||||
{%- endfor -%}
|
||||
</ul>
|
||||
{%- endif -%}
|
||||
</div>
|
||||
|
||||
{%- if child.image and child.image.src -%}
|
||||
|
||||
{%- if child.image.url -%}
|
||||
{%- include snippets/get-nav-url.html path=child.image.url -%}
|
||||
{%- assign _item_image_url = __return -%}
|
||||
{%- else -%}
|
||||
{%- assign _item_image_url = nil -%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- include snippets/get-nav-url.html path=child.image.src -%}
|
||||
{%- assign _item_image_src = __return -%}
|
||||
|
||||
{%- if child.image.is_row -%}
|
||||
<div class="mb-5">
|
||||
{%- endif -%}
|
||||
<div class="mx-auto" style="{{ child.image.style }}">
|
||||
{%- if _item_image_url -%}
|
||||
<a href="{{ _item_image_url }}">
|
||||
{%- endif -%}
|
||||
<img src="{{ _item_image_src }}"/>
|
||||
{%- if _item_image_url -%}
|
||||
</a>
|
||||
{%- endif -%}
|
||||
</div>
|
||||
{%- if child.image.is_row -%}
|
||||
</div>
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- if child.content-%}
|
||||
<p>{{ child.content }}</p>
|
||||
{%- endif -%}
|
||||
|
||||
</div>
|
||||
{%- endfor-%}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{%- endif -%}
|
||||
|
||||
{%- if _section.image.full_width == true -%}
|
||||
</div> {% comment %} end hero__content {% endcomment %}
|
||||
{%- endif -%}
|
||||
|
||||
{%- if _section.image and _section.image.src -%}
|
||||
|
||||
{%- if _section.image.url -%}
|
||||
{%- include snippets/get-nav-url.html path=_section.image.url -%}
|
||||
{%- assign _section_image_url = __return -%}
|
||||
{%- else -%}
|
||||
{%- assign _section_image_url = nil -%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- include snippets/get-nav-url.html path=_section.image.src -%}
|
||||
{%- assign _section_image_src = __return -%}
|
||||
|
||||
{%- if _section.image.is_row -%}
|
||||
<div class="mb-5">
|
||||
{%- endif -%}
|
||||
<div class="mx-auto" style="{{ _section.image.style }}">
|
||||
{%- if _section_image_url -%}
|
||||
<a href="{{ _section_image_url }}">
|
||||
{%- endif -%}
|
||||
{%- if _section.image.full_width == true -%}
|
||||
<img class="hero__cover hero__cover--full-width" src="{{ _section_image_src }}"/>
|
||||
{%- else -%}
|
||||
<img class="hero__cover" src="{{ _section_image_src }}"/>
|
||||
{%- endif -%}
|
||||
{%- if _section_image_url -%}
|
||||
</a>
|
||||
{%- endif -%}
|
||||
</div>
|
||||
{%- if _section.image.is_row -%}
|
||||
</div>
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- if _section.image.full_width != true -%}
|
||||
</div> {% comment %} end hero__content {% endcomment %}
|
||||
{%- endif -%}
|
||||
|
||||
{%- if _section.content-%}
|
||||
<p>{{ _section.content }}</p>
|
||||
{%- endif -%}
|
||||
</section>
|
||||
{%- endfor -%}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{ content }}
|
1
_layouts/none.html
Normal file
@ -0,0 +1 @@
|
||||
{{ content }}
|
270
_layouts/page.html
Normal file
@ -0,0 +1,270 @@
|
||||
---
|
||||
layout: base
|
||||
---
|
||||
{%- assign _page_mode = page.mode | default: layout.mode | default: site.data.variables.default.page.mode -%}
|
||||
{%- assign _page_type = page.type | default: layout.type | default: site.data.variables.default.page.type -%}
|
||||
{%- assign _article_header_type = page.article_header.type | default: layout.article_header.type -%}
|
||||
|
||||
{%- include snippets/assign.html
|
||||
target=layout.header source0=page.header -%}
|
||||
{%- assign _header = __return -%}
|
||||
|
||||
{%- include snippets/assign.html
|
||||
target=layout.footer source0=page.footer -%}
|
||||
{%- assign _footer = __return -%}
|
||||
|
||||
{%- assign _footer = false -%}
|
||||
|
||||
{%- include snippets/assign.html
|
||||
target=layout.lightbox source0=page.lightbox -%}
|
||||
{%- assign _lightbox = __return -%}
|
||||
|
||||
{%- include snippets/assign.html
|
||||
target = site.data.variables.default.page.full_width
|
||||
source0=layout.full_width source1=page.full_width -%}
|
||||
{%- assign _full_width = __return -%}
|
||||
|
||||
{%- include snippets/assign.html
|
||||
target = site.data.variables.default.page.comment
|
||||
source0=layout.comment source1=page.comment -%}
|
||||
{%- assign _comment = __return -%}
|
||||
|
||||
|
||||
{%- assign _article_header_excerpt_truncate = include.excerpt_truncate | default: 200 -%}
|
||||
|
||||
{%- if page.sidebar -%}
|
||||
<div class="layout--page layout--page--sidebar clearfix js-page-root">
|
||||
<div class="page__mask d-print-none js-page-mask js-sidebar-hide"></div>
|
||||
<div class="page__viewport">
|
||||
<div class="page__actions d-print-none">
|
||||
<div class="button button--circle button--lg box-shadow-2 sidebar-button js-sidebar-show">
|
||||
<i class="fas fa-bars icon--show"></i>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid page__grid">
|
||||
|
||||
<div class="page__sidebar d-print-none">
|
||||
{%- include sidebar/toc.html -%}
|
||||
</div>
|
||||
|
||||
{%- else -%}
|
||||
<div class="layout--page js-page-root">
|
||||
{%- endif -%}
|
||||
|
||||
{%- assign _page_main_class = 'page__main js-page-main' -%}
|
||||
{%- if _page_mode == 'immersive' -%}
|
||||
{%- assign _page_main_class = _page_main_class | append: ' page__main--immersive' -%}
|
||||
{%- endif -%}
|
||||
{%- unless page.sidebar -%}
|
||||
{%- assign _page_main_class = _page_main_class | append: ' page__viewport' -%}
|
||||
{%- endunless -%}
|
||||
{%- if _footer == false -%}
|
||||
{%- assign _page_main_class = _page_main_class | append: ' hide-footer' -%}
|
||||
{%- endif -%}
|
||||
|
||||
<!--
|
||||
{%- if page.aside -%}
|
||||
{%- assign _page_main_class = _page_main_class | append: ' has-aside' -%}
|
||||
{%- elsif _full_width -%}
|
||||
{%- assign _page_main_class = _page_main_class | append: ' full-width' -%}
|
||||
{%- endif -%}
|
||||
-->
|
||||
{%- assign _page_main_class = _page_main_class | append: ' has-aside' -%}
|
||||
|
||||
<div class="{{ _page_main_class }} cell cell--auto">
|
||||
|
||||
<div class="page__main-inner">
|
||||
{%- if _header != false -%}
|
||||
<div class="page__header d-print-none">
|
||||
{%- assign _header_theme = page.header.theme | default: layout.header.theme -%}
|
||||
{%- if _header_theme == 'dark'-%}
|
||||
{%- include header.html theme='dark' background=page.header.background -%}
|
||||
{%- elsif _header_theme == 'light' -%}
|
||||
{%- include header.html theme='light' background=page.header.background -%}
|
||||
{%- else -%}
|
||||
{%- include header.html -%}
|
||||
{%- endif -%}
|
||||
</div>
|
||||
{%- endif -%}
|
||||
|
||||
|
||||
<div class="page__content">
|
||||
{%- if _article_header_type == 'overlay' or _article_header_type == 'cover' -%}
|
||||
|
||||
{%- if _article_header_type == 'overlay' -%}
|
||||
|
||||
{%- assign _article_header_height = page.article_header.height | default: layout.article_header.height -%}
|
||||
{%- assign _article_header_align = page.article_header.align | default: layout.article_header.align | default: site.data.variables.default.page.article_header.align -%}
|
||||
{%- assign _article_header_theme = page.article_header.theme | default: layout.article_header.theme | default: site.data.variables.default.page.article_header.theme -%}
|
||||
|
||||
{%- if page.article_header.background_image.src -%}
|
||||
{%- assign _header_background_image_src = page.article_header.background_image.src -%}
|
||||
{%- elsif page.article_header.background_image != false and page.cover -%}
|
||||
{%- assign _header_background_image_src = page.cover -%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- if page.article_header.background_image.gradient -%}
|
||||
{%- assign _header_background_image = page.article_header.background_image.gradient -%}
|
||||
{%- if _header_background_image_src -%}
|
||||
{%- assign _header_background_image = _header_background_image | append: ',' -%}
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- if _header_background_image_src -%}
|
||||
{%- include snippets/get-nav-url.html path=_header_background_image_src -%}
|
||||
{%- assign _header_background_image_src = __return -%}
|
||||
{%- assign _header_background_image = _header_background_image
|
||||
| append: 'url(' | append: _header_background_image_src | append: ')'-%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- assign _header_style = 'background-image:' | append: _header_background_image | append: ';' -%}
|
||||
|
||||
{%- if page.article_header.background_color -%}
|
||||
{%- assign _header_style = _header_style | append: 'background-color:' | append: page.article_header.background_color | append: ';' -%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- if _article_header_height -%}
|
||||
{%- assign _header_style = _header_style | append: 'min-height:' | append: _article_header_height | append: ';' -%}
|
||||
{%- endif -%}
|
||||
|
||||
<div class="article__header--overlay">
|
||||
|
||||
{%- if _article_header_theme == 'light' -%}
|
||||
{%- if _article_header_align == 'center' -%}
|
||||
<div class="hero hero--center hero--light overlay" style="{{ _header_style }}">
|
||||
{%- else -%}
|
||||
<div class="hero hero--light overlay" style="{{ _header_style }}">
|
||||
{%- endif -%}
|
||||
{%- elsif _article_header_theme == 'dark' -%}
|
||||
{%- if _article_header_align == 'center' -%}
|
||||
<div class="hero hero--center hero--dark overlay" style="{{ _header_style }}">
|
||||
{%- else -%}
|
||||
<div class="hero hero--dark overlay" style="{{ _header_style }}">
|
||||
{%- endif -%}
|
||||
{%- else -%}
|
||||
{%- if _article_header_align == 'center' -%}
|
||||
<div class="hero hero--center overlay" style="{{ _header_style }}">
|
||||
{%- else -%}
|
||||
<div class="hero overlay" style="{{ _header_style }}">
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
<div class="hero__content">
|
||||
{%- if _full_width == false -%}
|
||||
<div class ="main">
|
||||
{%- endif -%}
|
||||
{%- include article-info.html article=page semantic=false -%}
|
||||
{%- include article-header.html article=page semantic=false -%}
|
||||
{%- if page.excerpt -%}
|
||||
<p class="overlay__excerpt">{{ page.excerpt | strip_html | strip_newlines | strip | truncate: _article_header_excerpt_truncate }}</p>
|
||||
{%- endif -%}
|
||||
{%- if page.article_header.actions -%}
|
||||
<ul class="menu">
|
||||
{%- for _action in page.article_header.actions -%}
|
||||
{%- include snippets/get-nav-url.html path=_action.url -%}
|
||||
{%- assign _url = __return -%}
|
||||
{%- assign _type = _action.type | default: 'info' -%}
|
||||
<li><a class="button button--{{ _type }} button--rounded button--xl" href="{{ _url }}">{{ _action.text }}</a></li>
|
||||
{%- endfor -%}
|
||||
</ul>
|
||||
{%- endif -%}
|
||||
{%- if _full_width == false -%}
|
||||
</div>
|
||||
{%- endif -%}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{%- elsif _article_header_type == 'cover' -%}
|
||||
{%- if page.article_header.image.src -%}
|
||||
{%- include snippets/get-nav-url.html path=page.article_header.image.src -%}
|
||||
{%- assign _header_image_src = __return -%}
|
||||
<img class="article__header--cover" src="{{ _header_image_src }}" />
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
|
||||
{%- endif -%}
|
||||
|
||||
|
||||
{%- if _full_width == false -%}
|
||||
<div class ="main">
|
||||
{%- endif -%}
|
||||
<div class="grid grid--reverse">
|
||||
<div class="col-main cell cell--auto">
|
||||
{%- include main/top/custom.html -%}
|
||||
{%- if _page_type == 'article' -%}
|
||||
<article itemscope itemtype="http://schema.org/Article">
|
||||
{%- elsif _page_type == 'webpage' -%}
|
||||
<article itemscope itemtype="http://schema.org/WebPage">
|
||||
{%- else -%}
|
||||
<article>
|
||||
{%- endif -%}
|
||||
|
||||
{%- if _article_header_type == 'overlay' or page.article_header == false -%}
|
||||
{%- include article-header.html article=page html=false -%}
|
||||
{%- include article-info.html article=page html=false -%}
|
||||
{%- else -%}
|
||||
{%- include article-header.html article=page -%}
|
||||
{%- include article-info.html article=page -%}
|
||||
{%- endif -%}
|
||||
|
||||
<div class="js-article-content">
|
||||
{{ content }}
|
||||
</div>
|
||||
{%- if _comment != false -%}
|
||||
<section class="page__comments d-print-none">{%- include comments.html -%}</section>
|
||||
{%- endif -%}
|
||||
</article>
|
||||
{%- include main/bottom/custom.html -%}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{%- if _full_width == false -%}
|
||||
</div>
|
||||
{%- endif -%}
|
||||
</div>
|
||||
|
||||
{%- if _footer != false -%}
|
||||
<div class="page__footer d-print-none">{%- include footer.html -%}</div>
|
||||
{%- endif -%}
|
||||
</div>
|
||||
</div> {%- comment -%} end page__main {%- endcomment -%}
|
||||
{%- if page.sidebar -%}
|
||||
</div> {%- comment -%} end grid {%- endcomment -%}
|
||||
</div> {%- comment -%} end page__viewport {%- endcomment -%}
|
||||
{%- endif -%}
|
||||
|
||||
<script>{%- include scripts/lib/modal.js -%}</script>
|
||||
{%- if _lightbox == true -%}
|
||||
<div class="modal d-print-none js-page-gallery-modal"><div class="gallery"></div></div>
|
||||
{%- endif -%}
|
||||
{%- if _header != false -%}
|
||||
<div class="modal modal--overflow page__search-modal d-print-none js-page-search-modal">{%- include search.html -%}</div>
|
||||
{%- endif -%}
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
{%- include scripts/lib/scroll-to.js -%}
|
||||
{%- include scripts/lib/affix.js -%}
|
||||
{%- include scripts/lib/toc.js -%}
|
||||
{%- if _lightbox == true -%}
|
||||
{%- include scripts/lib/gallery.js -%}
|
||||
{%- include scripts/components/lightbox.js -%}
|
||||
{%- endif -%}
|
||||
{%- include scripts/page.js -%}
|
||||
</script>
|
||||
|
||||
{%- if page.sidebar -%}
|
||||
<script>{%- include scripts/components/sidebar.js -%}</script>
|
||||
{%- endif -%}
|
||||
|
||||
{%- if page.aside -%}
|
||||
<script>
|
||||
/* toc must before affix, since affix need to konw toc' height. */
|
||||
{%- if page.aside.toc -%}{%- include scripts/aside/toc.js -%}{%- endif -%}
|
||||
{%- include scripts/aside/affix.js -%}
|
||||
</script>
|
||||
{%- endif -%}
|
||||
|
||||
{%- include markdown-enhancements.html -%}
|
||||
<!--{%- include pageview.html -%}-->
|
29
_sass/additional/_alert.scss
Normal file
@ -0,0 +1,29 @@
|
||||
.article__content {
|
||||
p.success {
|
||||
padding: map-get($spacers, 2) map-get($spacers, 3);
|
||||
background-color: rgba($green, .1);
|
||||
border: 1px solid $green;
|
||||
border-radius: map-get($base, border-radius);
|
||||
}
|
||||
|
||||
p.info {
|
||||
padding: map-get($spacers, 2) map-get($spacers, 3);
|
||||
background-color: rgba($blue, .1);
|
||||
border: 1px solid $blue;
|
||||
border-radius: map-get($base, border-radius);
|
||||
}
|
||||
|
||||
p.warning {
|
||||
padding: map-get($spacers, 2) map-get($spacers, 3);
|
||||
background-color: rgba($yellow, .1);
|
||||
border: 1px solid $yellow;
|
||||
border-radius: map-get($base, border-radius);
|
||||
}
|
||||
|
||||
p.error {
|
||||
padding: map-get($spacers, 2) map-get($spacers, 3);
|
||||
background-color: rgba($red, .1);
|
||||
border: 1px solid $red;
|
||||
border-radius: map-get($base, border-radius);
|
||||
}
|
||||
}
|
17
_sass/additional/_photo-frame.scss
Normal file
@ -0,0 +1,17 @@
|
||||
.article__content {
|
||||
img.shadow, .shadow > img {
|
||||
@include box-shadow();
|
||||
}
|
||||
|
||||
img.border, .border > img {
|
||||
border: 1px solid $border-color-l;
|
||||
}
|
||||
|
||||
img.rounded, .rounded > img {
|
||||
border-radius: map-get($base, border-radius);
|
||||
}
|
||||
|
||||
img.circle, .circle > img {
|
||||
border-radius: 50%;
|
||||
}
|
||||
}
|