Read-add gh-pages

This commit is contained in:
Oliver Woodman 2021-04-20 17:28:16 +01:00
parent ebd024a3ae
commit f89d3a9007
2076 changed files with 815215 additions and 0 deletions

3
docs/404.html Normal file
View File

@ -0,0 +1,3 @@
---
layout: 404
---

1
docs/CNAME Normal file
View File

@ -0,0 +1 @@
exoplayer.dev

6
docs/Gemfile Normal file
View File

@ -0,0 +1,6 @@
source "https://rubygems.org"
gem "github-pages", group: :jekyll_plugins
gem "tzinfo-data"
gem "wdm", "~> 0.1.0" if Gem.win_platform?

23
docs/LICENSE Normal file
View File

@ -0,0 +1,23 @@
Jekyll TeXt Theme
MIT License
Copyright (c) 2017 Tian Qi
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

12
docs/README.md Normal file
View File

@ -0,0 +1,12 @@
# ExoPlayer website #
The [ExoPlayer website](https://exoplayer.dev/) is hosted on
GitHub Pages, and is statically generated using Jekyll.
* GitHub provides a guide describing how to setup a GitHub Pages site using
Jekyll
[here](https://help.github.com/articles/using-jekyll-as-a-static-site-generator-with-github-pages/).
* GitHub provides a guide describing how to test changes to the site locally
[here](https://help.github.com/articles/setting-up-your-github-pages-site-locally-with-jekyll/).
Once your machine is setup, you can build and run a local instance of the
site using `./run_locally.sh` from the root directory.

95
docs/_config.yml Normal file
View File

@ -0,0 +1,95 @@
## => Site Settings
##############################
text_skin: default # "default" (default), "dark", "forest", "ocean", "chocolate", "orange"
highlight_theme: default # "default" (default), "tomorrow", "tomorrow-night", "tomorrow-night-eighties", "tomorrow-night-blue", "tomorrow-night-bright"
url: https://exoplayer.dev
baseurl:
title: ExoPlayer
description: An application level media player for Android
## => Link roots
##############################
release_v2: https://github.com/google/ExoPlayer/tree/release-v2
exo_sdk: /doc/reference/com/google/android/exoplayer2
android_sdk: https://developer.android.com/reference
google_sdk: https://developers.google.com
## => GitHub Repository (if the site is hosted by GitHub)
##############################
repository: google/ExoPlayer
repository_tree: gh-pages
## => Author and Social
##############################
author:
type : "organization"
name : "ExoPlayer"
github : "google/ExoPlayer"
medium : "google-exoplayer"
## => Paths
##############################
paths:
root : # title link url, "/" (default)
home : # home layout url, "/" (default)
archive : # "/archive.html" (default)
rss : # "/feed.xml" (default)
## => Post
##############################
excerpt_separator: <!--more-->
## => Analytics
##############################
analytics:
provider: google
google:
tracking_id : UA-68257324-1
anonymize_ip: true
## => Search
##############################
search:
provider: google # "default" (default), false, "google", "custom"
## Google Custom Search Engine
google:
custom_search_engine_id: 009764199895742571316:nuhckqry2_e
## => Build
##############################
markdown : kramdown
highlighter : rouge
permalink : date
exclude:
- Gemfile
- README.md
- vendor
defaults:
- scope:
path: ""
values:
footer: true
show_date: false
layout: article
sidebar:
nav: en
## => Plugins
##############################
plugins:
- jekyll-feed
- jekyll-paginate
- jekyll-sitemap
- jekyll-redirect-from
- jemoji

111
docs/_data/locale.yml Normal file
View File

@ -0,0 +1,111 @@
## => 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 Email."
EMAIL_US : "Send us Email."
COPYRIGHT_DATES : "2019"
en-GB:
<<: *EN
en-US:
<<: *EN
en-CA:
<<: *EN
en-AU:
<<: *EN
## => Simplified Chinese
########################
zh-Hans: &ZH_HANS
SUBSCRIBE : "订阅"
READMORE : "阅读更多"
SEARCH : "搜索"
CANCEL : "取消"
VIEWS : "阅读"
LAST_UPDATED : "更新于"
PREVIOUS : "上篇"
NEXT : "下篇"
ARTICLE_DATE_FORMAT : "%Y年 %m月%d日"
ARTICLE_LIST_DATE_FORMAT: "%m月%d日"
STATISTICS : "共计 [POST_COUNT] 篇文章,[PAGE_COUNT] 页。"
LICENSE_ANNOUNCE : "本文遵守 [LICENSE] 许可协议。"
POST_ON_GITHUB : "在 Github 上修改"
FOLLOW_ME : "在 [NAME] 上关注我。"
FOLLOW_US : "在 [NAME] 上关注我们。"
EMAIL_ME : "给我发邮件。"
EMAIL_US : "给我们发邮件。"
COPYRIGHT_DATES : "2019"
zh:
<<: *ZH_HANS
zh-CN:
<<: *ZH_HANS
zh-SG:
<<: *ZH_HANS
## => Traditional Chinese
########################
zh-Hant: &ZH_HANT
SUBSCRIBE : "訂閱"
READMORE : "閱讀更多"
SEARCH : "搜索"
CANCEL : "取消"
VIEWS : "閱讀"
LAST_UPDATED : "更新於"
PREVIOUS : "上篇"
NEXT : "下篇"
ARTICLE_DATE_FORMAT : "%Y年 %m月%d日"
ARTICLE_LIST_DATE_FORMAT: "%m月%d日"
STATISTICS : "共計 [POST_COUNT] 篇文章,[PAGE_COUNT] 頁。"
LICENSE_ANNOUNCE : "本文遵守 [LICENSE] 許可協議。"
POST_ON_GITHUB : "在 Github 上修改"
FOLLOW_ME : "在 [NAME] 上關注我。"
FOLLOW_US : "在 [NAME] 上關注我們。"
EMAIL_ME : "給我發郵件。"
EMAIL_US : "給我們發郵件。"
COPYRIGHT_DATES : "2019"
zh-TW:
<<: *ZH_HANT
zh-HK:
<<: *ZH_HANT
## => Korean
########################
ko: &KO
SUBSCRIBE : "구독하기"
READMORE : "더보기"
SEARCH : "검색"
CANCEL : "취소"
VIEWS : "조회"
LAST_UPDATED : "마지막 수정"
PREVIOUS : "이전"
NEXT : "다음"
ARTICLE_DATE_FORMAT : "%Y년 %m월 %d일"
ARTICLE_LIST_DATE_FORMAT: "%m월 %d일"
STATISTICS : "전체 글 [POST_COUNT]개, [PAGE_COUNT] 페이지"
LICENSE_ANNOUNCE : "이 글의 저작권은 [LICENSE] 라이센스를 따릅니다."
POST_ON_GITHUB : "Github에서 확인하기"
FOLLOW_ME : "[NAME]에서 팔로우하기"
FOLLOW_US : "[NAME]에서 팔로우하기"
EMAIL_ME : "이메일 보내기"
EMAIL_US : "이메일 보내기"
COPYRIGHT_DATES : "2019"
ko-KR:
<<: *KO

77
docs/_data/navigation.yml Normal file
View File

@ -0,0 +1,77 @@
header:
- title: Javadoc
url: doc/reference/
- title: GitHub
url: https://github.com/google/ExoPlayer
- title: Blog
url: https://medium.com/google-exoplayer
en:
- title:
children:
- title: Home
url: index.html
- title: Pros and cons
url: pros-and-cons.html
- title: Demo application
url: demo-application.html
- title: Supported formats
url: supported-formats.html
- title: Supported devices
url: supported-devices.html
- title: Glossary
url: glossary.html
- title: Getting started
children:
- title: Hello world
url: hello-world.html
- title: Player events
url: listening-to-player-events.html
- title: Playlists
url: playlists.html
- title: Media items
url: media-items.html
- title: Media sources
url: media-sources.html
- title: Track selection
url: track-selection.html
- title: UI components
url: ui-components.html
- title: Downloading media
url: downloading-media.html
- title: Ad insertion
url: ad-insertion.html
- title: Live streaming
url: live-streaming.html
- title: Debug logging
url: debug-logging.html
- title: Analytics
url: analytics.html
- title: Media types
children:
- title: DASH
url: dash.html
- title: HLS
url: hls.html
- title: SmoothStreaming
url: smoothstreaming.html
- title: Progressive
url: progressive.html
- title: Advanced topics
children:
- title: Digital rights management
url: drm.html
- title: Troubleshooting
url: troubleshooting.html
- title: Customization
url: customization.html
- title: Transforming media
url: transforming-media.html
- title: Battery consumption
url: battery-consumption.html
- title: APK shrinking
url: shrinking.html
- title: OEM testing
url: oems.html
- title: Design documents
url: design-documents.html

64
docs/_data/variables.yml Normal file
View File

@ -0,0 +1,64 @@
default:
text_skin: default
highlight_theme: default
lang: en
paths:
root: /
home: /
archive: /archive.html
rss: /feed.xml
mathjax: false
mathjax_autoNumber: false
mermaid: false
chart: false
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'
jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js'
leancloud_js_sdk: '//cdn1.lncld.net/static/js/3.4.1/av-min.js'
chart: 'https://cdn.bootcss.com/Chart.js/2.7.2/Chart.bundle.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
mathjax: 'https://cdn.bootcss.com/mathjax/2.7.4/MathJax.js?config=TeX-MML-AM_CHTML'
mermaid: 'https://cdn.bootcss.com/mermaid/8.0.0-rc.8/mermaid.min.js'
unpkg:
font_awesome: 'https://use.fontawesome.com/releases/v5.0.13/css/all.css'
jquery: 'https://unpkg.com/jquery@3.3.1/dist/jquery.min.js'
leancloud_js_sdk: '//cdn1.lncld.net/static/js/3.4.1/av-min.js'
chart: 'https://unpkg.com/chart.js@2.7.2/dist/Chart.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'
mathjax: 'https://unpkg.com/mathjax@2.7.4/unpacked/MathJax.js?config=TeX-MML-AM_CHTML'
mermaid: 'https://unpkg.com/mermaid@8.0.0-rc.8/dist/mermaid.min.js'

BIN
docs/_includes/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,3 @@
<!-- start custom analytics snippet -->
<!-- end custom analytics snippet -->

View File

@ -0,0 +1,14 @@
{%- if site.analytics.google.tracking_id -%}
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id={{ site.analytics.google.tracking_id }}"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '{{ site.analytics.google.tracking_id }}');
{% if site.analytics.google.anonymize_ip == true %}
gtag('config', '{{ site.analytics.google.tracking_id }}', { 'anonymize_ip': true });
{% endif %}
</script>
{%- endif -%}

View File

@ -0,0 +1,7 @@
{%- if jekyll.environment != 'development' -%}
{%- if site.analytics.provider == 'google' -%}
{%- include analytics-providers/google.html -%}
{%- elsif site.analytics.provider == 'custom' -%}
{%- include analytics-providers/custom.html -%}
{%- endif -%}
{%- endif -%}

View File

@ -0,0 +1,55 @@
{%- 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 -%}
{%- if _show_subscribe -%}
<div class="article__subscribe">{%- include article/footer/subscribe.html -%}</div>
{%- 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 -%}
<div class="article__license">{%- include article/footer/license.html license=_license_data -%}</div>
{%- endif -%}
</footer>

View 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>{{ _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">&nbsp;</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 -%}

View File

@ -0,0 +1,96 @@
{%- 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.date -%}
{%- 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>
{%- include snippets/get-locale-string.html key='ARTICLE_DATE_FORMAT' -%}
<i class="far fa-calendar-alt"></i> <span>{{ include.article.date | date: __return }}</span>
</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.date -%}
<meta itemprop="datePublished" content="{{ include.article.date | date_to_xmlschema }}">
{%- endif -%}
{%- if include.article.tags[0] -%}
{%- assign _keywords = include.article.tags | join: ',' %}
<meta itemprop="keywords" content="{{ _keywords }}">
{%- endif -%}
{%- endif -%}

View File

@ -0,0 +1,144 @@
{%- 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 -%}
{%- if include.group_by == 'year' -%}
{%- assign _sorted_list = _sorted_list | sort: 'date' -%}
{%- endif -%}
{%- if include.reverse -%}
{%- assign _sorted_list = _sorted_list | reverse -%}
{%- endif -%}
{%- 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 gird--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">
{%- else -%}
<article class="item">
{%- 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.date | 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 -%}
{%- include snippets/get-locale-string.html key='ARTICLE_LIST_DATE_FORMAT' -%}
<li class="item" itemscope itemtype="http://schema.org/BlogPosting" data-tags="{{ _tags }}">
<div class="item__content">
{%- if include.show_info -%}
<span class="item__meta">{{ _article.date | date: __return }}</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>

View 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 -%}

View 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>

View File

@ -0,0 +1,3 @@
<!-- start custom article footer snippet -->
<!-- end custom article footer snippet -->

View File

@ -0,0 +1,14 @@
{%- include snippets/get-locale-string.html key='LICENSE_ANNOUNCE' -%}
{%- assign _license_announce = __return -%}
{%- if include.license -%}
{%-assign _license_name = '<a itemprop="license" rel="license" href="[URL]">[NAME]</a>' | replace: "[URL]", include.license.url | replace: "[NAME]", include.license.name -%}
<div class="license">
<p>{{ _license_announce | replace: "[LICENSE]", _license_name }}
<a rel="license" href="{{ include.license.url }}">
<img alt="{{ include.license.name }}" src="{{ include.license.image }}" />
</a>
</p>
</div>
{%- endif -%}

View File

@ -0,0 +1,6 @@
{%- 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 -%}
<div class="subscribe"><i class="fas fa-rss"></i> <a type="application/rss+xml" href="{{ _paths_rss }}">{{ _locale_nav_subscribe }}</a></div>

View File

@ -0,0 +1,3 @@
<!-- start custom article top snippet -->
<!-- end custom article top snippet -->

View File

@ -0,0 +1 @@
<div class="toc-aside js-toc-root"></div>

View File

@ -0,0 +1,120 @@
{%- assign _author = include.author -%}
<div class="author-links">
<ul class="menu menu--nowrap menu--inline">
{%- if _author.url -%}
<link itemprop="url" href="{{ _author.url }}">
{%- endif -%}
{%- if _author.type == 'organization' -%}
{%- include snippets/get-locale-string.html key='EMAIL_US' -%}
{%- assign _locale_string_email = __return -%}
{%- include snippets/get-locale-string.html key='FOLLOW_US' -%}
{%- assign _locale_string_follow = __return -%}
{%- else -%}
{%- include snippets/get-locale-string.html key='EMAIL_ME' -%}
{%- assign _locale_string_email = __return -%}
{%- include snippets/get-locale-string.html key='FOLLOW_ME' -%}
{%- assign _locale_string_follow = __return -%}
{%- endif -%}
{%- include snippets/get-locale-string.html key='EMAIL_ME' -%}
{%- if _author.email -%}
<li title="{{ _locale_string_email }}">
<a class="button button--circle mail-button" itemprop="email" href="mailto:{{ _author.email }}" target="_blank" rel="noopener noreferrer">
<i class="fas fa-envelope"></i>
</a>
{%- endif -%}
{%- if _author.facebook -%}
<li title="{{ _locale_string_follow | replace: '[NAME]', 'Facebook' }}">
<a class="button button--circle facebook-button" itemprop="sameAs" href="https://www.facebook.com/{{ _author.facebook }}" target="_blank" rel="noopener noreferrer">
<div class="icon">{%- include svg/icon/social/facebook.svg -%}</div>
</a>
</li>
{%- endif -%}
{%- if _author.twitter -%}
<li title="{{ _locale_string_follow | replace: '[NAME]', 'Twitter' }}">
<a class="button button--circle twitter-button" itemprop="sameAs" href="https://twitter.com/{{ _author.twitter }}" target="_blank" rel="noopener noreferrer">
<div class="icon">{%- include svg/icon/social/twitter.svg -%}</div>
</a>
</li>
{%- endif -%}
{%- if _author.weibo -%}
<li title="{{ _locale_string_follow | replace: '[NAME]', 'Weibo' }}">
<a class="button button--circle weibo-button" itemprop="sameAs" href="https://weibo.com/{{ _author.weibo }}" target="_blank" rel="noopener noreferrer">
<div class="icon">{%- include svg/icon/social/weibo.svg -%}</div>
</a>
</li>
{%- endif -%}
{%- if _author.googleplus -%}
<li title="{{ _locale_string_follow | replace: '[NAME]', 'Google+' }}">
<a class="button button--circle googlepluse-button" itemprop="sameAs" href="https://plus.google.com/u/0/{{ _author.googleplus }}" target="_blank" rel="noopener noreferrer">
<div class="icon">{%- include svg/icon/social/googleplus.svg -%}</div>
</a>
</li>
{%- endif -%}
{%- if _author.telegram -%}
<li title="{{ _locale_string_follow | replace: '[NAME]', 'Telegram' }}">
<a class="button button--circle telegram-button" itemprop="sameAs" href="https://t.me/{{ _author.telegram }}" target="_blank" rel="noopener noreferrer">
<div class="icon">{%- include svg/icon/social/telegram.svg -%}</div>
</a>
</li>
{%- endif -%}
{%- if _author.medium -%}
<li title="{{ _locale_string_follow | replace: '[NAME]', 'Medium' }}">
<a class="button button--circle medium-button" itemprop="sameAs" href="https://medium.com/{{ _author.medium }}" target="_blank" rel="noopener noreferrer">
<div class="icon">{%- include svg/icon/social/medium.svg -%}</div>
</a>
</li>
{%- endif -%}
{%- if _author.zhihu -%}
<li title="{{ _locale_string_follow | replace: '[NAME]', 'Zhihu' }}">
<a class="button button--circle zhihu-button" itemprop="sameAs" href="https://www.zhihu.com/people/{{ _author.zhihu }}" target="_blank" rel="noopener noreferrer">
<div class="icon">{%- include svg/icon/social/zhihu.svg -%}</div>
</a>
</li>
{%- endif -%}
{%- if _author.douban -%}
<li title="{{ _locale_string_follow | replace: '[NAME]', 'Douban' }}">
<a class="button button--circle douban-button" itemprop="sameAs" href="https://www.douban.com/people/{{ _author.douban }}" target="_blank" rel="noopener noreferrer">
<div class="icon">{%- include svg/icon/social/douban.svg -%}</div>
</a>
</li>
{%- endif -%}
{%- if _author.linkedin -%}
<li title="{{ _locale_string_follow | replace: '[NAME]', 'Linkedin' }}">
<a class="button button--circle linkedin-button" itemprop="sameAs" href="https://www.linkedin.com/in/{{ _author.linkedin }}" target="_blank" rel="noopener noreferrer">
<div class="icon">{%- include svg/icon/social/linkedin.svg -%}</div>
</a>
</li>
{%- endif -%}
{%- if _author.github -%}
<li title="{{ _locale_string_follow | replace: '[NAME]', 'Github' }}">
<a class="button button--circle github-button" itemprop="sameAs" href="https://github.com/{{ _author.github }}" target="_blank" rel="noopener noreferrer">
<div class="icon">{%- include svg/icon/social/github.svg -%}</div>
</a>
</li>
{%- endif -%}
{%- if _author.npm -%}
<li title="{{ _locale_string_follow | replace: '[NAME]', 'npm' }}">
<a class="button button--circle npm-button" itemprop="sameAs" href="https://www.npmjs.com/~{{ _author.npm }}" target="_blank" rel="noopener noreferrer">
<div class="icon">{%- include svg/icon/social/npm.svg -%}</div>
</a>
</li>
{%- endif -%}
</ul>
</div>

View File

@ -0,0 +1,3 @@
<!-- start custom comments snippet -->
<!-- end custom comments snippet -->

View File

@ -0,0 +1,22 @@
{%- if page.key and
site.comments.disqus.shortname -%}
<div id="disqus_thread"></div>
<script>
/**
* RECOMMENDED CONFIGURATION VARIABLES: EDIT AND UNCOMMENT THE SECTION BELOW TO INSERT DYNAMIC VALUES FROM YOUR PLATFORM OR CMS.
* LEARN WHY DEFINING THESE VARIABLES IS IMPORTANT: https://disqus.com/admin/universalcode/#configuration-variables*/
var disqus_config = function () {
this.page.url = '{%- include snippets/page-url.html -%}';
this.page.identifier = '{{ page.key }}';
};
(function() { // DON'T EDIT BELOW THIS LINE
var d = document, s = d.createElement('script');
s.src = 'https://{{ site.comments.disqus.shortname }}.disqus.com/embed.js';
s.setAttribute('data-timestamp', +new Date());
(d.head || d.body).appendChild(s);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
{%- endif -%}

View File

@ -0,0 +1,39 @@
{%- if page.key and
site.comments.gitalk.clientID and
site.comments.gitalk.clientSecret and
site.comments.gitalk.repository and
site.comments.gitalk.owner and
site.comments.gitalk.admin -%}
<!-- fix text color in the input textarea of gitalk -->
<style type="text/css">
.gitalk-wrapper .gt-header-textarea {
color: #333 !important;
}
</style>
{%- include snippets/get-sources.html -%}
{%- assign _sources = __return -%}
<div class="gitalk-wrapper" id="js-gitalk-container"></div>
{%- assign _admin = '' -%}
{%- for _admin_id in site.comments.gitalk.admin -%}
{%- assign _admin = _admin | append: ", '" | append: _admin_id | append: "'" -%}
{%- endfor -%}
{%- assign _last = _admin | size | minus: 1 -%}
{%- assign _admin = _admin | slice: 2, _last -%}
<script>
window.Lazyload.css('{{ _sources.gitalk.css }}');
window.Lazyload.js('{{ _sources.gitalk.js }}', function() {
var gitalk = new Gitalk({
clientID: '{{ site.comments.gitalk.clientID }}',
clientSecret: '{{ site.comments.gitalk.clientSecret }}',
repo: '{{ site.comments.gitalk.repository }}',
owner: '{{ site.comments.gitalk.owner }}',
admin: [{{ _admin }}],
id: '{{ page.key }}'
});
gitalk.render('js-gitalk-container');
});
</script>
{%- endif -%}

View File

@ -0,0 +1,33 @@
{%- include snippets/get-sources.html -%}
{%- assign _sources = __return -%}
{%- assign _VALINE_APP_ID = site.comments.valine.app_id -%}
{%- assign _VALINE_APP_KEY = site.comments.valine.app_key -%}
{%- assign _VALINE_PLACEHOLDER = site.comments.valine.placeholder -%}
{%- if page.key and
_VALINE_APP_ID and
_VALINE_APP_KEY -%}
<div id="vcomments"></div>
<script>
window.Lazyload.js(['{{ _sources.leancloud_js_sdk}}', '{{ _sources.valine }}'], function() {
var _config = {
el: '#vcomments',
appId: '{{ _VALINE_APP_ID }}',
appKey: '{{ _VALINE_APP_KEY }}',
verify: true,
};
{%- if _VALINE_PLACEHOLDER -%}
_config.placeholder = '{{ _VALINE_PLACEHOLDER }}';
{%- endif -%}
{%- assign _page_lang_slice = page.lang | slice: 0, 2 -%}
{%- if _page_lang_slice != 'zh' -%}
_config.lang = 'en';
{%- endif -%}
new Valine(_config);
});
</script>
{%- endif -%}

View File

@ -0,0 +1,11 @@
{%- if jekyll.environment != 'development' -%}
{%- if site.comments.provider == 'disqus' -%}
{%- include comments-providers/disqus.html -%}
{%- elsif site.comments.provider == 'gitalk' -%}
{%- include comments-providers/gitalk.html -%}
{%- elsif site.comments.provider == 'valine' -%}
{%- include comments-providers/valine.html -%}
{%- elsif site.comments.provider == 'custom' -%}
{%- include comments-providers/custom.html -%}
{%- endif -%}
{%- endif -%}

View File

@ -0,0 +1,5 @@
<div class="extensions extensions--video">
<iframe src="//player.bilibili.com/player.html?aid={{ include.id }}&page=1"
frameborder="no" scrolling="no" allowfullscreen="true">
</iframe>
</div>

View File

@ -0,0 +1,4 @@
<div class="extensions extensions--demo">
<iframe src='//codepen.io/{{ include.user }}/embed/{{ include.hash }}/?theme-id=0&default-tab={{ include.default_tab | default: result }}'
frameborder="0" scrolling="no" allowfullscreen></iframe>
</div>

View File

@ -0,0 +1,4 @@
<iframe class="extensions extensions--audio" width="330" height="86"
src="//music.163.com/outchain/player?type=2&id={{ include.id }}&auto=1&height=66"
frameborder="no" border="0" marginwidth="0" marginheight="0">
</iframe>

View File

@ -0,0 +1,6 @@
<div class="extensions extensions--slide">
<iframe src="//www.slideshare.net/slideshow/embed_code/key/{{ include.id }}"
width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"
style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen>
</iframe>
</div>

View File

@ -0,0 +1,4 @@
<iframe class="extensions extensions--audio" width="100%" height="166"
src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/{{ include.id }}&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true"
scrolling="no" frameborder="no" allow="autoplay">
</iframe>

View File

@ -0,0 +1,5 @@
<div class="extensions extensions--video">
<iframe src="https://embed.ted.com/talks/{{ include.id }}"
frameborder="0" scrolling="no" allowfullscreen>
</iframe>
</div>

View File

@ -0,0 +1,4 @@
<div class="extensions extensions--video">
<iframe src="https://www.youtube.com/embed/{{ include.id }}?rel=0&showinfo=0"
frameborder="0" scrolling="no" allowfullscreen></iframe>
</div>

View File

@ -0,0 +1,15 @@
<figure>
<center>
<img src="{{ site.baseurl }}{{ include.url }}" alt="{{ include.caption }}"
{% if include.width %}
width="{{ include.width }}"
{% endif %}
{% if include.height %}
height="{{ include.height }}"
{% endif %}
/>
<figcaption>
<strong>Figure {{ include.index }}.</strong> {{ include.caption }}
</figcaption>
</center>
</figure>

View File

@ -0,0 +1,37 @@
<footer class="footer py-4 js-page-footer">
<div class="main">
{%- assign _site_author = site.author -%}
{%- if _site_author.type == 'organization' -%}
{%- assign _site_author_itemtype = 'http://schema.org/Organization' -%}
{%- else -%}
{%- assign _site_author_itemtype = 'http://schema.org/Person' -%}
{%- endif -%}
<div itemscope itemtype="{{ _site_author_itemtype }}">
<meta itemprop="name" content="{{ _site_author.name }}">
{%- assign _site_author_url = _site_author.url | default: '/'-%}
{%- include snippets/get-nav-url.html path=_site_author_url -%}
{%- assign _site_author_url = __return -%}
<meta itemprop="url" content="{{ _site_author_url }}">
{%- if _site_author.bio -%}
<meta itemprop="description" content="{{ _site_author.bio }}">
{%- endif -%}
<div class="footer__author-links">
{%- include author-links.html author=_site_author -%}
</div>
</div>
{%- include snippets/get-locale-string.html key='COPYRIGHT_DATES' -%}
{%- assign _locale_copyright_dates = __return -%}
<div class="site-info mt-2">
<div>
{%- include snippets/get-locale-string.html key='COPYRIGHT_DATES' -%}
{%- assign _locale_copyright_dates = __return -%}
© {{ site.title }} {{ _locale_copyright_dates }},
Powered by <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>.
</div>
</div>
</div>
</footer>

24
docs/_includes/head.html Normal file
View File

@ -0,0 +1,24 @@
<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 -%}
{%- 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 -%}

View File

@ -0,0 +1,7 @@
<!-- start custom head snippets -->
<style rel="stylesheet" type="text/css"/>
.gsc-result .gs-title {
line-height: 1.4em;
}
</style>
<!-- end custom head snippets -->

View File

@ -0,0 +1,26 @@
<!-- start favicons snippet, use https://realfavicongenerator.net/ -->
{%- include snippets/prepend-baseurl.html path='/assets/apple-touch-icon.png' -%}
<link rel="apple-touch-icon" sizes="180x180" href="{{ __return }}">
{%- include snippets/prepend-baseurl.html path='/assets/favicon-32x32.png' -%}
<link rel="icon" type="image/png" sizes="32x32" href="{{ __return }}">
{%- include snippets/prepend-baseurl.html path='/assets/favicon-16x16.png' -%}
<link rel="icon" type="image/png" sizes="16x16" href="{{ __return }}">
{%- include snippets/prepend-baseurl.html path='/assets/site.webmanifest' -%}
<link rel="manifest" href="{{ __return }}">
{%- include snippets/prepend-baseurl.html path='/assets/safari-pinned-tab.svg' -%}
<link rel="mask-icon" href="{{ __return }}" color="#fc4d50">
{%- include snippets/prepend-baseurl.html path='/assets/favicon.ico' -%}
<link rel="shortcut icon" href="{{ __return }}">
<meta name="msapplication-TileColor" content="#ffc40d">
{%- include snippets/prepend-baseurl.html path='/assets/browserconfig.xml' -%}
<meta name="msapplication-config" content="{{ __return }}">
<meta name="theme-color" content="#ffffff">
<!-- end favicons snippet -->

View File

@ -0,0 +1,46 @@
{%- 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>
{%- 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>
{%- elsif page.nav_key and _item.key -%}
<li class="navigation__item"><a href="{{ _nav_url }}">{%- if _item.title -%}{{ _item.title }}{%- else -%}{{ __return }}{%- endif -%}</a></li>
{%- else -%}
<li class="navigation__item"><a href="{{ _nav_url }}" target="_blank" rel="noopener noreferrer">{%- if _item.title -%}{{ _item.title }}{%- else -%}{{ __return }}{%- endif -%}</a></li>
{%- endif -%}
{%- endfor -%}
{%- 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>
{%- endif -%}
</ul>
</nav>
{%- endif -%}
</div>
</header>

View File

@ -0,0 +1,2 @@
**[Known issue #{{include.issue-id}}](https://github.com/google/ExoPlayer/issues/{{include.issue-id}})** - {{ include.description }}
{:.error}

View File

@ -0,0 +1,3 @@
<!-- start custom main bottom snippet -->
<!-- end custom main bottom snippet -->

View File

@ -0,0 +1,3 @@
<!-- start custom main top snippet -->
<!-- end custom main top snippet -->

View File

@ -0,0 +1,17 @@
{%- include snippets/assign.html target=site.data.variables.default.chart
source0=site.chart source1=page.chart -%}
{%- if __return == true -%}
{%- include markdown-enhancements/chart.html -%}
{%- endif -%}
{%- include snippets/assign.html target=site.data.variables.default.mathjax
source0=site.mathjax source1=page.mathjax -%}
{%- if __return == true -%}
{%- include markdown-enhancements/mathjax.html -%}
{%- endif -%}
{%- include snippets/assign.html target=site.data.variables.default.mermaid
source0=site.mermaid source1=page.mermaid -%}
{%- if __return == true -%}
{%- include markdown-enhancements/mermaid.html -%}
{%- endif -%}

View File

@ -0,0 +1,15 @@
{%- include snippets/get-sources.html -%}
{%- assign _sources = __return -%}
<script>
window.Lazyload.js(['{{ _sources.jquery }}', '{{ _sources.chart }}'], 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>

View File

@ -0,0 +1,17 @@
{%- include snippets/get-sources.html -%}
{%- assign _sources = __return -%}
{%- include snippets/assign.html target=site.data.variables.default.mathjax_autoNumber
source0=site.mathjax_autoNumber source1=page.mathjax_autoNumber -%}
{%- assign _mathjax_autoNumber = __return -%}
<script type="text/x-mathjax-config">
var _config = { tex2jax: {
inlineMath: [['$','$'], ['\\(','\\)']]
}};
{%- if _mathjax_autoNumber == true -%}
_config.TeX = { equationNumbers: { autoNumber: "all" } };
{%- endif -%}
MathJax.Hub.Config(_config);
</script>
<script type="text/javascript" src="{{ _sources.mathjax }}" async></script>

View File

@ -0,0 +1,10 @@
{%- include snippets/get-sources.html -%}
{%- assign _sources = __return -%}
<script>
window.Lazyload.js('{{ _sources.mermaid }}', function() {
mermaid.initialize({
startOnLoad: true
});
mermaid.init(undefined, '.language-mermaid');
});
</script>

View File

@ -0,0 +1,3 @@
<!-- start custom pageview snippet (for Home layout) -->
<!-- end custom pageview snippet (for Home layout) -->

View File

@ -0,0 +1,3 @@
<!-- start custom pageview snippet (for the post) -->
<!-- end custom pageview snippet (for the post) -->

View File

@ -0,0 +1,35 @@
{%- include snippets/get-sources.html -%}
{%- assign _sources = __return -%}
{%- assign _LEANCLOUD_APP_ID = site.pageview.leancloud.app_id -%}
{%- assign _LEANCLOUD_APP_KEY = site.pageview.leancloud.app_key -%}
{%- assign _LEANCLOUD_APP_CLASS = site.pageview.leancloud.app_class -%}
{%- if _LEANCLOUD_APP_ID and
_LEANCLOUD_APP_KEY and
_LEANCLOUD_APP_CLASS -%}
<script>
{%- include pageview-providers/leancloud/leancloud.js -%}
</script>
<script>
window.Lazyload.js(['{{ _sources.jquery }}', '{{ _sources.leancloud_js_sdk}}'], function() {
var pageview = window.pageview(AV, {
appId: '{{ _LEANCLOUD_APP_ID }}',
appKey: '{{ _LEANCLOUD_APP_KEY }}',
appClass: '{{ _LEANCLOUD_APP_CLASS }}'
});
$('.js-pageview').each(function() {
var $this = $(this);
var key = $this.attr('data-page-key');
pageview.get(key, function(view) {
$this.attr('itemprop', 'userInteractionCount').attr('content', view).text(view);
});
});
});
</script>
{%- endif -%}

View File

@ -0,0 +1,71 @@
(function() {
function errorHandler(error, callback) {
if (error) {
callback && callback(error);
throw error;
}
}
function pageview(_AV ,options) {
var AV = _AV;
var appId, appKey, appClass;
appId = options.appId;
appKey = options.appKey;
appClass = options.appClass;
AV.init({
appId: appId,
appKey: appKey
});
return {
get: get,
increase: increase
};
function searchKey(key) {
var query = new AV.Query(appClass);
query.equalTo('key', key);
return query.first();
}
function insert(key, title) {
var Blog = AV.Object.extend(appClass);
var blog = new Blog();
blog.set('title', title);
blog.set('key', key);
blog.set('views', 0);
return blog.save();
}
function increment(result) {
result.increment('views', 1);
return result.save(null, {
fetchWhenSave: true
});
}
function get(key, callback) {
searchKey(key).then(function(result) {
if (result) {
callback && callback(result.attributes.views);
}
}, errorHandler);
}
function increase(key, title, callback) {
searchKey(key).then(function(result) {
if (result) {
increment(result).then(function(result) {
callback && callback(result.attributes.views);
});
} else {
insert(key, title).then(function(result) {
increment(result).then(function(result) {
callback && callback(result.attributes.views);
});
}, errorHandler);
}
}, errorHandler);
}
}
window.pageview = pageview;
})();

View File

@ -0,0 +1,31 @@
{%- include snippets/get-sources.html -%}
{%- assign _sources = __return -%}
{%- assign _LEANCLOUD_APP_ID = site.pageview.leancloud.app_id -%}
{%- assign _LEANCLOUD_APP_KEY = site.pageview.leancloud.app_key -%}
{%- assign _LEANCLOUD_APP_CLASS = site.pageview.leancloud.app_class -%}
{%- if page.key and
_LEANCLOUD_APP_ID and
_LEANCLOUD_APP_KEY and
_LEANCLOUD_APP_CLASS -%}
<script>
{%- include pageview-providers/leancloud/leancloud.js -%}
</script>
<script>
window.Lazyload.js(['{{ _sources.jquery }}', '{{ _sources.leancloud_js_sdk}}'], function() {
var pageview = window.pageview(AV, {
appId: '{{ _LEANCLOUD_APP_ID }}',
appKey: '{{ _LEANCLOUD_APP_KEY }}',
appClass: '{{ _LEANCLOUD_APP_CLASS }}'
});
var key = '{{ page.key }}';
var title = window.decodeUrl('{{ page.title | url_encode }}');
pageview.increase(key, title, function(view) {
$("[data-page-key='{{ page.key }}']").text(view);
});
});
</script>
{%- endif -%}

View File

@ -0,0 +1,29 @@
{%- include snippets/assign.html target=site.data.variables.default.pageview source0=page.pageview -%}
{%- assign _pageview = __return -%}
{%- if page.layout == "home" -%}
{%- if jekyll.environment != "development" -%}
{%- if site.pageview.provider == 'leancloud' -%}
{%- include pageview-providers/leancloud/home.html -%}
{%- elsif site.pageview.provider == 'custom' -%}
{%- include pageview-providers/custom/home.html -%}
{%- endif -%}
{%- endif -%}
{%- elsif page.layout == "article" -%}
{%- if _pageview -%}
{%- if jekyll.environment != "development" and
jekyll.environment != "beta" -%}
{%- if site.pageview.provider == 'leancloud' -%}
{%- include pageview-providers/leancloud/post.html -%}
{%- elsif site.pageview.provider == 'custom' -%}
{%- include pageview-providers/custom/post.html -%}
{%- endif -%}
{%- endif -%}
{%- endif -%}
{%- endif -%}

View File

@ -0,0 +1,98 @@
{%- 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 -%}
</ul>
</div>
</div>
{%- endif -%}

View 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));
});
});
})();

View 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);
});
});
});
})();

View 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;
});
})();

View 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));
});
})();

View 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);
}
})();

View 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();
});
});
});
})();

View 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();
});
}
});
})();

View File

@ -0,0 +1,31 @@
(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
var $pageMask = $('.js-page-mask');
var $pageRoot = $('.js-page-root');
var $pageMain = $('.js-page-main');
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');
});
});
})();

View File

@ -0,0 +1,3 @@
/*(function () {
})();*/

View 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;
});
})();

View 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;
});
})();

View 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);
})();

View 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;
});
})();

View 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;
});
})();

View 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;
});
})();

View 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;
};
};
})();

View 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;
});
})();

View File

@ -0,0 +1,3 @@
/*(function () {
})();*/

View 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)));
}
};
};
})();

View File

@ -0,0 +1,43 @@
(function() {
window.isArray = function(val) {
return Object.prototype.toString.call(val) === '[object Array]';
};
window.isString = function(val) {
return typeof val === 'string';
};
window.decodeUrl = function(str) {
return str ? decodeURIComponent(str.replace(/\+/g, '%20')) : '';
};
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)));
}
};
})();
})();

View File

@ -0,0 +1,35 @@
{%- 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.4',
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 }}',
mathjax: '{{ _sources.mathjax }}',
mermaid: '{{ _sources.mermaid }}'
},
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>

View File

@ -0,0 +1,3 @@
<!-- start custom search snippet -->
<!-- end custom search snippet -->

View File

@ -0,0 +1,14 @@
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 | url_encode }}',
{%- include snippets/prepend-baseurl.html path=_article.url -%}
{%- assign _url = __return -%}
'url':'{{ _url | url_encode }}'}
{%- endfor -%}
]
{%- endfor -%}
};

View 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>

View File

@ -0,0 +1,127 @@
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 ? initData(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);
};
}
function initData(data) {
var _data = [], i, j, key, keys, cur;
keys = Object.keys(data);
for (i = 0; i < keys.length; i++) {
key = keys[i], _data[key] = [];
for (j = 0; j < data[key].length; j++) {
cur = data[key][j];
cur.title = window.decodeUrl(cur.title);
cur.url = window.decodeUrl(cur.url);
_data[key].push(cur);
}
}
return _data;
}
/// 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());
});
});

View File

@ -0,0 +1,21 @@
{%- if site.search.google.custom_search_engine_id -%}
<div class="search search--dark search--google-custom-search-engine">
<div class="main">
<div class="content js-gcse">
<!-- <gcse:search enableAutoComplete="true" gname="search-box"></gcse:search>
<gcse:searchresults-only gname="results"></gcse:searchresults-only> -->
</div>
</div>
</div>
<script>
var gcse = document.getElementsByClassName('js-gcse')[0];
var gcseSearch = document.createElement('gcse:search');
gcseSearch.setAttribute('enableAutoComplete', 'true');
gcseSearch.setAttribute('gname', 'search-box');
var gcseSearchresults = document.createElement('gcse:searchresults-only');
gcseSearchresults.setAttribute('gname', 'results');
gcse.appendChild(gcseSearch);
gcse.appendChild(gcseSearchresults);
</script>
<script>{%- include search-providers/google-custom-search-engine/search.js -%}</script>
{%- endif -%}

View File

@ -0,0 +1,33 @@
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
/* global google */
var search = (window.search || (window.search = {}));
var searchBox, searchInput, clearIcon, searchModal;
search.clear = function() {
searchBox && searchBox.clearAllResults();
};
search.onShow = function() {
searchInput && searchInput.focus();
};
search.onHide = function() {
searchInput && searchInput.blur();
};
window.__gcse = {
callback: function() {
searchBox = google.search.cse.element.getElement('search-box');
searchInput = document.getElementById('gsc-i-id1');
clearIcon = document.getElementById('gs_cb50');
searchModal = search.searchModal;
searchModal && searchModal.$el && searchModal.$el.on('click', function(e) {
(e.target === this || e.target === clearIcon || e.target.className === 'gs-title') && searchModal.hide();
});
}
};
var cx = '{{ site.search.google.custom_search_engine_id }}'; // Insert your own Custom Search Engine ID here
var gcse = document.createElement('script'); gcse.type = 'text/javascript'; gcse.async = true;
gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
'//cse.google.com/cse.js?cx=' + cx;
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(gcse, s);
});

View 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 -%}

View File

@ -0,0 +1,9 @@
<!-- Addthis BEGIN -->
{%- assign _SHARING_ADDTHIS_ID = site.sharing.addthis.id -%}
{%- if _SHARING_ADDTHIS_ID -%}
<script type="text/javascript"
src="//s7.addthis.com/js/300/addthis_widget.js#pubid={{ _SHARING_ADDTHIS_ID }}"></script>
<div class="addthis_inline_share_toolbox addthis_default_style"></div>
{%- endif -%}
<!-- Addthis END -->

View File

@ -0,0 +1,10 @@
<!-- AddToAny BEGIN -->
<div class="a2a_kit a2a_kit_size_32 a2a_default_style">
<a class="a2a_dd" href="https://www.addtoany.com/share"></a>
<a class="a2a_button_facebook"></a>
<a class="a2a_button_twitter"></a>
<a class="a2a_button_google_plus"></a>
<a class="a2a_button_linkedin"></a>
</div>
<script async src="https://static.addtoany.com/menu/page.js"></script>
<!-- AddToAny END -->

View File

@ -0,0 +1,3 @@
<!-- start custom sharing snippet -->
<!-- end custom sharing snippet -->

View File

@ -0,0 +1,7 @@
{%- if site.sharing.provider == 'addtoany' -%}
{%- include sharing-providers/addtoany.html -%}
{%- elsif site.sharing.provider == 'addthis' -%}
{%- include sharing-providers/addthis.html -%}
{%- elsif site.sharing.provider == 'custom' -%}
{%- include sharing-providers/custom.html -%}
{%- endif -%}

View 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 -%}

View 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 -%}

View 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 -%}

View 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 -%}

View 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 -%}

View 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 -%}

View File

@ -0,0 +1,2 @@
{%- assign _sources = site.sources | default: site.data.variables.default.sources -%}
{%- assign __return = site.data.variables.sources[_sources] -%}

View 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 -%}

View 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 -%}

View File

@ -0,0 +1,2 @@
{%- include snippets/prepend-baseurl.html path=page.url -%}
{{ __return | prepend: site.url }}

View 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 -%}

Some files were not shown because too many files have changed in this diff Show More