diff options
Diffstat (limited to '_includes')
106 files changed, 3037 insertions, 0 deletions
diff --git a/_includes/analytics-providers/custom.html b/_includes/analytics-providers/custom.html new file mode 100644 index 0000000..58448f7 --- /dev/null +++ b/_includes/analytics-providers/custom.html @@ -0,0 +1,3 @@ +<!-- start custom analytics snippet --> + +<!-- end custom analytics snippet --> diff --git a/_includes/analytics-providers/google.html b/_includes/analytics-providers/google.html new file mode 100644 index 0000000..5fbd17d --- /dev/null +++ b/_includes/analytics-providers/google.html @@ -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 -%} diff --git a/_includes/analytics.html b/_includes/analytics.html new file mode 100644 index 0000000..46ba91d --- /dev/null +++ b/_includes/analytics.html @@ -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 -%} diff --git a/_includes/article-footer.html b/_includes/article-footer.html new file mode 100644 index 0000000..33c3742 --- /dev/null +++ b/_includes/article-footer.html @@ -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> diff --git a/_includes/article-header.html b/_includes/article-header.html new file mode 100644 index 0000000..748b24c --- /dev/null +++ b/_includes/article-header.html @@ -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"> </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 -%} diff --git a/_includes/article-info.html b/_includes/article-info.html new file mode 100644 index 0000000..c97fac9 --- /dev/null +++ b/_includes/article-info.html @@ -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 -%} diff --git a/_includes/article-list.html b/_includes/article-list.html new file mode 100644 index 0000000..dfe0c85 --- /dev/null +++ b/_includes/article-list.html @@ -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 grid--sm grid--p-3"> + {%- else -%} + <div class="article-list grid grid--p-3"> + {%- endif -%} +{%- endif -%} + + {%- for _article in _sorted_list -%} + + {%- include snippets/prepend-baseurl.html path=_article.url -%} + {%- assign _article_url = __return -%} + + {%- if _article.cover -%} + {%- include snippets/get-nav-url.html path=_article.cover -%} + {%- assign _article_cover = __return -%} + {%- endif -%} + + {%- if include.type == 'item' -%} + {%- if include.article_type == 'BlogPosting' -%} + <article class="item" itemscope itemtype="http://schema.org/BlogPosting"> + {%- 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> diff --git a/_includes/article-section-navigator.html b/_includes/article-section-navigator.html new file mode 100644 index 0000000..a88aaf9 --- /dev/null +++ b/_includes/article-section-navigator.html @@ -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 -%} diff --git a/_includes/article/footer/author-profile.html b/_includes/article/footer/author-profile.html new file mode 100644 index 0000000..8b0d72d --- /dev/null +++ b/_includes/article/footer/author-profile.html @@ -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> diff --git a/_includes/article/footer/custom.html b/_includes/article/footer/custom.html new file mode 100644 index 0000000..edcd06d --- /dev/null +++ b/_includes/article/footer/custom.html @@ -0,0 +1,3 @@ +<!-- start custom article footer snippet --> + +<!-- end custom article footer snippet --> diff --git a/_includes/article/footer/license.html b/_includes/article/footer/license.html new file mode 100644 index 0000000..a2c1535 --- /dev/null +++ b/_includes/article/footer/license.html @@ -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 -%} diff --git a/_includes/article/footer/subscribe.html b/_includes/article/footer/subscribe.html new file mode 100644 index 0000000..cb9a169 --- /dev/null +++ b/_includes/article/footer/subscribe.html @@ -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> diff --git a/_includes/article/top/custom.html b/_includes/article/top/custom.html new file mode 100644 index 0000000..12f393d --- /dev/null +++ b/_includes/article/top/custom.html @@ -0,0 +1,3 @@ +<!-- start custom article top snippet --> + +<!-- end custom article top snippet --> diff --git a/_includes/aside/toc.html b/_includes/aside/toc.html new file mode 100644 index 0000000..1d19e6a --- /dev/null +++ b/_includes/aside/toc.html @@ -0,0 +1 @@ +<div class="toc-aside js-toc-root"></div> diff --git a/_includes/author-links.html b/_includes/author-links.html new file mode 100644 index 0000000..5ddc78a --- /dev/null +++ b/_includes/author-links.html @@ -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"> + <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"> + <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"> + <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"> + <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"> + <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"> + <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"> + <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"> + <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"> + <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"> + <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"> + <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"> + <div class="icon">{%- include svg/icon/social/npm.svg -%}</div> + </a> + </li> + {%- endif -%} + + </ul> +</div> diff --git a/_includes/comments-providers/custom.html b/_includes/comments-providers/custom.html new file mode 100644 index 0000000..600b9f7 --- /dev/null +++ b/_includes/comments-providers/custom.html @@ -0,0 +1,3 @@ +<!-- start custom comments snippet --> + +<!-- end custom comments snippet --> diff --git a/_includes/comments-providers/disqus.html b/_includes/comments-providers/disqus.html new file mode 100644 index 0000000..4022306 --- /dev/null +++ b/_includes/comments-providers/disqus.html @@ -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 -%} diff --git a/_includes/comments-providers/gitalk.html b/_includes/comments-providers/gitalk.html new file mode 100644 index 0000000..f7f5c67 --- /dev/null +++ b/_includes/comments-providers/gitalk.html @@ -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 -%} diff --git a/_includes/comments-providers/valine.html b/_includes/comments-providers/valine.html new file mode 100644 index 0000000..68a4274 --- /dev/null +++ b/_includes/comments-providers/valine.html @@ -0,0 +1,46 @@ +{%- 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 -%} +{%- assign _VALINE_VISITOR = site.comments.valine.visitor -%} +{%- assign _VALINE_META = site.comments.valine.meta -%} + + +{%- if _VALINE_APP_ID and + _VALINE_APP_KEY -%} + +<div id="vcomments"></div> + +{%- if _VALINE_VISITOR -%} +<span id="{{page.url}}" class="leancloud-visitors" data-flag-title={{page.title}}> +</span> +{%- endif -%} + +<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 -%} + {%- if _VALINE_VISITOR -%} + _config.visitor = 'true'; + {%- endif -%} + {%- if _VALINE_META -%} + _config.meta = {{ _VALINE_META}}; + {%- endif -%} + new Valine(_config); + }); +</script> + +{%- endif -%}
\ No newline at end of file diff --git a/_includes/comments.html b/_includes/comments.html new file mode 100644 index 0000000..8029395 --- /dev/null +++ b/_includes/comments.html @@ -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 -%} diff --git a/_includes/extensions/bilibili.html b/_includes/extensions/bilibili.html new file mode 100644 index 0000000..26f4fa4 --- /dev/null +++ b/_includes/extensions/bilibili.html @@ -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> diff --git a/_includes/extensions/codepen.html b/_includes/extensions/codepen.html new file mode 100644 index 0000000..2240dcf --- /dev/null +++ b/_includes/extensions/codepen.html @@ -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> diff --git a/_includes/extensions/netease-cloud-music.html b/_includes/extensions/netease-cloud-music.html new file mode 100644 index 0000000..be0b3b1 --- /dev/null +++ b/_includes/extensions/netease-cloud-music.html @@ -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> diff --git a/_includes/extensions/slideshare.html b/_includes/extensions/slideshare.html new file mode 100644 index 0000000..310806b --- /dev/null +++ b/_includes/extensions/slideshare.html @@ -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> diff --git a/_includes/extensions/soundcloud.html b/_includes/extensions/soundcloud.html new file mode 100644 index 0000000..b4e086b --- /dev/null +++ b/_includes/extensions/soundcloud.html @@ -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>
\ No newline at end of file diff --git a/_includes/extensions/ted.html b/_includes/extensions/ted.html new file mode 100644 index 0000000..1ffc9f4 --- /dev/null +++ b/_includes/extensions/ted.html @@ -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> diff --git a/_includes/extensions/youtube.html b/_includes/extensions/youtube.html new file mode 100644 index 0000000..6f9c2c8 --- /dev/null +++ b/_includes/extensions/youtube.html @@ -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> diff --git a/_includes/footer.html b/_includes/footer.html new file mode 100644 index 0000000..0a4eb29 --- /dev/null +++ b/_includes/footer.html @@ -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> diff --git a/_includes/head.html b/_includes/head.html new file mode 100644 index 0000000..35a3b19 --- /dev/null +++ b/_includes/head.html @@ -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 -%} diff --git a/_includes/head/custom.html b/_includes/head/custom.html new file mode 100644 index 0000000..33b1508 --- /dev/null +++ b/_includes/head/custom.html @@ -0,0 +1,3 @@ +<!-- start custom head snippets --> + +<!-- end custom head snippets --> diff --git a/_includes/header.html b/_includes/header.html new file mode 100644 index 0000000..c79d399 --- /dev/null +++ b/_includes/header.html @@ -0,0 +1,44 @@ +{%- 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> + {%- else -%} + <li class="navigation__item"><a href="{{ _nav_url }}">{%- 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> diff --git a/_includes/main/bottom/custom.html b/_includes/main/bottom/custom.html new file mode 100644 index 0000000..b19da2f --- /dev/null +++ b/_includes/main/bottom/custom.html @@ -0,0 +1,3 @@ +<!-- start custom main bottom snippet --> + +<!-- end custom main bottom snippet --> diff --git a/_includes/main/top/custom.html b/_includes/main/top/custom.html new file mode 100644 index 0000000..0bf5951 --- /dev/null +++ b/_includes/main/top/custom.html @@ -0,0 +1,3 @@ +<!-- start custom main top snippet --> + +<!-- end custom main top snippet --> diff --git a/_includes/markdown-enhancements.html b/_includes/markdown-enhancements.html new file mode 100644 index 0000000..fe701b4 --- /dev/null +++ b/_includes/markdown-enhancements.html @@ -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 -%} diff --git a/_includes/markdown-enhancements/chart.html b/_includes/markdown-enhancements/chart.html new file mode 100644 index 0000000..f1c476d --- /dev/null +++ b/_includes/markdown-enhancements/chart.html @@ -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> diff --git a/_includes/markdown-enhancements/mathjax.html b/_includes/markdown-enhancements/mathjax.html new file mode 100644 index 0000000..9500faa --- /dev/null +++ b/_includes/markdown-enhancements/mathjax.html @@ -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> diff --git a/_includes/markdown-enhancements/mermaid.html b/_includes/markdown-enhancements/mermaid.html new file mode 100644 index 0000000..64e4dac --- /dev/null +++ b/_includes/markdown-enhancements/mermaid.html @@ -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> diff --git a/_includes/pageview-providers/custom/home.html b/_includes/pageview-providers/custom/home.html new file mode 100644 index 0000000..7fabc80 --- /dev/null +++ b/_includes/pageview-providers/custom/home.html @@ -0,0 +1,3 @@ +<!-- start custom pageview snippet (for Home layout) --> + +<!-- end custom pageview snippet (for Home layout) --> diff --git a/_includes/pageview-providers/custom/post.html b/_includes/pageview-providers/custom/post.html new file mode 100644 index 0000000..c9d0f04 --- /dev/null +++ b/_includes/pageview-providers/custom/post.html @@ -0,0 +1,3 @@ +<!-- start custom pageview snippet (for the post) --> + +<!-- end custom pageview snippet (for the post) -->
\ No newline at end of file diff --git a/_includes/pageview-providers/leancloud/home.html b/_includes/pageview-providers/leancloud/home.html new file mode 100644 index 0000000..5dc99b7 --- /dev/null +++ b/_includes/pageview-providers/leancloud/home.html @@ -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 -%} + + + diff --git a/_includes/pageview-providers/leancloud/leancloud.js b/_includes/pageview-providers/leancloud/leancloud.js new file mode 100644 index 0000000..32e3ba8 --- /dev/null +++ b/_includes/pageview-providers/leancloud/leancloud.js @@ -0,0 +1,72 @@ +(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({ + serverURLs: 'https://avoscloud.com', + 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; +})(); diff --git a/_includes/pageview-providers/leancloud/post.html b/_includes/pageview-providers/leancloud/post.html new file mode 100644 index 0000000..ebd7510 --- /dev/null +++ b/_includes/pageview-providers/leancloud/post.html @@ -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 = {{ page.title | jsonify }}; + pageview.increase(key, title, function(view) { + $("[data-page-key='{{ page.key }}']").text(view); + }); + }); + </script> + +{%- endif -%}
\ No newline at end of file diff --git a/_includes/pageview.html b/_includes/pageview.html new file mode 100644 index 0000000..bb31b15 --- /dev/null +++ b/_includes/pageview.html @@ -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 -%} diff --git a/_includes/paginator.html b/_includes/paginator.html new file mode 100644 index 0000000..5956481 --- /dev/null +++ b/_includes/paginator.html @@ -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 -%} diff --git a/_includes/scripts/archieve.js b/_includes/scripts/archieve.js new file mode 100644 index 0000000..96549b5 --- /dev/null +++ b/_includes/scripts/archieve.js @@ -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)); + }); + + }); +})(); diff --git a/_includes/scripts/article.js b/_includes/scripts/article.js new file mode 100644 index 0000000..9b18ef5 --- /dev/null +++ b/_includes/scripts/article.js @@ -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); + }); + }); + }); +})(); diff --git a/_includes/scripts/aside/affix.js b/_includes/scripts/aside/affix.js new file mode 100644 index 0000000..1db3b8e --- /dev/null +++ b/_includes/scripts/aside/affix.js @@ -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; + }); +})(); diff --git a/_includes/scripts/aside/toc.js b/_includes/scripts/aside/toc.js new file mode 100644 index 0000000..a19ea95 --- /dev/null +++ b/_includes/scripts/aside/toc.js @@ -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)); + + }); +})(); diff --git a/_includes/scripts/common.js b/_includes/scripts/common.js new file mode 100644 index 0000000..09400a2 --- /dev/null +++ b/_includes/scripts/common.js @@ -0,0 +1,7 @@ +(function () { + var $root = document.getElementsByClassName('root')[0]; + if (window.hasEvent('touchstart')) { + $root.dataset.isTouch = true; + document.addEventListener('touchstart', function(){}, false); + } +})(); diff --git a/_includes/scripts/components/lightbox.js b/_includes/scripts/components/lightbox.js new file mode 100644 index 0000000..51689c2 --- /dev/null +++ b/_includes/scripts/components/lightbox.js @@ -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(); + }); + }); + }); +})(); diff --git a/_includes/scripts/components/search.js b/_includes/scripts/components/search.js new file mode 100644 index 0000000..e1c8c27 --- /dev/null +++ b/_includes/scripts/components/search.js @@ -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(); + }); + } + }); +})(); diff --git a/_includes/scripts/components/sidebar.js b/_includes/scripts/components/sidebar.js new file mode 100644 index 0000000..92c5591 --- /dev/null +++ b/_includes/scripts/components/sidebar.js @@ -0,0 +1,30 @@ +(function() { + var SOURCES = window.TEXT_VARIABLES.sources; + + window.Lazyload.js(SOURCES.jquery, function() { + var $pageMask = $('.js-page-mask'); + var $pageRoot = $('.js-page-root'); + var $sidebarShow = $('.js-sidebar-show'); + var $sidebarHide = $('.js-sidebar-hide'); + + function freeze(e) { + if (e.target === $pageMask[0]) { + e.preventDefault(); + } + } + function stopBodyScrolling(bool) { + if (bool === true) { + window.addEventListener('touchmove', freeze, { passive: false }); + } else { + window.removeEventListener('touchmove', freeze, { passive: false }); + } + } + + $sidebarShow.on('click', function() { + stopBodyScrolling(true); $pageRoot.addClass('show-sidebar'); + }); + $sidebarHide.on('click', function() { + stopBodyScrolling(false); $pageRoot.removeClass('show-sidebar'); + }); + }); +})(); diff --git a/_includes/scripts/home.js b/_includes/scripts/home.js new file mode 100644 index 0000000..91d05b9 --- /dev/null +++ b/_includes/scripts/home.js @@ -0,0 +1,3 @@ +/*(function () { + +})();*/ diff --git a/_includes/scripts/lib/affix.js b/_includes/scripts/lib/affix.js new file mode 100644 index 0000000..779442f --- /dev/null +++ b/_includes/scripts/lib/affix.js @@ -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; + }); +})(); diff --git a/_includes/scripts/lib/gallery.js b/_includes/scripts/lib/gallery.js new file mode 100644 index 0000000..1793f04 --- /dev/null +++ b/_includes/scripts/lib/gallery.js @@ -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; + }); +})();
\ No newline at end of file diff --git a/_includes/scripts/lib/lazyload.js b/_includes/scripts/lib/lazyload.js new file mode 100644 index 0000000..9911535 --- /dev/null +++ b/_includes/scripts/lib/lazyload.js @@ -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); +})(); diff --git a/_includes/scripts/lib/modal.js b/_includes/scripts/lib/modal.js new file mode 100644 index 0000000..cb5d188 --- /dev/null +++ b/_includes/scripts/lib/modal.js @@ -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; + }); +})(); diff --git a/_includes/scripts/lib/scroll-to.js b/_includes/scripts/lib/scroll-to.js new file mode 100644 index 0000000..e5a0ea2 --- /dev/null +++ b/_includes/scripts/lib/scroll-to.js @@ -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; + }); +})(); diff --git a/_includes/scripts/lib/swiper.js b/_includes/scripts/lib/swiper.js new file mode 100644 index 0000000..3d06419 --- /dev/null +++ b/_includes/scripts/lib/swiper.js @@ -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; + }); +})(); diff --git a/_includes/scripts/lib/throttle.js b/_includes/scripts/lib/throttle.js new file mode 100644 index 0000000..2add23c --- /dev/null +++ b/_includes/scripts/lib/throttle.js @@ -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; + }; + }; +})(); diff --git a/_includes/scripts/lib/toc.js b/_includes/scripts/lib/toc.js new file mode 100644 index 0000000..fb43857 --- /dev/null +++ b/_includes/scripts/lib/toc.js @@ -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; + }); +})(); diff --git a/_includes/scripts/page.js b/_includes/scripts/page.js new file mode 100644 index 0000000..91d05b9 --- /dev/null +++ b/_includes/scripts/page.js @@ -0,0 +1,3 @@ +/*(function () { + +})();*/ diff --git a/_includes/scripts/utils/imagesLoad.js b/_includes/scripts/utils/imagesLoad.js new file mode 100644 index 0000000..63a6bdf --- /dev/null +++ b/_includes/scripts/utils/imagesLoad.js @@ -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))); + } + }; + }; +})(); diff --git a/_includes/scripts/utils/utils.js b/_includes/scripts/utils/utils.js new file mode 100644 index 0000000..e7bce45 --- /dev/null +++ b/_includes/scripts/utils/utils.js @@ -0,0 +1,39 @@ +(function() { + window.isArray = function(val) { + return Object.prototype.toString.call(val) === '[object Array]'; + }; + window.isString = function(val) { + return typeof val === 'string'; + }; + + window.hasEvent = function(event) { + return 'on'.concat(event) in window.document; + }; + + window.isOverallScroller = function(node) { + return node === document.documentElement || node === document.body || node === window; + }; + + window.isFormElement = function(node) { + var tagName = node.tagName; + return tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA'; + }; + + window.pageLoad = (function () { + var loaded = false, cbs = []; + window.addEventListener('load', function () { + var i; + loaded = true; + if (cbs.length > 0) { + for (i = 0; i < cbs.length; i++) { + cbs[i](); + } + } + }); + return { + then: function(cb) { + cb && (loaded ? cb() : (cbs.push(cb))); + } + }; + })(); +})(); diff --git a/_includes/scripts/variables.html b/_includes/scripts/variables.html new file mode 100644 index 0000000..5bd1770 --- /dev/null +++ b/_includes/scripts/variables.html @@ -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.6', + sources: { + font_awesome: '{{ _sources.font_awesome }}', + jquery: '{{ _sources.jquery }}', + leancloud_js_sdk: '{{ _sources.leancloud_js_sdk }}', + chart: '{{ _sources.chart }}', + gitalk: { + js: '{{ _sources.gitalk.js }}', + css: '{{ _sources.gitalk.css }}' + }, + valine: '{{ _sources.valine }}', + 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> diff --git a/_includes/search-providers/custom/search.html b/_includes/search-providers/custom/search.html new file mode 100644 index 0000000..1d7eba3 --- /dev/null +++ b/_includes/search-providers/custom/search.html @@ -0,0 +1,3 @@ +<!-- start custom search snippet --> + +<!-- end custom search snippet --> diff --git a/_includes/search-providers/default/search-data.js b/_includes/search-providers/default/search-data.js new file mode 100644 index 0000000..f20e0c5 --- /dev/null +++ b/_includes/search-providers/default/search-data.js @@ -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 | jsonify }}, + {%- include snippets/prepend-baseurl.html path=_article.url -%} + {%- assign _url = __return -%} + 'url':{{ _url | jsonify }}} + {%- endfor -%} + ] + {%- endfor -%} +}; diff --git a/_includes/search-providers/default/search.html b/_includes/search-providers/default/search.html new file mode 100644 index 0000000..a21512c --- /dev/null +++ b/_includes/search-providers/default/search.html @@ -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> diff --git a/_includes/search-providers/default/search.js b/_includes/search-providers/default/search.js new file mode 100644 index 0000000..bf69c28 --- /dev/null +++ b/_includes/search-providers/default/search.js @@ -0,0 +1,112 @@ +var SOURCES = window.TEXT_VARIABLES.sources; +var PAHTS = window.TEXT_VARIABLES.paths; +window.Lazyload.js([SOURCES.jquery, PAHTS.search_js], function() { + var search = (window.search || (window.search = {})); + var searchData = window.TEXT_SEARCH_DATA || {}; + + function memorize(f) { + var cache = {}; + return function () { + var key = Array.prototype.join.call(arguments, ','); + if (key in cache) return cache[key]; + else return cache[key] = f.apply(this, arguments); + }; + } + + /// search + function searchByQuery(query) { + var i, j, key, keys, cur, _title, result = {}; + keys = Object.keys(searchData); + for (i = 0; i < keys.length; i++) { + key = keys[i]; + for (j = 0; j < searchData[key].length; j++) { + cur = searchData[key][j], _title = cur.title; + if ((result[key] === undefined || result[key] && result[key].length < 4 ) + && _title.toLowerCase().indexOf(query.toLowerCase()) >= 0) { + if (result[key] === undefined) { + result[key] = []; + } + result[key].push(cur); + } + } + } + return result; + } + + var renderHeader = memorize(function(header) { + return $('<p class="search-result__header">' + header + '</p>'); + }); + + var renderItem = function(index, title, url) { + return $('<li class="search-result__item" data-index="' + index + '"><a class="button" href="' + url + '">' + title + '</a></li>'); + }; + + function render(data) { + if (!data) { return null; } + var $root = $('<ul></ul>'), i, j, key, keys, cur, itemIndex = 0; + keys = Object.keys(data); + for (i = 0; i < keys.length; i++) { + key = keys[i]; + $root.append(renderHeader(key)); + for (j = 0; j < data[key].length; j++) { + cur = data[key][j]; + $root.append(renderItem(itemIndex++, cur.title, cur.url)); + } + } + return $root; + } + + // search box + var $result = $('.js-search-result'), $resultItems; + var lastActiveIndex, activeIndex; + + function clear() { + $result.html(null); + $resultItems = $('.search-result__item'); activeIndex = 0; + } + function onInputNotEmpty(val) { + $result.html(render(searchByQuery(val))); + $resultItems = $('.search-result__item'); activeIndex = 0; + $resultItems.eq(0).addClass('active'); + } + + search.clear = clear; + search.onInputNotEmpty = onInputNotEmpty; + + function updateResultItems() { + lastActiveIndex >= 0 && $resultItems.eq(lastActiveIndex).removeClass('active'); + activeIndex >= 0 && $resultItems.eq(activeIndex).addClass('active'); + } + + function moveActiveIndex(direction) { + var itemsCount = $resultItems ? $resultItems.length : 0; + if (itemsCount > 1) { + lastActiveIndex = activeIndex; + if (direction === 'up') { + activeIndex = (activeIndex - 1 + itemsCount) % itemsCount; + } else if (direction === 'down') { + activeIndex = (activeIndex + 1 + itemsCount) % itemsCount; + } + updateResultItems(); + } + } + + // Char Code: 13 Enter, 37 ⬅, 38 ⬆, 39 ➡, 40 ⬇ + $(window).on('keyup', function(e) { + var modalVisible = search.getModalVisible && search.getModalVisible(); + if (modalVisible) { + if (e.which === 38) { + modalVisible && moveActiveIndex('up'); + } else if (e.which === 40) { + modalVisible && moveActiveIndex('down'); + } else if (e.which === 13) { + modalVisible && $resultItems && activeIndex >= 0 && $resultItems.eq(activeIndex).children('a')[0].click(); + } + } + }); + + $result.on('mouseover', '.search-result__item > a', function() { + var itemIndex = $(this).parent().data('index'); + itemIndex >= 0 && (lastActiveIndex = activeIndex, activeIndex = itemIndex, updateResultItems()); + }); +}); diff --git a/_includes/search-providers/google-custom-search-engine/search.html b/_includes/search-providers/google-custom-search-engine/search.html new file mode 100644 index 0000000..cf132ab --- /dev/null +++ b/_includes/search-providers/google-custom-search-engine/search.html @@ -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 -%} diff --git a/_includes/search-providers/google-custom-search-engine/search.js b/_includes/search-providers/google-custom-search-engine/search.js new file mode 100644 index 0000000..09e5273 --- /dev/null +++ b/_includes/search-providers/google-custom-search-engine/search.js @@ -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); +}); diff --git a/_includes/search.html b/_includes/search.html new file mode 100644 index 0000000..680dd35 --- /dev/null +++ b/_includes/search.html @@ -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 -%} diff --git a/_includes/sharing-providers/addthis.html b/_includes/sharing-providers/addthis.html new file mode 100644 index 0000000..f2364d3 --- /dev/null +++ b/_includes/sharing-providers/addthis.html @@ -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 --> diff --git a/_includes/sharing-providers/addtoany.html b/_includes/sharing-providers/addtoany.html new file mode 100644 index 0000000..a433a1b --- /dev/null +++ b/_includes/sharing-providers/addtoany.html @@ -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 --> diff --git a/_includes/sharing-providers/custom.html b/_includes/sharing-providers/custom.html new file mode 100644 index 0000000..d2b17d2 --- /dev/null +++ b/_includes/sharing-providers/custom.html @@ -0,0 +1,3 @@ +<!-- start custom sharing snippet --> + +<!-- end custom sharing snippet --> diff --git a/_includes/sharing.html b/_includes/sharing.html new file mode 100644 index 0000000..f585346 --- /dev/null +++ b/_includes/sharing.html @@ -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 -%} diff --git a/_includes/sidebar/toc.html b/_includes/sidebar/toc.html new file mode 100644 index 0000000..4e3469e --- /dev/null +++ b/_includes/sidebar/toc.html @@ -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 -%}
\ No newline at end of file diff --git a/_includes/snippets/assign.html b/_includes/snippets/assign.html new file mode 100644 index 0000000..c2691f5 --- /dev/null +++ b/_includes/snippets/assign.html @@ -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 -%} diff --git a/_includes/snippets/get-article-title.html b/_includes/snippets/get-article-title.html new file mode 100644 index 0000000..395b793 --- /dev/null +++ b/_includes/snippets/get-article-title.html @@ -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 -%} diff --git a/_includes/snippets/get-lang.html b/_includes/snippets/get-lang.html new file mode 100644 index 0000000..028c52a --- /dev/null +++ b/_includes/snippets/get-lang.html @@ -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 -%} diff --git a/_includes/snippets/get-locale-string.html b/_includes/snippets/get-locale-string.html new file mode 100644 index 0000000..a7069ae --- /dev/null +++ b/_includes/snippets/get-locale-string.html @@ -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 -%} diff --git a/_includes/snippets/get-nav-url.html b/_includes/snippets/get-nav-url.html new file mode 100644 index 0000000..3b1b122 --- /dev/null +++ b/_includes/snippets/get-nav-url.html @@ -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 -%} diff --git a/_includes/snippets/get-sources.html b/_includes/snippets/get-sources.html new file mode 100644 index 0000000..0de1cb5 --- /dev/null +++ b/_includes/snippets/get-sources.html @@ -0,0 +1,2 @@ +{%- assign _sources = site.sources | default: site.data.variables.default.sources -%} +{%- assign __return = site.data.variables.sources[_sources] -%} diff --git a/_includes/snippets/get-string-from-locale-config.html b/_includes/snippets/get-string-from-locale-config.html new file mode 100644 index 0000000..03325fa --- /dev/null +++ b/_includes/snippets/get-string-from-locale-config.html @@ -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 -%} diff --git a/_includes/snippets/is_collection.html b/_includes/snippets/is_collection.html new file mode 100644 index 0000000..559a624 --- /dev/null +++ b/_includes/snippets/is_collection.html @@ -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 -%} diff --git a/_includes/snippets/page-url.html b/_includes/snippets/page-url.html new file mode 100644 index 0000000..3e9815d --- /dev/null +++ b/_includes/snippets/page-url.html @@ -0,0 +1,2 @@ +{%- include snippets/prepend-baseurl.html path=page.url -%} +{{ __return | prepend: site.url }}
\ No newline at end of file diff --git a/_includes/snippets/prepend-baseurl.html b/_includes/snippets/prepend-baseurl.html new file mode 100644 index 0000000..d5d24ef --- /dev/null +++ b/_includes/snippets/prepend-baseurl.html @@ -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 -%}
\ No newline at end of file diff --git a/_includes/snippets/prepend-path.html b/_includes/snippets/prepend-path.html new file mode 100644 index 0000000..5f6e904 --- /dev/null +++ b/_includes/snippets/prepend-path.html @@ -0,0 +1 @@ +{%- assign __return = include.path | prepend: '/' | prepend: include.prepend_path | replace:'///','/' | replace:'//','/' -%} diff --git a/_includes/svg/icon/social/behance.svg b/_includes/svg/icon/social/behance.svg new file mode 100644 index 0000000..bba499c --- /dev/null +++ b/_includes/svg/icon/social/behance.svg @@ -0,0 +1,3 @@ +<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <path d="M1056.000001 193.714286l-292 0 0 70.857143 292 0 0-70.857143zm-144 243.428571q-51.428571 0-83.428571 30t-35.428571 81.428571l233.142857 0q-10.285714-111.428571-114.285714-111.428571zm9.142857 334.285714q36 0 69.714286-18.285714t43.428571-49.714286l126.285714 0q-57.142857 175.428571-244 175.428571-122.285714 0-194.571429-75.428571t-72.285714-198.285714q0-118.857143 74.571429-197.428571t192.285714-78.571429q78.857143 0 137.428571 38.857143t87.428571 102.285714 28.857143 141.714286q0 9.714286-1.142857 26.857143l-376 0q0 63.428571 32.857143 98t95.142857 34.571429zm-762.857143-28.571429l169.142857 0q117.142857 0 117.142857-95.428571 0-102.857143-113.714286-102.857143l-172.571429 0 0 198.285714zm0-306.857143l160.571429 0q44.571429 0 70.571429-20.857143t26-64.857143q0-82.285714-108.571429-82.285714l-148.571429 0 0 168zm-158.285714-290.857143l339.428571 0q49.714286 0 88.571429 8t72.285714 27.142857 51.428571 55.142857 18 88q0 103.428571-98.285714 150.285714 65.142857 18.285714 98.285714 65.714286t33.142857 116.571429q0 42.857143-14 78t-37.714286 59.142857-56.285714 40.571429-69.142857 24-76.571429 7.428571l-349.142857 0 0-720z" /> +</svg> diff --git a/_includes/svg/icon/social/douban.svg b/_includes/svg/icon/social/douban.svg new file mode 100644 index 0000000..42a07d5 --- /dev/null +++ b/_includes/svg/icon/social/douban.svg @@ -0,0 +1,5 @@ +<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <path d="M161.431 147.172l699.701 0 0 78.813-699.701 0 0-78.814z" /> + <path d="M800.298 616.311l0-308.108-578.031 0 0 308.108 578.031 0zM306.076 386.961l411.23 0 0 150.633-411.23 0 0-150.633z" /> + <path d="M675.281 793.89c25.15-38.487 48.885-83.129 70.879-133.81l-84.107-30.649c-21.885 60.046-47.337 114.974-76.324 164.459l-146.332 0c-24.225-64.156-51.607-119.031-82.313-164.459l-77.357 30.649c31.9 47.851 57.651 92.383 77.357 133.81l-215.414 0 0 77.957 739.278 0 0-77.957-205.67 0z" /> +</svg> diff --git a/_includes/svg/icon/social/facebook.svg b/_includes/svg/icon/social/facebook.svg new file mode 100644 index 0000000..ba901bd --- /dev/null +++ b/_includes/svg/icon/social/facebook.svg @@ -0,0 +1,3 @@ +<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <path d="M767.428571 6.857143l0 150.857143-89.714286 0q-49.142857 0-66.285714 20.571429t-17.142857 61.714286l0 108 167.428571 0-22.285714 169.142857-145.142857 0 0 433.714286-174.857143 0 0-433.714286-145.714286 0 0-169.142857 145.714286 0 0-124.571429q0-106.285714 59.428571-164.857143t158.285714-58.571429q84 0 130.285714 6.857143z" /> +</svg> diff --git a/_includes/svg/icon/social/flicker.svg b/_includes/svg/icon/social/flicker.svg new file mode 100644 index 0000000..eaacc73 --- /dev/null +++ b/_includes/svg/icon/social/flicker.svg @@ -0,0 +1,5 @@ +<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <path d="M512 996.693333C245.76 996.693333 27.306667 778.24 27.306667 512 27.306667 245.76 245.76 27.306667 512 27.306667c266.24 0 484.693333 218.453333 484.693333 484.693333C996.693333 778.24 778.24 996.693333 512 996.693333zM512 78.506667C273.066667 78.506667 78.506667 273.066667 78.506667 512S273.066667 945.493333 512 945.493333 945.493333 750.933333 945.493333 512 750.933333 78.506667 512 78.506667z" /> + <path d="M655.36 512m-129.706667 0a3.8 3.8 0 1 0 259.413333 0 3.8 3.8 0 1 0-259.413333 0Z" /> + <path d="M368.64 512m-129.706667 0a3.8 3.8 0 1 0 259.413333 0 3.8 3.8 0 1 0-259.413333 0Z" /> +</svg> diff --git a/_includes/svg/icon/social/github.svg b/_includes/svg/icon/social/github.svg new file mode 100644 index 0000000..c5439a9 --- /dev/null +++ b/_includes/svg/icon/social/github.svg @@ -0,0 +1,3 @@ +<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <path class="svgpath" data-index="path_0" fill="#272636" d="M0 525.2c0 223.6 143.3 413.7 343 483.5 26.9 6.8 22.8-12.4 22.8-25.4l0-88.7c-155.3 18.2-161.5-84.6-172-101.7-21.1-36-70.8-45.2-56-62.3 35.4-18.2 71.4 4.6 113.1 66.3 30.2 44.7 89.1 37.2 119 29.7 6.5-26.9 20.5-50.9 39.7-69.6C248.8 728.2 181.7 630 181.7 513.2c0-56.6 18.7-108.7 55.3-150.7-23.3-69.3 2.2-128.5 5.6-137.3 66.5-6 135.5 47.6 140.9 51.8 37.8-10.2 80.9-15.6 129.1-15.6 48.5 0 91.8 5.6 129.8 15.9 12.9-9.8 77-55.8 138.8-50.2 3.3 8.8 28.2 66.7 6.3 135 37.1 42.1 56 94.6 56 151.4 0 117-67.5 215.3-228.8 243.7 26.9 26.6 43.6 63.4 43.6 104.2l0 128.8c0.9 10.3 0 20.5 17.2 20.5C878.1 942.4 1024 750.9 1024 525.3c0-282.9-229.3-512-512-512C229.1 13.2 0 242.3 0 525.2L0 525.2z" /> +</svg> diff --git a/_includes/svg/icon/social/googleplus.svg b/_includes/svg/icon/social/googleplus.svg new file mode 100644 index 0000000..69ab1e5 --- /dev/null +++ b/_includes/svg/icon/social/googleplus.svg @@ -0,0 +1,3 @@ +<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <path d="M621.31315 72.459289l-228.995461 0c-60.030212 0-135.601374 8.695033-198.98189 59.797921-47.839565 40.21184-71.180156 95.678106-71.180156 145.682987 0 84.786035 66.730821 170.671101 184.5369 170.671101 11.150968 0 23.341614-1.098008 35.619242-2.167363-5.574972 13.028735-11.122315 23.89113-11.122315 42.407855 0 33.68417 17.73799 54.338582 33.308617 73.894987-50.004881 3.264347-143.401014 8.695033-212.32785 50.005904-65.60416 38.046524-85.59547 93.483114-85.59547 132.624577 0 80.453357 77.794807 155.476027 239.019769 155.476027 191.20988 0 292.377-103.274108 292.377-205.451232 0-75.021647-44.402279-111.99984-93.367481-152.21168l-40.037878-30.447453c-12.219299-9.764388-28.887934-22.821775-28.887934-46.741557 0-23.890107 16.668635-39.142485 31.141254-53.269227 46.654576-35.879162 93.366458-73.925686 93.366458-154.37802 0-82.619696-53.357232-126.096906-78.951143-146.751319l68.926836 0L621.31315 72.459289zM523.497357 737.809909c0 67.367317-56.678884 117.373221-163.419953 117.373221-118.961392 0-195.687868-55.43659-195.687868-132.626623 0-77.18901 71.180156-103.274108 95.619778-111.969141 46.683229-15.223726 106.74107-17.419741 116.765377-17.419741 11.092639 0 16.638959 0 25.536606 1.098008C486.838436 652.994198 523.497357 682.316014 523.497357 737.809909zM434.608887 387.745045c-17.822924 17.36039-47.895847 30.447453-75.658144 30.447453-95.591125 0-138.980331-120.694873-138.980331-193.521528 0-28.281113 5.547343-57.631582 24.496927-80.453357 17.795295-21.75242 48.879244-35.879162 77.794807-35.879162 92.298126 0 140.078339 121.763205 140.078339 200.021569C462.341508 327.916425 460.116841 362.727255 434.608887 387.745045zM842.798567 238.016929 842.798567 127.57763l-55.464219 0 0 110.439298L676.402839 238.016929l0 55.234999 110.930485 0 0 110.438275 55.464219 0L842.797543 293.251927l110.929462 0 0-55.234999L842.798567 238.016929z" /> +</svg> diff --git a/_includes/svg/icon/social/linkedin.svg b/_includes/svg/icon/social/linkedin.svg new file mode 100644 index 0000000..3c26dbc --- /dev/null +++ b/_includes/svg/icon/social/linkedin.svg @@ -0,0 +1,3 @@ +<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <path d="M260.096 155.648c0 27.307008-9.899008 50.516992-29.696 69.632-19.796992 19.115008-45.396992 28.672-76.8 28.672-30.036992 0-54.612992-9.556992-73.728-28.672-19.115008-19.115008-28.672-42.324992-28.672-69.632 0-28.672 9.556992-52.224 28.672-70.656 19.115008-18.432 44.372992-27.648 75.776-27.648 31.403008 0 56.32 9.216 74.752 27.648 18.432 18.432 28.331008 41.984 29.696 70.656 0 0 0 0 0 0m-202.752 808.96c0 0 0-632.832 0-632.832 0 0 196.608 0 196.608 0 0 0 0 632.832 0 632.832 0 0-196.608 0-196.608 0 0 0 0 0 0 0m313.344-430.08c0-58.708992-1.364992-126.292992-4.096-202.752 0 0 169.984 0 169.984 0 0 0 10.24 88.064 10.24 88.064 0 0 4.096 0 4.096 0 40.96-68.267008 105.812992-102.4 194.56-102.4 68.267008 0 123.220992 22.868992 164.864 68.608 41.643008 45.739008 62.464 113.664 62.464 203.776 0 0 0 374.784 0 374.784 0 0-196.608 0-196.608 0 0 0 0-350.208 0-350.208 0-91.476992-33.451008-137.216-100.352-137.216-47.787008 0-81.236992 24.576-100.352 73.728-4.096 8.192-6.144 24.576-6.144 49.152 0 0 0 364.544 0 364.544 0 0-198.656 0-198.656 0 0 0 0-430.08 0-430.08 0 0 0 0 0 0" /> +</svg> diff --git a/_includes/svg/icon/social/mail.svg b/_includes/svg/icon/social/mail.svg new file mode 100644 index 0000000..a0d0751 --- /dev/null +++ b/_includes/svg/icon/social/mail.svg @@ -0,0 +1,6 @@ +<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <path d="M512.091 166.946c116.242 0 232.484-0.014 348.727 0.007 41.522 0.008 76.321 12.188 94.842 53.167 8.25 18.251 6.5 30.831-13.43 43.256-137.452 85.695-274.125 172.655-410.534 260.014-14.762 9.456-24.638 9.569-39.498 0.041C354.353 435.041 216.033 347.399 77.465 260.14c-12.701-8.002-16.368-15.572-12.01-29.962 9.882-32.627 30.845-52.873 63.868-59.66 13.656-2.806 27.953-3.4 41.966-3.431C284.888 166.83 398.492 166.943 512.091 166.946z" /> + <path d="M510.888 856.021c-117.998 0-235.996 0.134-353.993-0.067-47.671-0.083-79.295-22.331-91.17-61.206-4.28-14.027-2.127-22.232 10.858-30.356 108.193-67.725 215.807-136.366 324.233-203.713 7.275-4.519 21.51-4.25 29.378-0.171 22.589 11.713 44.026 25.859 64.999 40.383 11.823 8.191 21.091 8.623 33.117 0.325 20.993-14.484 43.689-26.52 64.549-41.176 12.159-8.539 20.73-7.176 32.785 0.537 106.04 67.844 212.318 135.315 319.158 201.894 16.481 10.272 18.065 21.564 12.577 37.407-12.35 35.666-45.183 55.999-92.491 56.081C746.889 856.149 628.886 856.021 510.888 856.021z" /> + <path d="M64.376 326.925c97.051 61.769 192.332 122.409 290.508 184.898-97.877 62.309-192.719 122.68-290.508 184.932C64.376 572.674 64.376 451.511 64.376 326.925z" /> + <path d="M959.665 327.168c0 124.369 0 244.164 0 369.253-97.913-62.322-192.914-122.792-290.001-184.589C766.993 449.854 861.628 389.595 959.665 327.168z" /> +</svg> diff --git a/_includes/svg/icon/social/medium.svg b/_includes/svg/icon/social/medium.svg new file mode 100644 index 0000000..2dfdd92 --- /dev/null +++ b/_includes/svg/icon/social/medium.svg @@ -0,0 +1,3 @@ +<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <path d="M834.7 279.8l61.3-58.9V208H683.7L532.4 586.4 360.3 208H137.7v12.9l71.6 86.6c7 6.4 10.6 15.8 9.7 25.2V673c2.2 12.3-1.7 24.8-10.3 33.7L128 805v12.7h228.6v-12.9l-80.6-98a39.99 39.99 0 0 1-11.1-33.7V378.7l200.7 439.2h23.3l172.6-439.2v349.9c0 9.2 0 11.1-6 17.2l-62.1 60.3V819h301.2v-12.9l-59.9-58.9c-5.2-4-7.9-10.7-6.8-17.2V297a18.1 18.1 0 0 1 6.8-17.2z"></path> +</svg> diff --git a/_includes/svg/icon/social/npm.svg b/_includes/svg/icon/social/npm.svg new file mode 100644 index 0000000..c382c30 --- /dev/null +++ b/_includes/svg/icon/social/npm.svg @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 48 48" version="1.1" width="24px" height="24px"> +<g id="surface1"> +<path style=" fill:#D50000;" d="M 0 15 L 48 15 L 48 32 L 24 32 L 24 35 L 13 35 L 13 32 L 0 32 Z "/> +<path style=" fill:#FFFFFF;" d="M 3 29 L 8 29 L 8 21 L 11 21 L 11 29 L 13 29 L 13 18 L 3 18 Z "/> +<path style=" fill:#FFFFFF;" d="M 16 18 L 16 32 L 21 32 L 21 29 L 26 29 L 26 18 Z M 24 26 L 21 26 L 21 21 L 24 21 Z "/> +<path style=" fill:#FFFFFF;" d="M 29 18 L 29 29 L 34 29 L 34 21 L 37 21 L 37 29 L 40 29 L 40 21 L 43 21 L 43 29 L 45 29 L 45 18 Z "/> +</g> +</svg> diff --git a/_includes/svg/icon/social/pinterest.svg b/_includes/svg/icon/social/pinterest.svg new file mode 100644 index 0000000..68f400b --- /dev/null +++ b/_includes/svg/icon/social/pinterest.svg @@ -0,0 +1,3 @@ +<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <path d="M444.56 671.968c-16.832 85.472-35.936 155.392-57.296 209.776S333.84 978.224 291.104 1008c-5.184-29.776-7.12-62.48-5.824-98.096 1.264-35.616 3.2-66.352 5.824-92.256 2.592-25.904 7.44-55.04 14.576-87.408 7.088-32.368 13.888-60.224 20.4-83.536 6.464-23.296 13.888-50.816 22.336-82.544 8.416-31.712 14.56-58.56 18.448-80.608-12.96-24.576-19.424-53.088-19.424-85.472 0-32.336 5.504-62.16 16.512-89.344 10.976-27.2 28.464-47.888 52.432-62.16 23.968-14.24 50.176-16.192 78.672-5.824 27.2 11.664 42.08 31.744 44.672 60.208 2.592 28.496-1.936 59.92-13.6 94.208-11.648 34.32-22.656 68.32-33.008 101.984-10.384 33.696-11.664 63.44-3.888 89.344 7.76 25.888 28.48 42.08 62.16 48.544 45.312 9.072 85.776-3.872 121.392-38.848 35.616-34.96 60.224-77.984 73.808-129.168 13.6-51.152 17.152-104.56 10.688-160.24-6.48-55.648-24.608-98.384-54.384-128.192-32.368-33.664-71.216-55.648-116.528-66.032-45.328-10.352-89.36-8.736-132.096 4.864-42.72 13.6-81.904 34.32-117.504 62.16-35.648 27.872-62.48 63.792-80.608 107.792-18.16 44.016-23.312 90.016-15.536 137.904 2.592 12.944 7.776 26.224 15.536 39.824 7.776 13.6 14.576 24.96 20.4 34 5.824 9.056 8.416 21.68 7.76 37.872-0.672 16.208-6.8 33.984-18.448 53.408-97.12-22-143.728-97.76-139.84-227.248 3.888-91.936 39.136-169.632 105.856-233.072 66.688-63.424 143.408-100.336 230.176-110.72 108.768-11.648 204.592 7.12 287.456 56.336 82.88 49.232 130.8 121.728 143.728 217.552 10.352 73.808 4.528 145.664-17.488 215.6-22 69.92-59.568 126.576-112.656 169.952-53.072 43.392-115.232 62.48-186.448 57.312-14.256-1.296-27.52-4.224-39.808-8.752-12.32-4.528-22.336-9.056-30.112-13.6-7.76-4.528-18.16-11.328-31.072-20.384C462.688 684.288 452.336 677.152 444.56 671.968z" /> +</svg>
\ No newline at end of file diff --git a/_includes/svg/icon/social/qq.svg b/_includes/svg/icon/social/qq.svg new file mode 100644 index 0000000..a305a5b --- /dev/null +++ b/_includes/svg/icon/social/qq.svg @@ -0,0 +1,3 @@ +<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <path d="M116.434944 581.71392c-33.540096 78.963712-38.984704 154.297344-12.058624 168.370176 18.572288 9.696256 47.685632-12.382208 74.93632-52.909056 10.790912 44.156928 37.492736 84.13696 75.63264 116.209664-40.003584 14.768128-66.13504 38.8864-66.13504 66.23232 0 44.9536 70.709248 81.301504 157.9776 81.301504 78.715904 0 143.906816-29.538304 155.93984-68.371456 3.231744-0.049152 15.663104-0.049152 18.79552 0 12.0832 38.784 77.324288 68.371456 155.988992 68.371456 87.267328 0 157.9776-36.39808 157.9776-81.301504 0-27.296768-26.104832-51.464192-66.13504-66.23232 38.088704-32.12288 64.888832-72.052736 75.630592-116.209664 27.250688 40.526848 56.290304 62.605312 74.887168 52.909056 26.949632-14.072832 21.630976-89.455616-12.032-168.370176-26.354688-62.058496-62.109696-107.754496-89.45664-117.848064 0.398336-3.929088 0.595968-7.957504 0.595968-11.93472 0-23.967744-6.66112-46.145536-18.049024-64.195584 0.198656-1.39264 0.198656-2.834432 0.198656-4.227072 0-11.037696-2.635776-21.38112-7.113728-30.331904-6.908928-161.308672-111.930368-289.401856-281.86624-289.401856-170.036224 0-275.105792 128.093184-281.94304 289.401856-4.525056 9.00096-7.135232 19.34336-7.135232 30.331904 0 1.39264 0.099328 2.835456 0.149504 4.227072-11.287552 18.050048-17.95072 40.177664-17.95072 64.195584 0 3.97824 0.149504 7.955456 0.497664 11.93472C178.61632 473.959424 142.739456 519.706624 116.434944 581.71392z" /> +</svg> diff --git a/_includes/svg/icon/social/telegram.svg b/_includes/svg/icon/social/telegram.svg new file mode 100644 index 0000000..1fc8d78 --- /dev/null +++ b/_includes/svg/icon/social/telegram.svg @@ -0,0 +1,4 @@ +<?xml version="1.0"?> +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24px" height="24px"> + <path style="line-height:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;block-progression:tb;isolation:auto;mix-blend-mode:normal" d="M 20.302734 2.984375 C 20.013769 2.996945 19.748583 3.080055 19.515625 3.171875 C 19.300407 3.256634 18.52754 3.5814726 17.296875 4.0976562 C 16.06621 4.61384 14.435476 5.2982348 12.697266 6.0292969 C 9.2208449 7.4914211 5.314238 9.1361259 3.3125 9.9785156 C 3.243759 10.007156 2.9645852 10.092621 2.65625 10.328125 C 2.3471996 10.564176 2.0039062 11.076462 2.0039062 11.636719 C 2.0039062 12.088671 2.2295201 12.548966 2.5019531 12.8125 C 2.7743861 13.076034 3.0504903 13.199244 3.28125 13.291016 C 3.9563403 13.559857 6.0424892 14.392968 6.9492188 14.755859 C 7.2668647 15.707799 8.0129251 17.950071 8.1875 18.501953 L 8.1855469 18.501953 C 8.3275588 18.951162 8.4659791 19.243913 8.6582031 19.488281 C 8.7543151 19.610465 8.8690398 19.721184 9.0097656 19.808594 C 9.0637596 19.842134 9.1235454 19.868148 9.1835938 19.892578 C 9.191962 19.896131 9.2005867 19.897012 9.2089844 19.900391 L 9.1855469 19.894531 C 9.2029579 19.901531 9.2185841 19.911859 9.2363281 19.917969 C 9.2652427 19.927926 9.2852873 19.927599 9.3242188 19.935547 C 9.4612233 19.977694 9.5979794 20.005859 9.7246094 20.005859 C 10.26822 20.005859 10.601562 19.710938 10.601562 19.710938 L 10.623047 19.695312 L 12.970703 17.708984 L 15.845703 20.367188 C 15.897113 20.439837 16.308174 20.998047 17.261719 20.998047 C 17.829844 20.998047 18.280978 20.718791 18.568359 20.423828 C 18.855741 20.128866 19.034757 19.82706 19.115234 19.417969 L 19.115234 19.414062 L 19.115234 19.412109 C 19.171124 19.121728 21.931641 5.265625 21.931641 5.265625 L 21.925781 5.2890625 C 22.01148 4.9067181 22.036735 4.5369631 21.935547 4.1601562 C 21.834358 3.7833495 21.561271 3.4156252 21.232422 3.2226562 C 20.903572 3.0296874 20.591699 2.9718046 20.302734 2.984375 z M 19.908203 5.1738281 C 19.799749 5.7182284 17.343164 18.059965 17.183594 18.878906 L 14.328125 16.240234 C 13.59209 15.559749 12.44438 15.535812 11.679688 16.181641 L 10.222656 17.414062 L 11 14.375 C 11 14.375 16.362547 8.9468594 16.685547 8.6308594 C 16.945547 8.3778594 17 8.2891719 17 8.2011719 C 17 8.0841719 16.939781 8 16.800781 8 C 16.675781 8 16.506016 8.1197812 16.416016 8.1757812 C 15.267511 8.8918132 10.350132 11.694224 7.96875 13.048828 C 7.8792978 12.995267 7.7913128 12.939666 7.6933594 12.900391 C 6.9119785 12.587666 5.4101276 11.985551 4.53125 11.634766 C 6.6055146 10.76177 10.161156 9.2658083 13.472656 7.8730469 C 15.210571 7.142109 16.840822 6.4570977 18.070312 5.9414062 C 19.108158 5.5060977 19.649538 5.2807035 19.908203 5.1738281 z M 17.152344 19.023438 C 17.152344 19.023438 17.154297 19.023438 17.154297 19.023438 C 17.154234 19.023761 17.152444 19.03095 17.152344 19.03125 C 17.154024 19.022709 17.151187 19.029588 17.152344 19.023438 z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible"/> +</svg> diff --git a/_includes/svg/icon/social/twitter.svg b/_includes/svg/icon/social/twitter.svg new file mode 100644 index 0000000..b04f68d --- /dev/null +++ b/_includes/svg/icon/social/twitter.svg @@ -0,0 +1,3 @@ +<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <path d="M1024.032 194.432c-37.664 16.704-78.176 28-120.672 33.088 43.36-26.016 76.672-67.168 92.384-116.224-40.608 24.064-85.568 41.568-133.408 50.976-38.336-40.832-92.928-66.336-153.344-66.336-116.032 0-210.08 94.048-210.08 210.08 0 16.48 1.856 32.512 5.44 47.872-174.592-8.768-329.408-92.416-433.024-219.52-18.08 31.04-28.448 67.104-28.448 105.632 0 72.896 37.088 137.184 93.472 174.88-34.432-1.088-66.816-10.528-95.168-26.272-0.032 0.864-0.032 1.76-0.032 2.656 0 101.792 72.416 186.688 168.512 205.984-17.632 4.8-36.192 7.36-55.36 7.36-13.536 0-26.688-1.312-39.52-3.776 26.72 83.456 104.32 144.192 196.256 145.888-71.904 56.352-162.496 89.92-260.928 89.92-16.96 0-33.664-0.992-50.112-2.944 92.96 59.616 203.392 94.4 322.048 94.4 386.432 0 597.728-320.128 597.728-597.76 0-9.12-0.192-18.176-0.608-27.168 41.056-29.632 76.672-66.624 104.832-108.736z" /> +</svg> diff --git a/_includes/svg/icon/social/weibo.svg b/_includes/svg/icon/social/weibo.svg new file mode 100644 index 0000000..2ccd8b1 --- /dev/null +++ b/_includes/svg/icon/social/weibo.svg @@ -0,0 +1,6 @@ +<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <path d="M769.226164 496.610234c-14.420098-4.330228-24.309277-7.266877-16.746482-26.214823 16.350218-41.133578 18.046881-76.626289 0.307181-101.939024-33.242099-47.500415-124.194284-44.928286-228.44638-1.280945 0-0.056317-32.73525 14.323848-24.371737-11.64523 16.042013-51.54906 13.626547-94.739726-11.332929-119.662341-56.566349-56.601163-206.976479 2.134908-335.954595 131.078209-96.594075 96.61353-152.681222 198.989775-152.681222 287.52035 0 169.337597 217.152361 272.292366 429.593589 272.292366 278.498445 0 463.752111-161.808592 463.752111-290.273715C893.345701 558.867622 827.968378 514.820945 769.226164 496.610234zM430.163922 866.063936c-169.51781 16.728051-315.851649-59.899262-326.864086-171.202185-11.010389-111.275277 117.530505-215.061482 287.031932-231.823323 169.537265-16.761841 315.876224 59.866496 326.86511 171.119247C728.190884 745.495411 599.705282 849.291856 430.163922 866.063936z" /> + <path d="M954.16753 186.714824c-67.256246-74.565105-166.457264-102.990607-258.020739-83.522502l-0.037886 0c-21.188318 4.535015-34.695065 25.37929-30.159026 46.527675 4.516584 21.166816 25.352668 34.691993 46.54201 30.174385 65.139769-13.832358 135.634727 6.400627 183.442323 59.368863 47.765615 52.96414 60.740938 125.206957 40.282686 188.537431l0.011263 0.012287c-6.666851 20.629249 4.617954 42.698153 25.271777 49.366027 20.570885 6.662755 42.687913-4.607714 49.362955-25.188838 0-0.037886 0-0.116729 0.011263-0.150519C1039.577146 362.756133 1021.443231 261.206205 954.16753 186.714824" /> + <path d="M850.886125 279.919669c-32.732179-36.315956-81.068126-50.108381-125.685136-40.621609-18.234261 3.885839-29.856965 21.833398-25.946551 40.085067 3.89915 18.173849 21.833398 29.851845 40.024654 25.893307l0 0.037886c21.809848-4.610786 45.459709 2.113405 61.461789 19.83365 16.018463 17.757107 20.323092 41.949655 13.45043 63.178931l0.035838 0c-5.715614 17.717174 3.983113 36.770584 21.717694 42.511796 17.7397 5.677728 36.76956-3.992328 42.493365-21.756603C892.458972 365.691759 883.686907 316.228458 850.886125 279.919669" /> + <path d="M447.103928 548.691741c-80.666743-20.985579-171.84317 19.215193-206.880229 90.291746-35.685212 72.492657-1.180599 152.963828 80.321676 179.268757 84.41947 27.224424 183.926645-14.492797 218.521364-92.744074C573.187374 649.021137 530.586496 570.268131 447.103928 548.691741zM385.506979 733.819463c-16.398343 26.160554-51.51015 37.623523-77.954335 25.54824-26.066352-11.868448-33.760211-42.248645-17.360844-67.757975 16.197652-25.400793 50.129884-36.716316 76.378497-25.711046C393.129162 677.216253 401.60838 707.401901 385.506979 733.819463zM439.522702 664.493841c-5.929616 10.131852-19.03498 15.010909-29.304039 10.785123-10.096014-4.15411-13.261002-15.495231-7.522862-25.454038 5.906066-9.908634 18.500485-14.747758 28.572948-10.750309C441.502995 642.817105 445.180975 654.283146 439.522702 664.493841z" /> +</svg> diff --git a/_includes/svg/icon/social/weixin.svg b/_includes/svg/icon/social/weixin.svg new file mode 100644 index 0000000..c2ed41b --- /dev/null +++ b/_includes/svg/icon/social/weixin.svg @@ -0,0 +1,3 @@ +<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <path d="M684.111464 364.088889c10.47478 0 20.949559 0.722399 31.424339 1.805996-28.173545-131.476543-168.680071-229.000353-329.052557-229.000353-179.15485 0-326.162963 122.085362-326.162963 277.401058 0 89.577425 48.761905 163.262081 130.392945 220.33157l-32.507937 98.246208L272.344268 675.442681c40.81552 7.946384 73.684656 16.253968 114.138977 16.253968 10.11358 0 20.22716-0.361199 30.340741-1.444797-6.501587-21.671958-10.11358-44.788713-10.11358-68.266667C406.710406 479.672663 529.156966 364.088889 684.111464 364.088889zM508.568607 275.595062c24.561552 0 40.81552 16.253968 40.81552 40.81552 0 24.561552-16.253968 40.81552-40.81552 40.81552-24.561552 0-49.123104-16.253968-49.123104-40.81552C459.806702 291.84903 484.368254 275.595062 508.568607 275.595062zM280.290653 357.226102c-24.561552 0-49.123104-16.253968-49.123104-40.81552 0-24.561552 24.561552-40.81552 49.123104-40.81552 24.561552 0 40.81552 16.253968 40.81552 40.81552C321.106173 340.610935 304.852205 357.226102 280.290653 357.226102z" p-id="792"></path><path d="M981.739683 618.373192c0-130.392945-130.392945-236.585538-277.039859-236.585538-155.315697 0-277.401058 106.192593-277.401058 236.585538 0 130.754145 122.085362 236.585538 277.401058 236.585538 32.507937 0 65.377072-8.307584 97.885009-16.253968l89.577425 49.123104-24.561552-81.631041C932.977778 757.073721 981.739683 691.696649 981.739683 618.373192zM614.761199 577.557672c-16.253968 0-32.507937-16.253968-32.507937-32.507937 0-16.253968 16.253968-32.507937 32.507937-32.507937 24.561552 0 40.81552 16.253968 40.81552 32.507937C655.57672 561.303704 639.322751 577.557672 614.761199 577.557672zM794.277249 577.557672c-16.253968 0-32.507937-16.253968-32.507937-32.507937 0-16.253968 16.253968-32.507937 32.507937-32.507937 24.561552 0 40.81552 16.253968 40.81552 32.507937C835.092769 561.303704 818.477601 577.557672 794.277249 577.557672z" /> +</svg> diff --git a/_includes/svg/icon/social/zhihu.svg b/_includes/svg/icon/social/zhihu.svg new file mode 100644 index 0000000..210fb2e --- /dev/null +++ b/_includes/svg/icon/social/zhihu.svg @@ -0,0 +1,3 @@ +<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <path d="M351.791182 562.469462l192.945407 0c0-45.367257-21.3871-71.939449-21.3871-71.939449L355.897709 490.530013c3.977591-82.182744 7.541767-187.659007 8.816806-226.835262l159.282726 0c0 0-0.86367-67.402109-18.578124-67.402109s-279.979646 0-279.979646 0 16.850783-88.141456 39.318494-127.053698c0 0-83.60514-4.510734-112.121614 106.962104S81.344656 355.077018 76.80834 367.390461c-4.536316 12.313443 24.62791 5.832845 36.941354 0 12.313443-5.832845 68.050885-25.924439 84.252893-103.69571l86.570681 0c1.165546 49.28652 4.596691 200.335724 3.515057 226.835262L109.86113 490.530013c-25.275663 18.147312-33.701566 71.939449-33.701566 71.939449L279.868105 562.469462c-8.497535 56.255235-23.417339 128.763642-44.275389 167.210279-33.05279 60.921511-50.55235 116.65793-169.802314 212.576513 0 0-19.442818 14.257725 40.829917 9.073656 60.273758-5.185093 117.305683-20.739347 156.840094-99.807147 20.553105-41.107233 41.805128-93.250824 58.386782-146.138358l-0.055259 0.185218 167.855986 193.263655c0 0 22.035876-51.847855 5.832845-108.880803L371.045711 650.610918l-42.1244 31.157627-0.045025 0.151449c11.69946-41.020252 20.11206-81.5749 22.726607-116.858498C351.665315 564.212152 351.72876 563.345412 351.791182 562.469462z" p-id="907"></path><path d="M584.918753 182.033893l0 668.840094 70.318532 0 28.807093 80.512708 121.875768-80.512708 153.600307 0L959.520453 182.033893 584.918753 182.033893zM887.150192 778.934538l-79.837326 0-99.578949 65.782216-23.537066-65.782216-24.855084 0L659.341766 256.673847l227.807403 0L887.149169 778.934538z" /> +</svg> diff --git a/_includes/tags.html b/_includes/tags.html new file mode 100644 index 0000000..424804c --- /dev/null +++ b/_includes/tags.html @@ -0,0 +1,52 @@ +{%- assign _tag_max_size = 1 -%} +{%- assign _tag_min_size = 1 -%} +{%- assign _tag_cur_size = 1 -%} +{%- assign _tags = site.tags | sort -%} +{%- for _tag in _tags -%} + {%- assign _tag_cur_size = _tag[1].size -%} + {%- if _tag_cur_size > _tag_max_size -%} + {%- assign _tag_max_size = _tag_cur_size -%} + {%- endif -%} + {%- if _tag_cur_size < _tag_min_size -%} + {%- assign _tag_min_size = _tag_cur_size -%} + {%- endif -%} +{%- endfor -%} +{%- assign _tag_gap_size = _tag_max_size | minus: _tag_min_size | plus: 1 | divided_by: 4 -%} +{%- if _tag_gap_size < 1 -%} + {%- assign _tag_gap_size = 1 -%} +{%- endif -%} +<div class="site-tags js-tags"> + <ul class="menu"> + <li> + <button type="button" class="button button--secondary button--pill tag-button tag-button--all" data-encode=""> + Show All<div class="tag-button__count">{{ site.posts | size }}</div> + </button> + </li> + {%- for _tag in _tags -%} + {%- assign _tag_cur_size = _tag[1].size -%} + {%- assign _tag_min_1 = _tag_min_size -%} + {%- assign _tag_max_1 = _tag_min_1 | plus: _tag_gap_size -%} + {%- assign _tag_min_2 = _tag_max_1 -%} + {%- assign _tag_max_2 = _tag_min_2 | plus: _tag_gap_size -%} + {%- assign _tag_min_3 = _tag_max_2 -%} + {%- assign _tag_max_3 = _tag_min_3 | plus: _tag_gap_size -%} + {%- assign _tag_min_4 = _tag_max_3 -%} + {%- assign _tag_max_4 = _tag_min_4 | plus: _tag_gap_size -%} + {%- if _tag_cur_size >= _tag_min_1 and _tag_cur_size < _tag_max_1 -%} + {%- assign _c_index = 1 -%} + {%- elsif _tag_cur_size >= _tag_min_2 and _tag_cur_size < _tag_max_2 -%} + {%- assign _c_index = 2 -%} + {%- elsif _tag_cur_size >= _tag_min_3 and _tag_cur_size < _tag_max_3 -%} + {%- assign _c_index = 3 -%} + {%- elsif _tag_cur_size >= _tag_min_4 and _tag_cur_size < _tag_max_4 -%} + {%- assign _c_index = 4 -%} + {%- else -%} + {%- assign _c_index = 4 -%} + {%- endif -%} + <li><button type="button" class="button button--pill tag-button tag-button-{{ _c_index }}" data-encode="{{ _tag[0] | strip | url_encode }}"> + <span>{{ _tag[0] | strip }}</span><div class="tag-button__count">{{ _tag[1].size }}</div> + </button> + </li> + {%- endfor -%} + </ul> +</div> |