diff --git a/.gitignore b/.gitignore index b350ab69..481c469d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,11 @@ -# Created by .ignore support plugin (hsz.mobi) -.idea -*.iml -node_modules/ -package-lock.json \ No newline at end of file +_site/* +_theme_packages/* + +Thumbs.db +.DS_Store + +!.gitkeep + +.rbenv-version +.rvmrc +/vendor diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..e7e9d11d --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml diff --git a/.travis.yml b/.travis.yml index 8832d122..579ea809 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,31 +1,17 @@ -language: node_js -node_js: - - "7" +language: ruby +rvm: + - 2.6 +install: gem install jekyll -v 3.1.3 && gem install bundler +script: jekyll build +after_success: + - cd ./_site + - git init + - git config user.name "tinyking" #修改name + - git config user.email "akingchao@qq.com" #修改地址 + - git add . + - git commit -m "Update docs" + - git push --force --quiet "https://${USER}:${GH_TOKEN}@${GH_REF}" master:master -before_install: - - npm install -g hexo@3.7.1 - - npm install -g hexo-cli@1.1.0 -# - npm install hexo-generator-sitemap --save #生成sitemap.xml -# - npm install hexo-generator-baidu-sitemap --save #生成baidusitemap.xml - -install: - - npm install #安装hexo及插件 - -script: - - hexo clean && hexo generate - -after_script: - - cd ./public - - git init - - git config user.name "tinyking" #修改name - - git config user.email "akingchao@qq.com" #修改地址 - - git add . - - git commit -m "Update docs" - - git push --force --quiet "https://${USER}:${GH_TOKEN}@${GH_REF}" master:master branches: - only: - - hexo #只监测hexo分支,hexo是我的分支的名称,可根据自己情况设置 - -#env: -# global: -# - GH_REF: github.com/tinyking/tinyking.github.io.git #设置GH_REF,注意更改yourname + only: + - jekyll diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index e0979ba2..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "files.autoSave": "afterDelay" -} \ No newline at end of file diff --git a/404.html b/404.html new file mode 100644 index 00000000..3d6f726f --- /dev/null +++ b/404.html @@ -0,0 +1,18 @@ + + +
+ + + + + + + + + + + + diff --git a/Gemfile b/Gemfile new file mode 100644 index 00000000..d74f7a56 --- /dev/null +++ b/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' +gem 'github-pages' +#gem 'github-pages', group: :jekyll_plugins +#gem 'jekyll-admin', group: :jekyll_plugins diff --git a/README.en.md b/README.en.md new file mode 100644 index 00000000..41edbdeb --- /dev/null +++ b/README.en.md @@ -0,0 +1,171 @@ +# NexT + +> NexT is a high quality elegant [Jekyll](https://jekyllrb.com) theme ported from [Hexo NexT](https://github.com/iissnan/hexo-theme-next). It is crafted from scratch, with love. + + + * [Live Preview](http://simpleyyt.github.io/jekyll-theme-next/) + * [Yitao's Blog](http://simpleyyt.com) + +## Screenshots + +* Desktop + + +* Sidebar + + + +* Sidebar (Post details page) + + + +* Mobile + + + + +## Installation + +Check whether you have `Ruby 2.1.0` or higher installed: + +```sh +ruby --version +``` + +Install `Bundler`: + +```sh +gem install bundler +``` + +Clone NexT theme: + +```sh +git clone https://github.com/Simpleyyt/jekyll-theme-next.git +cd jekyll-theme-next +``` + +Install Jekyll and other dependencies from the GitHub Pages gem: + +```sh +bundle install +``` + +Run your Jekyll site locally: + +```sh +bundle exec jekyll server +``` + +More Details:[Setting up your GitHub Pages site locally with Jekyll](https://help.github.com/articles/setting-up-your-github-pages-site-locally-with-jekyll/) + + +## Features + +### Multiple languages support, including: English / Russian / French / German / Simplified Chinese / Traditional Chinese. + +Default language is English. + +```yml +language: en +# language: zh-Hans +# language: fr-FR +# language: zh-hk +# language: zh-tw +# language: ru +# language: de +``` + +Set `language` field as following in site `_config.yml` to change to Chinese. + +```yml +language: zh-Hans +``` + +### Comment support. + +NexT has native support for `DuoShuo` and `Disqus` comment systems. + +Add the following snippets to your `_config.yml`: + +```yml +duoshuo: + enable: true + shortname: your-duoshuo-shortname +``` + +OR + +```yml +disqus_shortname: your-disqus-shortname +``` + +### Social Media + +NexT can automatically add links to your Social Media accounts: + +```yml +social: + GitHub: your-github-url + Twitter: your-twitter-url + Weibo: your-weibo-url + DouBan: your-douban-url + ZhiHu: your-zhihu-url +``` + +### Feed link. + +> Show a feed link. + +Set `rss` field in theme's `_config.yml`, as the following value: + +1. `rss: false` will totally disable feed link. +2. `rss: ` use sites' feed link. This is the default option. + + Follow the installation instruction in the plugin's README. After the configuration is done for this plugin, the feed link is ready too. + +3. `rss: http://your-feed-url` set specific feed link. + +### Up to 5 code highlight themes built-in. + +NexT uses [Tomorrow Theme](https://github.com/chriskempson/tomorrow-theme) with 5 themes for you to choose from. +Next use `normal` by default. Have a preview about `normal` and `night`: + + + + +Head over to [Tomorrow Theme](https://github.com/chriskempson/tomorrow-theme) for more details. + +## Configuration + +NexT comes with few configurations. + +```yml + +# Menu configuration. +menu: + home: / + archives: /archives + +# Favicon +favicon: /assets/favicon.ico + +# Avatar (put the image into next/source/images/) +# can be any image format supported by web browsers (JPEG,PNG,GIF,SVG,..) +avatar: /assets/default_avatar.png + +# Code highlight theme +# available: normal | night | night eighties | night blue | night bright +highlight_theme: normal + +# Fancybox for image gallery +fancybox: true + +# Specify the date when the site was setup +since: 2013 + +``` + +## Browser support + + diff --git a/README.md b/README.md new file mode 100644 index 00000000..39319af9 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# NexT + +> 精于心,简于形 + +NexT 是由 [Hexo NexT](https://github.com/iissnan/hexo-theme-next) 移植而来的 Jekyll 主题。 + +在线预览 Preview | Yitao's Blog | NexT 使用文档 | [English Documentation](README.en.md) + +[](https://gitter.im/jekyll-theme-next/lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + + + + +## 浏览器支持 Browser support + + + + +## 贡献 Contributing + +欢迎提交问题与需求,修复代码。 + + +## 开发 Development + +NexT 主旨在于简洁优雅且易于使用,所以首先要尽量确保 NexT 的简洁易用性。 + +NexT is built for easily use with elegant appearance. First things first, always keep things simple. + + +## 捐赠 + +支付宝捐赠链接还是要有的,万一真的有人捐呢。 + + diff --git a/_config.yml b/_config.yml index 95ef3254..6f631d74 100644 --- a/_config.yml +++ b/_config.yml @@ -1,84 +1,738 @@ -# Hexo Configuration -## Docs: https://hexo.io/docs/configuration.html -## Source: https://github.com/hexojs/hexo/ +# --------------------------------------------------------------- +# Jekyll & Global Configuration +## Docs: https://jekyllrb.com/docs/configuration/ +# --------------------------------------------------------------- # Site -title: 爱笑笑,爱生活 +title: NexT subtitle: -description: 努力做最好的自己 -author: TinyKing -language: zh-CN -timezone: +description: +author: John Doe +# Support language: de, en, fr-FR, id, ja, ko, pt-BR, pt, ru, zh-Hans, zh-hk, zh-tw +language: en +date_format: '%Y-%m-%d' # URL -## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/' -url: https://wangjianchao.cn -root: / -permalink: :year/:month/:day/:title/ -permalink_defaults: - -# Directory -source_dir: source -public_dir: public -tag_dir: tags -archive_dir: archives -category_dir: categories -code_dir: downloads/code -i18n_dir: :lang -skip_render: - -# Writing -new_post_name: :title.md # File name of new posts -default_layout: post -titlecase: false # Transform title into titlecase -external_link: true # Open external links in new tab -filename_case: 0 -render_drafts: false -post_asset_folder: false -relative_link: false -future: true +## If your site is put in a subdirectory, set url as 'http://yoursite.com' and baseurl as '/child' +url: +baseurl: +permalink: pretty + +# Pagination +paginate: 10 +#paginate_path: "/page:num/" +#archive: + #paginate: 10 + #paginate_path: "/page:num/" +#category: + #paginate: 10 + #paginate_path: "/page:num/" +#tag: + #paginate: 10 + #paginate_path: "/page:num/" + +# Handling Reading +exclude: [".rvmrc", ".rbenv-version", "README.md", "Rakefile", "changelog.md", "Gemfile", "Gemfile.lock", "README_en.md", "vendor"] + +# Separator +#excerpt_separator: + +# Code Highlighter +## 'pygments' is unsupported on GitHub Pages now. +highlighter: rouge highlight: - enable: true line_number: true - auto_detect: false - tab_replace: -# Category & Tag -default_category: uncategorized -category_map: -tag_map: +#### Markdown Processors +## 'redcarpet' is unsupported on GitHub Pages now. +markdown: kramdown +kramdown: + input: GFM -# Date / Time format -## Hexo uses Moment.js to parse and display date -## You can customize the date format as defined in -## http://momentjs.com/docs/#/displaying/format/ -date_format: YYYY-MM-DD -time_format: HH:mm:ss +# Default Attributes +## Docs: https://jekyllrb.com/docs/configuration/#front-matter-defaults +defaults: + - + scope: + path: "" + type: "posts" + values: + layout: "post" + comments: true -# Pagination -## Set per_page to 0 to disable pagination -per_page: 10 -pagination_dir: page - -# Extensions -## Plugins: https://hexo.io/plugins/ -## Themes: https://hexo.io/themes/ -theme: next -# theme: hexo-theme-snippet - -# Deployment -## Docs: https://hexo.io/docs/deployment.html -#deploy: -# type: -deploy: - type: git - #elfwalk改为你的github用户名 - repository: git@github.com:tinyking/tinyking.github.io.git - branch: master - -# search -search: - path: search.xml - field: post - format: html - limit: 10000 +# Atom feed +feed: + path: atom.xml + +# Plugins +## Docs: https://help.github.com/articles/configuring-jekyll-plugins/ +plugins: + - jemoji + - jekyll-sitemap + - jekyll-feed + +# --------------------------------------------------------------- +# Site Information Settings +# --------------------------------------------------------------- + +# Put your favicon.ico into `assets/` directory. +favicon: /assets/favicon.ico + +# Set default keywords (Use a comma to separate) +keywords: "Jekyll, NexT" + +# Set rss to false to disable feed link. +# Leave rss as empty to use site's feed link. +# Set rss to specific value if you have burned your feed already. +rss: + +# Specify the date when the site was setup +#since: 2015 + +# icon between year and author @Footer +authoricon: heart + +# Footer `powered-by` and `theme-info` copyright +copyright: true + +# --------------------------------------------------------------- +# SEO Settings +# --------------------------------------------------------------- + +# Canonical, set a canonical link tag in your jekyll, you could use it for your SEO of blog. +# See: https://support.google.com/webmasters/answer/139066 +# Tips: Before you open this tag, remember set up your URL in _config.yml ( ex. url: http://yourdomain.com ) +canonical: true + +# Change headers hierarchy on site-subtitle (will be main site description) and on all post/pages titles for better SEO-optimization. +seo: false + +# If true, will add site-subtitle to index page, added in jekyll config. +# subtitle: Subtitle +index_with_subtitle: false + +# --------------------------------------------------------------- +# Menu Settings +# --------------------------------------------------------------- + +# When running the site in a subdirectory (e.g. domain.tld/blog), remove the leading slash (/archives -> archives) +menu: + home: / + #categories: /categories/ + #about: /about/ + archives: /archives/ + tags: /tags/ + #sitemap: /sitemap.xml + #commonweal: /404.html + + +# Enable/Disable menu icons. +# Icon Mapping: +# Map a menu item to a specific FontAwesome icon name. +# Key is the name of menu item and value is the name of FontAwesome icon. Key is case-senstive. +# When an question mask icon presenting up means that the item has no mapping icon. +menu_icons: + enable: true + #KeyMapsToMenuItemKey: NameOfTheIconFromFontAwesome + home: home + about: user + categories: th + schedule: calendar + tags: tags + archives: archive + sitemap: sitemap + commonweal: heartbeat + + + + +# --------------------------------------------------------------- +# Scheme Settings +# --------------------------------------------------------------- + +# Schemes +scheme: Muse +#scheme: Mist +#scheme: Pisces + + +# --------------------------------------------------------------- +# Font Settings +# - Find fonts on Google Fonts (https://www.google.com/fonts) +# - All fonts set here will have the following styles: +# light, light italic, normal, normal italic, bold, bold italic +# - Be aware that setting too much fonts will cause site running slowly +# - Introduce in 5.0.1 +# --------------------------------------------------------------- +font: + enable: true + + # Uri of fonts host. E.g. //fonts.googleapis.com (Default) + host: + + # Global font settings used on element. + global: + # external: true will load this font family from host. + external: true + family: Lato + + # Font settings for Headlines (h1, h2, h3, h4, h5, h6) + # Fallback to `global` font settings. + headings: + external: true + family: + + # Font settings for posts + # Fallback to `global` font settings. + posts: + external: true + family: + + # Font settings for Logo + # Fallback to `global` font settings. + # The `size` option use `px` as unit + logo: + external: true + family: + size: + + # Font settings for and code blocks.
+ codes:
+ external: true
+ family:
+ size:
+
+
+
+
+# ---------------------------------------------------------------
+# Sidebar Settings
+# ---------------------------------------------------------------
+
+
+# Social Links
+# Key is the link label showing to end users.
+# Value is the target link (E.g. GitHub: https://github.com/iissnan)
+#social:
+ #LinkLabel: Link
+
+
+# Social Links Icons
+# Icon Mapping:
+# Map a menu item to a specific FontAwesome icon name.
+# Key is the name of the item and value is the name of FontAwesome icon. Key is case-senstive.
+# When an globe mask icon presenting up means that the item has no mapping icon.
+social_icons:
+ enable: true
+ # Icon Mappings.
+ # KeyMapsToSocialItemKey: NameOfTheIconFromFontAwesome
+ GitHub: github
+ Twitter: twitter
+ Weibo: weibo
+
+
+# Sidebar Avatar
+# in directory: /assets/images/avatar.gif
+#avatar:
+
+
+# Table Of Contents in the Sidebar
+toc:
+ enable: true
+
+ # Automatically add list number to toc.
+ number: true
+
+ # If true, all words will placed on next lines if header width longer then sidebar width.
+ wrap: false
+
+
+# Creative Commons 4.0 International License.
+# http://creativecommons.org/
+# Available: by | by-nc | by-nc-nd | by-nc-sa | by-nd | by-sa | zero
+#creative_commons: by-nc-sa
+#creative_commons:
+
+
+sidebar:
+ # Sidebar Position, available value: left | right
+ position: left
+ #position: right
+
+ # Sidebar Display, available value:
+ # - post expand on posts automatically. Default.
+ # - always expand for all pages automatically
+ # - hide expand only when click on the sidebar toggle icon.
+ # - remove Totally remove sidebar including sidebar toggle.
+ display: post
+ #display: always
+ #display: hide
+ #display: remove
+
+ # Sidebar offset from top menubar in pixels.
+ offset: 12
+ offset_float: 0
+
+ # Back to top in sidebar
+ b2t: false
+
+ # Scroll percent label in b2t button
+ scrollpercent: false
+
+
+# Blog rolls
+#links_title: Links
+#links_layout: block
+#links_layout: inline
+#links:
+ #Title: http://example.com/
+
+
+# ---------------------------------------------------------------
+# Post Settings
+# ---------------------------------------------------------------
+
+# Automatically scroll page to section which is under mark.
+scroll_to_more: true
+
+# Automatically saving scroll position on each post/page in cookies.
+save_scroll: false
+
+# Automatically excerpt description in homepage as preamble text.
+excerpt_description: true
+
+# Automatically Excerpt. Not recommend.
+# Please use in the post to control excerpt accurately.
+auto_excerpt:
+ enable: false
+ length: 150
+
+# Post meta display settings
+post_meta:
+ item_text: true
+ created_at: true
+ updated_at: false
+ categories: true
+
+# Post wordcount display settings
+post_wordcount:
+ item_text: true
+ wordcount: false
+ min2read: false
+ separated_meta: true
+
+# Wechat Subscriber
+#wechat_subscriber:
+ #enabled: true
+ #qcode: /path/to/your/wechatqcode ex. /uploads/wechat-qcode.jpg
+ #description: ex. subscribe to my blog by scanning my public wechat account
+
+# Declare license on posts
+post_copyright:
+ enable: false
+ license: CC BY-NC-SA 3.0
+ license_url: https://creativecommons.org/licenses/by-nc-sa/3.0/
+
+
+
+# ---------------------------------------------------------------
+# Misc Theme Settings
+# ---------------------------------------------------------------
+
+# Custom Logo.
+# !!Only available for Default Scheme currently.
+# Options:
+# enabled: [true/false] - Replace with specific image
+# image: url-of-image - Images's url
+custom_logo:
+ enabled: false
+ image:
+
+
+# Code Highlight theme
+# Available value:
+# normal | night | night eighties | night blue | night bright
+# https://github.com/chriskempson/tomorrow-theme
+highlight_theme: normal
+
+
+# ---------------------------------------------------------------
+# Third Party Services Settings
+# ---------------------------------------------------------------
+
+# MathJax Support
+mathjax:
+ enable: false
+ per_page: false
+ cdn: //cdn.bootcss.com/mathjax/2.7.1/latest.js?config=TeX-AMS-MML_HTMLorMML
+
+# Han Support docs: https://hanzi.pro/
+han: false
+
+# Swiftype Search API Key
+#swiftype_key:
+
+# Baidu Analytics ID
+#baidu_analytics:
+
+# Duoshuo ShortName
+#duoshuo_shortname:
+
+# Disqus
+disqus:
+ enable: false
+ shortname:
+ count: true
+ # hide comments (visitors need to click to load the comments)
+ # count need to be false when hide is true
+ hide: false
+
+#
+wildfire:
+ enable: false
+ # version - It's recommended to use the following versions.
+ loaderVersion: 1.2.5 # https://www.npmjs.com/package/wildfire-comment
+ useDev: true
+ version: 0.5.6
+ # database config
+ databaseProvider: firebase # or wilddog
+ firebase: # your firebase config goes here ↓
+ apiKey:
+ authDomain:
+ databaseURL:
+ projectId:
+ storageBucket:
+ messagingSenderId:
+ wilddog: # your wilddog config goes here ↓
+ siteId:
+ # other configs
+ theme: light # or dark
+ locale: en # or other locales, e.g. zh-CN
+ defaultAvatarURL:
+# Any question?
+# Raise an issue here: https://github.com/cheng-kang/wildfire/issues
+#
+
+# Hypercomments
+#hypercomments_id:
+
+# Gentie productKey
+#gentie_productKey:
+
+# changyan
+changyan:
+ enable: false
+ appid:
+ appkey:
+
+# Support for youyan comments system.
+# You can get your uid from http://www.uyan.cc
+#youyan_uid: your uid
+
+# Support for LiveRe comments system.
+# You can get your uid from https://livere.com/insight/myCode (General web site)
+#livere_uid: your uid
+
+# Support for gitalk comments system.
+gitalk:
+ enable: false
+ clientID: # 54730ddf7b9420460c03
+ clientSecret: # c05684701b25ff1c19ea0c01ce4d80c125e0707d
+ repo: # colingpt.github.io
+ owner: # colingpt
+ admin: # colingpt
+
+# Baidu Share
+# Available value:
+# button | slide
+# Warning: Baidu Share does not support https.
+#baidushare:
+## type: button
+
+# Share
+#jiathis:
+# Warning: JiaThis does not support https.
+#add_this_id:
+
+# Share
+#duoshuo_share: true
+
+# Google Webmaster tools verification setting
+# See: https://www.google.com/webmasters/
+#google_site_verification:
+
+# Google Analytics
+#google_analytics:
+
+# Yandex Webmaster tools verification setting
+# See: https://webmaster.yandex.ru/
+#yandex_site_verification:
+
+# CNZZ count
+#cnzz_siteid:
+
+# Application Insights
+# See https://azure.microsoft.com/en-us/services/application-insights/
+# application_insights:
+
+# Make duoshuo show UA
+# user_id must NOT be null when admin_enable is true!
+# you can visit http://dev.duoshuo.com get duoshuo user id.
+duoshuo_info:
+ ua_enable: true
+ admin_enable: false
+ user_id: 0
+ #admin_nickname: Author
+
+
+# Facebook SDK Support.
+# https://github.com/iissnan/hexo-theme-next/pull/410
+facebook_sdk:
+ enable: false
+ app_id: #
+ fb_admin: #
+ like_button: #true
+ webmaster: #true
+
+# Facebook comments plugin
+# This plugin depends on Facebook SDK.
+# If facebook_sdk.enable is false, Facebook comments plugin is unavailable.
+facebook_comments_plugin:
+ enable: false
+ num_of_posts: 10 # min posts num is 1
+ width: 100% # default width is 550px
+ scheme: light # default scheme is light (light or dark)
+
+# VKontakte API Support.
+# To get your AppID visit https://vk.com/editapp?act=create
+vkontakte_api:
+ enable: false
+ app_id: #
+ like: true
+ comments: true
+ num_of_posts: 10
+
+# Star rating support to each article.
+# To get your ID visit https://widgetpack.com
+rating:
+ enable: false
+ id: #
+ color: fc6423
+
+
+# Show number of visitors to each article.
+# You can visit https://leancloud.cn get AppID and AppKey.
+leancloud_visitors:
+ enable: false
+ app_id: #
+ app_key: #
+
+# Show PV/UV of the website/page with busuanzi.
+# Get more information on http://ibruce.info/2015/04/04/busuanzi/
+busuanzi_count:
+ # count values only if the other configs are false
+ enable: false
+ # custom uv span for the whole site
+ site_uv: true
+ site_uv_header:
+ site_uv_footer:
+ # custom pv span for the whole site
+ site_pv: true
+ site_pv_header:
+ site_pv_footer:
+ # custom pv span for one page only
+ page_pv: true
+ page_pv_header:
+ page_pv_footer:
+
+
+# Tencent analytics ID
+# tencent_analytics:
+
+# Tencent MTA ID
+# tencent_mta:
+
+
+# Enable baidu push so that the blog will push the url to baidu automatically which is very helpful for SEO
+baidu_push: false
+
+# Google Calendar
+# Share your recent schedule to others via calendar page
+#
+# API Documentation:
+# https://developers.google.com/google-apps/calendar/v3/reference/events/list
+calendar:
+ enable: false
+ calendar_id:
+ api_key:
+ orderBy: startTime
+ offsetMax: 24
+ offsetMin: 4
+ timeZone:
+ showDeleted: false
+ singleEvents: true
+ maxResults: 250
+
+# Algolia Search
+algolia_search:
+ enable: false
+ hits:
+ per_page: 10
+ labels:
+ input_placeholder: Search for Posts
+ hits_empty: "We didn't find any results for the search: ${query}"
+ hits_stats: "${hits} results found in ${time} ms"
+
+
+# Local search
+local_search:
+ enable: false
+ # if auto, trigger search by changing input
+ # if manual, trigger search by pressing enter key or search button
+ trigger: auto
+ # show top n results per article, show all results by setting to -1
+ top_n_per_article: 1
+
+# External URL with BASE64 encrypt & decrypt
+# Usage: {% exturl text url "title" %}
+# Alias: {% extlink text url "title" %}
+exturl: false
+
+
+#! ---------------------------------------------------------------
+#! DO NOT EDIT THE FOLLOWING SETTINGS
+#! UNLESS YOU KNOW WHAT YOU ARE DOING
+#! ---------------------------------------------------------------
+
+# Motion
+use_motion: true
+
+# Fancybox
+fancybox: true
+
+# Progress bar in the top during page loading.
+pace: false
+# Themes list:
+#pace-theme-big-counter
+#pace-theme-bounce
+#pace-theme-barber-shop
+#pace-theme-center-atom
+#pace-theme-center-circle
+#pace-theme-center-radar
+#pace-theme-center-simple
+#pace-theme-corner-indicator
+#pace-theme-fill-left
+#pace-theme-flash
+#pace-theme-loading-bar
+#pace-theme-mac-osx
+#pace-theme-minimal
+# For example
+# pace_theme: pace-theme-center-simple
+pace_theme: pace-theme-minimal
+
+# Canvas-nest
+canvas_nest: false
+
+# three_waves
+three_waves: false
+
+# canvas_lines
+canvas_lines: false
+
+# canvas_sphere
+canvas_sphere: false
+
+# Only fit scheme Pisces
+# Canvas-ribbon
+canvas_ribbon: false
+
+# Script Vendors.
+# Set a CDN address for the vendor you want to customize.
+# For example
+# jquery: https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js
+# Be aware that you should use the same version as internal ones to avoid potential problems.
+# Please use the https protocol of CDN files when you enable https on your site.
+vendors:
+ # Internal path prefix. Please do not edit it.
+ _internal: assets/lib
+
+ # Internal version: 2.1.3
+ jquery:
+
+ # Internal version: 2.1.5
+ # See: http://fancyapps.com/fancybox/
+ fancybox:
+ fancybox_css:
+
+ # Internal version: 1.0.6
+ # See: https://github.com/ftlabs/fastclick
+ fastclick:
+
+ # Internal version: 1.9.7
+ # See: https://github.com/tuupola/jquery_lazyload
+ lazyload:
+
+ # Internal version: 1.2.1
+ # See: http://VelocityJS.org
+ velocity:
+
+ # Internal version: 1.2.1
+ # See: http://VelocityJS.org
+ velocity_ui:
+
+ # Internal version: 0.7.9
+ # See: https://faisalman.github.io/ua-parser-js/
+ ua_parser:
+
+ # Internal version: 4.6.2
+ # See: http://fontawesome.io/
+ fontawesome:
+
+ # Internal version: 1
+ # https://www.algolia.com
+ algolia_instant_js:
+ algolia_instant_css:
+
+ # Internal version: 1.0.2
+ # See: https://github.com/HubSpot/pace
+ # Or use direct links below:
+ # pace: //cdn.bootcss.com/pace/1.0.2/pace.min.js
+ # pace_css: //cdn.bootcss.com/pace/1.0.2/themes/blue/pace-theme-flash.min.css
+ pace:
+ pace_css:
+
+ # Internal version: 1.0.0
+ # https://github.com/hustcc/canvas-nest.js
+ canvas_nest:
+
+ # three
+ three:
+
+ # three_waves
+ # https://github.com/jjandxa/three_waves
+ three_waves:
+
+ # three_waves
+ # https://github.com/jjandxa/canvas_lines
+ canvas_lines:
+
+ # three_waves
+ # https://github.com/jjandxa/canvas_sphere
+ canvas_sphere:
+
+ # Internal version: 1.0.0
+ # https://github.com/zproo/canvas-ribbon
+ canvas_ribbon:
+
+ # Internal version: 3.3.0
+ # https://github.com/ethantw/Han
+ han:
+
+
+# Assets
+css: assets/css
+js: assets/js
+images: assets/images
+
+# Theme version
+version: 5.1.1
diff --git a/_data/languages/de.yml b/_data/languages/de.yml
new file mode 100644
index 00000000..dc975cde
--- /dev/null
+++ b/_data/languages/de.yml
@@ -0,0 +1,87 @@
+title:
+ archive: Archiv
+ category: Kategorie
+ tag: Tag
+ archives: Archiv
+ categories: Kategorien
+ tags: Tags
+ about: Über
+
+author: Author
+
+menu:
+ home: Startseite
+ archives: Archiv
+ categories: Kategorien
+ tags: Tags
+ about: Über
+ feed: RSS
+ search: Suche
+
+sidebar:
+ overview: Übersicht
+ toc: Inhaltsverzeichnis
+
+post:
+ created: Post created
+ sticky: Sticky
+ posted: Veröffentlicht am
+ modified: Updated at
+ in: in
+ read_more: Weiterlesen
+ untitled: Unbenannt
+ toc_empty: Dieser Artikel hat kein Inhaltsverzeichnis
+ visitors: Visitors
+ wordcount: Words count in article
+ min2read: Reading time
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: Gesamt
+ tags: tags
+
+footer:
+ powered: "Erstellt mit %s"
+ theme: Theme
+
+counter:
+ tag_cloud:
+ zero: Keine Tags
+ one: Insgesamt ein Tag
+ other: "Insgesamt %d Tags"
+
+ categories:
+ zero: Keine Kategorien
+ one: Insgesamt eine Kategorie
+ other: "Insgesamt %d Kategorien"
+
+ archive_posts:
+ zero: Keine Artikel vorhanden.
+ one: Ein Artikel.
+ other: "Insgesamt %d Artikel."
+
+state:
+ posts: Artikel
+ pages: Seiten
+ tags: Tags
+ categories: Kategorien
+
+cheers:
+ um: Öhm..
+ ok: OK
+ nice: Schön
+ good: Gut
+ great: Wunderbar
+ excellent: Exzellent
+
+keep_on: Bleib dran.
+
+symbol:
+ comma: '. '
+ period: ', '
+ colon: ':'
diff --git a/_data/languages/default.yml b/_data/languages/default.yml
new file mode 100644
index 00000000..b0ce58bf
--- /dev/null
+++ b/_data/languages/default.yml
@@ -0,0 +1,96 @@
+title:
+ archive: Archive
+ category: Category
+ tag: Tag
+ schedule: Schedule
+ archives: Archives
+ categories: Categories
+ tags: Tags
+ about: About
+
+author: Author
+
+menu:
+ home: Home
+ archives: Archives
+ categories: Categories
+ tags: Tags
+ about: About
+ search: Search
+ schedule: Schedule
+ sitemap: Sitemap
+ commonweal: Commonweal 404
+
+sidebar:
+ overview: Overview
+ toc: Table of Contents
+
+post:
+ created: Post created
+ modified: Post modified
+ sticky: Sticky
+ posted: Posted on
+ in: In
+ more: more
+ read_more: Read more
+ untitled: Untitled
+ toc_empty: This post does not have a Table of Contents
+ visitors: Visitors
+ wordcount: Words count in article
+ min2read: Reading time
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+
+
+page:
+ totally: Totally
+ tags: tags
+
+footer:
+ powered: "Powered by %s"
+ theme: Theme
+
+counter:
+ tag_cloud:
+ zero: No tags
+ one: 1 tag in total
+ other: "%d tags in total"
+
+ categories:
+ zero: No categories
+ one: 1 category in total
+ other: "%d categories in total"
+
+ archive_posts:
+ zero: No posts.
+ one: 1 post.
+ other: "%d posts in total."
+
+state:
+ posts: posts
+ pages: pages
+ tags: tags
+ categories: categories
+
+search:
+ placeholder: Searching...
+
+cheers:
+ um: Um..
+ ok: OK
+ nice: Nice
+ good: Good
+ great: Great
+ excellent: Excellent
+
+keep_on: Keep on posting.
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
diff --git a/themes/next/languages/en.yml b/_data/languages/en.yml
similarity index 59%
rename from themes/next/languages/en.yml
rename to _data/languages/en.yml
index ed255517..8e065a1b 100644
--- a/themes/next/languages/en.yml
+++ b/_data/languages/en.yml
@@ -3,6 +3,12 @@ title:
category: Category
tag: Tag
schedule: Schedule
+ archives: Archives
+ categories: Categories
+ tags: Tags
+ about: About
+
+author: Author
menu:
home: Home
@@ -20,28 +26,24 @@ sidebar:
toc: Table of Contents
post:
+ created: Post created
+ modified: Post modified
+ sticky: Sticky
posted: Posted on
- edited: Edited on
- created: Created
- modified: Modified
- edit: Edit this post
in: In
more: more
read_more: Read more
untitled: Untitled
- sticky: Sticky
toc_empty: This post does not have a Table of Contents
- views: Views
- comments_count: Comments
- related_posts: Related Posts
- copy_button: Copy
- copy_success: Copied
- copy_failure: Copy failed
+ visitors: Visitors
+ wordcount: Words count in article
+ min2read: Reading time
copyright:
author: Post author
link: Post link
license_title: Copyright Notice
- license_content: "All articles in this blog are licensed under %s unless stating additionally."
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
page:
totally: Totally
@@ -50,8 +52,6 @@ page:
footer:
powered: "Powered by %s"
theme: Theme
- total_views: Total Views
- total_visitors: Total Visitors
counter:
tag_cloud:
@@ -89,26 +89,6 @@ cheers:
keep_on: Keep on posting.
symbol:
- comma: ", "
- period: ". "
- colon: ": "
-
-reward:
- donate: Donate
- wechatpay: WeChat Pay
- alipay: Alipay
- bitcoin: Bitcoin
-
-gitmentbutton: Show comments from Gitment
-
-accessibility:
- nav_toggle: Toggle navigation bar
- prev_page: Previous page
- next_page: Next page
-
-symbols_count_time:
- count: Symbols count in article
- count_total: Symbols count total
- time: Reading time
- time_total: Reading time total
- time_minutes: mins.
+ comma: ', '
+ period: '. '
+ colon: ':'
diff --git a/_data/languages/fr-FR.yml b/_data/languages/fr-FR.yml
new file mode 100644
index 00000000..69ea26ea
--- /dev/null
+++ b/_data/languages/fr-FR.yml
@@ -0,0 +1,85 @@
+title:
+ archive: Archive
+ category: Catégorie
+ tag: Tag
+ archives: Archives
+ categories: Categories
+ tags: Tags
+ about: A propos
+
+author: Author
+
+menu:
+ home: Accueil
+ archives: Archives
+ categories: Categories
+ tags: Tags
+ about: A propos
+ search: recherche
+
+sidebar:
+ overview: Ensemble
+ toc: Table Des Matières
+
+post:
+ sticky: Sticky
+ posted: Posté le
+ modified: Updated at
+ in: In
+ read_more: Lire la suite
+ untitled: Non titré
+ toc_empty: This post does not have a Table of Contents
+ visitors: Visitors
+ wordcount: Words count in article
+ min2read: Reading time
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: Total
+ tags: tags
+
+footer:
+ powered: "Powered by %s"
+ theme: Thème
+
+counter:
+ tag_cloud:
+ zero: Aucun tags
+ one: 1 tag au total
+ other: "%d tags au total"
+
+ categories:
+ zero: Aucun categories
+ one: 1 category au total
+ other: "%d categories au total"
+
+ archive_posts:
+ zero: Aucun article.
+ one: 1 article.
+ other: "%d articles au total."
+
+state:
+ posts: articles
+ pages: pages
+ tags: tags
+ categories: categories
+
+cheers:
+ um: Um..
+ ok: OK
+ nice: Jolie
+ good: Bien
+ great: Super
+ excellent: Excellent
+
+keep_on: Et ca ne fait que commencer.
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
diff --git a/themes/next/languages/id.yml b/_data/languages/id.yml
similarity index 52%
rename from themes/next/languages/id.yml
rename to _data/languages/id.yml
index 58fc5431..0613b3ae 100644
--- a/themes/next/languages/id.yml
+++ b/_data/languages/id.yml
@@ -1,9 +1,14 @@
----
title:
archive: Arsip
category: Kategori
tag: Tag
- schedule: Schedule
+ archives: Arsip
+ categories: Kategori
+ tags: Tags
+ about: Tentang
+
+author: Penulis
+
menu:
home: Beranda
archives: Arsip
@@ -11,63 +16,59 @@ menu:
tags: Tags
about: Tentang
search: Pencarian
- schedule: Schedule
- sitemap: Sitemap
- commonweal: Commonweal 404
+
sidebar:
overview: Ikhtisar
toc: Daftar Isi
+
post:
+ sticky: Sticky
posted: Diposting di
- edited: Edited on
- created: Post created
modified: Updated at
- edit: Edit this post
in: Di
- more: more
read_more: Baca lebih
untitled: Tidak ada title
- sticky: Sticky
toc_empty: Posting ini tidak memiliki Daftar Isi
- views: Views
- comments_count: Comments
- related_posts: Related Posts
- copy_button: Copy
- copy_success: Copied
- copy_failure: Copy failed
+ visitors: Pengunjung
+ wordcount: Words count in article
+ min2read: Reading time
copyright:
author: Post author
link: Post link
license_title: Copyright Notice
- license_content: "All articles in this blog are licensed under %s unless stating additionally."
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
page:
totally: Total
tags: tags
+
footer:
powered: "Powered by %s"
theme: Tema
- total_views: Total Views
- total_visitors: Total Visitors
+
counter:
tag_cloud:
zero: Tidak ada tags
one: 1 total tag
other: "%d total tags"
+
categories:
zero: Tidak ada kategori
one: 1 total categori
other: "%d total kategori"
+
archive_posts:
zero: Tidak ada posting.
one: 1 posting.
other: "%d total posting."
+
state:
posts: posting
pages: halaman
tags: tags
categories: kategori
-search:
- placeholder: Searching...
+
cheers:
um: Um..
ok: OK
@@ -75,24 +76,10 @@ cheers:
good: Bagus
great: Besar
excellent: Baik
+
keep_on: Terus Posting.
+
symbol:
- comma: ", "
- period: ". "
- colon: ": "
-reward:
- donate: Donate
- wechatpay: WeChat Pay
- alipay: Alipay
- bitcoin: Bitcoin
-gitmentbutton: Show comments from Gitment
-accessibility:
- nav_toggle: Toggle navigation bar
- prev_page: Halaman sebelumnya
- next_page: Halaman selanjutnya
-symbols_count_time:
- count: Symbols count in article
- count_total: Symbols count total
- time: Reading time
- time_total: Reading time total
- time_minutes: mins.
+ comma: ', '
+ period: '. '
+ colon: ':'
diff --git a/_data/languages/ja.yml b/_data/languages/ja.yml
new file mode 100644
index 00000000..230f5b14
--- /dev/null
+++ b/_data/languages/ja.yml
@@ -0,0 +1,85 @@
+title:
+ archive: アーカイブ
+ category: カテゴリ
+ tag: タグ
+ archives: アーカイブ
+ categories: カテゴリ
+ tags: タグ
+ about: About
+
+author: Author
+
+menu:
+ home: ホーム
+ archives: アーカイブ
+ categories: カテゴリ
+ tags: タグ
+ about: About
+ search: 検索
+
+sidebar:
+ overview: 概要
+ toc: 見出し
+
+post:
+ sticky: 固定
+ posted: 投稿日
+ modified: Updated at
+ in: In
+ read_more: 続きを読む
+ untitled: 無題
+ toc_empty: 見出しがありません
+ visitors: Visitors
+ wordcount: Words count in article
+ min2read: Reading time
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: 全ページ
+ tags: タグ
+
+footer:
+ powered: "Powered by %s"
+ theme: Theme
+
+counter:
+ tag_cloud:
+ zero: タグなし
+ one: "全 1 タグ"
+ other: "全 %d タグ"
+
+ categories:
+ zero: カテゴリなし
+ one: "全 1 カテゴリ"
+ other: "全 %d カテゴリ"
+
+ archive_posts:
+ zero: ポストなし
+ one: "全 1 ポスト"
+ other: "全 %d ポスト"
+
+state:
+ posts: ポスト
+ pages: ページ
+ tags: タグ
+ categories: カテゴリ
+
+cheers:
+ um: うーん
+ ok: OK
+ nice: まあまあ
+ good: いいね
+ great: すごい
+ excellent: 最高
+
+keep_on: もっと書こう!
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
diff --git a/themes/next/languages/ko.yml b/_data/languages/ko.yml
similarity index 54%
rename from themes/next/languages/ko.yml
rename to _data/languages/ko.yml
index bcda1d4e..2d38eb6c 100644
--- a/themes/next/languages/ko.yml
+++ b/_data/languages/ko.yml
@@ -1,9 +1,14 @@
----
title:
archive: 아카이브
category: 카테고리
tag: 태그
- schedule: Schedule
+ archives: 아카이브
+ categories: 카테고리
+ tags: 태그
+ about: About
+
+author: 작성자
+
menu:
home: 홈
archives: 아카이브
@@ -11,63 +16,59 @@ menu:
tags: 태그
about: About
search: 검색
- schedule: Schedule
- sitemap: Sitemap
- commonweal: Commonweal 404
+
sidebar:
overview: 흝어보기
toc: 목차
+
post:
+ sticky: 고정
posted: 작성일
- edited: Edited on
- created: Post created
modified: Updated at
- edit: Edit this post
in: In
- more: more
read_more: 더 읽어보기
untitled: 제목 없음
- sticky: 고정
toc_empty: 목차 없음
- views: Views
- comments_count: 댓글
- related_posts: Related Posts
- copy_button: 복사
- copy_success: Copied
- copy_failure: Copy failed
+ visitors: 방문객
+ wordcount: Words count in article
+ min2read: Reading time
copyright:
author: Post author
link: Post link
license_title: Copyright Notice
- license_content: "All articles in this blog are licensed under %s unless stating additionally."
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
page:
totally: 모두
tags: 태그
+
footer:
powered: "Powered by %s"
theme: Theme
- total_views: Total Views
- total_visitors: Total Visitors
+
counter:
tag_cloud:
zero: 태그 없음
one: 1개의 태그
other: "총 %d개의 태그"
+
categories:
zero: 카테고리 없음
one: 1개의 카테고리
other: "총 %d개의 카테고리"
+
archive_posts:
zero: 포스트 없음
one: 1개의 포스트
other: "총 %d개의 포스트"
+
state:
posts: 포스트
pages: 페이지
tags: 태그
categories: 카테고리
-search:
- placeholder: Searching...
+
cheers:
um: 음..
ok: OK
@@ -75,24 +76,10 @@ cheers:
good: 좋아요
great: 훌륭해요
excellent: 완벽해요
+
keep_on: 포스트를 마저 작성하세요
+
symbol:
- comma: ", "
- period: ". "
- colon: ": "
-reward:
- donate: Donate
- wechatpay: WeChat Pay
- alipay: Alipay
- bitcoin: Bitcoin
-gitmentbutton: Show comments from Gitment
-accessibility:
- nav_toggle: Toggle navigation bar
- prev_page: 이전 페이지
- next_page: 다음 페이지
-symbols_count_time:
- count: Symbols count in article
- count_total: Symbols count total
- time: Reading time
- time_total: Reading time total
- time_minutes: mins.
+ comma: ', '
+ period: '. '
+ colon: ':'
diff --git a/themes/next/languages/pt-BR.yml b/_data/languages/pt-BR.yml
similarity index 53%
rename from themes/next/languages/pt-BR.yml
rename to _data/languages/pt-BR.yml
index 721a15e2..28937629 100644
--- a/themes/next/languages/pt-BR.yml
+++ b/_data/languages/pt-BR.yml
@@ -1,9 +1,14 @@
----
title:
archive: Arquivo
category: Categoria
tag: Tag
- schedule: Schedule
+ archives: Arquivos
+ categories: Categorias
+ tags: Tags
+ about: Sobre
+
+author: Autor
+
menu:
home: Home
archives: Arquivos
@@ -11,63 +16,59 @@ menu:
tags: Tags
about: Sobre
search: Pesquisar
- schedule: Schedule
- sitemap: Sitemap
- commonweal: Commonweal 404
+
sidebar:
overview: Visão geral
toc: Tabela de conteúdo
+
post:
+ sticky: Sticky
posted: Postado em
- edited: Edited on
- created: Post created
modified: Updated at
- edit: Edit this post
in: Em
- more: more
read_more: Leia mais
untitled: Sem título
- sticky: Sticky
toc_empty: Este post não possui tabela de conteúdo
- views: Views
- comments_count: Comments
- related_posts: Related Posts
- copy_button: Copy
- copy_success: Copied
- copy_failure: Copy failed
+ visitors: Visitantes
+ wordcount: Words count in article
+ min2read: Reading time
copyright:
author: Post author
link: Post link
license_title: Copyright Notice
- license_content: "All articles in this blog are licensed under %s unless stating additionally."
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
page:
totally: Totalmente
tags: tags
+
footer:
powered: "Feito com %s"
theme: Tema
- total_views: Total Views
- total_visitors: Total Visitors
+
counter:
tag_cloud:
zero: Sem tags
one: 1 tag no total de
other: "%d tags no total de"
+
categories:
zero: Sem categoria
one: 1 categoria no total de
other: "%d categoria no total de"
+
archive_posts:
zero: Sem posts.
one: 1 post.
other: "%d posts no total."
+
state:
posts: Posts
pages: Páginas
tags: Tags
categories: Categorias
-search:
- placeholder: Searching...
+
cheers:
um: Uhmmmm...
ok: OK
@@ -75,24 +76,10 @@ cheers:
good: Muito Bom
great: Ótimo
excellent: Excelente
+
keep_on: Continuar no post.
+
symbol:
- comma: ", "
- period: ". "
- colon: ": "
-reward:
- donate: Donate
- wechatpay: WeChat Pay
- alipay: Alipay
- bitcoin: Bitcoin
-gitmentbutton: Show comments from Gitment
-accessibility:
- nav_toggle: Toggle navigation bar
- prev_page: Página anterior
- next_page: Próxima página
-symbols_count_time:
- count: Symbols count in article
- count_total: Symbols count total
- time: Reading time
- time_total: Reading time total
- time_minutes: mins.
+ comma: '. '
+ period: ', '
+ colon: ':'
diff --git a/themes/next/languages/pt.yml b/_data/languages/pt.yml
similarity index 54%
rename from themes/next/languages/pt.yml
rename to _data/languages/pt.yml
index 3955f05d..2c359547 100644
--- a/themes/next/languages/pt.yml
+++ b/_data/languages/pt.yml
@@ -1,9 +1,14 @@
----
title:
archive: Arquivo
category: Categoria
tag: Tag
- schedule: Schedule
+ archives: Arquivos
+ categories: Categorias
+ tags: Tags
+ about: Sobre
+
+author: Author
+
menu:
home: Home
archives: Arquivos
@@ -11,63 +16,59 @@ menu:
tags: Tags
about: Sobre
search: Pesquisa
- schedule: Schedule
- sitemap: Sitemap
- commonweal: Commonweal 404
+
sidebar:
overview: Visão Geral
toc: Tabela de Conteúdo
+
post:
+ sticky: Sticky
posted: Postado em
- edited: Edited on
- created: Post created
modified: Updated at
- edit: Edit this post
in: Em
- more: more
read_more: Ler mais
untitled: Sem título
- sticky: Sticky
toc_empty: Esta publicação não possui uma tabela de conteúdo
- views: Views
- comments_count: Comments
- related_posts: Related Posts
- copy_button: Copy
- copy_success: Copied
- copy_failure: Copy failed
+ visitors: Visitors
+ wordcount: Words count in article
+ min2read: Reading time
copyright:
author: Post author
link: Post link
license_title: Copyright Notice
- license_content: "All articles in this blog are licensed under %s unless stating additionally."
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
page:
totally: Totalmente
tags: tags
+
footer:
powered: "Desenvolvido com amor com %s"
theme: Tema
- total_views: Total Views
- total_visitors: Total Visitors
+
counter:
tag_cloud:
zero: Sem tags
one: 1 tag no total
other: "%d tags no total"
+
categories:
zero: Sem categorias
one: 1 categoria no total
other: "%d categorias no total"
+
archive_posts:
zero: Sem publicações.
one: 1 post.
other: "%d publicações no total."
+
state:
posts: publicações
pages: páginas
tags: tags
categories: categorias
-search:
- placeholder: Searching...
+
cheers:
um: Um..
ok: OK
@@ -75,24 +76,10 @@ cheers:
good: Bom
great: Grandioso
excellent: Excelente
+
keep_on: Mantenha-se publicando!
+
symbol:
- comma: ", "
- period: ". "
- colon: ": "
-reward:
- donate: Donate
- wechatpay: WeChat Pay
- alipay: Alipay
- bitcoin: Bitcoin
-gitmentbutton: Show comments from Gitment
-accessibility:
- nav_toggle: Toggle navigation bar
- prev_page: Página anterior
- next_page: Página seguinte
-symbols_count_time:
- count: Symbols count in article
- count_total: Symbols count total
- time: Reading time
- time_total: Reading time total
- time_minutes: mins.
+ comma: ', '
+ period: '. '
+ colon: ':'
diff --git a/themes/next/languages/ru.yml b/_data/languages/ru.yml
similarity index 52%
rename from themes/next/languages/ru.yml
rename to _data/languages/ru.yml
index c7d8c798..bbb03987 100644
--- a/themes/next/languages/ru.yml
+++ b/_data/languages/ru.yml
@@ -1,9 +1,15 @@
----
title:
archive: Архив
category: Категория
tag: Тэг
schedule: Календарь
+ archives: Архив
+ categories: Категории
+ tags: Тэги
+ about: О сайте
+
+author: Автор
+
menu:
home: Главная
archives: Архив
@@ -13,61 +19,73 @@ menu:
search: Поиск
schedule: Календарь
sitemap: Карта сайта
- commonweal: Страница 404
+
sidebar:
overview: Обзор
toc: Содержание
+
post:
+ created: Дата создания записи
+ modified: Дата обновления записи
+ sticky: Ссылка
posted: Размещено
- edited: Изменено
- created: Создано
- modified: Изменено
- edit: Редактировать запись
in: в категории
- more: more
+ more: далее
read_more: Читать полностью
untitled: Без имени
- sticky: Ссылка
toc_empty: Эта запись без оглавления
- views: Просмотров
- comments_count: Комментариев
- related_posts: Похожие записи
- copy_button: Скопировать
- copy_success: Скопировано!
- copy_failure: Ошибка копирования!
+ visitors: Просмотров
+ wordcount: Кол-во слов в статье
+ min2read: Время чтения в минутах
copyright:
author: Автор записи
link: Ссылка на запись
license_title: Информация об авторских правах
- license_content: "Все записи на этом сайте защищены лицензией %s, если не указано дополнительно."
+ license_content: 'Все записи на этом сайте защищены лицензией
+ %s если не указано дополнительно.'
+
page:
totally: Всего
tags: тэги
+
footer:
- powered: "Генератор — %s"
- theme: Тема
- total_views: Всего просмотров
- total_visitors: Всего посетителей
+ powered: "Powered by %s"
+ theme: Theme
+
counter:
tag_cloud:
zero: Нет тэгов.
one: 1 тэг.
+ two: "%d тэга всего."
+ three: "%d тэга всего."
+ four: "%d тэга всего."
other: "%d тэгов всего."
+
categories:
zero: Нет категорий.
one: 1 категория.
+ two: "%d категории всего."
+ three: "%d категории всего."
+ four: "%d категории всего."
other: "%d категорий всего."
+
archive_posts:
zero: Нет записей.
one: 1 запись.
+ two: "%d записи всего."
+ three: "%d записи всего."
+ four: "%d записи всего."
other: "%d записей всего."
+
state:
posts: Архив
pages: Страницы
tags: Тэги
categories: Категории
+
search:
placeholder: Поиск...
+
cheers:
um: Эм..
ok: OK
@@ -75,24 +93,10 @@ cheers:
good: Хорошо
great: Замечательно
excellent: Великолепно
+
keep_on: Продолжаю писать.
+
symbol:
- comma: ", "
- period: ". "
- colon: ": "
-reward:
- donate: Донат
- wechatpay: WeChat Pay
- alipay: Alipay
- bitcoin: Bitcoin
-gitmentbutton: Открыть Gitment комментарии
-accessibility:
- nav_toggle: Показать/скрыть меню
- prev_page: Предыдущая страница
- next_page: Следующая страница
-symbols_count_time:
- count: Кол-во символов в статье
- count_total: Общее кол-во символов
- time: Время чтения
- time_total: Общее время чтения
- time_minutes: мин.
+ comma: ', '
+ period: '. '
+ colon: ':'
diff --git a/themes/next/languages/zh-CN.yml b/_data/languages/zh-Hans.yml
similarity index 55%
rename from themes/next/languages/zh-CN.yml
rename to _data/languages/zh-Hans.yml
index d0c78f2e..3879a38b 100644
--- a/themes/next/languages/zh-CN.yml
+++ b/_data/languages/zh-Hans.yml
@@ -1,101 +1,93 @@
----
title:
archive: 归档
category: 分类
tag: 标签
schedule: 日程表
+ archives: 归档
+ categories: 分类
+ tags: 标签
+ about: 关于
+
+author: 博主
+
menu:
home: 首页
archives: 归档
categories: 分类
- frontends: 前端
- backends: 后端
- tools: 工具
tags: 标签
about: 关于
search: 搜索
schedule: 日程表
sitemap: 站点地图
- commonweal: 公益 404
+ commonweal: 公益404
+
sidebar:
overview: 站点概览
toc: 文章目录
+
post:
+ created: 创建于
+ modified: 更新于
+ sticky: 置顶
posted: 发表于
- edited: 更新于
- created: 创建时间
- modified: 修改时间
- edit: 编辑
in: 分类于
- more: 更多
read_more: 阅读全文
untitled: 未命名
- sticky: 置顶
toc_empty: 此文章未包含目录
- views: 阅读次数
- comments_count: 评论数
- related_posts: 相关文章
- copy_button: 复制
- copy_success: 复制成功
- copy_failure: 复制失败
+ visitors: 阅读次数
+ wordcount: 字数统计
+ min2read: 阅读时长
copyright:
author: 本文作者
link: 本文链接
license_title: 版权声明
- license_content: "本博客所有文章除特别声明外,均采用 %s 许可协议。转载请注明出处!"
+ license_content: '本博客所有文章除特别声明外,均采用
+ %s 许可协议。转载请注明出处!'
+
page:
totally: 共有
tags: 标签
+
footer:
powered: "由 %s 强力驱动"
theme: 主题
- total_views: 总访问量
- total_visitors: 总访客量
+
counter:
tag_cloud:
zero: 暂无标签
one: 目前共计 1 个标签
other: "目前共计 %d 个标签"
+
categories:
zero: 暂无分类
one: 目前共计 1 个分类
other: "目前共计 %d 个分类"
+
archive_posts:
zero: 暂无日志。
one: 目前共计 1 篇日志。
other: "目前共计 %d 篇日志。"
+
state:
posts: 日志
pages: 页面
tags: 标签
categories: 分类
+
search:
placeholder: 搜索...
+
cheers:
um: 嗯..
- ok: 还行
- nice: 不错
+ ok: OK
+ nice: 好
good: 很好
great: 非常好
excellent: 太棒了
+
keep_on: 继续努力。
+
symbol:
- comma: ","
- period: "。"
- colon: ":"
-reward:
- donate: 打赏
- wechatpay: 微信支付
- alipay: 支付宝
- bitcoin: 比特币
-gitmentbutton: 显示 Gitment 评论
-accessibility:
- nav_toggle: 切换导航栏
- prev_page: 上一页
- next_page: 下一页
-symbols_count_time:
- count: 本文字数
- count_total: 站点总字数
- time: 阅读时长
- time_total: 站点阅读时长
- time_minutes: 分钟
+ comma: ', '
+ period: '。 '
+ colon: ':'
diff --git a/themes/next/languages/zh-hk.yml b/_data/languages/zh-hk.yml
similarity index 52%
rename from themes/next/languages/zh-hk.yml
rename to _data/languages/zh-hk.yml
index 0ef571eb..bb067939 100644
--- a/themes/next/languages/zh-hk.yml
+++ b/_data/languages/zh-hk.yml
@@ -1,9 +1,15 @@
----
title:
archive: 歸檔
category: 分類
tag: 標籤
schedule: 日程表
+ archives: 歸檔
+ categories: 分類
+ tags: 標籤
+ about: 關於
+
+author: 博主
+
menu:
home: 首頁
archives: 歸檔
@@ -13,86 +19,75 @@ menu:
search: 檢索
schedule: 日程表
sitemap: 站點地圖
- commonweal: 公益 404
+ commonweal: 公益404
+
sidebar:
overview: 本站概覽
toc: 文章目錄
+
post:
+ created: 創建於
+ modified: 更新於
+ sticky: 置頂
posted: 發表於
- edited: 更新於
- created: 創建時間
- modified: 修改時間
- edit: 編輯
in: 分類於
- more: 更多
read_more: 閱讀全文
untitled: 未命名
- sticky: 置頂
toc_empty: 此文章未包含目錄
- views: 閱讀次數
- comments_count: 評論數
- related_posts: 相關文章
- copy_button: 複製
- copy_success: 複製成功
- copy_failure: 複製失敗
+ visitors: 閱讀次數
+ wordcount: 字數統計
+ min2read: 閱讀時長
copyright:
- author: 博主
- link: 文章連結
- license_title: 版權聲明
- license_content: "本網誌所有文章除特別聲明外,均採用 %s 許可協議。轉載請註明出處!"
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
page:
totally: 共有
tags: 標籤
+
footer:
powered: "由 %s 強力驅動"
theme: 主題
- total_views: 總瀏覽次數
- total_visitors: 訪客總數
+
counter:
tag_cloud:
zero: 暫無標籤
one: 目前共有 1 個標籤
other: "目前共有 %d 個標籤"
+
categories:
zero: 暫無分類
one: 目前共有 1 個分類
other: "目前共有 %d 個分類"
+
archive_posts:
zero: 暫無文章。
one: 目前共有 1 篇文章。
other: "目前共有 %d 篇文章。"
+
state:
posts: 文章
pages: 頁面
tags: 標籤
categories: 分類
+
search:
placeholder: 搜索...
+
cheers:
um: 嗯..
- ok: 還行
+ ok: OK
nice: 好
good: 很好
great: 非常好
- excellent: 太棒了
+ excellent: 激爆好
+
keep_on: 繼續努力。
+
symbol:
- comma: ","
- period: "。"
- colon: ":"
-reward:
- donate: 打賞
- wechatpay: 微信支付
- alipay: 支付寶
- bitcoin: 比特幣
-gitmentbutton: 顯示 Gitment 評論
-accessibility:
- nav_toggle: 切換導航欄
- prev_page: 上一頁
- next_page: 下一頁
-symbols_count_time:
- count: 本文字數
- count_total: 站點總字數
- time: 閱讀時長
- time_total: 站點閱讀時長
- time_minutes: 分鍾
+ comma: ', '
+ period: '。 '
+ colon: ':'
diff --git a/_data/languages/zh-tw.yml b/_data/languages/zh-tw.yml
new file mode 100644
index 00000000..c79b3686
--- /dev/null
+++ b/_data/languages/zh-tw.yml
@@ -0,0 +1,93 @@
+title:
+ archive: 歸檔
+ category: 分類
+ tag: 標籤
+ schedule: 日程表
+ archives: 歸檔
+ categories: 分類
+ tags: 標籤
+ about: 關於
+
+author: 博主
+
+menu:
+ home: 首頁
+ archives: 歸檔
+ categories: 分類
+ tags: 標籤
+ about: 關於
+ search: 檢索
+ schedule: 日程表
+ sitemap: 站點地圖
+ commonweal: 公益404
+
+sidebar:
+ overview: 本站概覽
+ toc: 文章目錄
+
+post:
+ created: 創建於
+ modified: 更新於
+ sticky: 置頂
+ posted: 發表於
+ in: 分類於
+ read_more: 閱讀全文
+ untitled: 未命名
+ toc_empty: 此文章未包含目錄
+ visitors: 閱讀次數
+ wordcount: 字數統計
+ min2read: 閱讀時長
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: 共有
+ tags: 標籤
+
+footer:
+ powered: "由 %s 強力驅動"
+ theme: 主題
+
+counter:
+ tag_cloud:
+ zero: 暫無標籤
+ one: 目前共計 1 個標籤
+ other: "目前共計 %d 個標籤"
+
+ categories:
+ zero: 暫無分類
+ one: 目前共計 1 個分類
+ other: "目前共計 %d 個分類"
+
+ archive_posts:
+ zero: 暫無文章。
+ one: 目前共計 1 篇文章。
+ other: "目前共計 %d 篇文章。"
+
+state:
+ posts: 文章
+ pages: 頁面
+ tags: 標籤
+ categories: 分類
+
+search:
+ placeholder: 搜索...
+
+cheers:
+ um: 嗯..
+ ok: OK
+ nice: 好
+ good: 很好
+ great: 非常好
+ excellent: 非常屌
+
+keep_on: 繼續努力。
+
+symbol:
+ comma: ', '
+ period: '。 '
+ colon: ':'
diff --git a/_includes/_blocks/page_class.html b/_includes/_blocks/page_class.html
new file mode 100644
index 00000000..f2a7e232
--- /dev/null
+++ b/_includes/_blocks/page_class.html
@@ -0,0 +1,12 @@
+{% case page.layout %}
+{% when 'index' %}
+ {% capture page_class %}page-home{% endcapture %}
+{% when 'post' %}
+ {% capture page_class %}page-post-detail{% endcapture %}
+{% when 'page' %}
+ {% capture page_class %}page-post-detail{% endcapture %}
+{% when 'archive' %}
+ {% capture page_class %}page-archive{% endcapture %}
+{% when 'schedule' %}
+ {% capture page_class %}page-post-detail page-calendar{% endcapture %}
+{% endcase %}
diff --git a/_includes/_blocks/script_extra.html b/_includes/_blocks/script_extra.html
new file mode 100644
index 00000000..4dbb0ef6
--- /dev/null
+++ b/_includes/_blocks/script_extra.html
@@ -0,0 +1,23 @@
+{% case page.layout %}
+{% when 'post' %}
+ {% capture script_extra %}{% include _scripts/pages/post-details.html %}{% endcapture %}
+{% when 'archive' %}
+ {% capture script_extra %}
+ {% if site.use_motion %}
+
+ {% endif %}
+ {% include _scripts/pages/pagination.html %}
+ {% endcapture %}
+{% when 'category' %}
+ {% capture script_extra %}
+ {% include _scripts/pages/pagination.html %}
+ {% endcapture %}
+{% when 'tag' %}
+ {% capture script_extra %}
+ {% include _scripts/pages/pagination.html %}
+ {% endcapture %}
+{% else %}
+ {% capture script_extra %}{% include _scripts/pages/post-details.html %}{% endcapture %}
+{% endcase %}
diff --git a/_includes/_blocks/sidebar.html b/_includes/_blocks/sidebar.html
new file mode 100644
index 00000000..8c1600ed
--- /dev/null
+++ b/_includes/_blocks/sidebar.html
@@ -0,0 +1,23 @@
+{% case page.layout %}
+{% when 'index' %}
+ {% assign is_post = false %}
+ {% capture sidebar %}{% include _macro/sidebar.html %}{% endcapture %}
+{% when 'post' %}
+ {% assign is_post = true %}
+ {% capture sidebar %}{% include _macro/sidebar.html %}{% endcapture %}
+{% when 'page' %}
+ {% assign is_post = false %}
+ {% capture sidebar %}{% include _macro/sidebar.html %}{% endcapture %}
+{% when 'archive' %}
+ {% assign is_post = false %}
+ {% capture sidebar %}{% include _macro/sidebar.html %}{% endcapture %}
+{% when 'category' %}
+ {% assign is_post = false %}
+ {% capture sidebar %}{% include _macro/sidebar.html %}{% endcapture %}
+{% when 'tag' %}
+ {% assign is_post = false %}
+ {% capture sidebar %}{% include _macro/sidebar.html %}{% endcapture %}
+{% when 'schedule' %}
+ {% assign is_post = false %}
+ {% capture sidebar %}{% include _macro/sidebar.html %}{% endcapture %}
+{% endcase %}
diff --git a/_includes/_blocks/title.html b/_includes/_blocks/title.html
new file mode 100644
index 00000000..f2aec268
--- /dev/null
+++ b/_includes/_blocks/title.html
@@ -0,0 +1,29 @@
+{% case page.layout %}
+{% when 'index' %}
+ {% capture title %}{{ site.title }}{% if site.index_with_subtitle and site.subtitle %} - {{site.subtitle }}{% endif %}{% endcapture %}
+{% when 'post' %}
+ {% capture title %}{{ page.title }} | {{ site.title }}{% endcapture %}
+{% when 'page' %}
+ {% capture title %}
+ {% assign page_title_suffix = ' | ' | append: site.title %}
+ {% if page.type == "categories" and page.title == nil %}
+ {{ __.title.categories | append: page_title_suffix }}
+ {% elsif page.type == "tags" and page.title == nil %}
+ {{ __.title.tags | append: page_title_suffix }}
+ {% elsif page.type == "about" and page.title == nil %}
+ {{ __.title.about | append: page_title_suffix }}
+ {% else %}
+ {{ page.title | append: page_title_suffix }}
+ {% endif %}
+ {% endcapture %}
+{% when 'archive' %}
+ {% capture title %}{{ __.title.archives }} | {{ site.title }}{% endcapture %}
+{% when 'category' %}
+ {% capture title %}{{ __.title.category }} | {{ site.title }}{% endcapture %}
+{% when 'tag' %}
+ {% capture title %}{{ __.title.tag }} | {{ site.title }}{% endcapture %}
+{% when 'schedule' %}
+ {% capture title %}{{ __.title.schedule }} | {{ site.title }}{% endcapture %}
+{% endcase %}
+
+{% assign title = title | strip_newlines %}
diff --git a/themes/next/layout/_custom/header.swig b/_includes/_custom/header.html
similarity index 100%
rename from themes/next/layout/_custom/header.swig
rename to _includes/_custom/header.html
diff --git a/themes/next/layout/_custom/sidebar.swig b/_includes/_custom/sidebar.html
similarity index 100%
rename from themes/next/layout/_custom/sidebar.swig
rename to _includes/_custom/sidebar.html
diff --git a/_includes/_helper/_config_map.html b/_includes/_helper/_config_map.html
new file mode 100644
index 00000000..2e71a5cc
--- /dev/null
+++ b/_includes/_helper/_config_map.html
@@ -0,0 +1,23 @@
+{% comment %} _config_map(include.key, include.value, include.deep, include.key_prefix) {% endcomment %}
+{% capture _config_map %}
+ {% if include.key != '' and include.key != nil and include.deep <= 3 %}
+ {% assign value_type = include.value | jsonify | slice: 0 %}
+ {% if value_type == '{' %}
+ {% for key_value in include.value %}
+ {% assign key = key_value[0] %}
+ {% assign value = key_value[1] %}
+ {% assign deep = include.deep | plus: 1 %}
+ {% capture key_prefix %}{{ include.key_prefix }}{{ include.key }}.{% endcapture %}
+ {% include _helper/_config_map.html key=key value=value deep=deep key_prefix=key_prefix %}
+ {{ _config_map }}
+ {% endfor %}
+ {% elsif value_type != '[' %}
+ {% assign value = include.value | jsonify %}
+ {% if value != '{}' and value != '[]' %}
+ '{{ include.key_prefix }}{{ include.key }}': {{ value }},
+ {% endif %}
+ {% endif %}
+ {% endif %}
+{% endcapture %}
+
+{% assign _config_map = _config_map | normalize_whitespace %}
\ No newline at end of file
diff --git a/_includes/_helper/_toc.html b/_includes/_helper/_toc.html
new file mode 100644
index 00000000..41def9b8
--- /dev/null
+++ b/_includes/_helper/_toc.html
@@ -0,0 +1,45 @@
+{% comment %} _toc(class, list_number, include.source, include.level, include.number_prefix) {% endcomment %}
+{% capture _toc %}
+ {% if include.level <= 6 %}
+ {% assign tag_begin = ''%}
+ {% assign tmp = block | split: tag_end %}
+ {% assign source = tmp[1] | strip %}
+
+ {% assign tmp = tmp[0] | strip | split: '>' %}
+ {% assign toc_title = tmp | shift | join: '>' | strip_html %}
+
+ {% assign tmp = tmp[0] | strip | split: 'id=' %}
+ {% assign id = tmp[1] | strip | replace: '"', '' %}
+
+
+
+ {% if list_number %}
+ {{ include.number_prefix }}{{ forloop.index }}
+ {% endif %}
+ {{ toc_title }}
+
+
+ {% capture number_prefix %}{{ include.number_prefix }}{{ forloop.index }}.{% endcapture %}
+ {% assign level = include.level | plus: 1 %}
+ {% include _helper/_toc.html source=source level=level number_prefix=number_prefix %}
+ {% if _toc.size != 0 %}
+
+ {{ _toc }}
+
+ {% endif %}
+
+ {% endfor %}
+ {% endif %}
+ {% endif %}
+{% endcapture %}
+
+{% assign _toc = _toc | normalize_whitespace %}
\ No newline at end of file
diff --git a/_includes/_helper/config_map.html b/_includes/_helper/config_map.html
new file mode 100644
index 00000000..2c750494
--- /dev/null
+++ b/_includes/_helper/config_map.html
@@ -0,0 +1,18 @@
+{% comment %} config_map() {% endcomment %}
+{% capture config_map %}
+(
+ {% assign exclude_keys = 'source, time, data, documents, github, related_posts, posts, pages, static_files, html_pages, html_files, collections, categories, tags, kramdown' | split: ', ' %}
+ {% assign keys = '' | split: '' %}
+ {% for site_key in site %}
+ {% unless exclude_keys contains site_key %}
+ {% assign keys = keys | push: site_key %}
+ {% assign key = site_key %}
+ {% assign value = site[site_key] %}
+ {% include _helper/_config_map.html key=key value=value deep=1 key_prefix='' %}
+ {{ _config_map }}
+ {% endunless %}
+ {% endfor %}
+)
+{% endcapture %}
+
+{% assign config_map = config_map | normalize_whitespace %}
\ No newline at end of file
diff --git a/_includes/_helper/lineno.html b/_includes/_helper/lineno.html
new file mode 100644
index 00000000..34026842
--- /dev/null
+++ b/_includes/_helper/lineno.html
@@ -0,0 +1,29 @@
+{% comment %} lineno(source) {% endcomment %}
+{% assign block_begin = '' %}
+{% assign block_end = '
' %}
+
+{% comment %} This tag isn't in the site which is built locally. I don't know why? {% endcomment %}
+{% assign div_tag_begin = '' %}
+{% assign div_tag_end = '' %}
+{% unless source contains '' %}
+ {% assign div_tag_begin = '' %}
+ {% assign div_tag_end = '' %}
+{% endunless %}
+
+{% assign blocks = source | split: block_begin | shift %}
+{% for block in blocks %}
+ {% assign code_content = block | split: block_end | first | prepend: block_begin | append: block_end %}
+ {% assign line_count = code_content | newline_to_br | split: '
' | size | minus: 1 %}
+ {% assign lineno = '' %}
+ {% for no in (1..line_count) %}
+ {% if no == 1 %}
+ {% assign lineno = '1' %}
+ {% else %}
+ {% assign lineno = lineno | append: '
' | append: no %}
+ {% endif %}
+ {% endfor %}
+ {% capture code_content_with_lineno %}{{ div_tag_begin }}{{ lineno }}
{{ code_content }}
{{ div_tag_end }}{% endcapture %}
+ {% assign source = source | replace: code_content, code_content_with_lineno %}
+{% endfor %}
+
+{% assign lineno = source %}
\ No newline at end of file
diff --git a/_includes/_helper/list_categories.html b/_includes/_helper/list_categories.html
new file mode 100644
index 00000000..ce35af7f
--- /dev/null
+++ b/_includes/_helper/list_categories.html
@@ -0,0 +1,14 @@
+{% comment %} list_categories(paginator, prev_text, next_text) {% endcomment %}
+{% capture list_categories %}
+
+ {% for cat_posts in site.categories %}
+ -
+ {% assign cat = cat_posts[0] %}
+ {% assign posts = cat_posts[1] %}
+ {% assign cat_url_encode = cat | url_encode | replace: '+', '%20' %}
+ {{ cat }}
+ {{ posts.size }}
+
+ {% endfor %}
+
+{% endcapture %}
diff --git a/_includes/_helper/open_graph.html b/_includes/_helper/open_graph.html
new file mode 100644
index 00000000..ef31228f
--- /dev/null
+++ b/_includes/_helper/open_graph.html
@@ -0,0 +1,125 @@
+{% comment %} open_graph(twitter_id, google_plus, fb_admins, fb_app_id) {% endcomment %}
+{% capture open_graph %}
+ {% assign default_images = '' | split: '' %}
+ {% assign images = page.photos | default: default_images %}
+ {% assign page_content = page.content %}
+ {% assign description = page.description | default: page.excerpt | default: page_content | default: site.description %}
+
+ {% if page.tags and page.tags.size != 0 %}{% assign page_tags = page.tags | join: ', ' %}{% endif %}
+ {% assign keywords = page.keywords | default: page_tags | default: site.keywords %}
+
+ {% if page.layout == 'post' %}
+ {% assign type = 'article' %}
+ {% else %}
+ {% assign type = 'website' %}
+ {% endif %}
+
+ {% assign url = page.url | absolute_url %}
+ {% assign og_title = page.title | default: site.title %}
+ {% assign site_name = site.title %}
+ {% assign language = page.language | default: site.language %}
+ {% assign updated = page.updated %}
+ {% assign twitter_card = 'summary' %}
+
+ {% if description %}
+ {% assign description = description | strip_html | strip |
+ replace: '<', '<' |
+ replace: '>', '>' |
+ replace: '&', '&' |
+ replace: '"', '"' |
+ replace: "'", ''' |
+ replace: '\n', ' ' %}
+ {% endif %}
+
+ {% if images.size == 0 and page_content %}
+ {% assign imgs = page_content | strip | split: '
+
+ {% endif %}
+
+ {% if keywords %}
+
+
+ {% endif %}
+
+
+
+
+
+
+ {% if description %}
+
+
+ {% endif %}
+
+ {% if language %}
+
+
+ {% endif %}
+
+ {% for image in images %}
+
+
+ {% endfor %}
+
+ {% if updated %}
+
+
+ {% endif %}
+
+
+
+
+ {% if description %}
+
+
+ {% endif %}
+
+ {% if images.size != 0 %}
+
+
+ {% endif %}
+
+ {% if twitter_id %}
+ {% if twitter_id[0] != '@' %}
+ {% assign twitter_id = '@' | append: twitter_id %}
+ {% endif %}
+
+
+ {% endif %}
+
+ {% if twitter_site %}
+
+
+ {% endif %}
+
+ {% if google_plus %}
+
+
+ {% endif %}
+
+ {% if fb_admins %}
+
+
+ {% endif %}
+
+ {% if fb_app_id %}
+
+
+ {% endif %}
+
+{% endcapture %}
+{% assign lines = open_graph | normalize_whitespace | split: '' %}
+{% capture open_graph %}{% for line in lines %}
+{{ line | strip }}{% endfor %}{% endcapture %}
diff --git a/_includes/_helper/paginator.html b/_includes/_helper/paginator.html
new file mode 100644
index 00000000..6baf185b
--- /dev/null
+++ b/_includes/_helper/paginator.html
@@ -0,0 +1,72 @@
+{% comment %} paginator(paginator, prev_text, next_text) {% endcomment %}
+{% capture paginator %}
+ {% assign end_size = 1 %}
+ {% assign mid_size = 1 %}
+ {% assign current = paginator.page %}
+ {% capture current_page %}
+ {{ current }}
+ {% endcapture %}
+ {% if paginator.previous_page %}
+ {{ prev_text }}
+ {% endif %}
+
+ {% assign total = paginator.total_pages %}
+
+ {% assign left_end = end_size %}
+ {% assign right_end = total | minus: end_size | plus: 1 %}
+ {% assign left_mid = current | minus: mid_size %}
+ {% assign right_mid = current | plus: mid_size %}
+
+ {% if left_end >= current %}{% assign left_end = current | minus: 1 %}{% endif %}
+
+ {% assign current_plus_one = current | plus: 1 %}
+ {% if right_end <= current_plus_one %}{% assign right_end = current_plus_one %}{% endif %}
+
+ {% if left_mid <= end_size %}{% assign left_mid = left_mid | plus: end_size %}{% endif %}
+
+ {% assign total_minus_end_size = total | minus: end_size %}
+ {% if right_mid > total_minus_end_size %}{% assign right_mid = right_mid | minus: end_size %}{% endif %}
+
+ {% assign space_html = '…' %}
+
+ {% for i in (1..left_end) %}
+ {% assign href = site.paginate_path | relative_url | replace: '//', '/' | replace: ':num', i %}
+ {% if i == 1 %}
+ {% assign href = "/" | relative_url %}
+ {% endif %}
+ {{ i }}
+ {% endfor %}
+
+ {% assign current_minus_end_size_minus_mid_size = current | minus: end_size | minus: mid_size %}
+ {% if current_minus_end_size_minus_mid_size > 1 %}
+ {{ space_html }}
+ {% endif %}
+
+ {% assign current_minus_one = current | minus: 1 %}
+ {% if left_mid > left_end %}
+ {% for i in (left_mid..current_minus_one) %}
+ {{ i }}
+ {% endfor %}
+ {% endif %}
+ {{ current_page }}
+
+ {% if right_mid < right_end %}
+ {% for i in (current_plus_one..right_mid) %}
+ {{ i }}
+ {% endfor %}
+ {% endif %}
+
+ {% assign total_minus_end_size_minus_mid_size = total_minus_end_size | minus: mid_size %}
+ {% if total_minus_end_size_minus_mid_size > current %}
+ {{ space_html }}
+ {% endif %}
+
+ {% for i in (right_end..total) %}
+ {{ i }}
+ {% endfor %}
+
+ {% if current < total %}
+ {{ next_text }}
+ {% endif %}
+{% endcapture %}
+{% assign paginator = paginator | normalize_whitespace %}
diff --git a/_includes/_helper/tagcloud.html b/_includes/_helper/tagcloud.html
new file mode 100644
index 00000000..ab5ae20a
--- /dev/null
+++ b/_includes/_helper/tagcloud.html
@@ -0,0 +1,58 @@
+{% comment %} tagcloud(min_font, max_font, amount, color, start_color, end_color) {% endcomment %}
+{% capture tagcloud %}
+ {% assign tags = site.tags %}
+ {% assign max = max_font %}
+ {% assign min = min_font %}
+ {% assign sizes = '' | split: '' %}
+ {% assign unit = 'px' %}
+ {% assign start_color = start_color | split: ',' %}
+ {% assign end_color = end_color | split: ',' %}
+
+ {% for tag in tags %}
+ {% if forloop.index > amount %}
+ {% break %}
+ {% endif %}
+ {% assign sizes = sizes | push: tag[1].size %}
+ {% endfor %}
+
+ {% assign sizes = sizes | uniq | sort %}
+ {% assign length = sizes.size | minus: 1 %}
+
+ {% for tag in tags %}
+ {% if forloop.index > amount %}
+ {% break %}
+ {% endif %}
+
+ {% assign ratio = 0 %}
+
+ {% if length > 0 %}
+ {% for size in sizes %}
+ {% if size == tag[1].size %}
+ {% assign ratio = forloop.index0 | times: 1.0 | divided_by: length %}
+ {% break %}
+ {% endif %}
+ {% endfor %}
+ {% endif %}
+
+ {% assign tmp = max | minus: min | times: ratio %}
+ {% assign size = tmp | plus: min %}
+ {% assign tmp = size | round: 2 %}
+
+ {% assign style = 'font-size: ' | append: tmp | append: unit | append: ';' %}
+
+ {% if color %}
+ {% assign mid_color = '' | split: '' %}
+ {% for i in (0..2) %}
+ {% assign tmp = end_color[i] | minus: start_color[i] | times: ratio %}
+ {% assign tmp = start_color[i] | plus: tmp | round %}
+ {% assign mid_color = mid_color | push: tmp %}
+ {% endfor %}
+ {% assign mid_color = 'rgb(' | append: mid_color[0] | append: ',' | append: mid_color[1] | append: ',' | append: mid_color[2] | append: ')' %}
+ {% assign style = style | append: 'color: ' | append: mid_color %}
+ {% endif %}
+ {% assign tag_url_encode = tag[0] | url_encode | replace: '+', '%20' %}
+ {{ tag[0] }}
+ {% endfor %}
+
+{% endcapture %}
+{% assign tagcloud = tagcloud | normalize_whitespace %}
diff --git a/_includes/_helper/toc.html b/_includes/_helper/toc.html
new file mode 100644
index 00000000..31079bf8
--- /dev/null
+++ b/_includes/_helper/toc.html
@@ -0,0 +1,10 @@
+{% comment %} toc(source, class, list_number) {% endcomment %}
+{% include _helper/_toc.html source=source level=1 number_prefix='' %}
+{% assign toc = _toc | normalize_whitespace %}
+{% if toc.size != 0 %}
+ {% capture toc %}
+
+ {{ toc }}
+
+ {% endcapture %}
+{% endif %}
diff --git a/_includes/_helper/wordcount.html b/_includes/_helper/wordcount.html
new file mode 100644
index 00000000..4b62f598
--- /dev/null
+++ b/_includes/_helper/wordcount.html
@@ -0,0 +1,28 @@
+{% comment %} wordcount(source) {% endcomment %}
+{% assign source = source | strip_html | strip_newlines %}
+{% assign no_english_source = source | upcase %}
+{% assign no_english_source = no_english_source | remove: 'A' | remove: 'B' | remove: 'C' %}
+{% assign no_english_source = no_english_source | remove: 'D' | remove: 'E' | remove: 'F' %}
+{% assign no_english_source = no_english_source | remove: 'G' | remove: 'H' | remove: 'I' %}
+{% assign no_english_source = no_english_source | remove: 'J' | remove: 'K' | remove: 'L' %}
+{% assign no_english_source = no_english_source | remove: 'M' | remove: 'N' | remove: 'O' %}
+{% assign no_english_source = no_english_source | remove: 'P' | remove: 'Q' | remove: 'R' %}
+{% assign no_english_source = no_english_source | remove: 'S' | remove: 'T' | remove: 'U' %}
+{% assign no_english_source = no_english_source | remove: 'V' | remove: 'W' | remove: 'X' %}
+{% assign no_english_source = no_english_source | remove: 'Y' | remove: 'Z' %}
+
+{% assign no_english_source = no_english_source | remove: ' ' | remove: '"' | remove: '.' | remove: ',' %}
+{% assign no_english_source = no_english_source | remove: '?' | remove: ':' | remove: ';' | remove: "'" %}
+{% assign no_english_source = no_english_source | remove: '<' | remove: '>' | remove: '[' | remove: '']' %}
+{% assign no_english_source = no_english_source | remove: '{' | remove: '}' | remove: '\' | remove: '/' %}
+{% assign no_english_source = no_english_source | remove: '(' | remove: ')' | remove: '!' | remove: '-' %}
+
+{% assign no_english_source = no_english_source | remove: '。' | remove: ',' | remove: '?' | remove: '…' %}
+{% assign no_english_source = no_english_source | remove: '“' | remove: '”' | remove: '《' | remove: '》' %}
+{% assign no_english_source = no_english_source | remove: '【' | remove: '】' | remove: '‘' | remove: '’' %}
+{% assign no_english_source = no_english_source | remove: ':' | remove: ';' | remove: '「' | remove: '」' %}
+{% assign no_english_source = no_english_source | remove: '!' | remove: '—' | remove: '、' | remove: '·' %}
+
+{% assign no_english_wordcount = no_english_source | size %}
+{% assign english_wordcount = source | number_of_words %}
+{% assign wordcount = no_english_wordcount | plus: english_wordcount %}
diff --git a/_includes/_layout.html b/_includes/_layout.html
new file mode 100644
index 00000000..fdb739e0
--- /dev/null
+++ b/_includes/_layout.html
@@ -0,0 +1,86 @@
+
+{% include _blocks/title.html %}
+{% include _blocks/page_class.html %}
+{% include _blocks/sidebar.html %}
+{% include _blocks/script_extra.html %}
+
+{% assign html_class = 'theme-next ' | append: site.scheme %}
+{% if site.use_motion %}
+ {% assign html_class = html_class | append: ' use-motion' %}
+{% endif %}
+
+
+
+ {% include _partials/head.html %}
+ {{ title }}
+ {% include _third-party/analytics/index.html %}
+
+
+
+
+ {% assign container_class = "container " %}
+ {% if site.sidebar.position %}
+ {% assign container_class = container_class | append: 'sidebar-position-' | append: site.sidebar.position %}
+ {% endif %}
+
+
+
+
+
+ {% include _partials/header.html %}
+
+
+
+
+
+
+ {{ content }}
+
+ {% include _third-party/duoshuo-hot-articles.html %}
+ {% include _partials/comments.html %}
+
+ {% if site.sidebar.display != 'remove' %}
+ {{ sidebar }}
+ {% endif %}
+
+
+
+
+
+ {% unless site.sidebar.b2t %}
+
+
+ {% if site.sidebar.scrollpercent %}
+ 0%
+ {% endif %}
+
+ {% endunless %}
+
+
+
+ {% include _scripts/vendors.html %}
+ {% include _scripts/commons.html %}
+
+ {% assign scheme_script = '_scripts/schemes/' | append: site.scheme | downcase | append: '.html' %}
+ {% include {{ scheme_script }} %}
+
+ {{ script_extra }}
+
+ {% include _scripts/boostrap.html %}
+
+ {% include _third-party/comments/index.html %}
+ {% include _third-party/search/index.html %}
+ {% include _third-party/analytics/lean-analytics.html %}
+ {% include _third-party/seo/baidu-push.html %}
+ {% include _third-party/rating.html %}
+ {% include _third-party/mathjax.html %}
+ {% include _third-party/scroll-cookie.html %}
+ {% include _third-party/exturl.html %}
+
+
diff --git a/_includes/_macro/post-collapse.html b/_includes/_macro/post-collapse.html
new file mode 100644
index 00000000..388157d4
--- /dev/null
+++ b/_includes/_macro/post-collapse.html
@@ -0,0 +1,31 @@
+{% comment %} post-collapse(post) {% endcomment %}
+
+
+
+ <{% if site.seo %}h3{% else %}h2{% endif %} class="post-title">
+ {% if post.link %}{% comment %} Link posts {% endcomment %}
+
+ {{ post.title | default: post.link }}
+
+
+ {% else %}
+
+ {% if post.type == 'picture' %}
+ {{ post.content }}
+ {% else %}
+ {{ post.title | default: __.post.untitled }}
+ {% endif %}
+
+ {% endif %}
+ {% if site.seo %}h3{% else %}h2{% endif %}>
+
+
+
+
+
diff --git a/_includes/_macro/post-content.html b/_includes/_macro/post-content.html
new file mode 100644
index 00000000..1ebdce80
--- /dev/null
+++ b/_includes/_macro/post-content.html
@@ -0,0 +1,7 @@
+{% if site.highlight.line_number %}
+ {% assign source = post.content %}
+ {% include _helper/lineno.html %}
+ {{ lineno }}
+{% else %}
+ {{ post.content }}
+{% endif %}
\ No newline at end of file
diff --git a/_includes/_macro/post-copyright.html b/_includes/_macro/post-copyright.html
new file mode 100644
index 00000000..3b64d301
--- /dev/null
+++ b/_includes/_macro/post-copyright.html
@@ -0,0 +1,16 @@
+{% if site.post_copyright.enable %}
+
+ -
+ {{ __.post.copyright.link | append: __.symbol.colon }}
+ {{ post.url | absolute_url }}
+
+ -
+ {{ __.post.copyright.license_title | append: __.symbol.colon }}
+ {{ __.post.copyright.license_content | replace_first: '%s', site.post_copyright.license_url | replace_first: '%s', site.post_copyright.license }}
+
+
+{% endif %}
diff --git a/_includes/_macro/post-excerpt.html b/_includes/_macro/post-excerpt.html
new file mode 100644
index 00000000..c89eb570
--- /dev/null
+++ b/_includes/_macro/post-excerpt.html
@@ -0,0 +1,7 @@
+{% if site.highlight.line_number %}
+ {% assign source = post.excerpt %}
+ {% include _helper/lineno.html %}
+ {{ lineno }}
+{% else %}
+ {{ post.excerpt }}
+{% endif %}
\ No newline at end of file
diff --git a/_includes/_macro/post.html b/_includes/_macro/post.html
new file mode 100644
index 00000000..0036aabf
--- /dev/null
+++ b/_includes/_macro/post.html
@@ -0,0 +1,431 @@
+{% comment %} post(post, is_index, post_extra_class) {% endcomment %}
+
+ {% if 'quote, picture' contains post.type %}
+ {% assign headlessPost = true %}
+ {% endif %}
+
+ {% assign post_class = 'post post-type-' | append: post.type | default: 'normal' %}
+ {% assign post_class = post_class | append: ' ' | append: post_extra_class | default: '' %}
+ {% if post.sticky > 0 %}
+ {% assign post_class = post_class | append: ' ' | append: 'post-sticky' %}
+ {% endif %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% unless headlessPost %}
+
+
+ {% comment %} % Not to show title for quote posts that do not have a title {% endcomment %}
+ {% unless is_index and post.type == 'quote' and post.title == nil %}
+ <{% if site.seo %}h2{% else %}h1{% endif %} class="post-title" itemprop="name headline">
+ {% comment %} Link posts {% endcomment %}
+ {% if post.link %}
+ {% if post.sticky > 0 %}
+ {{ post.sticky }}
+
+
+
+ {% endif %}
+
+ {% if post.title %}{{ post.title }}{% else %}{{ post.link }}{% endif %}
+
+
+ {% else %}
+ {% if is_index %}
+ {% if post.sticky > 0 %}
+
+
+
+ {% endif %}
+
+ {{ post.title | default: __.post.untitled }}
+
+ {% else %}{{ post.title }}{% endif %}
+ {% endif %}
+ {% if site.seo %}h2{% else %}h1{% endif %}>
+ {% endunless %}
+
+
+
+ {% endunless %}
+
+
+
+ {% comment %} Gallery support {% endcomment %}
+ {% if post.photos and post.photos.size > 0 %}
+
+ {% assign COLUMN_NUMBER = 3 %}
+ {% for photo in post.photos %}
+ {% assign index0_modulo_COLUMN_NUMBER = forloop.index0 | modulo: COLUMN_NUMBER %}
+ {% if index0_modulo_COLUMN_NUMBER == 0 %}{% endif %}
+
+
+
+ {% if index0_modulo_COLUMN_NUMBER == 2 %}{% endif %}
+ {% endfor %}
+
+ {% comment %} Append end tag for `post-gallery-row` when (photos size mod COLUMN_NUMBER) is less than COLUMN_NUMBER {% endcomment %}
+ {% assign photos_size_modulo_COLUMN_NUMBER = post.photos.size | modulo: COLUMN_NUMBER %}
+ {% if photos_size_modulo_COLUMN_NUMBER > 0 %}{% endif %}
+
+ {% endif %}
+
+ {% if is_index %}
+ {% if post.description and site.excerpt_description %}
+ {{ post.description }}
+
+
+
+ {% elsif post.excerpt %}
+ {% include _macro/post-excerpt.html %}
+
+
+
+ {% elsif site.auto_excerpt.enable %}
+ {% assign content = post.content | strip_html %}
+ {{ content | slice: 0, site.auto_excerpt.length }}
+ {% if content.size > site.auto_excerpt.length %}...{% endif %}
+
+
+
+ {% else %}
+ {% if post.type == 'picture' %}
+ {{ post.content }}
+ {% else %}
+ {% include _macro/post-content.html %}
+ {% endif %}
+ {% endif %}
+ {% else %}
+ {% include _macro/post-content.html %}
+ {% endif %}
+
+
+
+ {% unless is_index %}
+ {% include _macro/wechat-subscriber.html %}
+ {% endunless %}
+
+
+
+ {% unless is_index %}
+ {% include _macro/reward.html %}
+ {% endunless %}
+
+
+
+ {% unless is_index %}
+ {% include _macro/post-copyright.html %}
+ {% endunless %}
+
+
+
+
diff --git a/_includes/_macro/reward.html b/_includes/_macro/reward.html
new file mode 100644
index 00000000..76f4f5a2
--- /dev/null
+++ b/_includes/_macro/reward.html
@@ -0,0 +1,22 @@
+{% if site.alipay or site.wechatpay %}
+
+ {{ site.reward_comment }}
+
+
+
+{% endif %}
diff --git a/_includes/_macro/sidebar.html b/_includes/_macro/sidebar.html
new file mode 100644
index 00000000..6dfa5904
--- /dev/null
+++ b/_includes/_macro/sidebar.html
@@ -0,0 +1,179 @@
+{% comment %} sidebar(is_post) {% endcomment %}
+
+
+
+
diff --git a/_includes/_macro/wechat-subscriber.html b/_includes/_macro/wechat-subscriber.html
new file mode 100644
index 00000000..1bf2b2f5
--- /dev/null
+++ b/_includes/_macro/wechat-subscriber.html
@@ -0,0 +1,6 @@
+{% if site.wechat_subscriber.enabled %}
+
+
+ {{ site.wechat_subscriber.description }}
+
+{% endif %}
diff --git a/_includes/_partials/comments.html b/_includes/_partials/comments.html
new file mode 100644
index 00000000..939ff0f2
--- /dev/null
+++ b/_includes/_partials/comments.html
@@ -0,0 +1,39 @@
+{% if page.comments %}
+
+ {% if site.duoshuo and site.duoshuo.shortname or site.duoshuo_shortname %}
+
+
+ {% elsif site.facebook_sdk.enable and site.facebook_comments_plugin.enable %}
+
+
+ {% elsif site.vkontakte_api.enable and site.vkontakte_api.comments %}
+
+ {% elsif site.disqus.enable %}
+
+
+
+ {% elsif site.hypercomments_id %}
+
+ {% elsif site.gentie_productKey %}
+
+ {% elsif site.gitalk.enable %}
+
+ {% elsif site.youyan_uid %}
+
+ {% elsif site.livere_uid %}
+
+ {% elsif site.changyan.appid and site.changyan.appkey %}
+
+ {% elsif site.wildfire.enable %}
+
+ {% endif %}
+
+{% endif %}
diff --git a/_includes/_partials/footer.html b/_includes/_partials/footer.html
new file mode 100644
index 00000000..d9e4af22
--- /dev/null
+++ b/_includes/_partials/footer.html
@@ -0,0 +1,23 @@
+
+ {% assign current = site.time | date: '%Y' %}
+ {% assign since = site.since | downcase %}
+ © {% if site.since and since != current %} {{ since }} - {% endif %}
+ {{ current }}
+
+
+
+
+
+
+{% if site.copyright %}
+
+ {{ __.footer.powered | replace: '%s', 'Jekyll') }}
+
+
+
+ {{ __.footer.theme }} -
+
+ NexT.{{ site.scheme }}
+
+
+{% endif %}
diff --git a/_includes/_partials/head.html b/_includes/_partials/head.html
new file mode 100644
index 00000000..70de6fb7
--- /dev/null
+++ b/_includes/_partials/head.html
@@ -0,0 +1,135 @@
+
+
+
+
+
+{% if site.pace %}
+ {% assign pace_css_uri = site.vendors._internal | append: '/pace/'| append: site.pace_theme | append: '.min.css?v=1.0.2' | relative_url %}
+ {% assign pace_js_uri = site.vendors._internal | append: '/pace/pace.min.js?v=1.0.2' | relative_url %}
+ {% if site.vendors.pace %}
+ {% assign pace_js_uri = site.vendors.pace %}
+ {% endif %}
+ {% if site.vendors.pace_css %}
+ {% assign pace_css_uri = site.vendors.pace_css %}
+ {% endif %}
+
+
+{% endif %}
+
+
+{% if site.han %}
+ {% assign Han_uri = site.vendors._internal | append: '/Han/dist/han.min.css?v=3.3' | relative_url %}
+ {% if site.vendors.Han %}
+ {% assign Han_uri = site.vendors.Han %}
+ {% endif %}
+
+{% endif %}
+
+
+{% comment %} #238, Disable Baidu tranformation {% endcomment %}
+
+
+
+
+{% if site.google_site_verification %}
+
+{% endif %}
+
+
+{% if site.yandex_site_verification %}
+
+{% endif %}
+
+
+{% if site.baidu_site_verification %}
+
+{% endif %}
+
+
+{% if site.qihu_site_verification %}
+
+{% endif %}
+
+
+{% if site.fancybox %}
+ {% assign fancybox_css_uri = site.vendors._internal | append: '/fancybox/source/jquery.fancybox.css?v=2.1.5' | relative_url %}
+ {% if site.vendors.fancybox_css %}
+ {% assign fancybox_css_uri = site.vendors.fancybox_css %}
+ {% endif %}
+
+{% endif %}
+
+{% include _partials/head/external-fonts.html %}
+
+{% assign font_awesome_uri = site.vendors._internal | append: '/font-awesome/css/font-awesome.min.css?v=4.6.2' | relative_url %}
+{% if site.vendors.fontawesome %}
+ {% assign font_awesome_uri = site.vendors.fontawesome %}
+{% endif %}
+
+
+
+
+{% if page.keywords %}
+
+{% elsif page.tags and page.tags | size != 0 %}
+
+{% elsif site.keywords %}
+
+{% endif %}
+
+{% assign site_rss = site.rss %}
+{% if site.feed and site.feed.path and site.rss == '' or site.rss == nil %}
+ {% assign site_rss = site.feed.path %}
+{% endif %}
+{% if site_rss %}
+
+{% endif %}
+
+
+{% if site.favicon %}
+
+{% endif %}
+
+
+{% if site.facebook_sdk.enable and site.facebook_sdk.webmaster %}
+
+
+{% endif %}
+
+
+{% assign twitter_id = site.twitter %}
+{% assign google_plus = site.google_plus %}
+{% assign fb_admins = site.fb_admins %}
+{% assign fb_app_id = site.fb_app_id %}
+{% include _helper/open_graph.html %}
+{{ open_graph }}
+
+{% comment %} Export some HEXO Configurations to Front-End {% endcomment %}
+
+
+{% comment %} Canonical, good for google search engine (SEO) : https://support.google.com/webmasters/answer/139066 {% endcomment %}
+{% if site.canonical %}
+
+{% endif %}
+
+{% include _partials/head/custom-head.html %}
diff --git a/_includes/_partials/head/custom-head.html b/_includes/_partials/head/custom-head.html
new file mode 100644
index 00000000..ce990b74
--- /dev/null
+++ b/_includes/_partials/head/custom-head.html
@@ -0,0 +1,3 @@
+{% comment %}
+Custom head.
+{% endcomment %}
diff --git a/_includes/_partials/head/external-fonts.html b/_includes/_partials/head/external-fonts.html
new file mode 100644
index 00000000..d065853b
--- /dev/null
+++ b/_includes/_partials/head/external-fonts.html
@@ -0,0 +1,51 @@
+{% if site.font.enable %}
+
+ {% assign font_config = site.font %}
+ {% assign font_families = '' %}
+ {% assign font_styles = ':300,300italic,400,400italic,700,700italic' %}
+ {% assign font_found = false %}
+
+ {% if font_config.global.family and font_config.global.external %}
+ {% assign font_families = font_families | append: font_config.global.family | append: font_styles %}
+ {% assign font_found = true %}
+ {% endif %}
+
+ {% if font_config.headings.family and font_config.headings.external %}
+ {% if font_found %}
+ {% assign font_families = font_families | append: '|' %}
+ {% endif %}
+
+ {% assign font_families = font_families | append: font_config.headings.family | append: font_styles %}
+ {% endif %}
+
+ {% if font_config.posts.family and font_config.posts.external %}
+ {% if font_found %}
+ {% assign font_families = font_families | append: '|' %}
+ {% endif %}
+
+ {% assign font_families = font_families | append: font_config.posts.family | append: font_styles %}
+ {% endif %}
+
+ {% if font_config.logo.family and font_config.logo.external %}
+ {% if font_found %}
+ {% assign font_families = font_families | append: '|' %}
+ {% endif %}
+
+ {% assign font_families = font_families | append: font_config.logo.family | append: font_styles %}
+ {% endif %}
+
+ {% if font_config.codes.family and font_config.codes.external %}
+ {% if font_found %}
+ {% assign font_families = font_families | append: '|' %}
+ {% endif %}
+
+ {% assign font_families = font_families | append: font_config.codes.family | append: font_styles %}
+ {% endif %}
+
+ {% if font_families != '' %}
+ {% assign font_families = font_families | append: '&subset=latin,latin-ext' %}
+ {% assign font_host = font_config.host | default: '//fonts.googleapis.com' %}
+
+ {% endif %}
+
+{% endif %}
diff --git a/_includes/_partials/header.html b/_includes/_partials/header.html
new file mode 100644
index 00000000..3fb2a849
--- /dev/null
+++ b/_includes/_partials/header.html
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+{% include _custom/header.html %}
diff --git a/_includes/_partials/page-header.html b/_includes/_partials/page-header.html
new file mode 100644
index 00000000..c12323bf
--- /dev/null
+++ b/_includes/_partials/page-header.html
@@ -0,0 +1,26 @@
+
+
+
+{% case page.layout %}
+{% when 'page' %}
+ {% capture post_title %}
+ {% if page.type == "categories" and page.title == nil %}
+ {{ __.title.categories }}
+ {% elsif page.type == "tags" and page.title == nil %}
+ {{ __.title.tags }}
+ {% elsif page.type == "about" and page.title == nil %}
+ {{ __.title.about }}
+ {% else %}
+ {{ page.title }}
+ {% endif %}
+ {% endcapture %}
+{% when 'schedule' %}
+ {% capture post_title %}{{ __.title.schedule }}{% endcapture %}
+{% endcase %}
+ <{% if site.seo %}h2{% else %}h1{% endif %} class="post-title" itemprop="name headline">{{ post_title }}{% if site.seo %}h2{% else %}h1{% endif %}>
+
+{% if page.description %}
+
diff --git a/_includes/_partials/pagination.html b/_includes/_partials/pagination.html
new file mode 100644
index 00000000..c00f33a4
--- /dev/null
+++ b/_includes/_partials/pagination.html
@@ -0,0 +1,8 @@
+{% if paginator.previous_page or paginator.next_page %}
+
+{% endif %}
diff --git a/_includes/_partials/search.html b/_includes/_partials/search.html
new file mode 100644
index 00000000..076fe0b2
--- /dev/null
+++ b/_includes/_partials/search.html
@@ -0,0 +1,9 @@
+{% if site.algolia_search.enable %}
+ {% include _third-party/search/algolia-search/dom.html %}
+{% elsif site.swiftype_key %}
+ {% include _partials/search/swiftype.html %}
+{% elsif site.tinysou_Key %}
+ {% include _partials/search/tinysou.html %}
+{% elsif site.local_search.enable %}
+ {% include _partials/search/localsearch.html %}
+{% endif %}
diff --git a/themes/next/layout/_partials/search/localsearch.swig b/_includes/_partials/search/localsearch.html
similarity index 85%
rename from themes/next/layout/_partials/search/localsearch.swig
rename to _includes/_partials/search/localsearch.html
index f106aa06..1c7d9034 100644
--- a/themes/next/layout/_partials/search/localsearch.swig
+++ b/_includes/_partials/search/localsearch.html
@@ -8,7 +8,7 @@
+{% endif %}
+
+
diff --git a/themes/next/layout/_partials/search/swiftype.swig b/_includes/_partials/search/swiftype.html
similarity index 78%
rename from themes/next/layout/_partials/search/swiftype.swig
rename to _includes/_partials/search/swiftype.html
index 6216e62c..f1b71cce 100644
--- a/themes/next/layout/_partials/search/swiftype.swig
+++ b/_includes/_partials/search/swiftype.html
@@ -1,12 +1,12 @@
-
diff --git a/_includes/_partials/search/tinysou.html b/_includes/_partials/search/tinysou.html
new file mode 100644
index 00000000..2dfa3e31
--- /dev/null
+++ b/_includes/_partials/search/tinysou.html
@@ -0,0 +1,3 @@
+
diff --git a/_includes/_partials/share/add-this.html b/_includes/_partials/share/add-this.html
new file mode 100644
index 00000000..f5a6f225
--- /dev/null
+++ b/_includes/_partials/share/add-this.html
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/themes/next/layout/_partials/share/baidushare.swig b/_includes/_partials/share/baidushare.html
similarity index 95%
rename from themes/next/layout/_partials/share/baidushare.swig
rename to _includes/_partials/share/baidushare.html
index d30f6a46..eb5f8fb2 100644
--- a/themes/next/layout/_partials/share/baidushare.swig
+++ b/_includes/_partials/share/baidushare.html
@@ -1,4 +1,4 @@
-{% if theme.baidushare.type === "button" %}
+{% if site.baidushare.type == "button" %}
+{% endif %}
diff --git a/_includes/_third-party/analytics/cnzz-analytics.html b/_includes/_third-party/analytics/cnzz-analytics.html
new file mode 100644
index 00000000..70a3bf5d
--- /dev/null
+++ b/_includes/_third-party/analytics/cnzz-analytics.html
@@ -0,0 +1,7 @@
+{% if site.cnzz_siteid %}
+
+
+
+{% endif %}
diff --git a/_includes/_third-party/analytics/facebook-sdk.html b/_includes/_third-party/analytics/facebook-sdk.html
new file mode 100644
index 00000000..a91c2955
--- /dev/null
+++ b/_includes/_third-party/analytics/facebook-sdk.html
@@ -0,0 +1,19 @@
+{% if site.facebook_sdk.enable %}
+
+{% endif %}
diff --git a/_includes/_third-party/analytics/google-analytics.html b/_includes/_third-party/analytics/google-analytics.html
new file mode 100644
index 00000000..714e9a09
--- /dev/null
+++ b/_includes/_third-party/analytics/google-analytics.html
@@ -0,0 +1,10 @@
+{% if site.google_analytics %}
+
+{% endif %}
diff --git a/_includes/_third-party/analytics/index.html b/_includes/_third-party/analytics/index.html
new file mode 100644
index 00000000..25b5c63c
--- /dev/null
+++ b/_includes/_third-party/analytics/index.html
@@ -0,0 +1,8 @@
+{% include _third-party/analytics/facebook-sdk.html %}
+{% include _third-party/analytics/vkontakte-api.html %}
+{% include _third-party/analytics/google-analytics.html %}
+{% include _third-party/analytics/baidu-analytics.html %}
+{% include _third-party/analytics/tencent-analytics.html %}
+{% include _third-party/analytics/tencent-mta.html %}
+{% include _third-party/analytics/cnzz-analytics.html %}
+{% include _third-party/analytics/application-insights.html %}
diff --git a/_includes/_third-party/analytics/lean-analytics.html b/_includes/_third-party/analytics/lean-analytics.html
new file mode 100644
index 00000000..1b9df528
--- /dev/null
+++ b/_includes/_third-party/analytics/lean-analytics.html
@@ -0,0 +1,108 @@
+{% if site.leancloud_visitors.enable %}
+
+ {% comment %} custom analytics part create by xiamo {% endcomment %}
+
+
+
+
+{% endif %}
diff --git a/themes/next/layout/_third-party/analytics/tencent-analytics.swig b/_includes/_third-party/analytics/tencent-analytics.html
similarity index 59%
rename from themes/next/layout/_third-party/analytics/tencent-analytics.swig
rename to _includes/_third-party/analytics/tencent-analytics.html
index adc1fc3f..acf2cd1f 100644
--- a/themes/next/layout/_third-party/analytics/tencent-analytics.swig
+++ b/_includes/_third-party/analytics/tencent-analytics.html
@@ -1,8 +1,8 @@
-{% if theme.tencent_analytics %}
-
+{% endif %}
diff --git a/_includes/_third-party/analytics/vkontakte-api.html b/_includes/_third-party/analytics/vkontakte-api.html
new file mode 100644
index 00000000..88bca549
--- /dev/null
+++ b/_includes/_third-party/analytics/vkontakte-api.html
@@ -0,0 +1,29 @@
+{% if site.vkontakte_api.enable %}
+
+
+
+
+{% endif %}
diff --git a/_includes/_third-party/comments/changyan.html b/_includes/_third-party/comments/changyan.html
new file mode 100644
index 00000000..9472a32f
--- /dev/null
+++ b/_includes/_third-party/comments/changyan.html
@@ -0,0 +1,18 @@
+{% if site.changyan.enable and site.changyan.appid and site.changyan.appkey %}
+ {% if page.home %}
+
+ {% else %}
+
+
+ {% endif %}
+{% endif %}
diff --git a/_includes/_third-party/comments/disqus.html b/_includes/_third-party/comments/disqus.html
new file mode 100644
index 00000000..6236c128
--- /dev/null
+++ b/_includes/_third-party/comments/disqus.html
@@ -0,0 +1,68 @@
+{% unless site.duoshuo_shortname or site.duoshuo and site.duoshuo.shortname %}
+ {% if site.disqus.enable %}
+
+ {% if site.disqus.count %}
+
+ {% endif %}
+
+ {% if page.comments %}
+ {% if site.disqus.hide %}
+
+ {% else %}
+
+ {% endif %}
+ {% endif %}
+
+ {% endif %}
+{% endunless %}
diff --git a/_includes/_third-party/comments/duoshuo.html b/_includes/_third-party/comments/duoshuo.html
new file mode 100644
index 00000000..929dadf7
--- /dev/null
+++ b/_includes/_third-party/comments/duoshuo.html
@@ -0,0 +1,33 @@
+{% if site.duoshuo_shortname or site.duoshuo and site.duoshuo.shortname %}
+
+ {% if site.duoshuo %}
+ {% assign duoshuo_shortname = site.duoshuo.shortname %}
+ {% else %}
+ {% assign duoshuo_shortname = site.duoshuo_shortname %}
+ {% endif %}
+
+
+
+ {% if site.duoshuo_info.ua_enable %}
+ {% if site.duoshuo_info.admin_enable %}
+ {% assign ua_parser_internal = site.vendors._internal | append: '/ua-parser-js/dist/ua-parser.min.js?v=0.7.9' | relative_url %}
+
+
+ {% endif %}
+ {% assign ua_parser_internal = site.vendors._internal | append: '/ua-parser-js/dist/ua-parser.min.js?v=0.7.9' | relative_url %}
+
+
+ {% endif %}
+
+{% endif %}
diff --git a/_includes/_third-party/comments/gentie.html b/_includes/_third-party/comments/gentie.html
new file mode 100644
index 00000000..dfa5d0c3
--- /dev/null
+++ b/_includes/_third-party/comments/gentie.html
@@ -0,0 +1,16 @@
+{% unless site.disqus_shortname or site.hypercomments_id or site.duoshuo_shortname or site.duoshuo and site.duoshuo.shortname %}
+
+ {% if site.gentie_productKey %}
+ {% assign gentie_productKey = site.gentie_productKey %}
+
+
+ {% endif %}
+
+{% endunless %}
diff --git a/_includes/_third-party/comments/gitalk.html b/_includes/_third-party/comments/gitalk.html
new file mode 100644
index 00000000..06104f45
--- /dev/null
+++ b/_includes/_third-party/comments/gitalk.html
@@ -0,0 +1,28 @@
+{% unless site.duoshuo_shortname
+ or site.disqus_shortname
+ or site.hypercomments_id
+ or site.gentie_productKey
+ or site.duoshuo and site.duoshuo.shortname %}
+
+{% if site.gitalk.enable %}
+
+
+
+
+
+{% endif %}
+
+{% endunless %}
diff --git a/_includes/_third-party/comments/hypercomments.html b/_includes/_third-party/comments/hypercomments.html
new file mode 100644
index 00000000..69b5493b
--- /dev/null
+++ b/_includes/_third-party/comments/hypercomments.html
@@ -0,0 +1,27 @@
+{% unless site.disqus_shortname or site.duoshuo_shortname or site.duoshuo and site.duoshuo.shortname %}
+
+ {% if site.hypercomments_id %}
+
+
+
+ {% endif %}
+
+{% endunless %}
diff --git a/_includes/_third-party/comments/index.html b/_includes/_third-party/comments/index.html
new file mode 100644
index 00000000..6e20bf36
--- /dev/null
+++ b/_includes/_third-party/comments/index.html
@@ -0,0 +1,9 @@
+{% include _third-party/comments/duoshuo.html %}
+{% include _third-party/comments/disqus.html %}
+{% include _third-party/comments/hypercomments.html %}
+{% include _third-party/comments/gentie.html %}
+{% include _third-party/comments/gitalk.html %}
+{% include _third-party/comments/youyan.html %}
+{% include _third-party/comments/livere.html %}
+{% include _third-party/comments/changyan.html %}
+{% include _third-party/comments/wildfire.html %}
diff --git a/_includes/_third-party/comments/livere.html b/_includes/_third-party/comments/livere.html
new file mode 100644
index 00000000..12f5ae2a
--- /dev/null
+++ b/_includes/_third-party/comments/livere.html
@@ -0,0 +1,18 @@
+{% unless site.duoshuo and site.duoshuo.shortname %}
+ {% unless site.hypercomments_id or site.gentie_productKey or site.duoshuo_shortname or site.disqus.enable and site.disqus.shortname %}
+
+ {% if page.comments and site.livere_uid %}
+
+ {% endif %}
+
+ {% endunless %}
+{% endunless %}
diff --git a/_includes/_third-party/comments/wildfire.html b/_includes/_third-party/comments/wildfire.html
new file mode 100644
index 00000000..7b07d39b
--- /dev/null
+++ b/_includes/_third-party/comments/wildfire.html
@@ -0,0 +1,44 @@
+{% if site.wildfire.enable %}
+
+ {% if page.comments %}
+ {% if site.wildfire.loaderVersion %}
+
+ {% else %}
+
+ {% endif %}
+ {% endif %}
+
+{% endif %}
diff --git a/_includes/_third-party/comments/youyan.html b/_includes/_third-party/comments/youyan.html
new file mode 100644
index 00000000..ac96d774
--- /dev/null
+++ b/_includes/_third-party/comments/youyan.html
@@ -0,0 +1,17 @@
+{% unless site.duoshuo_shortname
+ or site.disqus_shortname
+ or site.hypercomments_id
+ or site.gentie_productKey
+ or site.duoshuo and site.duoshuo.shortname %}
+
+ {% if site.youyan_uid %}
+ {% assign uid = site.youyan_uid %}
+
+ {% if page.comments %}
+
+
+
+ {% endif %}
+ {% endif %}
+
+{% endunless %}
diff --git a/_includes/_third-party/duoshuo-hot-articles.html b/_includes/_third-party/duoshuo-hot-articles.html
new file mode 100644
index 00000000..d1741bb1
--- /dev/null
+++ b/_includes/_third-party/duoshuo-hot-articles.html
@@ -0,0 +1,5 @@
+{% comment %} 多说热评文章 {% endcomment %}
+{% if site.duoshuo_hotartical and page.title %}
+ 热评文章
+
+{% endif %}
diff --git a/_includes/_third-party/exturl.html b/_includes/_third-party/exturl.html
new file mode 100644
index 00000000..610fd32d
--- /dev/null
+++ b/_includes/_third-party/exturl.html
@@ -0,0 +1,3 @@
+{% if site.exturl %}
+
+{% endif %}
diff --git a/_includes/_third-party/mathjax.html b/_includes/_third-party/mathjax.html
new file mode 100644
index 00000000..220ca458
--- /dev/null
+++ b/_includes/_third-party/mathjax.html
@@ -0,0 +1,23 @@
+{% if site.mathjax.enable %}
+ {% if page.layout == 'index' or page.mathjax or site.mathjax.per_page == nil or site.mathjax.per_page == false %}
+
+
+
+
+ {% endif %}
+{% endif %}
diff --git a/themes/next/layout/_third-party/rating.swig b/_includes/_third-party/rating.html
similarity index 62%
rename from themes/next/layout/_third-party/rating.swig
rename to _includes/_third-party/rating.html
index e51e0945..f1f25063 100644
--- a/themes/next/layout/_third-party/rating.swig
+++ b/_includes/_third-party/rating.html
@@ -1,11 +1,10 @@
-{% if theme.rating.enable and (not is_home() and is_post()) %}
-
-{% endif %}
+
+ {% endif %}
+{% endunless %}
diff --git a/_includes/_third-party/schedule.html b/_includes/_third-party/schedule.html
new file mode 100644
index 00000000..6aa59780
--- /dev/null
+++ b/_includes/_third-party/schedule.html
@@ -0,0 +1,185 @@
+{% if site.calendar.enable %}
+{% if page.type == 'schedule' %}
+
+
+
+{% endif %}
+{% endif %}
diff --git a/_includes/_third-party/scroll-cookie.html b/_includes/_third-party/scroll-cookie.html
new file mode 100644
index 00000000..6f515fc3
--- /dev/null
+++ b/_includes/_third-party/scroll-cookie.html
@@ -0,0 +1,4 @@
+{% if site.save_scroll %}
+
+
+{% endif %}
diff --git a/_includes/_third-party/search/algolia-search/assets.html b/_includes/_third-party/search/algolia-search/assets.html
new file mode 100644
index 00000000..076e1d16
--- /dev/null
+++ b/_includes/_third-party/search/algolia-search/assets.html
@@ -0,0 +1,18 @@
+{% if site.algolia_search.enable %}
+
+ {% comment %} S: Include Algolia instantsearch.js library {% endcomment %}
+ {% assign algolia_instant_css = site.vendors._internal | append: '/algolia-instant-search/instantsearch.min.css' | relative_url %}
+ {% if site.vendors.algolia_instant_css %}
+ {% assign algolia_instant_css = site.vendors.algolia_instant_css %}
+ {% endif %}
+
+
+ {% assign algolia_instant_js = site.vendors._internal | append: '/algolia-instant-search/instantsearch.min.js' | relative_url %}
+ {% if site.vendors.algolia_instant_js %}
+ {% assign algolia_instant_js = site.vendors.algolia_instant_js %}
+ {% endif %}
+
+ {% comment %} E: Include Algolia instantsearch.js library {% endcomment %}
+
+
+{% endif %}
diff --git a/themes/next/layout/_partials/search/algolia-search.swig b/_includes/_third-party/search/algolia-search/dom.html
similarity index 93%
rename from themes/next/layout/_partials/search/algolia-search.swig
rename to _includes/_third-party/search/algolia-search/dom.html
index a733bb17..63a2c5e5 100644
--- a/themes/next/layout/_partials/search/algolia-search.swig
+++ b/_includes/_third-party/search/algolia-search/dom.html
@@ -1,4 +1,4 @@
-{% if theme.algolia_search.enable %}
+{% if site.algolia_search.enable %}
');
+ }
+
+ return rs;
+ };
+}
+
+function getAgentInfo(string) {
+ $.ua.set(string);
+
+ var UNKNOWN = 'Unknown';
+ var sua = $.ua;
+ var separator = isMobile() ? '
' : '';
+ var osName = sua.os.name || UNKNOWN;
+ var osVersion = sua.os.version || UNKNOWN;
+ var browserName = sua.browser.name || UNKNOWN;
+ var browserVersion = sua.browser.version || UNKNOWN;
+ var iconMapping = {
+ os: {
+ android : 'android',
+ linux : 'linux',
+ windows : 'windows',
+ ios : 'apple',
+ 'mac os': 'apple',
+ unknown : 'desktop'
+ },
+ browser: {
+ chrome : 'chrome',
+ chromium : 'chrome',
+ firefox : 'firefox',
+ opera : 'opera',
+ safari : 'safari',
+ ie : 'internet-explorer',
+ wechat : 'wechat',
+ qq : 'qq',
+ unknown : 'globe'
+ }
+ };
+ var osIcon = iconMapping.os[osName.toLowerCase()];
+ var browserIcon = iconMapping.browser[getBrowserKey()];
+
+ return separator +
+ '' +
+ '' +
+ osName + ' ' + osVersion +
+ '' + separator +
+ '' +
+ '' +
+ browserName + ' ' + browserVersion +
+ '';
+
+ function getBrowserKey () {
+ var key = browserName.toLowerCase();
+
+ if (key.match(/WeChat/i)) {
+ return 'wechat';
+ }
+
+ if (key.match(/QQBrowser/i)) {
+ return 'qq';
+ }
+
+ return key;
+ }
+
+ function isMobile() {
+ var userAgent = window.navigator.userAgent;
+
+ var isiPad = userAgent.match(/iPad/i) !== null;
+ var mobileUA = [
+ 'iphone', 'android', 'phone', 'mobile',
+ 'wap', 'netfront', 'x11', 'java', 'opera mobi',
+ 'opera mini', 'ucweb', 'windows ce', 'symbian',
+ 'symbianos', 'series', 'webos', 'sony',
+ 'blackberry', 'dopod', 'nokia', 'samsung',
+ 'palmsource', 'xda', 'pieplus', 'meizu',
+ 'midp' ,'cldc' , 'motorola', 'foma',
+ 'docomo', 'up.browser', 'up.link', 'blazer',
+ 'helio', 'hosin', 'huawei', 'novarra',
+ 'coolpad', 'webos', 'techfaith', 'palmsource',
+ 'alcatel', 'amoi', 'ktouch', 'nexian',
+ 'ericsson', 'philips', 'sagem', 'wellcom',
+ 'bunjalloo', 'maui', 'smartphone', 'iemobile',
+ 'spice', 'bird', 'zte-', 'longcos',
+ 'pantech', 'gionee', 'portalmmm', 'jig browser',
+ 'hiptop', 'benq', 'haier', '^lct',
+ '320x320', '240x320', '176x220'
+ ];
+ var pattern = new RegExp(mobileUA.join('|'), 'i');
+
+ return !isiPad && userAgent.match(pattern);
+ }
+}
diff --git a/themes/next/source/js/js.cookie.js b/assets/js/src/js.cookie.js
similarity index 99%
rename from themes/next/source/js/js.cookie.js
rename to assets/js/src/js.cookie.js
index 97b4fea1..c6c39758 100644
--- a/themes/next/source/js/js.cookie.js
+++ b/assets/js/src/js.cookie.js
@@ -5,7 +5,6 @@
* Copyright 2006, 2015 Klaus Hartl & Fagner Brack
* Released under the MIT license
*/
-
;(function (factory) {
var registeredInModuleLoader = false;
if (typeof define === 'function' && define.amd) {
diff --git a/assets/js/src/motion.js b/assets/js/src/motion.js
new file mode 100644
index 00000000..cbfb8244
--- /dev/null
+++ b/assets/js/src/motion.js
@@ -0,0 +1,291 @@
+/* global NexT: true */
+
+$(document).ready(function () {
+ NexT.motion = {};
+
+ var sidebarToggleLines = {
+ lines: [],
+ push: function (line) {
+ this.lines.push(line);
+ },
+ init: function () {
+ this.lines.forEach(function (line) {
+ line.init();
+ });
+ },
+ arrow: function () {
+ this.lines.forEach(function (line) {
+ line.arrow();
+ });
+ },
+ close: function () {
+ this.lines.forEach(function (line) {
+ line.close();
+ });
+ }
+ };
+
+ function SidebarToggleLine(settings) {
+ this.el = $(settings.el);
+ this.status = $.extend({}, {
+ init: {
+ width: '100%',
+ opacity: 1,
+ left: 0,
+ rotateZ: 0,
+ top: 0
+ }
+ }, settings.status);
+ }
+
+ SidebarToggleLine.prototype.init = function () {
+ this.transform('init');
+ };
+ SidebarToggleLine.prototype.arrow = function () {
+ this.transform('arrow');
+ };
+ SidebarToggleLine.prototype.close = function () {
+ this.transform('close');
+ };
+ SidebarToggleLine.prototype.transform = function (status) {
+ this.el.velocity('stop').velocity(this.status[status]);
+ };
+
+ var sidebarToggleLine1st = new SidebarToggleLine({
+ el: '.sidebar-toggle-line-first',
+ status: {
+ arrow: {width: '50%', rotateZ: '-45deg', top: '2px'},
+ close: {width: '100%', rotateZ: '-45deg', top: '5px'}
+ }
+ });
+ var sidebarToggleLine2nd = new SidebarToggleLine({
+ el: '.sidebar-toggle-line-middle',
+ status: {
+ arrow: {width: '90%'},
+ close: {opacity: 0}
+ }
+ });
+ var sidebarToggleLine3rd = new SidebarToggleLine({
+ el: '.sidebar-toggle-line-last',
+ status: {
+ arrow: {width: '50%', rotateZ: '45deg', top: '-2px'},
+ close: {width: '100%', rotateZ: '45deg', top: '-5px'}
+ }
+ });
+
+ sidebarToggleLines.push(sidebarToggleLine1st);
+ sidebarToggleLines.push(sidebarToggleLine2nd);
+ sidebarToggleLines.push(sidebarToggleLine3rd);
+
+ var SIDEBAR_WIDTH = '320px';
+ var SIDEBAR_DISPLAY_DURATION = 200;
+
+ var sidebarToggleMotion = {
+ toggleEl: $('.sidebar-toggle'),
+ sidebarEl: $('.sidebar'),
+ isSidebarVisible: false,
+ init: function () {
+ this.toggleEl.on('click', this.clickHandler.bind(this));
+ this.toggleEl.on('mouseenter', this.mouseEnterHandler.bind(this));
+ this.toggleEl.on('mouseleave', this.mouseLeaveHandler.bind(this));
+
+ $(document)
+ .on('sidebar.isShowing', function () {
+ NexT.utils.isDesktop() && $('body').velocity('stop').velocity(
+ {paddingRight: SIDEBAR_WIDTH},
+ SIDEBAR_DISPLAY_DURATION
+ );
+ })
+ .on('sidebar.isHiding', function () {
+ });
+ },
+ clickHandler: function () {
+ this.isSidebarVisible ? this.hideSidebar() : this.showSidebar();
+ this.isSidebarVisible = !this.isSidebarVisible;
+ },
+ mouseEnterHandler: function () {
+ if (this.isSidebarVisible) {
+ return;
+ }
+ sidebarToggleLines.arrow();
+ },
+ mouseLeaveHandler: function () {
+ if (this.isSidebarVisible) {
+ return;
+ }
+ sidebarToggleLines.init();
+ },
+ showSidebar: function () {
+ var self = this;
+
+ sidebarToggleLines.close();
+
+ this.sidebarEl.velocity('stop').velocity({
+ width: SIDEBAR_WIDTH
+ }, {
+ display: 'block',
+ duration: SIDEBAR_DISPLAY_DURATION,
+ begin: function () {
+ $('.sidebar .motion-element').velocity(
+ 'transition.slideRightIn',
+ {
+ stagger: 50,
+ drag: true,
+ complete: function () {
+ self.sidebarEl.trigger('sidebar.motion.complete');
+ }
+ }
+ );
+ },
+ complete: function () {
+ self.sidebarEl.addClass('sidebar-active');
+ self.sidebarEl.trigger('sidebar.didShow');
+ }
+ }
+ );
+
+ this.sidebarEl.trigger('sidebar.isShowing');
+ },
+ hideSidebar: function () {
+ NexT.utils.isDesktop() && $('body').velocity('stop').velocity({paddingRight: 0});
+ this.sidebarEl.find('.motion-element').velocity('stop').css('display', 'none');
+ this.sidebarEl.velocity('stop').velocity({width: 0}, {display: 'none'});
+
+ sidebarToggleLines.init();
+
+ this.sidebarEl.removeClass('sidebar-active');
+ this.sidebarEl.trigger('sidebar.isHiding');
+
+ //在 post 页面下按下隐藏 sidebar 时如果当前选中的是“站点概览”,将 toc 去除 motion 效果
+ //防止再次打开时会出现在“站点概览”下的 bug
+ if (!!$('.post-toc-wrap')) {
+ if ($('.site-overview').css('display') === 'block') {
+ $('.post-toc-wrap').removeClass('motion-element');
+ }
+ }
+ }
+ };
+ sidebarToggleMotion.init();
+
+ NexT.motion.integrator = {
+ queue: [],
+ cursor: -1,
+ add: function (fn) {
+ this.queue.push(fn);
+ return this;
+ },
+ next: function () {
+ this.cursor++;
+ var fn = this.queue[this.cursor];
+ $.isFunction(fn) && fn(NexT.motion.integrator);
+ },
+ bootstrap: function () {
+ this.next();
+ }
+ };
+
+ NexT.motion.middleWares = {
+ logo: function (integrator) {
+ var sequence = [];
+ var $brand = $('.brand');
+ var $title = $('.site-title');
+ var $subtitle = $('.site-subtitle');
+ var $logoLineTop = $('.logo-line-before i');
+ var $logoLineBottom = $('.logo-line-after i');
+
+ $brand.size() > 0 && sequence.push({
+ e: $brand,
+ p: {opacity: 1},
+ o: {duration: 200}
+ });
+
+ NexT.utils.isMist() && hasElement([$logoLineTop, $logoLineBottom]) &&
+ sequence.push(
+ getMistLineSettings($logoLineTop, '100%'),
+ getMistLineSettings($logoLineBottom, '-100%')
+ );
+
+ hasElement($title) && sequence.push({
+ e: $title,
+ p: {opacity: 1, top: 0},
+ o: { duration: 200 }
+ });
+
+ hasElement($subtitle) && sequence.push({
+ e: $subtitle,
+ p: {opacity: 1, top: 0},
+ o: {duration: 200}
+ });
+
+ if (sequence.length > 0) {
+ sequence[sequence.length - 1].o.complete = function () {
+ integrator.next();
+ };
+ $.Velocity.RunSequence(sequence);
+ } else {
+ integrator.next();
+ }
+
+
+ function getMistLineSettings (element, translateX) {
+ return {
+ e: $(element),
+ p: {translateX: translateX},
+ o: {
+ duration: 500,
+ sequenceQueue: false
+ }
+ };
+ }
+
+ /**
+ * Check if $elements exist.
+ * @param {jQuery|Array} $elements
+ * @returns {boolean}
+ */
+ function hasElement ($elements) {
+ $elements = Array.isArray($elements) ? $elements : [$elements];
+ return $elements.every(function ($element) {
+ return $.isFunction($element.size) && $element.size() > 0;
+ });
+ }
+ },
+
+ menu: function (integrator) {
+ $('.menu-item').velocity('transition.slideDownIn', {
+ display: null,
+ duration: 200,
+ complete: function () {
+ integrator.next();
+ }
+ });
+ },
+
+ postList: function (integrator) {
+ var $post = $('.post');
+ var hasPost = $post.size() > 0;
+
+ hasPost ? postMotion() : integrator.next();
+
+ function postMotion () {
+ var postMotionOptions = window.postMotionOptions || {
+ stagger: 100,
+ drag: true
+ };
+ postMotionOptions.complete = function () {
+ integrator.next();
+ };
+
+ $post.velocity('transition.slideDownIn', postMotionOptions);
+ }
+ },
+
+ sidebar: function (integrator) {
+ if (CONFIG.sidebar.display === 'always') {
+ NexT.utils.displaySidebar();
+ }
+ integrator.next();
+ }
+ };
+
+});
diff --git a/assets/js/src/paginator.js b/assets/js/src/paginator.js
new file mode 100644
index 00000000..6042ed47
--- /dev/null
+++ b/assets/js/src/paginator.js
@@ -0,0 +1,109 @@
+'use strict';
+
+function paginatorHelper(options) {
+ options = options || {};
+
+ var current = options.current || 0;
+ var total = options.total || 1;
+ var endSize = options.hasOwnProperty('end_size') ? +options.end_size : 1;
+ var midSize = options.hasOwnProperty('mid_size') ? +options.mid_size : 2;
+ var space = options.hasOwnProperty('space') ? options.space : '…';
+ var base = options.base || '';
+ var format = options.format || '/%d/';
+ var prevText = options.prev_text || 'Prev';
+ var nextText = options.next_text || 'Next';
+ var prevNext = options.hasOwnProperty('prev_next') ? options.prev_next : true;
+ var transform = options.transform;
+ var self = this;
+ var result = '';
+ var i;
+
+ if (!current) return '';
+
+ var currentPage = '' +
+ (transform ? transform(current) : current) +
+ '';
+
+ function link(i) {
+ return i === 1 ? base : base + format.replace('%d', i);
+ }
+
+ function pageLink(i) {
+ return '' +
+ (transform ? transform(i) : i) +
+ '';
+ }
+
+ // Display the link to the previous page
+ if (prevNext && current > 1) {
+ result += '' + prevText + '';
+ }
+
+ if (options.show_all) {
+ // Display pages on the left side of the current page
+ for (i = 1; i < current; i++) {
+ result += pageLink(i);
+ }
+
+ // Display the current page
+ result += currentPage;
+
+ // Display pages on the right side of the current page
+ for (i = current + 1; i <= total; i++) {
+ result += pageLink(i);
+ }
+ } else {
+ // It's too complicated. May need refactor.
+ var leftEnd = current <= endSize ? current - 1 : endSize;
+ var rightEnd = total - current <= endSize ? current + 1 : total - endSize + 1;
+ var leftMid = current - midSize <= endSize ? current - midSize + endSize : current - midSize;
+ var rightMid = current + midSize + endSize > total ? current + midSize - endSize : current + midSize;
+ var spaceHtml = '' + space + '';
+
+ // Display pages on the left edge
+ for (i = 1; i <= leftEnd; i++) {
+ result += pageLink(i);
+ }
+
+ // Display spaces between edges and middle pages
+ if (space && current - endSize - midSize > 1) {
+ result += spaceHtml;
+ }
+
+ // Display left middle pages
+ if (leftMid > leftEnd) {
+ for (i = leftMid; i < current; i++) {
+ result += pageLink(i);
+ }
+ }
+
+ // Display the current page
+ result += currentPage;
+
+ // Display right middle pages
+ if (rightMid < rightEnd) {
+ for (i = current + 1; i <= rightMid; i++) {
+ result += pageLink(i);
+ }
+ }
+
+ // Display spaces between edges and middle pages
+ if (space && total - endSize - midSize > current) {
+ result += spaceHtml;
+ }
+
+ // Dispaly pages on the right edge
+ for (i = rightEnd; i <= total; i++) {
+ result += pageLink(i);
+ }
+ }
+
+ // Display the link to the next page
+ if (prevNext && current < total) {
+ result += '' + nextText + '';
+ }
+
+ return result;
+}
+
+window.paginator = paginatorHelper;
diff --git a/assets/js/src/post-details.js b/assets/js/src/post-details.js
new file mode 100644
index 00000000..2570070d
--- /dev/null
+++ b/assets/js/src/post-details.js
@@ -0,0 +1,147 @@
+/* global NexT: true */
+
+$(document).ready(function () {
+
+ initScrollSpy();
+ NexT.utils.needAffix() && initAffix();
+ initTOCDimension();
+
+ function initScrollSpy () {
+ var tocSelector = '.post-toc';
+ var $tocElement = $(tocSelector);
+ var activeCurrentSelector = '.active-current';
+
+ $tocElement
+ .on('activate.bs.scrollspy', function () {
+ var $currentActiveElement = $(tocSelector + ' .active').last();
+
+ removeCurrentActiveClass();
+ $currentActiveElement.addClass('active-current');
+ })
+ .on('clear.bs.scrollspy', removeCurrentActiveClass);
+
+ $('body').scrollspy({ target: tocSelector });
+
+ function removeCurrentActiveClass () {
+ $(tocSelector + ' ' + activeCurrentSelector)
+ .removeClass(activeCurrentSelector.substring(1));
+ }
+ }
+
+ // Sidebar float
+ function initAffix () {
+ var headerHeight = $('.header-inner').height();
+ var footerOffset = parseInt($('.main').css('padding-bottom'), 10);
+
+ /*jshint camelcase: false */
+ var sidebarTop = (CONFIG.sidebar.offset_float === 0) ?
+ headerHeight + CONFIG.sidebar.offset :
+ headerHeight;
+ /*jshint camelcase: true */
+
+ $('.sidebar-inner').affix({
+ offset: {
+ top: sidebarTop,
+ bottom: footerOffset
+ }
+ });
+
+ $(document)
+ .on('affixed.bs.affix', function () {
+ updateTOCHeight(document.body.clientHeight - 100);
+ });
+ }
+
+ function initTOCDimension () {
+ var updateTOCHeightTimer;
+
+ $(window).on('resize', function () {
+ updateTOCHeightTimer && clearTimeout(updateTOCHeightTimer);
+
+ updateTOCHeightTimer = setTimeout(function () {
+ var tocWrapperHeight = document.body.clientHeight - 100;
+
+ updateTOCHeight(tocWrapperHeight);
+ }, 0);
+ });
+
+ // Initialize TOC Height.
+ updateTOCHeight(document.body.clientHeight - 100);
+
+ // Initialize TOC Width.
+ var scrollbarWidth = NexT.utils.getScrollbarWidth();
+ $('.post-toc').css('width', 'calc(100% + ' + scrollbarWidth + 'px)');
+ }
+
+ function updateTOCHeight (height) {
+ height = height || 'auto';
+ $('.post-toc').css('max-height', height);
+ }
+
+});
+
+$(document).ready(function () {
+ var html = $('html');
+ var TAB_ANIMATE_DURATION = 200;
+ var hasVelocity = $.isFunction(html.velocity);
+
+ $('.sidebar-nav li').on('click', function () {
+ var item = $(this);
+ var activeTabClassName = 'sidebar-nav-active';
+ var activePanelClassName = 'sidebar-panel-active';
+ if (item.hasClass(activeTabClassName)) {
+ return;
+ }
+
+ var currentTarget = $('.' + activePanelClassName);
+ var target = $('.' + item.data('target'));
+
+ hasVelocity ?
+ currentTarget.velocity('transition.slideUpOut', TAB_ANIMATE_DURATION, function () {
+ target
+ .velocity('stop')
+ .velocity('transition.slideDownIn', TAB_ANIMATE_DURATION)
+ .addClass(activePanelClassName);
+ }) :
+ currentTarget.animate({ opacity: 0 }, TAB_ANIMATE_DURATION, function () {
+ currentTarget.hide();
+ target
+ .stop()
+ .css({'opacity': 0, 'display': 'block'})
+ .animate({ opacity: 1 }, TAB_ANIMATE_DURATION, function () {
+ currentTarget.removeClass(activePanelClassName);
+ target.addClass(activePanelClassName);
+ });
+ });
+
+ item.siblings().removeClass(activeTabClassName);
+ item.addClass(activeTabClassName);
+ });
+
+ $('.post-toc a').on('click', function (e) {
+ e.preventDefault();
+ var targetSelector = NexT.utils.escapeSelector(decodeURIComponent(this.getAttribute('href')));
+ var offset = $(targetSelector).offset().top;
+
+ hasVelocity ?
+ html.velocity('stop').velocity('scroll', {
+ offset: offset + 'px',
+ mobileHA: false
+ }) :
+ $('html, body').stop().animate({
+ scrollTop: offset
+ }, 500);
+ });
+
+ // Expand sidebar on post detail page by default, when post has a toc.
+ var $tocContent = $('.post-toc-content');
+ var isSidebarCouldDisplay = CONFIG.sidebar.display === 'post' ||
+ CONFIG.sidebar.display === 'always';
+ var hasTOC = $tocContent.length > 0 && $tocContent.html().trim().length > 0;
+ if (isSidebarCouldDisplay && hasTOC) {
+ CONFIG.motion ?
+ (NexT.motion.middleWares.sidebar = function () {
+ NexT.utils.displaySidebar();
+ }) : NexT.utils.displaySidebar();
+ }
+});
diff --git a/assets/js/src/schemes/pisces.js b/assets/js/src/schemes/pisces.js
new file mode 100644
index 00000000..d4125b6b
--- /dev/null
+++ b/assets/js/src/schemes/pisces.js
@@ -0,0 +1,17 @@
+$(document).ready(function () {
+ var $headerInner = $('.header-inner');
+ var $sidebar = $('#sidebar');
+ var getSidebarTop = function(){
+ return $headerInner.height() + CONFIG.sidebar.offset;
+ };
+ var setSidebarMarginTop = function(sidebarTop){
+ return $sidebar.css({ 'margin-top': sidebarTop });
+ };
+ var mql = window.matchMedia('(min-width: 991px)');
+ setSidebarMarginTop(getSidebarTop()).show();
+ mql.addListener(function(e){
+ if(e.matches){
+ setSidebarMarginTop(getSidebarTop());
+ }
+ });
+});
diff --git a/assets/js/src/scroll-cookie.js b/assets/js/src/scroll-cookie.js
new file mode 100644
index 00000000..34ff200b
--- /dev/null
+++ b/assets/js/src/scroll-cookie.js
@@ -0,0 +1,23 @@
+$(document).ready(function() {
+
+ // Set relative link path (without domain)
+ var rpath = window.location.href.replace(window.location.origin, "");
+
+ // Write position in cookie
+ var timeout;
+ $(window).on("scroll", function() {
+ clearTimeout(timeout);
+ timeout = setTimeout(function () {
+ Cookies.set("scroll-cookie", ($(window).scrollTop() + "|" + rpath), { expires: 365, path: '' });
+ }, 250);
+ });
+
+ // Read position from cookie
+ if (Cookies.get("scroll-cookie") !== undefined) {
+ var cvalues = Cookies.get("scroll-cookie").split('|');
+ if (cvalues[1] == rpath) {
+ $(window).scrollTop(cvalues[0]);
+ }
+ }
+
+});
diff --git a/assets/js/src/scrollspy.js b/assets/js/src/scrollspy.js
new file mode 100644
index 00000000..5ef01484
--- /dev/null
+++ b/assets/js/src/scrollspy.js
@@ -0,0 +1,182 @@
+/* ========================================================================
+* Bootstrap: scrollspy.js v3.3.2
+* http://getbootstrap.com/javascript/#scrollspy
+* ========================================================================
+* Copyright 2011-2015 Twitter, Inc.
+* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+* ======================================================================== */
+
+/**
+ * Custom by iissnan
+ *
+ * - Add a `clear.bs.scrollspy` event.
+ * - Esacpe targets selector.
+ */
+
+
++function ($) {
+ 'use strict';
+
+ // SCROLLSPY CLASS DEFINITION
+ // ==========================
+
+ function ScrollSpy(element, options) {
+ this.$body = $(document.body)
+ this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
+ this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
+ this.selector = (this.options.target || '') + ' .nav li > a'
+ this.offsets = []
+ this.targets = []
+ this.activeTarget = null
+ this.scrollHeight = 0
+
+ this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
+ this.refresh()
+ this.process()
+ }
+
+ ScrollSpy.VERSION = '3.3.2'
+
+ ScrollSpy.DEFAULTS = {
+ offset: 10
+ }
+
+ ScrollSpy.prototype.getScrollHeight = function () {
+ return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
+ }
+
+ ScrollSpy.prototype.refresh = function () {
+ var that = this
+ var offsetMethod = 'offset'
+ var offsetBase = 0
+
+ this.offsets = []
+ this.targets = []
+ this.scrollHeight = this.getScrollHeight()
+
+ if (!$.isWindow(this.$scrollElement[0])) {
+ offsetMethod = 'position'
+ offsetBase = this.$scrollElement.scrollTop()
+ }
+
+ this.$body
+ .find(this.selector)
+ .map(function () {
+ var $el = $(this)
+ var href = $el.data('target') || $el.attr('href')
+ var $href = /^#./.test(href) && $(NexT.utils.escapeSelector(decodeURIComponent(href))) // Need to escape selector.
+
+ return ($href
+ && $href.length
+ && $href.is(':visible')
+ && [[$href[offsetMethod]().top + offsetBase, href]]) || null
+ })
+ .sort(function (a, b) { return a[0] - b[0] })
+ .each(function () {
+ that.offsets.push(this[0])
+ that.targets.push(this[1])
+ })
+
+
+ }
+
+ ScrollSpy.prototype.process = function () {
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
+ var scrollHeight = this.getScrollHeight()
+ var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
+ var offsets = this.offsets
+ var targets = this.targets
+ var activeTarget = this.activeTarget
+ var i
+
+ if (this.scrollHeight != scrollHeight) {
+ this.refresh()
+ }
+
+ if (scrollTop >= maxScroll) {
+ return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
+ }
+
+ if (activeTarget && scrollTop < offsets[0]) {
+ $(this.selector).trigger('clear.bs.scrollspy') // Add a custom event.
+ this.activeTarget = null
+ return this.clear()
+ }
+
+ for (i = offsets.length; i--;) {
+ activeTarget != targets[i]
+ && scrollTop >= offsets[i]
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+ && this.activate(targets[i])
+ }
+ }
+
+ ScrollSpy.prototype.activate = function (target) {
+ this.activeTarget = target
+
+ this.clear()
+
+ var selector = this.selector +
+ '[data-target="' + target + '"],' +
+ this.selector + '[href="' + target + '"]'
+
+ var active = $(selector)
+ .parents('li')
+ .addClass('active')
+
+ if (active.parent('.dropdown-menu').length) {
+ active = active
+ .closest('li.dropdown')
+ .addClass('active')
+ }
+
+ active.trigger('activate.bs.scrollspy')
+ }
+
+ ScrollSpy.prototype.clear = function () {
+ $(this.selector)
+ .parentsUntil(this.options.target, '.active')
+ .removeClass('active')
+ }
+
+
+ // SCROLLSPY PLUGIN DEFINITION
+ // ===========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.scrollspy')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.scrollspy
+
+ $.fn.scrollspy = Plugin
+ $.fn.scrollspy.Constructor = ScrollSpy
+
+
+ // SCROLLSPY NO CONFLICT
+ // =====================
+
+ $.fn.scrollspy.noConflict = function () {
+ $.fn.scrollspy = old
+ return this
+ }
+
+
+ // SCROLLSPY DATA-API
+ // ==================
+
+ $(window).on('load.bs.scrollspy.data-api', function () {
+ $('[data-spy="scroll"]').each(function () {
+ var $spy = $(this)
+ Plugin.call($spy, $spy.data())
+ })
+ })
+
+}(jQuery);
diff --git a/assets/js/src/utils.js b/assets/js/src/utils.js
new file mode 100644
index 00000000..d9e7f1f9
--- /dev/null
+++ b/assets/js/src/utils.js
@@ -0,0 +1,235 @@
+/* global NexT: true */
+
+NexT.utils = NexT.$u = {
+ /**
+ * Wrap images with fancybox support.
+ */
+ wrapImageWithFancyBox: function () {
+ $('.content img')
+ .not('[hidden]')
+ .not('.group-picture img, .post-gallery img')
+ .not('.emoji')
+ .each(function () {
+ var $image = $(this);
+ var imageTitle = $image.attr('title');
+ var $imageWrapLink = $image.parent('a');
+
+ if ($imageWrapLink.size() < 1) {
+ var imageLink = ($image.attr('data-original')) ? this.getAttribute('data-original') : this.getAttribute('src');
+ $imageWrapLink = $image.wrap('').parent('a');
+ }
+
+ $imageWrapLink.addClass('fancybox fancybox.image');
+ $imageWrapLink.attr('rel', 'group');
+
+ if (imageTitle) {
+ $imageWrapLink.append('
' + imageTitle + '
');
+
+ //make sure img title tag will show correctly in fancybox
+ $imageWrapLink.attr('title', imageTitle);
+ }
+ });
+
+ $('.fancybox').fancybox({
+ helpers: {
+ overlay: {
+ locked: false
+ }
+ }
+ });
+ },
+
+ lazyLoadPostsImages: function () {
+ $('#posts').find('img').lazyload({
+ //placeholder: '/images/loading.gif',
+ effect: 'fadeIn',
+ threshold : 0
+ });
+ },
+
+ registerESCKeyEvent: function () {
+ $(document).on('keyup', function (event) {
+ var shouldDismissSearchPopup = event.which === 27 &&
+ $('.search-popup').is(':visible');
+ if (shouldDismissSearchPopup) {
+ $('.search-popup').hide();
+ $('.search-popup-overlay').remove();
+ $('body').css('overflow', '');
+ }
+ });
+ },
+
+ registerBackToTop: function () {
+ var THRESHOLD = 50;
+ var $top = $('.back-to-top');
+
+ $(window).on('scroll', function () {
+ $top.toggleClass('back-to-top-on', window.pageYOffset > THRESHOLD);
+
+ var scrollTop = $(window).scrollTop();
+ var docHeight = $('#content').height();
+ var winHeight = $(window).height();
+ var contentMath = (docHeight > winHeight) ? (docHeight - winHeight) : ($(document).height() - winHeight);
+ var scrollPercent = (scrollTop) / (contentMath);
+ var scrollPercentRounded = Math.round(scrollPercent*100);
+ var scrollPercentMaxed = (scrollPercentRounded > 100) ? 100 : scrollPercentRounded;
+ $('#scrollpercent>span').html(scrollPercentMaxed);
+ });
+
+ $top.on('click', function () {
+ $('body').velocity('scroll');
+ });
+ },
+
+ /**
+ * Transform embedded video to support responsive layout.
+ * @see http://toddmotto.com/fluid-and-responsive-youtube-and-vimeo-videos-with-fluidvids-js/
+ */
+ embeddedVideoTransformer: function () {
+ var $iframes = $('iframe');
+
+ // Supported Players. Extend this if you need more players.
+ var SUPPORTED_PLAYERS = [
+ 'www.youtube.com',
+ 'player.vimeo.com',
+ 'player.youku.com',
+ 'music.163.com',
+ 'www.tudou.com'
+ ];
+ var pattern = new RegExp( SUPPORTED_PLAYERS.join('|') );
+
+ $iframes.each(function () {
+ var iframe = this;
+ var $iframe = $(this);
+ var oldDimension = getDimension($iframe);
+ var newDimension;
+
+ if (this.src.search(pattern) > 0) {
+
+ // Calculate the video ratio based on the iframe's w/h dimensions
+ var videoRatio = getAspectRadio(oldDimension.width, oldDimension.height);
+
+ // Replace the iframe's dimensions and position the iframe absolute
+ // This is the trick to emulate the video ratio
+ $iframe.width('100%').height('100%')
+ .css({
+ position: 'absolute',
+ top: '0',
+ left: '0'
+ });
+
+
+ // Wrap the iframe in a new which uses a dynamically fetched padding-top property
+ // based on the video's w/h dimensions
+ var wrap = document.createElement('div');
+ wrap.className = 'fluid-vids';
+ wrap.style.position = 'relative';
+ wrap.style.marginBottom = '20px';
+ wrap.style.width = '100%';
+ wrap.style.paddingTop = videoRatio + '%';
+
+ // Add the iframe inside our newly created
+ var iframeParent = iframe.parentNode;
+ iframeParent.insertBefore(wrap, iframe);
+ wrap.appendChild(iframe);
+
+ // Additional adjustments for 163 Music
+ if (this.src.search('music.163.com') > 0) {
+ newDimension = getDimension($iframe);
+ var shouldRecalculateAspect = newDimension.width > oldDimension.width ||
+ newDimension.height < oldDimension.height;
+
+ // 163 Music Player has a fixed height, so we need to reset the aspect radio
+ if (shouldRecalculateAspect) {
+ wrap.style.paddingTop = getAspectRadio(newDimension.width, oldDimension.height) + '%';
+ }
+ }
+ }
+ });
+
+ function getDimension($element) {
+ return {
+ width: $element.width(),
+ height: $element.height()
+ };
+ }
+
+ function getAspectRadio(width, height) {
+ return height / width * 100;
+ }
+ },
+
+ /**
+ * Add `menu-item-active` class name to menu item
+ * via comparing location.path with menu item's href.
+ */
+ addActiveClassToMenuItem: function () {
+ var path = window.location.pathname;
+ path = path === '/' ? path : path.substring(0, path.length - 1);
+ $('.menu-item a[href^="' + path + '"]:first').parent().addClass('menu-item-active');
+ },
+
+ hasMobileUA: function () {
+ var nav = window.navigator;
+ var ua = nav.userAgent;
+ var pa = /iPad|iPhone|Android|Opera Mini|BlackBerry|webOS|UCWEB|Blazer|PSP|IEMobile|Symbian/g;
+
+ return pa.test(ua);
+ },
+
+ isTablet: function () {
+ return window.screen.width < 992 && window.screen.width > 767 && this.hasMobileUA();
+ },
+
+ isMobile: function () {
+ return window.screen.width < 767 && this.hasMobileUA();
+ },
+
+ isDesktop: function () {
+ return !this.isTablet() && !this.isMobile();
+ },
+
+ /**
+ * Escape meta symbols in jQuery selectors.
+ *
+ * @param selector
+ * @returns {string|void|XML|*}
+ */
+ escapeSelector: function (selector) {
+ return selector.replace(/[!"$%&'()*+,.\/:;<=>?@[\\\]^`{|}~]/g, '\\$&');
+ },
+
+ displaySidebar: function () {
+ if (!this.isDesktop() || this.isPisces()) {
+ return;
+ }
+ $('.sidebar-toggle').trigger('click');
+ },
+
+ isMist: function () {
+ return CONFIG.scheme === 'Mist';
+ },
+
+ isPisces: function () {
+ return CONFIG.scheme === 'Pisces';
+ },
+
+ getScrollbarWidth: function () {
+ var $div = $('').addClass('scrollbar-measure').prependTo('body');
+ var div = $div[0];
+ var scrollbarWidth = div.offsetWidth - div.clientWidth;
+
+ $div.remove();
+
+ return scrollbarWidth;
+ },
+
+ /**
+ * Affix behaviour for Sidebar.
+ *
+ * @returns {Boolean}
+ */
+ needAffix: function () {
+ return this.isPisces();
+ }
+};
diff --git a/assets/lib/Han/dist/font/han-space.otf b/assets/lib/Han/dist/font/han-space.otf
new file mode 100644
index 00000000..845b1bc2
Binary files /dev/null and b/assets/lib/Han/dist/font/han-space.otf differ
diff --git a/assets/lib/Han/dist/font/han-space.woff b/assets/lib/Han/dist/font/han-space.woff
new file mode 100644
index 00000000..6ccc84f8
Binary files /dev/null and b/assets/lib/Han/dist/font/han-space.woff differ
diff --git a/assets/lib/Han/dist/font/han.otf b/assets/lib/Han/dist/font/han.otf
new file mode 100644
index 00000000..2ce2f46c
Binary files /dev/null and b/assets/lib/Han/dist/font/han.otf differ
diff --git a/assets/lib/Han/dist/font/han.woff b/assets/lib/Han/dist/font/han.woff
new file mode 100644
index 00000000..011e06c7
Binary files /dev/null and b/assets/lib/Han/dist/font/han.woff differ
diff --git a/assets/lib/Han/dist/han.css b/assets/lib/Han/dist/han.css
new file mode 100644
index 00000000..1b82c584
--- /dev/null
+++ b/assets/lib/Han/dist/han.css
@@ -0,0 +1,2038 @@
+@charset "UTF-8";
+
+/*! 漢字標準格式 v3.3.0 | MIT License | css.hanzi.co */
+/*! Han.css: the CSS typography framework optimised for Hanzi */
+
+/* normalize.css v4.0.0 | MIT License | github.com/necolas/normalize.css */
+html {
+ font-family: sans-serif; /* 1 */
+ -ms-text-size-adjust: 100%; /* 2 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+}
+body {
+ margin: 0;
+}
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+main,
+menu,
+nav,
+section,
+summary {
+ /* 1 */
+ display: block;
+}
+audio,
+canvas,
+progress,
+video {
+ display: inline-block;
+}
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+progress {
+ vertical-align: baseline;
+}
+template,
+[hidden] {
+ display: none;
+}
+a {
+ background-color: transparent;
+}
+a:active,
+a:hover {
+ outline-width: 0;
+}
+abbr[title] {
+ border-bottom: none; /* 1 */
+ text-decoration: underline; /* 2 */
+ text-decoration: underline dotted; /* 2 */
+}
+b,
+strong {
+ font-weight: inherit;
+}
+b,
+strong {
+ font-weight: bolder;
+}
+dfn {
+ font-style: italic;
+}
+h1 {
+ font-size: 2em;
+ margin: .67em 0;
+}
+mark {
+ background-color: #ff0;
+ color: #000;
+}
+small {
+ font-size: 80%;
+}
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+sub {
+ bottom: -.25em;
+}
+sup {
+ top: -.5em;
+}
+img {
+ border-style: none;
+}
+svg:not(:root) {
+ overflow: hidden;
+}
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+}
+figure {
+ margin: 1em 40px;
+}
+hr {
+ box-sizing: content-box; /* 1 */
+ height: 0; /* 1 */
+ overflow: visible; /* 2 */
+}
+button,
+input,
+select,
+textarea {
+ font: inherit;
+}
+optgroup {
+ font-weight: bold;
+}
+button,
+input,
+select {
+ /* 2 */
+ overflow: visible;
+}
+button,
+input,
+select,
+textarea {
+ /* 1 */
+ margin: 0;
+}
+button,
+select {
+ /* 1 */
+ text-transform: none;
+}
+button,
+[type="button"],
+[type="reset"],
+[type="submit"] {
+ cursor: pointer;
+}
+[disabled] {
+ cursor: default;
+}
+button,
+html [type="button"],
+[type="reset"],
+[type="submit"] {
+ -webkit-appearance: button; /* 2 */
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+button:-moz-focusring,
+input:-moz-focusring {
+ outline: 1px dotted ButtonText;
+}
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: .35em .625em .75em;
+}
+legend {
+ box-sizing: border-box; /* 1 */
+ color: inherit; /* 2 */
+ display: table; /* 1 */
+ max-width: 100%; /* 1 */
+ padding: 0; /* 3 */
+ white-space: normal; /* 1 */
+}
+textarea {
+ overflow: auto;
+}
+[type="checkbox"],
+[type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+}
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+[type="search"] {
+ -webkit-appearance: textfield;
+}
+[type="search"]::-webkit-search-cancel-button,
+[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+html {
+ line-height: 1.3;
+ -webkit-font-smoothing: subpixel-antialiased;
+}
+ol,
+ul {
+ padding-left: 2em;
+}
+figure,
+blockquote {
+ margin-left: 2em;
+ margin-right: 2em;
+}
+address {
+ font-style: inherit;
+}
+pre {
+ overflow: auto;
+ white-space: pre;
+ word-wrap: normal;
+}
+a {
+ text-decoration: inherit;
+}
+em:lang(zh),
+em:lang(ja) {
+ -moz-text-emphasis: filled circle;
+ -webkit-text-emphasis: filled circle;
+ text-emphasis: filled circle;
+ -moz-text-emphasis-position: under;
+ -webkit-text-emphasis-position: under;
+ text-emphasis-position: under;
+ font-style: inherit;
+ border-bottom: 2px dotted;
+ padding-bottom: .05em;
+ border-bottom-width: -webkit-calc(0px);
+ padding-bottom: -webkit-calc(0px);
+}
+em:lang(ja) {
+ -moz-text-emphasis: filled sesame;
+ -webkit-text-emphasis: filled sesame;
+ text-emphasis: filled sesame;
+ -moz-text-emphasis-position: over;
+ -webkit-text-emphasis-position: over;
+ text-emphasis-position: over;
+}
+dfn:lang(zh),
+dfn:lang(ja) {
+ font-weight: inherit;
+ font-style: inherit;
+}
+dfn:lang(zh),
+dfn:lang(ja) {
+ font-weight: bolder;
+}
+cite:lang(zh),
+cite:lang(ja) {
+ font-style: inherit;
+}
+q {
+ quotes: "\201c" "\201d" "\2018" "\2019" "\201c" "\201d" "\2018" "\2019" "\201c" "\201d" "\2018" "\2019";
+}
+q:lang(zh) {
+ quotes: "\300c" "\300d" "\300e" "\300f" "\300c" "\300d" "\300e" "\300f" "\300c" "\300d" "\300e" "\300f";
+}
+q:lang(zh-CN),
+q:lang(en) {
+ quotes: "\201c" "\201d" "\2018" "\2019" "\201c" "\201d" "\2018" "\2019" "\201c" "\201d" "\2018" "\2019";
+}
+q:lang(en-GB) {
+ quotes: "\2018" "\2019" "\201c" "\201d" "\2018" "\2019" "\201c" "\201d" "\2018" "\2019" "\201c" "\201d";
+}
+q:before {
+ content: open-quote;
+}
+q:after {
+ content: close-quote;
+}
+q:lang(ja):before,
+q:lang(ja):after {
+ content: none;
+}
+code,
+kbd,
+samp,
+pre {
+ font-family: monospace, monospace, sans-serif;
+}
+i:lang(zh),
+var:lang(zh),
+i:lang(ja),
+var:lang(ja) {
+ font-family: cursive, serif;
+ font-style: inherit;
+}
+u + u,
+ins + u,
+u + ins,
+ins + ins,
+s + s,
+del + s,
+s + del,
+del + del,
+.han-js-rendered u.adjacent,
+.han-js-rendered ins.adjacent,
+.han-js-rendered s + s.adjacent,
+.han-js-rendered del + s.adjacent,
+.han-js-rendered s + del.adjacent,
+.han-js-rendered del + del.adjacent {
+ margin-left: .125em;
+}
+u,
+ins {
+ padding-bottom: .05em;
+ border-bottom: 1px solid;
+ text-decoration: none;
+}
+ruby rtc rt {
+ display: inline;
+ font-size: inherit;
+}
+ruby.zhuyin,
+ruby.mps {
+ display: ruby;
+ -webkit-ruby-position: inter-character;
+ ruby-position: inter-character;
+}
+ruby.zhuyin > rt,
+ruby.mps > rt {
+ -moz-transform: scale(.8);
+ -ms-transform: scale(.8);
+ -webkit-transform: scale(.8);
+ transform: scale(.8);
+ -moz-transform-origin: left center;
+ -ms-transform-origin: left center;
+ -webkit-transform-origin: left center;
+ transform-origin: left center;
+ font-size: .5em;
+}
+ruby.zhuyin > rt:empty,
+ruby.mps > rt:empty {
+ display: none;
+}
+.han-js-rendered u + u,
+.han-js-rendered ins + u,
+.han-js-rendered u + ins,
+.han-js-rendered ins + ins,
+.han-js-rendered s + s,
+.han-js-rendered del + s,
+.han-js-rendered s + del,
+.han-js-rendered del + del {
+ margin-left: auto;
+}
+.textemphasis $han-text-emphasis-pf h-jinze,
+.textemphasis em:lang(zh) h-jinze,
+.textemphasis em:lang(ja) h-jinze {
+ display: inline;
+}
+.han-js-rendered em:lang(zh),
+.han-js-rendered em:lang(ja) {
+ padding-bottom: auto;
+ border-bottom-width: 0;
+}
+.no-textemphasis em:lang(zh),
+.no-textemphasis em:lang(ja) {
+ line-height: 2;
+}
+.no-textemphasis em:lang(zh) h-char,
+.no-textemphasis em:lang(ja) h-char {
+ position: relative;
+ font-style: inherit;
+}
+.no-textemphasis em:lang(zh) h-char:after,
+.no-textemphasis em:lang(ja) h-char:after {
+ -moz-text-emphasis: none;
+ -webkit-text-emphasis: none;
+ text-emphasis: none;
+ font-style: normal;
+ font-weight: normal;
+ line-height: normal;
+ text-decoration: none;
+ text-indent: 0;
+ -moz-transform: scale(.5);
+ -ms-transform: scale(.5);
+ -webkit-transform: scale(.5);
+ transform: scale(.5);
+ position: absolute;
+ left: 50%;
+ top: 0;
+ margin-left: -250%;
+ overflow: hidden;
+ display: inline-block;
+ height: 1em;
+ width: 500%;
+ line-height: 1;
+ text-align: center;
+ text-indent: 0;
+ font-family: Georgia, "Times New Roman", Arial, !important;
+}
+em:lang(zh) h-char.punct,
+em:lang(ja) h-char.punct,
+em:lang(zh) h-char.biaodian,
+em:lang(ja) h-char.biaodian {
+ -moz-text-emphasis: none;
+ -webkit-text-emphasis: none;
+ text-emphasis: none;
+}
+.no-textemphasis em:lang(zh) h-char.punct:after,
+.no-textemphasis em:lang(ja) h-char.punct:after,
+.no-textemphasis em:lang(zh) h-char.biaodian:after,
+.no-textemphasis em:lang(ja) h-char.biaodian:after {
+ content: none !important;
+}
+.no-textemphasis em:lang(zh) h-char:after {
+ margin-top: 1em;
+ content: "\25cf";
+}
+.no-textemphasis em:lang(ja) h-char:after {
+ margin-top: -.7em;
+ content: "\fe45";
+}
+ruby.zhuyin h-zhuyin,
+ruby.mps h-zhuyin,
+h-ruby.zhuyin h-zhuyin {
+ position: relative;
+ letter-spacing: 0;
+}
+ruby.zhuyin h-diao,
+ruby.mps h-diao,
+h-ruby.zhuyin h-diao {
+ position: absolute;
+ right: -.9em;
+ bottom: .5em;
+ display: block;
+ font-size: 1.5em;
+}
+ruby.zhuyin h-diao h-char,
+ruby.mps h-diao h-char,
+h-ruby.zhuyin h-diao h-char {
+ -webkit-writing-mode: horizontal-tb;
+ writing-mode: horizontal-tb;
+}
+ruby.zhuyin [diao="˙"] h-diao,
+ruby.mps [diao="˙"] h-diao,
+h-ruby.zhuyin [diao="˙"] h-diao {
+ top: -.3em;
+ right: auto;
+ bottom: auto;
+ left: 0;
+ font-size: 1em;
+}
+ruby.zhuyin [diao^="ㆴ"] h-diao,
+ruby.mps [diao^="ㆴ"] h-diao,
+h-ruby.zhuyin [diao^="ㆴ"] h-diao,
+ruby.zhuyin [diao^="ㆵ"] h-diao,
+ruby.mps [diao^="ㆵ"] h-diao,
+h-ruby.zhuyin [diao^="ㆵ"] h-diao,
+ruby.zhuyin [diao^="ㆶ"] h-diao,
+ruby.mps [diao^="ㆶ"] h-diao,
+h-ruby.zhuyin [diao^="ㆶ"] h-diao,
+ruby.zhuyin [diao^="ㆷ"] h-diao,
+ruby.mps [diao^="ㆷ"] h-diao,
+h-ruby.zhuyin [diao^="ㆷ"] h-diao,
+ruby.zhuyin [diao=""] h-diao,
+ruby.mps [diao=""] h-diao,
+h-ruby.zhuyin [diao=""] h-diao,
+ruby.zhuyin [diao=""] h-diao,
+ruby.mps [diao=""] h-diao,
+h-ruby.zhuyin [diao=""] h-diao,
+ruby.zhuyin [diao=""] h-diao,
+ruby.mps [diao=""] h-diao,
+h-ruby.zhuyin [diao=""] h-diao,
+ruby.zhuyin [diao=""] h-diao,
+ruby.mps [diao=""] h-diao,
+h-ruby.zhuyin [diao=""] h-diao {
+ right: -1em;
+ bottom: -.125em;
+ font-size: 1em;
+}
+h-ru[annotation] {
+ position: relative;
+ display: inline-table;
+ border-collapse: collapse;
+ border-spacing: 0;
+ line-height: 1.1;
+ text-align: center;
+ vertical-align: 1em;
+}
+h-ru[annotation] > h-ru[annotation] {
+ vertical-align: -.1em;
+}
+h-ru[annotation] > h-ru,
+h-ru[annotation] > rb,
+h-ru[annotation] > rt {
+ line-height: 1;
+ text-align: center;
+}
+h-ru[annotation] > rt {
+ display: table-header-group;
+ height: 1em;
+ font-size: .5em;
+ white-space: nowrap;
+ word-break: normal;
+}
+h-ru[annotation] > rt:before,
+h-ru[annotation] > rt:after {
+ content: "\2006";
+}
+h-ru[order="0"] > rt,
+h-ruby[rightangle][doubleline] h-ru[order="0"] > rt {
+ display: table-header-group;
+}
+h-ru[order="1"] > rt,
+h-ruby[rightangle] h-ru[order="0"] > rt,
+h-ruby[rightangle][doubleline] h-ru[order="1"] > rt {
+ display: table-footer-group;
+}
+h-ru[order="0"] > h-ru[order="1"] {
+ vertical-align: .15em;
+}
+h-ruby[rightangle][doubleline] h-ru[order="0"] rt {
+ line-height: 1.5;
+}
+h-ruby[rightangle][doubleline] h-ru[annotation] {
+ vertical-align: .5em;
+}
+[zhuyin] h-zhuyin {
+ -moz-text-emphasis: none;
+ -webkit-text-emphasis: none;
+ text-emphasis: none;
+ font-style: normal;
+ font-weight: normal;
+ line-height: normal;
+ text-decoration: none;
+ text-indent: 0;
+ position: relative;
+ display: inline-block;
+ height: 1em;
+ width: .4em;
+ vertical-align: text-top;
+}
+[zhuyin] h-zhuyin > * {
+ -moz-transform: scale(.4);
+ -ms-transform: scale(.4);
+ -webkit-transform: scale(.4);
+ transform: scale(.4);
+ -moz-transform-origin: left top;
+ -ms-transform-origin: left top;
+ -webkit-transform-origin: left top;
+ transform-origin: left top;
+ display: inline-block;
+}
+[zhuyin] h-yin {
+ position: absolute;
+ left: 0;
+ height: 1em;
+ vertical-align: top;
+ line-height: 1;
+}
+[zhuyin] h-diao {
+ position: absolute;
+ bottom: 0;
+ right: -.9em;
+ line-height: 1;
+}
+[zhuyin] h-yin:empty,
+[zhuyin] h-diao:empty {
+ display: none;
+}
+[zhuyin] [length="0"] {
+ margin-right: 0;
+}
+[zhuyin] [length="0"] h-zhuyin {
+ display: none;
+}
+[zhuyin] [length="1"] h-yin {
+ top: .3em;
+}
+[zhuyin] [length="1"] h-diao {
+ bottom: 0;
+}
+[zhuyin] [length="2"] h-yin {
+ top: .05em;
+}
+[zhuyin] [length="2"] h-diao {
+ bottom: -.3em;
+}
+[zhuyin] [length="3"] h-yin {
+ top: -.05em;
+ line-height: .85;
+}
+[zhuyin] [length="3"] h-diao {
+ bottom: -.35em;
+}
+[zhuyin] [diao="˙"] h-diao {
+ top: 0;
+ right: auto;
+ bottom: auto;
+ left: .06em;
+}
+[zhuyin] [diao="˙"] [length="1"] h-diao {
+ top: .15em;
+}
+[zhuyin] [diao="˙"] [length="2"] h-diao {
+ top: -.05em;
+}
+[zhuyin] [diao="˙"] [length="3"] h-diao {
+ top: -.2em;
+}
+[zhuyin] [diao="˪"] h-diao,
+[zhuyin] [diao="˫"] h-diao {
+ -moz-transform: scale(.6);
+ -ms-transform: scale(.6);
+ -webkit-transform: scale(.6);
+ transform: scale(.6);
+ -moz-transform-origin: left top;
+ -ms-transform-origin: left top;
+ -webkit-transform-origin: left top;
+ transform-origin: left top;
+}
+[zhuyin] [diao^="ㆴ"] h-diao,
+[zhuyin] [diao^="ㆵ"] h-diao,
+[zhuyin] [diao^="ㆶ"] h-diao,
+[zhuyin] [diao^="ㆷ"] h-diao,
+[zhuyin] [diao=""] h-diao,
+[zhuyin] [diao=""] h-diao,
+[zhuyin] [diao=""] h-diao,
+[zhuyin] [diao=""] h-diao {
+ bottom: -.6em;
+ margin-right: .3em;
+}
+[zhuyin] {
+ margin-right: .2em;
+ display: inline-block;
+ line-height: 1.8;
+}
+[rightangle] h-ru[annotation] {
+ vertical-align: 0;
+ line-height: 1;
+}
+[rightangle] rt:after {
+ content: "";
+ display: inline-block;
+ width: 1.2em;
+}
+h-ru h-ru[zhuyin] {
+ margin-top: -.4em;
+ margin-bottom: -.2em;
+ line-height: 1.8;
+}
+h-jinze,
+h-word {
+ display: inline-block;
+ text-indent: 0;
+}
+@font-face {
+ font-family: "Han Heiti";
+ src: local("Hiragino Sans GB"), local("Lantinghei TC Extralight"), local("Lantinghei SC Extralight"), local(FZLTXHB--B51-0), local(FZLTZHK--GBK1-0), local(".PingFang SC Light"), local(".PingFang TC Light"), local(".PingFang-SC-Light"), local(".PingFang-TC-Light"), local(".PingFang SC"), local(".PingFang TC"), local("Heiti SC Light"), local(STHeitiSC-Light), local("Heiti SC"), local("Heiti TC Light"), local(STHeitiTC-Light), local("Heiti TC"), local("Microsoft Yahei"), local("Microsoft Jhenghei"), local("Noto Sans CJK KR"), local("Noto Sans CJK JP"), local("Noto Sans CJK SC"), local("Noto Sans CJK TC"), local("Source Han Sans K"), local("Source Han Sans KR"), local("Source Han Sans JP"), local("Source Han Sans CN"), local("Source Han Sans HK"), local("Source Han Sans TW"), local("Source Han Sans TWHK"), local("Droid Sans Fallback");
+}
+@font-face {
+ unicode-range: U+4E00-9FFF, U+3400-4DB5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3040-309F, U+30A0-30FF, U+3099-309E, U+FF66-FF9F, U+3007, U+31C0-31E3, U+2F00-2FD5, U+2E80-2EF3;
+ font-family: "Han Heiti";
+ src: local(YuGothic), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro");
+}
+@font-face {
+ font-family: "Han Heiti CNS";
+ src: local(".PingFang TC Light"), local(".PingFang-TC-Light"), local(".PingFang TC"), local("Heiti TC Light"), local(STHeitiTC-Light), local("Heiti TC"), local("Lantinghei TC Extralight"), local(FZLTXHB--B51-0), local("Lantinghei TC"), local("Microsoft Jhenghei"), local("Microsoft Yahei"), local("Noto Sans CJK TC"), local("Source Han Sans TC"), local("Source Han Sans TW"), local("Source Han Sans TWHK"), local("Source Han Sans HK"), local("Droid Sans Fallback");
+}
+@font-face {
+ font-family: "Han Heiti GB";
+ src: local("Hiragino Sans GB"), local(".PingFang SC Light"), local(".PingFang-SC-Light"), local(".PingFang SC"), local("Lantinghei SC Extralight"), local(FZLTXHK--GBK1-0), local("Lantinghei SC"), local("Heiti SC Light"), local(STHeitiSC-Light), local("Heiti SC"), local("Microsoft Yahei"), local("Noto Sans CJK SC"), local("Source Han Sans SC"), local("Source Han Sans CN"), local("Droid Sans Fallback");
+}
+@font-face {
+ font-family: "Han Heiti";
+ font-weight: 600;
+ src: local("Hiragino Sans GB W6"), local(HiraginoSansGB-W6), local("Lantinghei TC Demibold"), local("Lantinghei SC Demibold"), local(FZLTZHB--B51-0), local(FZLTZHK--GBK1-0), local(".PingFang-SC-Semibold"), local(".PingFang-TC-Semibold"), local("Heiti SC Medium"), local("STHeitiSC-Medium"), local("Heiti SC"), local("Heiti TC Medium"), local("STHeitiTC-Medium"), local("Heiti TC"), local("Microsoft YaHei Bold"), local("Microsoft Jhenghei Bold"), local(MicrosoftYaHei-Bold), local(MicrosoftJhengHeiBold), local("Microsoft YaHei"), local("Microsoft Jhenghei"), local("Noto Sans CJK KR Bold"), local("Noto Sans CJK JP Bold"), local("Noto Sans CJK SC Bold"), local("Noto Sans CJK TC Bold"), local(NotoSansCJKkr-Bold), local(NotoSansCJKjp-Bold), local(NotoSansCJKsc-Bold), local(NotoSansCJKtc-Bold), local("Source Han Sans K Bold"), local(SourceHanSansK-Bold), local("Source Han Sans K"), local("Source Han Sans KR Bold"), local("Source Han Sans JP Bold"), local("Source Han Sans CN Bold"), local("Source Han Sans HK Bold"), local("Source Han Sans TW Bold"), local("Source Han Sans TWHK Bold"), local("SourceHanSansKR-Bold"), local("SourceHanSansJP-Bold"), local("SourceHanSansCN-Bold"), local("SourceHanSansHK-Bold"), local("SourceHanSansTW-Bold"), local("SourceHanSansTWHK-Bold"), local("Source Han Sans KR"), local("Source Han Sans CN"), local("Source Han Sans HK"), local("Source Han Sans TW"), local("Source Han Sans TWHK");
+}
+@font-face {
+ unicode-range: U+4E00-9FFF, U+3400-4DB5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3040-309F, U+30A0-30FF, U+3099-309E, U+FF66-FF9F, U+3007, U+31C0-31E3, U+2F00-2FD5, U+2E80-2EF3;
+ font-family: "Han Heiti";
+ font-weight: 600;
+ src: local("YuGothic Bold"), local("Hiragino Kaku Gothic ProN W6"), local("Hiragino Kaku Gothic Pro W6"), local(YuGo-Bold), local(HiraKakuProN-W6), local(HiraKakuPro-W6);
+}
+@font-face {
+ font-family: "Han Heiti CNS";
+ font-weight: 600;
+ src: local(".PingFang TC Semibold"), local(".PingFang-TC-Semibold"), local("Heiti TC Medium"), local("STHeitiTC-Medium"), local("Heiti TC"), local("Lantinghei TC Demibold"), local(FZLTXHB--B51-0), local("Microsoft Jhenghei Bold"), local(MicrosoftJhengHeiBold), local("Microsoft Jhenghei"), local("Microsoft YaHei Bold"), local(MicrosoftYaHei-Bold), local("Noto Sans CJK TC Bold"), local(NotoSansCJKtc-Bold), local("Noto Sans CJK TC"), local("Source Han Sans TC Bold"), local("SourceHanSansTC-Bold"), local("Source Han Sans TC"), local("Source Han Sans TW Bold"), local("SourceHanSans-TW"), local("Source Han Sans TW"), local("Source Han Sans TWHK Bold"), local("SourceHanSans-TWHK"), local("Source Han Sans TWHK"), local("Source Han Sans HK"), local("SourceHanSans-HK"), local("Source Han Sans HK");
+}
+@font-face {
+ font-family: "Han Heiti GB";
+ font-weight: 600;
+ src: local("Hiragino Sans GB W6"), local(HiraginoSansGB-W6), local(".PingFang SC Semibold"), local(".PingFang-SC-Semibold"), local("Lantinghei SC Demibold"), local(FZLTZHK--GBK1-0), local("Heiti SC Medium"), local("STHeitiSC-Medium"), local("Heiti SC"), local("Microsoft YaHei Bold"), local(MicrosoftYaHei-Bold), local("Microsoft YaHei"), local("Noto Sans CJK SC Bold"), local(NotoSansCJKsc-Bold), local("Noto Sans CJK SC"), local("Source Han Sans SC Bold"), local("SourceHanSansSC-Bold"), local("Source Han Sans CN Bold"), local("SourceHanSansCN-Bold"), local("Source Han Sans SC"), local("Source Han Sans CN");
+}
+@font-face {
+ font-family: "Han Heiti";
+ src: local("Hiragino Sans GB"), local("Lantinghei TC Extralight"), local("Lantinghei SC Extralight"), local(FZLTXHB--B51-0), local(FZLTZHK--GBK1-0), local(".PingFang SC Light"), local(".PingFang TC Light"), local(".PingFang-SC-Light"), local(".PingFang-TC-Light"), local(".PingFang SC"), local(".PingFang TC"), local("Heiti SC Light"), local("STHeitiSC-Light"), local("Heiti SC"), local("Heiti TC Light"), local("STHeitiTC-Light"), local("Heiti TC"), local("Microsoft Yahei"), local("Microsoft Jhenghei"), local("Noto Sans CJK KR"), local("Noto Sans CJK JP"), local("Noto Sans CJK SC"), local("Noto Sans CJK TC"), local("Source Han Sans K"), local("Source Han Sans KR"), local("Source Han Sans JP"), local("Source Han Sans CN"), local("Source Han Sans HK"), local("Source Han Sans TW"), local("Source Han Sans TWHK"), local("Droid Sans Fallback");
+ unicode-range: U+270C;
+}
+@font-face {
+ font-family: "Han Heiti";
+ font-weight: 600;
+ src: local("Hiragino Sans GB W6"), local(HiraginoSansGB-W6), local("Lantinghei TC Demibold"), local("Lantinghei SC Demibold"), local(FZLTZHB--B51-0), local(FZLTZHK--GBK1-0), local(".PingFang-SC-Semibold"), local(".PingFang-TC-Semibold"), local("Heiti SC Medium"), local("STHeitiSC-Medium"), local("Heiti SC"), local("Heiti TC Medium"), local("STHeitiTC-Medium"), local("Heiti TC"), local("Microsoft YaHei Bold"), local("Microsoft Jhenghei Bold"), local(MicrosoftYaHei-Bold), local(MicrosoftJhengHeiBold), local("Microsoft YaHei"), local("Microsoft Jhenghei"), local("Noto Sans CJK KR Bold"), local("Noto Sans CJK JP Bold"), local("Noto Sans CJK SC Bold"), local("Noto Sans CJK TC Bold"), local(NotoSansCJKkr-Bold), local(NotoSansCJKjp-Bold), local(NotoSansCJKsc-Bold), local(NotoSansCJKtc-Bold), local("Source Han Sans K Bold"), local(SourceHanSansK-Bold), local("Source Han Sans K"), local("Source Han Sans KR Bold"), local("Source Han Sans JP Bold"), local("Source Han Sans CN Bold"), local("Source Han Sans HK Bold"), local("Source Han Sans TW Bold"), local("Source Han Sans TWHK Bold"), local("SourceHanSansKR-Bold"), local("SourceHanSansJP-Bold"), local("SourceHanSansCN-Bold"), local("SourceHanSansHK-Bold"), local("SourceHanSansTW-Bold"), local("SourceHanSansTWHK-Bold"), local("Source Han Sans KR"), local("Source Han Sans CN"), local("Source Han Sans HK"), local("Source Han Sans TW"), local("Source Han Sans TWHK");
+ unicode-range: U+270C;
+}
+@font-face {
+ font-family: "Han Songti";
+ src: local("Songti SC Regular"), local(STSongti-SC-Regular), local("Songti SC"), local("Songti TC Regular"), local(STSongti-TC-Regular), local("Songti TC"), local(STSong), local("Lisong Pro"), local(SimSun), local(PMingLiU);
+}
+@font-face {
+ unicode-range: U+4E00-9FFF, U+3400-4DB5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3040-309F, U+30A0-30FF, U+3099-309E, U+FF66-FF9F, U+3007, U+31C0-31E3, U+2F00-2FD5, U+2E80-2EF3;
+ font-family: "Han Songti";
+ src: local(YuMincho), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("MS Mincho");
+}
+@font-face {
+ font-family: "Han Songti CNS";
+ src: local("Songti TC Regular"), local(STSongti-TC-Regular), local("Songti TC"), local("Lisong Pro"), local("Songti SC Regular"), local(STSongti-SC-Regular), local("Songti SC"), local(STSong), local(PMingLiU), local(SimSun);
+}
+@font-face {
+ font-family: "Han Songti GB";
+ src: local("Songti SC Regular"), local(STSongti-SC-Regular), local("Songti SC"), local(STSong), local(SimSun), local(PMingLiU);
+}
+@font-face {
+ font-family: "Han Songti";
+ font-weight: 600;
+ src: local("STSongti SC Bold"), local("STSongti TC Bold"), local(STSongti-SC-Bold), local(STSongti-TC-Bold), local("STSongti SC"), local("STSongti TC");
+}
+@font-face {
+ unicode-range: U+4E00-9FFF, U+3400-4DB5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3040-309F, U+30A0-30FF, U+3099-309E, U+FF66-FF9F, U+3007, U+31C0-31E3, U+2F00-2FD5, U+2E80-2EF3;
+ font-family: "Han Songti";
+ font-weight: 600;
+ src: local("YuMincho Demibold"), local("Hiragino Mincho ProN W6"), local("Hiragino Mincho Pro W6"), local(YuMin-Demibold), local(HiraMinProN-W6), local(HiraMinPro-W6), local(YuMincho), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro");
+}
+@font-face {
+ font-family: "Han Songti CNS";
+ font-weight: 600;
+ src: local("STSongti TC Bold"), local("STSongti SC Bold"), local(STSongti-TC-Bold), local(STSongti-SC-Bold), local("STSongti TC"), local("STSongti SC");
+}
+@font-face {
+ font-family: "Han Songti GB";
+ font-weight: 600;
+ src: local("STSongti SC Bold"), local(STSongti-SC-Bold), local("STSongti SC");
+}
+@font-face {
+ font-family: "Han Songti";
+ src: local("Songti SC Regular"), local(STSongti-SC-Regular), local("Songti SC"), local("Songti TC Regular"), local(STSongti-TC-Regular), local("Songti TC"), local(STSongti), local("Lisong Pro"), local("MS Mincho"), local(SimSun), local(PMingLiU);
+ unicode-range: U+270C;
+}
+@font-face {
+ font-family: "Han Songti";
+ font-weight: 600;
+ src: local("Songti TC Bold"), local("Songti SC Bold"), local(STSongti-TC-Bold), local(STSongti-SC-Bold), local("Songti TC"), local("Songti SC");
+ unicode-range: U+270C;
+}
+@font-face {
+ font-family: "Han Songti CNS";
+ src: local("Songti TC Regular"), local("Lisong Pro"), local("Songti TC"), local("Songti SC Regular"), local(STSong), local("Songti SC"), local("MS Mincho"), local(PMingLiU), local(SimSun);
+ unicode-range: U+270C;
+}
+@font-face {
+ font-family: "Han Songti CNS";
+ font-weight: 600;
+ src: local("Songti TC Bold"), local("Songti SC Bold"), local(STSongti-TC-Bold), local(STSongti-SC-Bold), local("Songti TC"), local("Songti SC");
+ unicode-range: U+270C;
+}
+@font-face {
+ font-family: "Han Songti GB";
+ src: local("Songti SC"), local(STSong), local(SimSun);
+ unicode-range: U+270C;
+}
+@font-face {
+ font-family: "Han Songti GB";
+ font-weight: 600;
+ src: local("Songti SC Bold"), local(STSongti-SC-Bold), local("Songti SC");
+ unicode-range: U+270C;
+}
+@font-face {
+ font-family: cursive;
+ src: local("Kaiti TC Regular"), local(STKaiTi-TC-Regular), local("Kaiti TC"), local("Kaiti SC"), local(STKaiti), local(BiauKai), local("標楷體"), local(DFKaiShu-SB-Estd-BF), local(Kaiti), local(DFKai-SB);
+}
+@font-face {
+ unicode-range: U+4E00-9FFF, U+3400-4DB5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3040-309F, U+30A0-30FF, U+3099-309E, U+FF66-FF9F, U+3007, U+31C0-31E3, U+2F00-2FD5, U+2E80-2EF3;
+ font-family: "Han Kaiti";
+ src: local("Kaiti TC Regular"), local(STKaiTi-TC-Regular), local("Kaiti TC"), local("Kaiti SC"), local(STKaiti), local(BiauKai), local("標楷體"), local(DFKaiShu-SB-Estd-BF), local(Kaiti), local(DFKai-SB);
+}
+@font-face {
+ unicode-range: U+4E00-9FFF, U+3400-4DB5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3040-309F, U+30A0-30FF, U+3099-309E, U+FF66-FF9F, U+3007, U+31C0-31E3, U+2F00-2FD5, U+2E80-2EF3;
+ font-family: "Han Kaiti CNS";
+ src: local(BiauKai), local("標楷體"), local(DFKaiShu-SB-Estd-BF), local("Kaiti TC Regular"), local(STKaiTi-TC-Regular), local("Kaiti TC");
+}
+@font-face {
+ unicode-range: U+4E00-9FFF, U+3400-4DB5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3040-309F, U+30A0-30FF, U+3099-309E, U+FF66-FF9F, U+3007, U+31C0-31E3, U+2F00-2FD5, U+2E80-2EF3;
+ font-family: "Han Kaiti GB";
+ src: local("Kaiti SC Regular"), local(STKaiTi-SC-Regular), local("Kaiti SC"), local(STKaiti), local(Kai), local(Kaiti), local(DFKai-SB);
+}
+@font-face {
+ font-family: cursive;
+ font-weight: 600;
+ src: local("Kaiti TC Bold"), local(STKaiTi-TC-Bold), local("Kaiti SC Bold"), local(STKaiti-SC-Bold), local("Kaiti TC"), local("Kaiti SC");
+}
+@font-face {
+ font-family: "Han Kaiti";
+ font-weight: 600;
+ src: local("Kaiti TC Bold"), local(STKaiTi-TC-Bold), local("Kaiti SC Bold"), local(STKaiti-SC-Bold), local("Kaiti TC"), local("Kaiti SC");
+}
+@font-face {
+ font-family: "Han Kaiti CNS";
+ font-weight: 600;
+ src: local("Kaiti TC Bold"), local(STKaiTi-TC-Bold), local("Kaiti TC");
+}
+@font-face {
+ font-family: "Han Kaiti GB";
+ font-weight: 600;
+ src: local("Kaiti SC Bold"), local(STKaiti-SC-Bold);
+}
+@font-face {
+ unicode-range: U+4E00-9FFF, U+3400-4DB5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3040-309F, U+30A0-30FF, U+3099-309E, U+FF66-FF9F, U+3007, U+31C0-31E3, U+2F00-2FD5, U+2E80-2EF3;
+ font-family: "Han Fangsong";
+ src: local(STFangsong), local(FangSong);
+}
+@font-face {
+ unicode-range: U+4E00-9FFF, U+3400-4DB5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3040-309F, U+30A0-30FF, U+3099-309E, U+FF66-FF9F, U+3007, U+31C0-31E3, U+2F00-2FD5, U+2E80-2EF3;
+ font-family: "Han Fangsong CNS";
+ src: local(STFangsong), local(FangSong);
+}
+@font-face {
+ unicode-range: U+4E00-9FFF, U+3400-4DB5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3040-309F, U+30A0-30FF, U+3099-309E, U+FF66-FF9F, U+3007, U+31C0-31E3, U+2F00-2FD5, U+2E80-2EF3;
+ font-family: "Han Fangsong GB";
+ src: local(STFangsong), local(FangSong);
+}
+@font-face {
+ font-family: "Biaodian Sans";
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local("MS Gothic"), local(SimSun);
+ unicode-range: U+FF0E;
+}
+@font-face {
+ font-family: "Biaodian Serif";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local(SimSun);
+ unicode-range: U+FF0E;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans";
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local("MS Gothic"), local(SimSun);
+ unicode-range: U+FF0E;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local(SimSun);
+ unicode-range: U+FF0E;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans CNS";
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local("MS Gothic"), local(SimSun);
+ unicode-range: U+FF0E;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif CNS";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local(SimSun);
+ unicode-range: U+FF0E;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans GB";
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local("MS Gothic"), local(SimSun);
+ unicode-range: U+FF0E;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local(SimSun);
+ unicode-range: U+FF0E;
+}
+@font-face {
+ font-family: "Biaodian Sans";
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun);
+ unicode-range: U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Serif";
+ src: local("Songti SC"), local(STSong), local("Heiti SC"), local(SimSun);
+ unicode-range: U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans";
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun);
+ unicode-range: U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif";
+ src: local("Songti SC"), local(STSong), local("Heiti SC"), local(SimSun);
+ unicode-range: U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans CNS";
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun);
+ unicode-range: U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif CNS";
+ src: local("Songti SC"), local(STSong), local("Heiti SC"), local(SimSun);
+ unicode-range: U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans GB";
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun);
+ unicode-range: U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ src: local("Songti SC"), local(STSong), local("Heiti SC"), local(SimSun);
+ unicode-range: U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Sans";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Microsoft Yahei"), local(SimSun);
+ unicode-range: U+2014;
+}
+@font-face {
+ font-family: "Biaodian Serif";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local("Microsoft Yahei"), local(SimSun);
+ unicode-range: U+2014;
+}
+@font-face {
+ font-family: "Yakumono Sans";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Arial Unicode MS"), local("MS Gothic");
+ unicode-range: U+2014;
+}
+@font-face {
+ font-family: "Yakumono Serif";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("MS Mincho"), local("Microsoft Yahei");
+ unicode-range: U+2014;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Microsoft Yahei"), local(SimSun);
+ unicode-range: U+2014;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local("Microsoft Yahei"), local(SimSun);
+ unicode-range: U+2014;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans CNS";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Microsoft Yahei"), local(SimSun);
+ unicode-range: U+2014;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif CNS";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local("Microsoft Yahei"), local(SimSun);
+ unicode-range: U+2014;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans GB";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Microsoft Yahei"), local(SimSun);
+ unicode-range: U+2014;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local("Microsoft Yahei"), local(SimSun);
+ unicode-range: U+2014;
+}
+@font-face {
+ font-family: "Biaodian Sans";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(Meiryo), local("MS Gothic"), local(SimSun), local(PMingLiU);
+ unicode-range: U+2026;
+}
+@font-face {
+ font-family: "Biaodian Serif";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local("MS Mincho"), local(SimSun), local(PMingLiU);
+ unicode-range: U+2026;
+}
+@font-face {
+ font-family: "Yakumono Sans";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(Meiryo), local("MS Gothic");
+ unicode-range: U+2026;
+}
+@font-face {
+ font-family: "Yakumono Serif";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("MS Mincho");
+ unicode-range: U+2026;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(SimSun), local(PMingLiU);
+ unicode-range: U+2026;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(SimSun), local(PMingLiU);
+ unicode-range: U+2026;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans CNS";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(SimSun), local(PMingLiU);
+ unicode-range: U+2026;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif CNS";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSongti), local(SimSun), local(PMingLiU);
+ unicode-range: U+2026;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans GB";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(SimSun), local(PMingLiU);
+ unicode-range: U+2026;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSongti), local(SimSun), local(PMingLiU);
+ unicode-range: U+2026;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans GB";
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun), local(PMingLiU);
+ unicode-range: U+201C-201D, U+2018-2019;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans GB";
+ font-weight: bold;
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun), local(PMingLiU);
+ unicode-range: U+201C-201D, U+2018-2019;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ src: local("Lisong Pro"), local("Heiti SC"), local(STHeiti), local(SimSun), local(PMingLiU);
+ unicode-range: U+201C-201D, U+2018-2019;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ font-weight: bold;
+ src: local("Lisong Pro"), local("Heiti SC"), local(STHeiti), local(SimSun), local(PMingLiU);
+ unicode-range: U+201C-201D, U+2018-2019;
+}
+@font-face {
+ font-family: "Biaodian Sans";
+ src: local(Georgia), local("Times New Roman"), local(Arial), local("Droid Sans Fallback");
+ unicode-range: U+25CF;
+}
+@font-face {
+ font-family: "Biaodian Serif";
+ src: local(Georgia), local("Times New Roman"), local(Arial), local("Droid Sans Fallback");
+ unicode-range: U+25CF;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans";
+ src: local(Georgia), local("Times New Roman"), local(Arial), local("Droid Sans Fallback");
+ unicode-range: U+25CF;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif";
+ src: local(Georgia), local("Times New Roman"), local(Arial), local("Droid Sans Fallback");
+ unicode-range: U+25CF;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans CNS";
+ src: local(Georgia), local("Times New Roman"), local(Arial), local("Droid Sans Fallback");
+ unicode-range: U+25CF;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif CNS";
+ src: local(Georgia), local("Times New Roman"), local(Arial), local("Droid Sans Fallback");
+ unicode-range: U+25CF;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans GB";
+ src: local(Georgia), local("Times New Roman"), local(Arial), local("Droid Sans Fallback");
+ unicode-range: U+25CF;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ src: local(Georgia), local("Times New Roman"), local(Arial), local("Droid Sans Fallback");
+ unicode-range: U+25CF;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans";
+ src: local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("MS Gothic");
+ unicode-range: U+3002, U+FF0C, U+3001, U+FF1B, U+FF1A, U+FF1F, U+FF01, U+FF0D, U+FF0F, U+FF3C;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("MS Mincho");
+ unicode-range: U+3002, U+FF0C, U+3001, U+FF1B, U+FF1A, U+FF1F, U+FF01, U+FF0D, U+FF0F, U+FF3C;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans CNS";
+ src: local("Heiti TC"), local("Lihei Pro"), local("Microsoft Jhenghei"), local(PMingLiU);
+ unicode-range: U+3002, U+FF0C, U+3001;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans CNS";
+ src: local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Heiti TC"), local("Lihei Pro"), local("Microsoft Jhenghei"), local(PMingLiU), local("MS Gothic");
+ unicode-range: U+FF1B, U+FF1A, U+FF1F, U+FF01;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans CNS";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("MS Mincho");
+ unicode-range: U+FF0D, U+FF0F, U+FF3C;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif CNS";
+ src: local(STSongti-TC-Regular), local("Lisong Pro"), local("Heiti TC"), local(PMingLiU);
+ unicode-range: U+3002, U+FF0C, U+3001;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif CNS";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local(PMingLiU), local("MS Mincho");
+ unicode-range: U+FF1B, U+FF1A, U+FF1F, U+FF01, U+FF0D, U+FF0F, U+FF3C;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans GB";
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(SimSun), local("MS Gothic");
+ unicode-range: U+3002, U+FF0C, U+3001, U+FF1B, U+FF1A, U+FF1F, U+FF01, U+FF0D, U+FF0F, U+FF3C;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ src: local("Songti SC"), local(STSongti), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun), local("MS Mincho");
+ unicode-range: U+3002, U+FF0C, U+3001, U+FF1B, U+FF1A, U+FF1F, U+FF01;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local(PMingLiU), local("MS Mincho");
+ unicode-range: U+FF0D, U+FF0F, U+FF3C;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans";
+ src: local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Yu Gothic"), local(YuGothic), local(SimSun), local(PMingLiU);
+ unicode-range: U+300C-300F, U+300A-300B, U+3008-3009, U+FF08-FF09, U+3014-3015;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Yu Mincho"), local(YuMincho), local(SimSun), local(PMingLiU);
+ unicode-range: U+300C-300F, U+300A-300B, U+3008-3009, U+FF08-FF09, U+3014-3015;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans CNS";
+ src: local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Yu Gothic"), local(YuGothic), local(SimSun), local(PMingLiU);
+ unicode-range: U+300C-300F, U+300A-300B, U+3008-3009, U+FF08-FF09, U+3014-3015;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif CNS";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Yu Mincho"), local(YuMincho), local(SimSun), local(PMingLiU);
+ unicode-range: U+300C-300F, U+300A-300B, U+3008-3009, U+FF08-FF09, U+3014-3015;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans GB";
+ src: local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Yu Gothic"), local(YuGothic), local(SimSun), local(PMingLiU);
+ unicode-range: U+300C-300F, U+300A-300B, U+3008-3009, U+FF08-FF09, U+3014-3015;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Yu Mincho"), local(YuMincho), local(SimSun), local(PMingLiU);
+ unicode-range: U+300C-300F, U+300A-300B, U+3008-3009, U+FF08-FF09, U+3014-3015;
+}
+@font-face {
+ font-family: "Biaodian Basic";
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+2014, U+2026, U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Basic";
+ font-weight: bold;
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+2014, U+2026, U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Sans";
+ font-weight: bold;
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+2014, U+2026, U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans";
+ font-weight: bold;
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+2014, U+2026, U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans";
+ font-weight: bold;
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+2014, U+2026, U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans CNS";
+ font-weight: bold;
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+2014, U+2026, U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans GB";
+ font-weight: bold;
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+2014, U+2026, U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif";
+ font-weight: bold;
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+2014, U+2026, U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif CNS";
+ font-weight: bold;
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+2014, U+2026, U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ font-weight: bold;
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+2014, U+2026, U+00B7;
+}
+@font-face {
+ font-family: "Latin Italic Serif";
+ src: local("Georgia Italic"), local("Times New Roman Italic"), local(Georgia-Italic), local(TimesNewRomanPS-ItalicMT), local(Times-Italic);
+}
+@font-face {
+ font-family: "Latin Italic Serif";
+ font-weight: 700;
+ src: local("Georgia Bold Italic"), local("Times New Roman Bold Italic"), local(Georgia-BoldItalic), local(TimesNewRomanPS-BoldItalicMT), local(Times-Italic);
+}
+@font-face {
+ font-family: "Latin Italic Sans";
+ src: local("Helvetica Neue Italic"), local("Helvetica Oblique"), local("Arial Italic"), local(HelveticaNeue-Italic), local(Helvetica-LightOblique), local(Arial-ItalicMT);
+}
+@font-face {
+ font-family: "Latin Italic Sans";
+ font-weight: 700;
+ src: local("Helvetica Neue Bold Italic"), local("Helvetica Bold Oblique"), local("Arial Bold Italic"), local(HelveticaNeue-BoldItalic), local(Helvetica-BoldOblique), local(Arial-BoldItalicMT);
+}
+@font-face {
+ unicode-range: U+0030-0039;
+ font-family: "Numeral TF Sans";
+ src: local(Skia), local("Neutraface 2 Text"), local(Candara), local(Corbel);
+}
+@font-face {
+ unicode-range: U+0030-0039;
+ font-family: "Numeral TF Serif";
+ src: local(Georgia), local("Hoefler Text"), local("Big Caslon");
+}
+@font-face {
+ unicode-range: U+0030-0039;
+ font-family: "Numeral TF Italic Serif";
+ src: local("Georgia Italic"), local("Hoefler Text Italic"), local(Georgia-Italic), local(HoeflerText-Italic);
+}
+@font-face {
+ unicode-range: U+0030-0039;
+ font-family: "Numeral LF Sans";
+ src: local("Helvetica Neue"), local(Helvetica), local(Arial);
+}
+@font-face {
+ unicode-range: U+0030-0039;
+ font-family: "Numeral LF Italic Sans";
+ src: local("Helvetica Neue Italic"), local("Helvetica Oblique"), local("Arial Italic"), local(HelveticaNeue-Italic), local(Helvetica-LightOblique), local(Arial-ItalicMT);
+}
+@font-face {
+ unicode-range: U+0030-0039;
+ font-family: "Numeral LF Italic Sans";
+ font-weight: bold;
+ src: local("Helvetica Neue Bold Italic"), local("Helvetica Bold Oblique"), local("Arial Bold Italic"), local(HelveticaNeue-BoldItalic), local(Helvetica-BoldOblique), local(Arial-BoldItalicMT);
+}
+@font-face {
+ unicode-range: U+0030-0039;
+ font-family: "Numeral LF Serif";
+ src: local(Palatino), local("Palatino Linotype"), local("Times New Roman");
+}
+@font-face {
+ unicode-range: U+0030-0039;
+ font-family: "Numeral LF Italic Serif";
+ src: local("Palatino Italic"), local("Palatino Italic Linotype"), local("Times New Roman Italic"), local(Palatino-Italic), local(Palatino-Italic-Linotype), local(TimesNewRomanPS-ItalicMT);
+}
+@font-face {
+ unicode-range: U+0030-0039;
+ font-family: "Numeral LF Italic Serif";
+ font-weight: bold;
+ src: local("Palatino Bold Italic"), local("Palatino Bold Italic Linotype"), local("Times New Roman Bold Italic"), local(Palatino-BoldItalic), local(Palatino-BoldItalic-Linotype), local(TimesNewRomanPS-BoldItalicMT);
+}
+@font-face {
+ font-family: "Numeral TF Sans";
+ src: local(lying-to-firefox);
+ unicode-range: U+270C;
+}
+@font-face {
+ font-family: "Numeral TF Serif";
+ src: local(lying-to-firefox);
+ unicode-range: U+270C;
+}
+@font-face {
+ font-family: "Numeral TF Italic Serif";
+ src: local(lying-to-firefox);
+ unicode-range: U+270C;
+}
+@font-face {
+ font-family: "Numeral LF Sans";
+ src: local(lying-to-firefox);
+ unicode-range: U+270C;
+}
+@font-face {
+ font-family: "Numeral LF Italic Sans";
+ src: local(lying-to-firefox);
+ unicode-range: U+270C;
+}
+@font-face {
+ font-family: "Numeral LF Italic Sans";
+ font-weight: bold;
+ src: local(lying-to-firefox);
+ unicode-range: U+270C;
+}
+@font-face {
+ font-family: "Numeral LF Serif";
+ src: local(lying-to-firefox);
+ unicode-range: U+270C;
+}
+@font-face {
+ font-family: "Numeral LF Italic Serif";
+ src: local(lying-to-firefox);
+ unicode-range: U+270C;
+}
+@font-face {
+ font-family: "Numeral LF Italic Serif";
+ font-weight: bold;
+ src: local(lying-to-firefox);
+ unicode-range: U+270C;
+}
+@font-face {
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+3105-312D, U+31A0-31BA, U+02D9, U+02CA, U+02C5, U+02C7, U+02CB, U+02EA-02EB, U+030D, U+0358, U+F31B4-F31B7, U+F0061, U+F0065, U+F0069, U+F006F, U+F0075;
+ font-family: "Zhuyin Kaiti";
+}
+@font-face {
+ unicode-range: U+3105-312D, U+31A0-31BA, U+02D9, U+02CA, U+02C5, U+02C7, U+02CB, U+02EA-02EB, U+030D, U+0358, U+F31B4-F31B7, U+F0061, U+F0065, U+F0069, U+F006F, U+F0075;
+ font-family: "Zhuyin Heiti";
+ src: local("Hiragino Sans GB"), local("Heiti TC"), local("Microsoft Jhenghei"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+}
+@font-face {
+ font-family: "Zhuyin Heiti";
+ src: local("Heiti TC"), local("Microsoft Jhenghei"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+3127;
+}
+@font-face {
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ font-family: "Zhuyin Heiti";
+ unicode-range: U+02D9, U+02CA, U+02C5, U+02C7, U+02CB, U+02EA-02EB, U+31B4, U+31B5, U+31B6, U+31B7, U+030D, U+0358, U+F31B4-F31B7, U+F0061, U+F0065, U+F0069, U+F006F, U+F0075;
+}
+@font-face {
+ src: url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ font-family: "Romanization Sans";
+ unicode-range: U+030D, U+0358, U+F31B4-F31B7, U+F0061, U+F0065, U+F0069, U+F006F, U+F0075;
+}
+html:lang(zh-Latn),
+html:lang(ja-Latn),
+html:not(:lang(zh)):not(:lang(ja)),
+html *:lang(zh-Latn),
+html *:lang(ja-Latn),
+html *:not(:lang(zh)):not(:lang(ja)),
+article strong:lang(zh-Latn),
+article strong:lang(ja-Latn),
+article strong:not(:lang(zh)):not(:lang(ja)),
+article strong *:lang(zh-Latn),
+article strong *:lang(ja-Latn),
+article strong *:not(:lang(zh)):not(:lang(ja)) {
+ font-family: "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif;
+}
+html:lang(zh),
+html:lang(zh-Hant),
+[lang^="zh"],
+[lang*="Hant"],
+[lang="zh-TW"],
+[lang="zh-HK"],
+article strong:lang(zh),
+article strong:lang(zh-Hant) {
+ font-family: "Biaodian Pro Sans CNS", "Helvetica Neue", Helvetica, Arial, "Zhuyin Heiti", "Han Heiti", sans-serif;
+}
+html:lang(zh).no-unicoderange,
+html:lang(zh-Hant).no-unicoderange,
+.no-unicoderange [lang^="zh"],
+.no-unicoderange [lang*="Hant"],
+.no-unicoderange [lang="zh-TW"],
+.no-unicoderange [lang="zh-HK"],
+.no-unicoderange article strong:lang(zh),
+.no-unicoderange article strong:lang(zh-Hant) {
+ font-family: "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif;
+}
+html:lang(zh-Hans),
+html:lang(zh-CN),
+[lang*="Hans"],
+[lang="zh-CN"],
+article strong:lang(zh-Hans),
+article strong:lang(zh-CN) {
+ font-family: "Biaodian Pro Sans GB", "Helvetica Neue", Helvetica, Arial, "Han Heiti GB", sans-serif;
+}
+html:lang(zh-Hans).no-unicoderange,
+html:lang(zh-CN).no-unicoderange,
+.no-unicoderange [lang*="Hans"],
+.no-unicoderange [lang="zh-CN"],
+.no-unicoderange article strong:lang(zh-Hans),
+.no-unicoderange article strong:lang(zh-CN) {
+ font-family: "Helvetica Neue", Helvetica, Arial, "Han Heiti GB", sans-serif;
+}
+html:lang(ja),
+[lang^="ja"],
+article strong:lang(ja) {
+ font-family: "Yakumono Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+html:lang(ja).no-unicoderange,
+.no-unicoderange [lang^="ja"],
+.no-unicoderange article strong:lang(ja) {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+article blockquote i:lang(zh-Latn),
+article blockquote var:lang(zh-Latn),
+article blockquote i:lang(ja-Latn),
+article blockquote var:lang(ja-Latn),
+article blockquote i:not(:lang(zh)):not(:lang(ja)),
+article blockquote var:not(:lang(zh)):not(:lang(ja)),
+article blockquote i *:lang(zh-Latn),
+article blockquote var *:lang(zh-Latn),
+article blockquote i *:lang(ja-Latn),
+article blockquote var *:lang(ja-Latn),
+article blockquote i *:not(:lang(zh)):not(:lang(ja)),
+article blockquote var *:not(:lang(zh)):not(:lang(ja)) {
+ font-family: "Latin Italic Sans", "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif;
+}
+article blockquote i:lang(zh),
+article blockquote var:lang(zh),
+article blockquote i:lang(zh-Hant),
+article blockquote var:lang(zh-Hant) {
+ font-family: "Biaodian Pro Sans CNS", "Latin Italic Sans", "Helvetica Neue", Helvetica, Arial, "Zhuyin Heiti", "Han Heiti", sans-serif;
+}
+.no-unicoderange article blockquote i:lang(zh),
+.no-unicoderange article blockquote var:lang(zh),
+.no-unicoderange article blockquote i:lang(zh-Hant),
+.no-unicoderange article blockquote var:lang(zh-Hant) {
+ font-family: "Latin Italic Sans", "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif;
+}
+.no-unicoderange article blockquote i:lang(zh),
+.no-unicoderange article blockquote var:lang(zh),
+.no-unicoderange article blockquote i:lang(zh-Hant),
+.no-unicoderange article blockquote var:lang(zh-Hant) {
+ font-family: "Latin Italic Sans", "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif;
+}
+article blockquote i:lang(zh-Hans),
+article blockquote var:lang(zh-Hans),
+article blockquote i:lang(zh-CN),
+article blockquote var:lang(zh-CN) {
+ font-family: "Biaodian Pro Sans GB", "Latin Italic Sans", "Helvetica Neue", Helvetica, Arial, "Han Heiti GB", sans-serif;
+}
+.no-unicoderange article blockquote i:lang(zh-Hans),
+.no-unicoderange article blockquote var:lang(zh-Hans),
+.no-unicoderange article blockquote i:lang(zh-CN),
+.no-unicoderange article blockquote var:lang(zh-CN) {
+ font-family: "Latin Italic Sans", "Helvetica Neue", Helvetica, Arial, "Han Heiti GB", sans-serif;
+}
+article blockquote i:lang(ja),
+article blockquote var:lang(ja) {
+ font-family: "Yakumono Sans", "Latin Italic Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+.no-unicoderange article blockquote i:lang(ja),
+.no-unicoderange article blockquote var:lang(ja) {
+ font-family: "Latin Italic Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+article figure blockquote:lang(zh-Latn),
+article figure blockquote:lang(ja-Latn),
+article figure blockquote:not(:lang(zh)):not(:lang(ja)),
+article figure blockquote *:lang(zh-Latn),
+article figure blockquote *:lang(ja-Latn),
+article figure blockquote *:not(:lang(zh)):not(:lang(ja)) {
+ font-family: Georgia, "Times New Roman", "Han Songti", cursive, serif;
+}
+article figure blockquote:lang(zh),
+article figure blockquote:lang(zh-Hant) {
+ font-family: "Biaodian Pro Serif CNS", "Numeral LF Serif", Georgia, "Times New Roman", "Zhuyin Kaiti", "Han Songti", serif;
+}
+.no-unicoderange article figure blockquote:lang(zh),
+.no-unicoderange article figure blockquote:lang(zh-Hant) {
+ font-family: "Numeral LF Serif", Georgia, "Times New Roman", "Han Songti", serif;
+}
+article figure blockquote:lang(zh-Hans),
+article figure blockquote:lang(zh-CN) {
+ font-family: "Biaodian Pro Serif GB", "Numeral LF Serif", Georgia, "Times New Roman", "Han Songti GB", serif;
+}
+.no-unicoderange article figure blockquote:lang(zh-Hans),
+.no-unicoderange article figure blockquote:lang(zh-CN) {
+ font-family: "Numeral LF Serif", Georgia, "Times New Roman", "Han Songti GB", serif;
+}
+article figure blockquote:lang(ja) {
+ font-family: "Yakumono Serif", "Numeral LF Serif", Georgia, "Times New Roman", serif;
+}
+.no-unicoderange article figure blockquote:lang(ja) {
+ font-family: "Numeral LF Serif", Georgia, "Times New Roman", serif;
+}
+article blockquote:lang(zh-Latn),
+article blockquote:lang(ja-Latn),
+article blockquote:not(:lang(zh)):not(:lang(ja)),
+article blockquote *:lang(zh-Latn),
+article blockquote *:lang(ja-Latn),
+article blockquote *:not(:lang(zh)):not(:lang(ja)) {
+ font-family: Georgia, "Times New Roman", "Han Kaiti", cursive, serif;
+}
+article blockquote:lang(zh),
+article blockquote:lang(zh-Hant) {
+ font-family: "Biaodian Pro Serif CNS", "Numeral LF Serif", Georgia, "Times New Roman", "Zhuyin Kaiti", "Han Kaiti", cursive, serif;
+}
+.no-unicoderange article blockquote:lang(zh),
+.no-unicoderange article blockquote:lang(zh-Hant) {
+ font-family: "Numeral LF Serif", Georgia, "Times New Roman", "Han Kaiti", cursive, serif;
+}
+article blockquote:lang(zh-Hans),
+article blockquote:lang(zh-CN) {
+ font-family: "Biaodian Pro Serif GB", "Numeral LF Serif", Georgia, "Times New Roman", "Han Kaiti GB", cursive, serif;
+}
+.no-unicoderange article blockquote:lang(zh-Hans),
+.no-unicoderange article blockquote:lang(zh-CN) {
+ font-family: "Numeral LF Serif", Georgia, "Times New Roman", "Han Kaiti GB", cursive, serif;
+}
+article blockquote:lang(ja) {
+ font-family: "Yakumono Serif", "Numeral LF Serif", Georgia, "Times New Roman", cursive, serif;
+}
+.no-unicoderange article blockquote:lang(ja) {
+ font-family: "Numeral LF Serif", Georgia, "Times New Roman", cursive, serif;
+}
+i:lang(zh-Latn),
+var:lang(zh-Latn),
+i:lang(ja-Latn),
+var:lang(ja-Latn),
+i:not(:lang(zh)):not(:lang(ja)),
+var:not(:lang(zh)):not(:lang(ja)),
+i *:lang(zh-Latn),
+var *:lang(zh-Latn),
+i *:lang(ja-Latn),
+var *:lang(ja-Latn),
+i *:not(:lang(zh)):not(:lang(ja)),
+var *:not(:lang(zh)):not(:lang(ja)) {
+ font-family: "Latin Italic Serif", Georgia, "Times New Roman", "Han Kaiti", cursive, serif;
+}
+i:lang(zh),
+var:lang(zh),
+i:lang(zh-Hant),
+var:lang(zh-Hant) {
+ font-family: "Biaodian Pro Serif CNS", "Numeral LF Italic Serif", "Latin Italic Serif", Georgia, "Times New Roman", "Zhuyin Kaiti", "Han Kaiti", cursive, serif;
+}
+.no-unicoderange i:lang(zh),
+.no-unicoderange var:lang(zh),
+.no-unicoderange i:lang(zh-Hant),
+.no-unicoderange var:lang(zh-Hant) {
+ font-family: "Numeral LF Italic Serif", "Latin Italic Serif", Georgia, "Times New Roman", "Han Kaiti", cursive, serif;
+}
+i:lang(zh-Hans),
+var:lang(zh-Hans),
+i:lang(zh-CN),
+var:lang(zh-CN) {
+ font-family: "Biaodian Pro Serif GB", "Numeral LF Italic Serif", "Latin Italic Serif", Georgia, "Times New Roman", "Han Kaiti GB", cursive, serif;
+}
+.no-unicoderange i:lang(zh-Hans),
+.no-unicoderange var:lang(zh-Hans),
+.no-unicoderange i:lang(zh-CN),
+.no-unicoderange var:lang(zh-CN) {
+ font-family: "Numeral LF Italic Serif", "Latin Italic Serif", Georgia, "Times New Roman", "Han Kaiti GB", cursive, serif;
+}
+i:lang(ja),
+var:lang(ja) {
+ font-family: "Yakumono Serif", "Numeral LF Italic Serif", "Latin Italic Serif", Georgia, "Times New Roman", cursive, serif;
+}
+.no-unicoderange i:lang(ja),
+.no-unicoderange var:lang(ja) {
+ font-family: "Numeral LF Italic Serif", "Latin Italic Serif", Georgia, "Times New Roman", cursive, serif;
+}
+code:lang(zh-Latn),
+kbd:lang(zh-Latn),
+samp:lang(zh-Latn),
+pre:lang(zh-Latn),
+code:lang(ja-Latn),
+kbd:lang(ja-Latn),
+samp:lang(ja-Latn),
+pre:lang(ja-Latn),
+code:not(:lang(zh)):not(:lang(ja)),
+kbd:not(:lang(zh)):not(:lang(ja)),
+samp:not(:lang(zh)):not(:lang(ja)),
+pre:not(:lang(zh)):not(:lang(ja)),
+code *:lang(zh-Latn),
+kbd *:lang(zh-Latn),
+samp *:lang(zh-Latn),
+pre *:lang(zh-Latn),
+code *:lang(ja-Latn),
+kbd *:lang(ja-Latn),
+samp *:lang(ja-Latn),
+pre *:lang(ja-Latn),
+code *:not(:lang(zh)):not(:lang(ja)),
+kbd *:not(:lang(zh)):not(:lang(ja)),
+samp *:not(:lang(zh)):not(:lang(ja)),
+pre *:not(:lang(zh)):not(:lang(ja)) {
+ font-family: Menlo, Consolas, Courier, "Han Heiti", monospace, monospace, sans-serif;
+}
+code:lang(zh),
+kbd:lang(zh),
+samp:lang(zh),
+pre:lang(zh),
+code:lang(zh-Hant),
+kbd:lang(zh-Hant),
+samp:lang(zh-Hant),
+pre:lang(zh-Hant) {
+ font-family: "Biaodian Pro Sans CNS", Menlo, Consolas, Courier, "Zhuyin Heiti", "Han Heiti", monospace, monospace, sans-serif;
+}
+.no-unicoderange code:lang(zh),
+.no-unicoderange kbd:lang(zh),
+.no-unicoderange samp:lang(zh),
+.no-unicoderange pre:lang(zh),
+.no-unicoderange code:lang(zh-Hant),
+.no-unicoderange kbd:lang(zh-Hant),
+.no-unicoderange samp:lang(zh-Hant),
+.no-unicoderange pre:lang(zh-Hant) {
+ font-family: Menlo, Consolas, Courier, "Han Heiti", monospace, monospace, sans-serif;
+}
+code:lang(zh-Hans),
+kbd:lang(zh-Hans),
+samp:lang(zh-Hans),
+pre:lang(zh-Hans),
+code:lang(zh-CN),
+kbd:lang(zh-CN),
+samp:lang(zh-CN),
+pre:lang(zh-CN) {
+ font-family: "Biaodian Pro Sans GB", Menlo, Consolas, Courier, "Han Heiti GB", monospace, monospace, sans-serif;
+}
+.no-unicoderange code:lang(zh-Hans),
+.no-unicoderange kbd:lang(zh-Hans),
+.no-unicoderange samp:lang(zh-Hans),
+.no-unicoderange pre:lang(zh-Hans),
+.no-unicoderange code:lang(zh-CN),
+.no-unicoderange kbd:lang(zh-CN),
+.no-unicoderange samp:lang(zh-CN),
+.no-unicoderange pre:lang(zh-CN) {
+ font-family: Menlo, Consolas, Courier, "Han Heiti GB", monospace, monospace, sans-serif;
+}
+code:lang(ja),
+kbd:lang(ja),
+samp:lang(ja),
+pre:lang(ja) {
+ font-family: "Yakumono Sans", Menlo, Consolas, Courier, monospace, monospace, sans-serif;
+}
+.no-unicoderange code:lang(ja),
+.no-unicoderange kbd:lang(ja),
+.no-unicoderange samp:lang(ja),
+.no-unicoderange pre:lang(ja) {
+ font-family: Menlo, Consolas, Courier, monospace, monospace, sans-serif;
+}
+html,
+.no-unicoderange h-char.bd-liga,
+.no-unicoderange h-char[unicode="b7"],
+ruby h-zhuyin,
+h-ruby h-zhuyin,
+ruby h-zhuyin h-diao,
+h-ruby h-zhuyin h-diao,
+ruby.romanization rt,
+h-ruby.romanization rt,
+ruby [annotation] rt,
+h-ruby [annotation] rt {
+ -moz-font-feature-settings: "liga";
+ -ms-font-feature-settings: "liga";
+ -webkit-font-feature-settings: "liga";
+ font-feature-settings: "liga";
+}
+html,
+[lang^="zh"],
+[lang*="Hant"],
+[lang="zh-TW"],
+[lang="zh-HK"],
+[lang*="Hans"],
+[lang="zh-CN"],
+article strong,
+code,
+kbd,
+samp,
+pre,
+article blockquote i,
+article blockquote var {
+ -moz-font-feature-settings: "liga=1, locl=0";
+ -ms-font-feature-settings: "liga", "locl" 0;
+ -webkit-font-feature-settings: "liga", "locl" 0;
+ font-feature-settings: "liga", "locl" 0;
+}
+.no-unicoderange h-char.bd-cop:lang(zh-Hant),
+.no-unicoderange h-char.bd-cop:lang(zh-TW),
+.no-unicoderange h-char.bd-cop:lang(zh-HK) {
+ font-family: -apple-system, "Han Heiti CNS";
+}
+.no-unicoderange h-char.bd-liga,
+.no-unicoderange h-char[unicode="b7"] {
+ font-family: "Biaodian Basic", "Han Heiti";
+}
+.no-unicoderange h-char[unicode="2018"]:lang(zh-Hans),
+.no-unicoderange h-char[unicode="2019"]:lang(zh-Hans),
+.no-unicoderange h-char[unicode="201c"]:lang(zh-Hans),
+.no-unicoderange h-char[unicode="201d"]:lang(zh-Hans),
+.no-unicoderange h-char[unicode="2018"]:lang(zh-CN),
+.no-unicoderange h-char[unicode="2019"]:lang(zh-CN),
+.no-unicoderange h-char[unicode="201c"]:lang(zh-CN),
+.no-unicoderange h-char[unicode="201d"]:lang(zh-CN) {
+ font-family: "Han Heiti GB";
+}
+i,
+var {
+ font-style: inherit;
+}
+.no-unicoderange ruby h-zhuyin,
+.no-unicoderange h-ruby h-zhuyin,
+.no-unicoderange ruby h-zhuyin h-diao,
+.no-unicoderange h-ruby h-zhuyin h-diao {
+ font-family: "Zhuyin Kaiti", cursive, serif;
+}
+ruby h-diao,
+h-ruby h-diao {
+ font-family: "Zhuyin Kaiti", cursive, serif;
+}
+ruby.romanization rt,
+h-ruby.romanization rt,
+ruby [annotation] rt,
+h-ruby [annotation] rt {
+ font-family: "Romanization Sans", "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif;
+}
+.no-kaiti i,
+.no-kaiti var {
+ padding-bottom: .05em;
+ border-bottom: 3px double #d3d3d3;
+}
+article h1 + blockquote,
+article h2 + blockquote,
+article h3 + blockquote,
+article h4 + blockquote,
+article h5 + blockquote,
+article h6 + blockquote,
+article h1 + p,
+article h2 + p,
+article h3 + p,
+article h4 + p,
+article h5 + p,
+article h6 + p,
+article h1 + ol,
+article h2 + ol,
+article h3 + ol,
+article h4 + ol,
+article h5 + ol,
+article h6 + ol,
+article h1 + ul,
+article h2 + ul,
+article h3 + ul,
+article h4 + ul,
+article h5 + ul,
+article h6 + ul,
+article h1 + h6,
+article h2 + h6,
+article h3 + h6,
+article h4 + h6,
+article h5 + h6,
+article h6 + h6,
+article h1 + section > h6:first-child,
+article h2 + section > h6:first-child,
+article h3 + section > h6:first-child,
+article h4 + section > h6:first-child,
+article h5 + section > h6:first-child,
+article h6 + section > h6:first-child,
+article h1 + section > p:first-child,
+article h2 + section > p:first-child,
+article h3 + section > p:first-child,
+article h4 + section > p:first-child,
+article h5 + section > p:first-child,
+article h6 + section > p:first-child,
+article h1 + section > ol:first-child,
+article h2 + section > ol:first-child,
+article h3 + section > ol:first-child,
+article h4 + section > ol:first-child,
+article h5 + section > ol:first-child,
+article h6 + section > ol:first-child,
+article h1 + section > ul:first-child,
+article h2 + section > ul:first-child,
+article h3 + section > ul:first-child,
+article h4 + section > ul:first-child,
+article h5 + section > ul:first-child,
+article h6 + section > ul:first-child,
+article h1 + section > blockquote:first-child,
+article h2 + section > blockquote:first-child,
+article h3 + section > blockquote:first-child,
+article h4 + section > blockquote:first-child,
+article h5 + section > blockquote:first-child,
+article h6 + section > blockquote:first-child,
+article h1 + h5,
+article h2 + h5,
+article h3 + h5,
+article h4 + h5,
+article h5 + h5,
+article h1 + section > h5:first-child,
+article h2 + section > h5:first-child,
+article h3 + section > h5:first-child,
+article h4 + section > h5:first-child,
+article h5 + section > h5:first-child,
+article h1 + h4,
+article h2 + h4,
+article h3 + h4,
+article h4 + h4,
+article h1 + section > h4:first-child,
+article h2 + section > h4:first-child,
+article h3 + section > h4:first-child,
+article h4 + section > h4:first-child,
+article h1 + h3,
+article h2 + h3,
+article h3 + h3,
+article h1 + section > h3:first-child,
+article h2 + section > h3:first-child,
+article h3 + section > h3:first-child,
+article h1 + h2,
+article h2 + h2,
+article h1 + section > h2:first-child,
+article h2 + section > h2:first-child {
+ margin-top: -1em;
+}
+article {
+ line-height: 1.7;
+}
+article {
+ -moz-hyphens: auto;
+ -ms-hyphens: auto;
+ -webkit-hyphens: auto;
+ hyphens: auto;
+}
+article p,
+article li {
+ text-align: justify;
+ text-justify: inter-ideograph;
+}
+p.poem-like,
+.poem-like p {
+ margin-left: 2em;
+}
+@media only screen and (max-width: 480px) {
+ p.poem-like,
+ .poem-like p {
+ margin-left: 1em;
+ }
+}
+article blockquote {
+ margin-right: 0;
+}
+@media only screen and (max-width: 480px) {
+ article blockquote {
+ margin-left: 1em;
+ }
+}
+figure blockquote {
+ margin: 0;
+}
+blockquote blockquote {
+ margin-left: 1em;
+ margin-right: 1em;
+}
+article blockquote blockquote {
+ margin-right: 0;
+}
+@media only screen and (max-width: 480px) {
+ blockquote,
+ figure {
+ margin-left: 1em;
+ margin-right: 1em;
+ }
+}
+h-hws,
+h-hws[hidden] {
+ display: inline;
+ visibility: hidden;
+ font: .89em Arial;
+}
+code h-hws,
+code h-hws[hidden],
+kbd h-hws,
+kbd h-hws[hidden],
+samp h-hws,
+samp h-hws[hidden],
+pre h-hws,
+pre h-hws[hidden],
+h-hws.quote-inner,
+h-hws[hidden].quote-inner,
+h-hws.quote-outer:lang(zh-Hans),
+h-hws[hidden].quote-outer:lang(zh-Hans),
+h-hws.quote-outer:lang(zh-CN),
+h-hws[hidden].quote-outer:lang(zh-CN) {
+ display: none;
+}
+@font-face {
+ src: url("./font/han-space.woff?v3.3.0") format("woff"), url("./font/han-space.otf?v3.3.0") format("opentype");
+ font-family: "Han Space";
+ unicode-range: U+20;
+}
+h-char.bd-hangable:lang(zh) h-cs,
+h-char.bd-hangable:lang(zh-Hant) h-cs,
+h-char.bd-hangable:lang(zh-TW) h-cs,
+h-char.bd-hangable:lang(zh-HK) h-cs,
+h-cs,
+h-char.bd-hangable:lang(zh) h-cs[hidden],
+h-char.bd-hangable:lang(zh-Hant) h-cs[hidden],
+h-char.bd-hangable:lang(zh-TW) h-cs[hidden],
+h-char.bd-hangable:lang(zh-HK) h-cs[hidden],
+h-cs[hidden] {
+ display: inline;
+ visibility: inherit;
+ font-family: inherit;
+ font-size: inherit;
+}
+h-cs.hangable-outer,
+h-cs.hangable-outer[hidden] {
+ display: inline;
+ font: 1em "Han Space";
+}
+h-cs.hangable-outer:lang(zh-Hant),
+h-cs.hangable-outer[hidden]:lang(zh-Hant),
+h-cs.hangable-outer:lang(zh-TW),
+h-cs.hangable-outer[hidden]:lang(zh-TW),
+h-cs.hangable-outer:lang(zh-HK),
+h-cs.hangable-outer[hidden]:lang(zh-HK) {
+ display: none;
+}
+h-char.bd-hangable:lang(zh-Hans),
+h-char.bd-hangable:lang(zh-CN),
+h-char.bd-hangable:lang(ja) {
+ position: relative;
+}
+h-char.bd-hangable:lang(zh-Hans):after,
+h-char.bd-hangable:lang(zh-CN):after,
+h-char.bd-hangable:lang(ja):after {
+ display: none !important;
+}
+h-char.bd-hangable:lang(zh-Hans):before,
+h-char.bd-hangable:lang(zh-CN):before,
+h-char.bd-hangable:lang(ja):before {
+ display: inline !important;
+ content: " ";
+ font: 1em "Han Space", Menlo, Consolas, Courier;
+}
+h-char.bd-hangable:lang(zh-Hans) > h-inner,
+h-char.bd-hangable:lang(zh-CN) > h-inner,
+h-char.bd-hangable:lang(ja) > h-inner {
+ -moz-text-emphasis: none;
+ -webkit-text-emphasis: none;
+ text-emphasis: none;
+ font-style: normal;
+ font-weight: normal;
+ line-height: normal;
+ text-decoration: none;
+ text-indent: 0;
+ position: absolute;
+ left: 0;
+ top: 0;
+ display: inline-block;
+ line-height: 1.1;
+}
+ruby h-char.bd-hangable:lang(zh-Hans) > h-inner,
+ruby h-char.bd-hangable:lang(zh-CN) > h-inner,
+ruby h-char.bd-hangable:lang(ja) > h-inner,
+h-ru h-char.bd-hangable:lang(zh-Hans) > h-inner,
+h-ru h-char.bd-hangable:lang(zh-CN) > h-inner,
+h-ru h-char.bd-hangable:lang(ja) > h-inner {
+ position: relative;
+}
+h-char.bd-jiya.bd-open:before,
+h-char.bd-jiya.bd-end:after,
+h-cs,
+h-cs[hidden] {
+ display: none;
+ visibility: hidden;
+ content: " ";
+ font: .825em Courier;
+ letter-spacing: 0;
+ white-space: normal;
+}
+h-cs.jinze-outer,
+h-cs.jinze-outer[hidden] {
+ display: inline;
+}
+h-char.bd-jiya.bd-open > h-inner {
+ margin-left: -.5em;
+}
+h-char.bd-jiya.bd-close > h-inner,
+h-char.bd-jiya.bd-cop > h-inner,
+h-char.bd-jiya[unicode="ff0e"] > h-inner {
+ letter-spacing: -.5em;
+}
+h-char.bd-jiya.bd-open:before,
+h-char.bd-jiya.bd-close:after,
+h-char.bd-jiya.bd-cop:after,
+h-char.bd-jiya[unicode="ff0e"]:after {
+ display: inline;
+}
+h-char.bd-jiya.bd-cop:lang(zh-Hant):after,
+h-char.bd-jiya.bd-cop:lang(zh-TW):after,
+h-char.bd-jiya.bd-cop:lang(zh-HK):after {
+ display: none;
+}
+h-char.bd-jiya.bd-cop:lang(zh-Hant) > h-inner,
+h-char.bd-jiya.bd-cop:lang(zh-TW) > h-inner,
+h-char.bd-jiya.bd-cop:lang(zh-HK) > h-inner {
+ letter-spacing: inherit;
+}
+h-char.bd-consecutive.bd-end:not(.end-portion):after,
+h-char.bd-consecutive.bd-open[prev="bd-open"]:before,
+h-cs.jiya-outer.bd-end:not(.end-portion) {
+ display: none;
+}
+h-cs.jiya-outer.bd-end[next="bd-open"] {
+ display: inline;
+}
+h-char.bd-consecutive.bd-open[prev*="bd-cop"]:lang(zh-Hant):before,
+h-char.bd-consecutive.bd-open[prev*="bd-cop"]:lang(zh-TW):before,
+h-char.bd-consecutive.bd-open[prev*="bd-cop"]:lang(zh-HK):before {
+ display: none;
+}
+h-cs.jiya-outer[prev*="bd-cop"]:lang(zh-Hant),
+h-cs.jiya-outer.bd-end:lang(zh-Hant),
+h-cs.jiya-outer[prev*="bd-cop"]:lang(zh-TW),
+h-cs.jiya-outer.bd-end:lang(zh-TW),
+h-cs.jiya-outer[prev*="bd-cop"]:lang(zh-HK),
+h-cs.jiya-outer.bd-end:lang(zh-HK) {
+ display: none;
+}
+h-char.bd-consecutive[unicode="b7"]:not(.end-portion),
+h-char.bd-consecutive[unicode="30fb"]:not(.end-portion) {
+ letter-spacing: -.5em;
+}
+h-char.bd-consecutive.bd-liga:not(.end-portion) {
+ margin-right: -.25em;
+}
+h-char[display-as] {
+ position: relative;
+ display: inline-block;
+}
+h-char[display-as] h-inner {
+ color: transparent;
+}
+h-char[display-as]:after {
+ position: absolute;
+ left: 0;
+ display: inline-block;
+ content: attr(display-as);
+}
+h-char[display-as].comb-liga:after {
+ font-family: "Romanization Sans", "Zhuyin Kaiti";
+}
diff --git a/assets/lib/Han/dist/han.js b/assets/lib/Han/dist/han.js
new file mode 100644
index 00000000..75976c6d
--- /dev/null
+++ b/assets/lib/Han/dist/han.js
@@ -0,0 +1,3005 @@
+/*!
+ * 漢字標準格式 v3.3.0 | MIT License | css.hanzi.co
+ * Han.css: the CSS typography framework optimised for Hanzi
+ */
+
+void function( global, factory ) {
+
+ // CommonJS
+ if ( typeof module === 'object' && typeof module.exports === 'object' ) {
+ module.exports = factory( global, true )
+ // AMD
+ } else if ( typeof define === 'function' && define.amd ) {
+ define(function() { return factory( global, true ) })
+ // Global namespace
+ } else {
+ factory( global )
+ }
+
+}( typeof window !== 'undefined' ? window : this, function( window, noGlobalNS ) {
+
+'use strict'
+
+var document = window.document
+
+var root = document.documentElement
+
+var body = document.body
+
+var VERSION = '3.3.0'
+
+var ROUTINE = [
+ // Initialise the condition with feature-detecting
+ // classes (Modernizr-alike), binding onto the root
+ // element, possibly ``.
+ 'initCond',
+
+ // Address element normalisation
+ 'renderElem',
+
+ // Handle Biaodian
+ /* 'jinzify', */
+ 'renderJiya',
+ 'renderHanging',
+
+ // Address Biaodian correction
+ 'correctBiaodian',
+
+ // Address Hanzi and Western script mixed spacing
+ 'renderHWS',
+
+ // Address presentational correction to combining ligatures
+ 'substCombLigaWithPUA'
+
+ // Address semantic correction to inaccurate characters
+ // **Note:** inactivated by default
+ /* 'substInaccurateChar', */
+]
+
+// Define Han
+var Han = function( context, condition ) {
+ return new Han.fn.init( context, condition )
+}
+
+var init = function() {
+ if ( arguments[ 0 ] ) {
+ this.context = arguments[ 0 ]
+ }
+ if ( arguments[ 1 ] ) {
+ this.condition = arguments[ 1 ]
+ }
+ return this
+}
+
+Han.version = VERSION
+
+Han.fn = Han.prototype = {
+ version: VERSION,
+
+ constructor: Han,
+
+ // Body as the default target context
+ context: body,
+
+ // Root element as the default condition
+ condition: root,
+
+ // Default rendering routine
+ routine: ROUTINE,
+
+ init: init,
+
+ setRoutine: function( routine ) {
+ if ( Array.isArray( routine )) {
+ this.routine = routine
+ }
+ return this
+ },
+
+ // Note that the routine set up here will execute
+ // only once. The method won't alter the routine in
+ // the instance or in the prototype chain.
+ render: function( routine ) {
+ var it = this
+ var routine = Array.isArray( routine )
+ ? routine
+ : this.routine
+
+ routine
+ .forEach(function( method ) {
+ if (
+ typeof method === 'string' &&
+ typeof it[ method ] === 'function'
+ ) {
+ it[ method ]()
+ } else if (
+ Array.isArray( method ) &&
+ typeof it[ method[0] ] === 'function'
+ ) {
+ it[ method.shift() ].apply( it, method )
+ }
+ })
+ return this
+ }
+}
+
+Han.fn.init.prototype = Han.fn
+
+/**
+ * Shortcut for `render()` under the default
+ * situation.
+ *
+ * Once initialised, replace `Han.init` with the
+ * instance for future usage.
+ */
+Han.init = function() {
+ return Han.init = Han().render()
+}
+
+var UNICODE = {
+ /**
+ * Western punctuation (西文標點符號)
+ */
+ punct: {
+ base: '[\u2026,.;:!?\u203D_]',
+ sing: '[\u2010-\u2014\u2026]',
+ middle: '[\\\/~\\-&\u2010-\u2014_]',
+ open: '[\'"‘“\\(\\[\u00A1\u00BF\u2E18\u00AB\u2039\u201A\u201C\u201E]',
+ close: '[\'"”’\\)\\]\u00BB\u203A\u201B\u201D\u201F]',
+ end: '[\'"”’\\)\\]\u00BB\u203A\u201B\u201D\u201F\u203C\u203D\u2047-\u2049,.;:!?]',
+ },
+
+ /**
+ * CJK biaodian (CJK標點符號)
+ */
+ biaodian: {
+ base: '[︰.、,。:;?!ー]',
+ liga: '[—…⋯]',
+ middle: '[·\/-゠\uFF06\u30FB\uFF3F]',
+ open: '[「『《〈(〔[{【〖]',
+ close: '[」』》〉)〕]}】〗]',
+ end: '[」』》〉)〕]}】〗︰.、,。:;?!ー]'
+ },
+
+ /**
+ * CJK-related blocks (CJK相關字符區段)
+ *
+ * 1. 中日韓統一意音文字:[\u4E00-\u9FFF]
+ Basic CJK unified ideographs
+ * 2. 擴展-A區:[\u3400-\u4DB5]
+ Extended-A
+ * 3. 擴展-B區:[\u20000-\u2A6D6]([\uD840-\uD869][\uDC00-\uDED6])
+ Extended-B
+ * 4. 擴展-C區:[\u2A700-\u2B734](\uD86D[\uDC00-\uDF3F]|[\uD86A-\uD86C][\uDC00-\uDFFF]|\uD869[\uDF00-\uDFFF])
+ Extended-C
+ * 5. 擴展-D區:[\u2B740-\u2B81D](急用漢字,\uD86D[\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1F])
+ Extended-D
+ * 6. 擴展-E區:[\u2B820-\u2F7FF](暫未支援)
+ Extended-E (not supported yet)
+ * 7. 擴展-F區(暫未支援)
+ Extended-F (not supported yet)
+ * 8. 筆畫區:[\u31C0-\u31E3]
+ Strokes
+ * 9. 意音數字「〇」:[\u3007]
+ Ideographic number zero
+ * 10. 相容意音文字及補充:[\uF900-\uFAFF][\u2F800-\u2FA1D](不使用)
+ Compatibility ideograph and supplement (not supported)
+
+ 12 exceptions:
+ [\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]
+
+ https://zh.wikipedia.org/wiki/中日韓統一表意文字#cite_note-1
+
+ * 11. 康熙字典及簡化字部首:[\u2F00-\u2FD5\u2E80-\u2EF3]
+ Kangxi and supplement radicals
+ * 12. 意音文字描述字元:[\u2FF0-\u2FFA]
+ Ideographic description characters
+ */
+ hanzi: {
+ base: '[\u4E00-\u9FFF\u3400-\u4DB5\u31C0-\u31E3\u3007\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\uD800-\uDBFF][\uDC00-\uDFFF]',
+ desc: '[\u2FF0-\u2FFA]',
+ radical: '[\u2F00-\u2FD5\u2E80-\u2EF3]'
+ },
+
+ /**
+ * Latin script blocks (拉丁字母區段)
+ *
+ * 1. 基本拉丁字母:A-Za-z
+ Basic Latin
+ * 2. 阿拉伯數字:0-9
+ Digits
+ * 3. 補充-1:[\u00C0-\u00FF]
+ Latin-1 supplement
+ * 4. 擴展-A區:[\u0100-\u017F]
+ Extended-A
+ * 5. 擴展-B區:[\u0180-\u024F]
+ Extended-B
+ * 5. 擴展-C區:[\u2C60-\u2C7F]
+ Extended-C
+ * 5. 擴展-D區:[\uA720-\uA7FF]
+ Extended-D
+ * 6. 附加區:[\u1E00-\u1EFF]
+ Extended additional
+ * 7. 變音組字符:[\u0300-\u0341\u1DC0-\u1DFF]
+ Combining diacritical marks
+ */
+ latin: {
+ base: '[A-Za-z0-9\u00C0-\u00FF\u0100-\u017F\u0180-\u024F\u2C60-\u2C7F\uA720-\uA7FF\u1E00-\u1EFF]',
+ combine: '[\u0300-\u0341\u1DC0-\u1DFF]'
+ },
+
+ /**
+ * Elli̱niká (Greek) script blocks (希臘字母區段)
+ *
+ * 1. 希臘字母及擴展:[\u0370–\u03FF\u1F00-\u1FFF]
+ Basic Greek & Greek Extended
+ * 2. 阿拉伯數字:0-9
+ Digits
+ * 3. 希臘字母變音組字符:[\u0300-\u0345\u1DC0-\u1DFF]
+ Combining diacritical marks
+ */
+ ellinika: {
+ base: '[0-9\u0370-\u03FF\u1F00-\u1FFF]',
+ combine: '[\u0300-\u0345\u1DC0-\u1DFF]'
+ },
+
+ /**
+ * Kirillica (Cyrillic) script blocks (西里爾字母區段)
+ *
+ * 1. 西里爾字母及補充:[\u0400-\u0482\u048A-\u04FF\u0500-\u052F]
+ Basic Cyrillic and supplement
+ * 2. 擴展B區:[\uA640-\uA66E\uA67E-\uA697]
+ Extended-B
+ * 3. 阿拉伯數字:0-9
+ Digits
+ * 4. 西里爾字母組字符:[\u0483-\u0489\u2DE0-\u2DFF\uA66F-\uA67D\uA69F](位擴展A、B區)
+ Cyrillic combining diacritical marks (in extended-A, B)
+ */
+ kirillica: {
+ base: '[0-9\u0400-\u0482\u048A-\u04FF\u0500-\u052F\uA640-\uA66E\uA67E-\uA697]',
+ combine: '[\u0483-\u0489\u2DE0-\u2DFF\uA66F-\uA67D\uA69F]'
+ },
+
+ /**
+ * Kana (假名)
+ *
+ * 1. 日文假名:[\u30A2\u30A4\u30A6\u30A8\u30AA-\u30FA\u3042\u3044\u3046\u3048\u304A-\u3094\u309F\u30FF]
+ Japanese Kana
+ * 2. 假名補充[\u1B000\u1B001](\uD82C[\uDC00-\uDC01])
+ Kana supplement
+ * 3. 日文假名小寫:[\u3041\u3043\u3045\u3047\u3049\u30A1\u30A3\u30A5\u30A7\u30A9\u3063\u3083\u3085\u3087\u308E\u3095\u3096\u30C3\u30E3\u30E5\u30E7\u30EE\u30F5\u30F6\u31F0-\u31FF]
+ Japanese small Kana
+ * 4. 假名組字符:[\u3099-\u309C]
+ Kana combining characters
+ * 5. 半形假名:[\uFF66-\uFF9F]
+ Halfwidth Kana
+ * 6. 符號:[\u309D\u309E\u30FB-\u30FE]
+ Marks
+ */
+ kana: {
+ base: '[\u30A2\u30A4\u30A6\u30A8\u30AA-\u30FA\u3042\u3044\u3046\u3048\u304A-\u3094\u309F\u30FF]|\uD82C[\uDC00-\uDC01]',
+ small: '[\u3041\u3043\u3045\u3047\u3049\u30A1\u30A3\u30A5\u30A7\u30A9\u3063\u3083\u3085\u3087\u308E\u3095\u3096\u30C3\u30E3\u30E5\u30E7\u30EE\u30F5\u30F6\u31F0-\u31FF]',
+ combine: '[\u3099-\u309C]',
+ half: '[\uFF66-\uFF9F]',
+ mark: '[\u30A0\u309D\u309E\u30FB-\u30FE]'
+ },
+
+ /**
+ * Eonmun (Hangul, 諺文)
+ *
+ * 1. 諺文音節:[\uAC00-\uD7A3]
+ Eonmun (Hangul) syllables
+ * 2. 諺文字母:[\u1100-\u11FF\u314F-\u3163\u3131-\u318E\uA960-\uA97C\uD7B0-\uD7FB]
+ Eonmun (Hangul) letters
+ * 3. 半形諺文字母:[\uFFA1-\uFFDC]
+ Halfwidth Eonmun (Hangul) letters
+ */
+ eonmun: {
+ base: '[\uAC00-\uD7A3]',
+ letter: '[\u1100-\u11FF\u314F-\u3163\u3131-\u318E\uA960-\uA97C\uD7B0-\uD7FB]',
+ half: '[\uFFA1-\uFFDC]'
+ },
+
+ /**
+ * Zhuyin (注音符號, Mandarin & Dialect Phonetic Symbols)
+ *
+ * 1. 國語注音、方言音符號:[\u3105-\u312D][\u31A0-\u31BA]
+ Bopomofo phonetic symbols
+ * 2. 平上去聲調號:[\u02D9\u02CA\u02C5\u02C7\u02EA\u02EB\u02CB] (**註:**國語三聲包含乙個不合規範的符號)
+ Level, rising, departing tones
+ * 3. 入聲調號:[\u31B4-\u31B7][\u0358\u030d]?
+ Checked (entering) tones
+ */
+ zhuyin: {
+ base: '[\u3105-\u312D\u31A0-\u31BA]',
+ initial: '[\u3105-\u3119\u312A-\u312C\u31A0-\u31A3]',
+ medial: '[\u3127-\u3129]',
+ final: '[\u311A-\u3129\u312D\u31A4-\u31B3\u31B8-\u31BA]',
+ tone: '[\u02D9\u02CA\u02C5\u02C7\u02CB\u02EA\u02EB]',
+ checked: '[\u31B4-\u31B7][\u0358\u030d]?'
+ }
+}
+
+var TYPESET = (function() {
+ var rWhite = '[\\x20\\t\\r\\n\\f]'
+ // Whitespace characters
+ // http://www.w3.org/TR/css3-selectors/#whitespace
+
+ var rPtOpen = UNICODE.punct.open
+ var rPtClose = UNICODE.punct.close
+ var rPtEnd = UNICODE.punct.end
+ var rPtMid = UNICODE.punct.middle
+ var rPtSing = UNICODE.punct.sing
+ var rPt = rPtOpen + '|' + rPtEnd + '|' + rPtMid
+
+ var rBDOpen = UNICODE.biaodian.open
+ var rBDClose = UNICODE.biaodian.close
+ var rBDEnd = UNICODE.biaodian.end
+ var rBDMid = UNICODE.biaodian.middle
+ var rBDLiga = UNICODE.biaodian.liga + '{2}'
+ var rBD = rBDOpen + '|' + rBDEnd + '|' + rBDMid
+
+ var rKana = UNICODE.kana.base + UNICODE.kana.combine + '?'
+ var rKanaS = UNICODE.kana.small + UNICODE.kana.combine + '?'
+ var rKanaH = UNICODE.kana.half
+ var rEon = UNICODE.eonmun.base + '|' + UNICODE.eonmun.letter
+ var rEonH = UNICODE.eonmun.half
+
+ var rHan = UNICODE.hanzi.base + '|' + UNICODE.hanzi.desc + '|' + UNICODE.hanzi.radical + '|' + rKana
+
+ var rCbn = UNICODE.ellinika.combine
+ var rLatn = UNICODE.latin.base + rCbn + '*'
+ var rGk = UNICODE.ellinika.base + rCbn + '*'
+
+ var rCyCbn = UNICODE.kirillica.combine
+ var rCy = UNICODE.kirillica.base + rCyCbn + '*'
+
+ var rAlph = rLatn + '|' + rGk + '|' + rCy
+
+ // For words like `it's`, `Jones’s` or `'99`
+ var rApo = '[\u0027\u2019]'
+ var rChar = rHan + '|(?:' + rAlph + '|' + rApo + ')+'
+
+ var rZyS = UNICODE.zhuyin.initial
+ var rZyJ = UNICODE.zhuyin.medial
+ var rZyY = UNICODE.zhuyin.final
+ var rZyD = UNICODE.zhuyin.tone + '|' + UNICODE.zhuyin.checked
+
+ return {
+ /* Character-level selector (字級選擇器)
+ */
+ char: {
+ punct: {
+ all: new RegExp( '(' + rPt + ')', 'g' ),
+ open: new RegExp( '(' + rPtOpen + ')', 'g' ),
+ end: new RegExp( '(' + rPtEnd + ')', 'g' ),
+ sing: new RegExp( '(' + rPtSing + ')', 'g' )
+ },
+
+ biaodian: {
+ all: new RegExp( '(' + rBD + ')', 'g' ),
+ open: new RegExp( '(' + rBDOpen + ')', 'g' ),
+ close: new RegExp( '(' + rBDClose + ')', 'g' ),
+ end: new RegExp( '(' + rBDEnd + ')', 'g' ),
+ liga: new RegExp( '(' + rBDLiga + ')', 'g' )
+ },
+
+ hanzi: new RegExp( '(' + rHan + ')', 'g' ),
+
+ latin: new RegExp( '(' + rLatn + ')', 'ig' ),
+ ellinika: new RegExp( '(' + rGk + ')', 'ig' ),
+ kirillica: new RegExp( '(' + rCy + ')', 'ig' ),
+
+ kana: new RegExp( '(' + rKana + '|' + rKanaS + '|' + rKanaH + ')', 'g' ),
+ eonmun: new RegExp( '(' + rEon + '|' + rEonH + ')', 'g' )
+ },
+
+ /* Word-level selectors (詞級選擇器)
+ */
+ group: {
+ biaodian: [
+ new RegExp( '((' + rBD + '){2,})', 'g' ),
+ new RegExp( '(' + rBDLiga + rBDOpen + ')', 'g' )
+ ],
+ punct: null,
+ hanzi: new RegExp( '(' + rHan + ')+', 'g' ),
+ western: new RegExp( '(' + rLatn + '|' + rGk + '|' + rCy + '|' + rPt + ')+', 'ig' ),
+ kana: new RegExp( '(' + rKana + '|' + rKanaS + '|' + rKanaH + ')+', 'g' ),
+ eonmun: new RegExp( '(' + rEon + '|' + rEonH + '|' + rPt + ')+', 'g' )
+ },
+
+ /* Punctuation Rules (禁則)
+ */
+ jinze: {
+ hanging: new RegExp( rWhite + '*([、,。.])(?!' + rBDEnd + ')', 'ig' ),
+ touwei: new RegExp( '(' + rBDOpen + '+)(' + rChar + ')(' + rBDEnd + '+)', 'ig' ),
+ tou: new RegExp( '(' + rBDOpen + '+)(' + rChar + ')', 'ig' ),
+ wei: new RegExp( '(' + rChar + ')(' + rBDEnd + '+)', 'ig' ),
+ middle: new RegExp( '(' + rChar + ')(' + rBDMid + ')(' + rChar + ')', 'ig' )
+ },
+
+ zhuyin: {
+ form: new RegExp( '^\u02D9?(' + rZyS + ')?(' + rZyJ + ')?(' + rZyY + ')?(' + rZyD + ')?$' ),
+ diao: new RegExp( '(' + rZyD + ')', 'g' )
+ },
+
+ /* Hanzi and Western mixed spacing (漢字西文混排間隙)
+ * - Basic mode
+ * - Strict mode
+ */
+ hws: {
+ base: [
+ new RegExp( '('+ rHan + ')(' + rAlph + '|' + rPtOpen + ')', 'ig' ),
+ new RegExp( '('+ rAlph + '|' + rPtEnd + ')(' + rHan + ')', 'ig' )
+ ],
+
+ strict: [
+ new RegExp( '('+ rHan + ')' + rWhite + '?(' + rAlph + '|' + rPtOpen + ')', 'ig' ),
+ new RegExp( '('+ rAlph + '|' + rPtEnd + ')' + rWhite + '?(' + rHan + ')', 'ig' )
+ ]
+ },
+
+ // The feature displays the following characters
+ // in its variant form for font consistency and
+ // presentational reason. Meanwhile, this won't
+ // alter the original character in the DOM.
+ 'display-as': {
+ 'ja-font-for-hant': [
+ // '夠 够',
+ '查 査',
+ '啟 啓',
+ '鄉 鄕',
+ '值 値',
+ '污 汚'
+ ],
+
+ 'comb-liga-pua': [
+ [ '\u0061[\u030d\u0358]', '\uDB80\uDC61' ],
+ [ '\u0065[\u030d\u0358]', '\uDB80\uDC65' ],
+ [ '\u0069[\u030d\u0358]', '\uDB80\uDC69' ],
+ [ '\u006F[\u030d\u0358]', '\uDB80\uDC6F' ],
+ [ '\u0075[\u030d\u0358]', '\uDB80\uDC75' ],
+
+ [ '\u31B4[\u030d\u0358]', '\uDB8C\uDDB4' ],
+ [ '\u31B5[\u030d\u0358]', '\uDB8C\uDDB5' ],
+ [ '\u31B6[\u030d\u0358]', '\uDB8C\uDDB6' ],
+ [ '\u31B7[\u030d\u0358]', '\uDB8C\uDDB7' ]
+ ],
+
+ 'comb-liga-vowel': [
+ [ '\u0061[\u030d\u0358]', '\uDB80\uDC61' ],
+ [ '\u0065[\u030d\u0358]', '\uDB80\uDC65' ],
+ [ '\u0069[\u030d\u0358]', '\uDB80\uDC69' ],
+ [ '\u006F[\u030d\u0358]', '\uDB80\uDC6F' ],
+ [ '\u0075[\u030d\u0358]', '\uDB80\uDC75' ]
+ ],
+
+ 'comb-liga-zhuyin': [
+ [ '\u31B4[\u030d\u0358]', '\uDB8C\uDDB4' ],
+ [ '\u31B5[\u030d\u0358]', '\uDB8C\uDDB5' ],
+ [ '\u31B6[\u030d\u0358]', '\uDB8C\uDDB6' ],
+ [ '\u31B7[\u030d\u0358]', '\uDB8C\uDDB7' ]
+ ]
+ },
+
+ // The feature actually *converts* the character
+ // in the DOM for semantic reason.
+ //
+ // Note that this could be aggressive.
+ 'inaccurate-char': [
+ [ '[\u2022\u2027]', '\u00B7' ],
+ [ '\u22EF\u22EF', '\u2026\u2026' ],
+ [ '\u2500\u2500', '\u2014\u2014' ],
+ [ '\u2035', '\u2018' ],
+ [ '\u2032', '\u2019' ],
+ [ '\u2036', '\u201C' ],
+ [ '\u2033', '\u201D' ]
+ ]
+ }
+})()
+
+Han.UNICODE = UNICODE
+Han.TYPESET = TYPESET
+
+// Aliases
+Han.UNICODE.cjk = Han.UNICODE.hanzi
+Han.UNICODE.greek = Han.UNICODE.ellinika
+Han.UNICODE.cyrillic = Han.UNICODE.kirillica
+Han.UNICODE.hangul = Han.UNICODE.eonmun
+Han.UNICODE.zhuyin.ruyun = Han.UNICODE.zhuyin.checked
+
+Han.TYPESET.char.cjk = Han.TYPESET.char.hanzi
+Han.TYPESET.char.greek = Han.TYPESET.char.ellinika
+Han.TYPESET.char.cyrillic = Han.TYPESET.char.kirillica
+Han.TYPESET.char.hangul = Han.TYPESET.char.eonmun
+
+Han.TYPESET.group.hangul = Han.TYPESET.group.eonmun
+Han.TYPESET.group.cjk = Han.TYPESET.group.hanzi
+
+var $ = {
+ /**
+ * Query selectors which return arrays of the resulted
+ * node lists.
+ */
+ id: function( selector, $context ) {
+ return ( $context || document ).getElementById( selector )
+ },
+
+ tag: function( selector, $context ) {
+ return this.makeArray(
+ ( $context || document ).getElementsByTagName( selector )
+ )
+ },
+
+ qs: function( selector, $context ) {
+ return ( $context || document ).querySelector( selector )
+ },
+
+ qsa: function( selector, $context ) {
+ return this.makeArray(
+ ( $context || document ).querySelectorAll( selector )
+ )
+ },
+
+ parent: function( $node, selector ) {
+ return selector
+ ? (function() {
+ if ( typeof $.matches !== 'function' ) return
+
+ while (!$.matches( $node, selector )) {
+ if (
+ !$node ||
+ $node === document.documentElement
+ ) {
+ $node = undefined
+ break
+ }
+ $node = $node.parentNode
+ }
+ return $node
+ })()
+ : $node
+ ? $node.parentNode : undefined
+ },
+
+ /**
+ * Create a document fragment, a text node with text
+ * or an element with/without classes.
+ */
+ create: function( name, clazz ) {
+ var $elmt = '!' === name
+ ? document.createDocumentFragment()
+ : '' === name
+ ? document.createTextNode( clazz || '' )
+ : document.createElement( name )
+
+ try {
+ if ( clazz ) {
+ $elmt.className = clazz
+ }
+ } catch (e) {}
+
+ return $elmt
+ },
+
+ /**
+ * Clone a DOM node (text, element or fragment) deeply
+ * or childlessly.
+ */
+ clone: function( $node, deep ) {
+ return $node.cloneNode(
+ typeof deep === 'boolean'
+ ? deep
+ : true
+ )
+ },
+
+ /**
+ * Remove a node (text, element or fragment).
+ */
+ remove: function( $node ) {
+ return $node.parentNode.removeChild( $node )
+ },
+
+ /**
+ * Set attributes all in once with an object.
+ */
+ setAttr: function( target, attr ) {
+ if ( typeof attr !== 'object' ) return
+ var len = attr.length
+
+ // Native `NamedNodeMap``:
+ if (
+ typeof attr[0] === 'object' &&
+ 'name' in attr[0]
+ ) {
+ for ( var i = 0; i < len; i++ ) {
+ if ( attr[ i ].value !== undefined ) {
+ target.setAttribute( attr[ i ].name, attr[ i ].value )
+ }
+ }
+
+ // Plain object:
+ } else {
+ for ( var name in attr ) {
+ if (
+ attr.hasOwnProperty( name ) &&
+ attr[ name ] !== undefined
+ ) {
+ target.setAttribute( name, attr[ name ] )
+ }
+ }
+ }
+ return target
+ },
+
+ /**
+ * Indicate whether or not the given node is an
+ * element.
+ */
+ isElmt: function( $node ) {
+ return $node && $node.nodeType === Node.ELEMENT_NODE
+ },
+
+ /**
+ * Indicate whether or not the given node should
+ * be ignored (`` or comments).
+ */
+ isIgnorable: function( $node ) {
+ if ( !$node ) return false
+
+ return (
+ $node.nodeName === 'WBR' ||
+ $node.nodeType === Node.COMMENT_NODE
+ )
+ },
+
+ /**
+ * Convert array-like objects into real arrays.
+ */
+ makeArray: function( object ) {
+ return Array.prototype.slice.call( object )
+ },
+
+ /**
+ * Extend target with an object.
+ */
+ extend: function( target, object ) {
+ if ((
+ typeof target === 'object' ||
+ typeof target === 'function' ) &&
+ typeof object === 'object'
+ ) {
+ for ( var name in object ) {
+ if (object.hasOwnProperty( name )) {
+ target[ name ] = object[ name ]
+ }
+ }
+ }
+ return target
+ }
+}
+
+var Fibre =
+/*!
+ * Fibre.js v0.2.1 | MIT License | github.com/ethantw/fibre.js
+ * Based on findAndReplaceDOMText
+ */
+
+function( Finder ) {
+
+'use strict'
+
+var VERSION = '0.2.1'
+var NON_INLINE_PROSE = Finder.NON_INLINE_PROSE
+var AVOID_NON_PROSE = Finder.PRESETS.prose.filterElements
+
+var global = window || {}
+var document = global.document || undefined
+
+function matches( node, selector, bypassNodeType39 ) {
+ var Efn = Element.prototype
+ var matches = Efn.matches || Efn.mozMatchesSelector || Efn.msMatchesSelector || Efn.webkitMatchesSelector
+
+ if ( node instanceof Element ) {
+ return matches.call( node, selector )
+ } else if ( bypassNodeType39 ) {
+ if ( /^[39]$/.test( node.nodeType )) return true
+ }
+ return false
+}
+
+if ( typeof document === 'undefined' ) throw new Error( 'Fibre requires a DOM-supported environment.' )
+
+var Fibre = function( context, preset ) {
+ return new Fibre.fn.init( context, preset )
+}
+
+Fibre.version = VERSION
+Fibre.matches = matches
+
+Fibre.fn = Fibre.prototype = {
+ constructor: Fibre,
+
+ version: VERSION,
+
+ finder: [],
+
+ context: undefined,
+
+ portionMode: 'retain',
+
+ selector: {},
+
+ preset: 'prose',
+
+ init: function( context, noPreset ) {
+ if ( !!noPreset ) this.preset = null
+
+ this.selector = {
+ context: null,
+ filter: [],
+ avoid: [],
+ boundary: []
+ }
+
+ if ( !context ) {
+ throw new Error( 'A context is required for Fibre to initialise.' )
+ } else if ( context instanceof Node ) {
+ if ( context instanceof Document ) this.context = context.body || context
+ else this.context = context
+ } else if ( typeof context === 'string' ) {
+ this.context = document.querySelector( context )
+ this.selector.context = context
+ }
+ return this
+ },
+
+ filterFn: function( node ) {
+ var filter = this.selector.filter.join( ', ' ) || '*'
+ var avoid = this.selector.avoid.join( ', ' ) || null
+ var result = matches( node, filter, true ) && !matches( node, avoid )
+ return ( this.preset === 'prose' ) ? AVOID_NON_PROSE( node ) && result : result
+ },
+
+ boundaryFn: function( node ) {
+ var boundary = this.selector.boundary.join( ', ' ) || null
+ var result = matches( node, boundary )
+ return ( this.preset === 'prose' ) ? NON_INLINE_PROSE( node ) || result : result
+ },
+
+ filter: function( selector ) {
+ if ( typeof selector === 'string' ) {
+ this.selector.filter.push( selector )
+ }
+ return this
+ },
+
+ endFilter: function( all ) {
+ if ( all ) {
+ this.selector.filter = []
+ } else {
+ this.selector.filter.pop()
+ }
+ return this
+ },
+
+ avoid: function( selector ) {
+ if ( typeof selector === 'string' ) {
+ this.selector.avoid.push( selector )
+ }
+ return this
+ },
+
+ endAvoid: function( all ) {
+ if ( all ) {
+ this.selector.avoid = []
+ } else {
+ this.selector.avoid.pop()
+ }
+ return this
+ },
+
+ addBoundary: function( selector ) {
+ if ( typeof selector === 'string' ) {
+ this.selector.boundary.push( selector )
+ }
+ return this
+ },
+
+ removeBoundary: function() {
+ this.selector.boundary = []
+ return this
+ },
+
+ setMode: function( portionMode ) {
+ this.portionMode = portionMode === 'first' ? 'first' : 'retain'
+ return this
+ },
+
+ replace: function( regexp, newSubStr ) {
+ var it = this
+ it.finder.push(Finder( it.context, {
+ find: regexp,
+ replace: newSubStr,
+ filterElements: function( currentNode ) {
+ return it.filterFn( currentNode )
+ },
+ forceContext: function( currentNode ) {
+ return it.boundaryFn( currentNode )
+ },
+ portionMode: it.portionMode
+ }))
+ return it
+ },
+
+ wrap: function( regexp, strElemName ) {
+ var it = this
+ it.finder.push(Finder( it.context, {
+ find: regexp,
+ wrap: strElemName,
+ filterElements: function( currentNode ) {
+ return it.filterFn( currentNode )
+ },
+ forceContext: function( currentNode ) {
+ return it.boundaryFn( currentNode )
+ },
+ portionMode: it.portionMode
+ }))
+ return it
+ },
+
+ revert: function( level ) {
+ var max = this.finder.length
+ var level = Number( level ) || ( level === 0 ? Number(0) :
+ ( level === 'all' ? max : 1 ))
+
+ if ( typeof max === 'undefined' || max === 0 ) return this
+ else if ( level > max ) level = max
+
+ for ( var i = level; i > 0; i-- ) {
+ this.finder.pop().revert()
+ }
+ return this
+ }
+}
+
+// Deprecated API(s)
+Fibre.fn.filterOut = Fibre.fn.avoid
+
+// Make sure init() inherit from Fibre()
+Fibre.fn.init.prototype = Fibre.fn
+
+return Fibre
+
+}(
+
+/**
+ * findAndReplaceDOMText v 0.4.3
+ * @author James Padolsey http://james.padolsey.com
+ * @license http://unlicense.org/UNLICENSE
+ *
+ * Matches the text of a DOM node against a regular expression
+ * and replaces each match (or node-separated portions of the match)
+ * in the specified element.
+ */
+ (function() {
+
+ var PORTION_MODE_RETAIN = 'retain'
+ var PORTION_MODE_FIRST = 'first'
+ var doc = document
+ var toString = {}.toString
+ var hasOwn = {}.hasOwnProperty
+ function isArray(a) {
+ return toString.call(a) == '[object Array]'
+ }
+
+ function escapeRegExp(s) {
+ return String(s).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1')
+ }
+
+ function exposed() {
+ // Try deprecated arg signature first:
+ return deprecated.apply(null, arguments) || findAndReplaceDOMText.apply(null, arguments)
+ }
+
+ function deprecated(regex, node, replacement, captureGroup, elFilter) {
+ if ((node && !node.nodeType) && arguments.length <= 2) {
+ return false
+ }
+ var isReplacementFunction = typeof replacement == 'function'
+ if (isReplacementFunction) {
+ replacement = (function(original) {
+ return function(portion, match) {
+ return original(portion.text, match.startIndex)
+ }
+ }(replacement))
+ }
+
+ // Awkward support for deprecated argument signature (<0.4.0)
+ var instance = findAndReplaceDOMText(node, {
+
+ find: regex,
+
+ wrap: isReplacementFunction ? null : replacement,
+ replace: isReplacementFunction ? replacement : '$' + (captureGroup || '&'),
+
+ prepMatch: function(m, mi) {
+
+ // Support captureGroup (a deprecated feature)
+
+ if (!m[0]) throw 'findAndReplaceDOMText cannot handle zero-length matches'
+ if (captureGroup > 0) {
+ var cg = m[captureGroup]
+ m.index += m[0].indexOf(cg)
+ m[0] = cg
+ }
+
+ m.endIndex = m.index + m[0].length
+ m.startIndex = m.index
+ m.index = mi
+ return m
+ },
+ filterElements: elFilter
+ })
+ exposed.revert = function() {
+ return instance.revert()
+ }
+ return true
+ }
+
+ /**
+ * findAndReplaceDOMText
+ *
+ * Locates matches and replaces with replacementNode
+ *
+ * @param {Node} node Element or Text node to search within
+ * @param {RegExp} options.find The regular expression to match
+ * @param {String|Element} [options.wrap] A NodeName, or a Node to clone
+ * @param {String|Function} [options.replace='$&'] What to replace each match with
+ * @param {Function} [options.filterElements] A Function to be called to check whether to
+ * process an element. (returning true = process element,
+ * returning false = avoid element)
+ */
+ function findAndReplaceDOMText(node, options) {
+ return new Finder(node, options)
+ }
+
+ exposed.NON_PROSE_ELEMENTS = {
+ br:1, hr:1,
+ // Media / Source elements:
+ script:1, style:1, img:1, video:1, audio:1, canvas:1, svg:1, map:1, object:1,
+ // Input elements
+ input:1, textarea:1, select:1, option:1, optgroup: 1, button:1
+ }
+ exposed.NON_CONTIGUOUS_PROSE_ELEMENTS = {
+
+ // Elements that will not contain prose or block elements where we don't
+ // want prose to be matches across element borders:
+
+ // Block Elements
+ address:1, article:1, aside:1, blockquote:1, dd:1, div:1,
+ dl:1, fieldset:1, figcaption:1, figure:1, footer:1, form:1, h1:1, h2:1, h3:1,
+ h4:1, h5:1, h6:1, header:1, hgroup:1, hr:1, main:1, nav:1, noscript:1, ol:1,
+ output:1, p:1, pre:1, section:1, ul:1,
+ // Other misc. elements that are not part of continuous inline prose:
+ br:1, li: 1, summary: 1, dt:1, details:1, rp:1, rt:1, rtc:1,
+ // Media / Source elements:
+ script:1, style:1, img:1, video:1, audio:1, canvas:1, svg:1, map:1, object:1,
+ // Input elements
+ input:1, textarea:1, select:1, option:1, optgroup: 1, button:1,
+ // Table related elements:
+ table:1, tbody:1, thead:1, th:1, tr:1, td:1, caption:1, col:1, tfoot:1, colgroup:1
+
+ }
+ exposed.NON_INLINE_PROSE = function(el) {
+ return hasOwn.call(exposed.NON_CONTIGUOUS_PROSE_ELEMENTS, el.nodeName.toLowerCase())
+ }
+ // Presets accessed via `options.preset` when calling findAndReplaceDOMText():
+ exposed.PRESETS = {
+ prose: {
+ forceContext: exposed.NON_INLINE_PROSE,
+ filterElements: function(el) {
+ return !hasOwn.call(exposed.NON_PROSE_ELEMENTS, el.nodeName.toLowerCase())
+ }
+ }
+ }
+ exposed.Finder = Finder
+ /**
+ * Finder -- encapsulates logic to find and replace.
+ */
+ function Finder(node, options) {
+
+ var preset = options.preset && exposed.PRESETS[options.preset]
+ options.portionMode = options.portionMode || PORTION_MODE_RETAIN
+ if (preset) {
+ for (var i in preset) {
+ if (hasOwn.call(preset, i) && !hasOwn.call(options, i)) {
+ options[i] = preset[i]
+ }
+ }
+ }
+
+ this.node = node
+ this.options = options
+ // ENable match-preparation method to be passed as option:
+ this.prepMatch = options.prepMatch || this.prepMatch
+ this.reverts = []
+ this.matches = this.search()
+ if (this.matches.length) {
+ this.processMatches()
+ }
+
+ }
+
+ Finder.prototype = {
+
+ /**
+ * Searches for all matches that comply with the instance's 'match' option
+ */
+ search: function() {
+
+ var match
+ var matchIndex = 0
+ var offset = 0
+ var regex = this.options.find
+ var textAggregation = this.getAggregateText()
+ var matches = []
+ var self = this
+ regex = typeof regex === 'string' ? RegExp(escapeRegExp(regex), 'g') : regex
+ matchAggregation(textAggregation)
+ function matchAggregation(textAggregation) {
+ for (var i = 0, l = textAggregation.length; i < l; ++i) {
+
+ var text = textAggregation[i]
+ if (typeof text !== 'string') {
+ // Deal with nested contexts: (recursive)
+ matchAggregation(text)
+ continue
+ }
+
+ if (regex.global) {
+ while (match = regex.exec(text)) {
+ matches.push(self.prepMatch(match, matchIndex++, offset))
+ }
+ } else {
+ if (match = text.match(regex)) {
+ matches.push(self.prepMatch(match, 0, offset))
+ }
+ }
+
+ offset += text.length
+ }
+ }
+
+ return matches
+ },
+
+ /**
+ * Prepares a single match with useful meta info:
+ */
+ prepMatch: function(match, matchIndex, characterOffset) {
+
+ if (!match[0]) {
+ throw new Error('findAndReplaceDOMText cannot handle zero-length matches')
+ }
+
+ match.endIndex = characterOffset + match.index + match[0].length
+ match.startIndex = characterOffset + match.index
+ match.index = matchIndex
+ return match
+ },
+
+ /**
+ * Gets aggregate text within subject node
+ */
+ getAggregateText: function() {
+
+ var elementFilter = this.options.filterElements
+ var forceContext = this.options.forceContext
+ return getText(this.node)
+ /**
+ * Gets aggregate text of a node without resorting
+ * to broken innerText/textContent
+ */
+ function getText(node, txt) {
+
+ if (node.nodeType === 3) {
+ return [node.data]
+ }
+
+ if (elementFilter && !elementFilter(node)) {
+ return []
+ }
+
+ var txt = ['']
+ var i = 0
+ if (node = node.firstChild) do {
+
+ if (node.nodeType === 3) {
+ txt[i] += node.data
+ continue
+ }
+
+ var innerText = getText(node)
+ if (
+ forceContext &&
+ node.nodeType === 1 &&
+ (forceContext === true || forceContext(node))
+ ) {
+ txt[++i] = innerText
+ txt[++i] = ''
+ } else {
+ if (typeof innerText[0] === 'string') {
+ // Bridge nested text-node data so that they're
+ // not considered their own contexts:
+ // I.e. ['some', ['thing']] -> ['something']
+ txt[i] += innerText.shift()
+ }
+ if (innerText.length) {
+ txt[++i] = innerText
+ txt[++i] = ''
+ }
+ }
+ } while (node = node.nextSibling)
+ return txt
+ }
+
+ },
+
+ /**
+ * Steps through the target node, looking for matches, and
+ * calling replaceFn when a match is found.
+ */
+ processMatches: function() {
+
+ var matches = this.matches
+ var node = this.node
+ var elementFilter = this.options.filterElements
+ var startPortion,
+ endPortion,
+ innerPortions = [],
+ curNode = node,
+ match = matches.shift(),
+ atIndex = 0, // i.e. nodeAtIndex
+ matchIndex = 0,
+ portionIndex = 0,
+ doAvoidNode,
+ nodeStack = [node]
+ out: while (true) {
+
+ if (curNode.nodeType === 3) {
+
+ if (!endPortion && curNode.length + atIndex >= match.endIndex) {
+
+ // We've found the ending
+ endPortion = {
+ node: curNode,
+ index: portionIndex++,
+ text: curNode.data.substring(match.startIndex - atIndex, match.endIndex - atIndex),
+ indexInMatch: atIndex - match.startIndex,
+ indexInNode: match.startIndex - atIndex, // always zero for end-portions
+ endIndexInNode: match.endIndex - atIndex,
+ isEnd: true
+ }
+ } else if (startPortion) {
+ // Intersecting node
+ innerPortions.push({
+ node: curNode,
+ index: portionIndex++,
+ text: curNode.data,
+ indexInMatch: atIndex - match.startIndex,
+ indexInNode: 0 // always zero for inner-portions
+ })
+ }
+
+ if (!startPortion && curNode.length + atIndex > match.startIndex) {
+ // We've found the match start
+ startPortion = {
+ node: curNode,
+ index: portionIndex++,
+ indexInMatch: 0,
+ indexInNode: match.startIndex - atIndex,
+ endIndexInNode: match.endIndex - atIndex,
+ text: curNode.data.substring(match.startIndex - atIndex, match.endIndex - atIndex)
+ }
+ }
+
+ atIndex += curNode.data.length
+ }
+
+ doAvoidNode = curNode.nodeType === 1 && elementFilter && !elementFilter(curNode)
+ if (startPortion && endPortion) {
+
+ curNode = this.replaceMatch(match, startPortion, innerPortions, endPortion)
+ // processMatches has to return the node that replaced the endNode
+ // and then we step back so we can continue from the end of the
+ // match:
+
+ atIndex -= (endPortion.node.data.length - endPortion.endIndexInNode)
+ startPortion = null
+ endPortion = null
+ innerPortions = []
+ match = matches.shift()
+ portionIndex = 0
+ matchIndex++
+ if (!match) {
+ break; // no more matches
+ }
+
+ } else if (
+ !doAvoidNode &&
+ (curNode.firstChild || curNode.nextSibling)
+ ) {
+ // Move down or forward:
+ if (curNode.firstChild) {
+ nodeStack.push(curNode)
+ curNode = curNode.firstChild
+ } else {
+ curNode = curNode.nextSibling
+ }
+ continue
+ }
+
+ // Move forward or up:
+ while (true) {
+ if (curNode.nextSibling) {
+ curNode = curNode.nextSibling
+ break
+ }
+ curNode = nodeStack.pop()
+ if (curNode === node) {
+ break out
+ }
+ }
+
+ }
+
+ },
+
+ /**
+ * Reverts ... TODO
+ */
+ revert: function() {
+ // Reversion occurs backwards so as to avoid nodes subsequently
+ // replaced during the matching phase (a forward process):
+ for (var l = this.reverts.length; l--;) {
+ this.reverts[l]()
+ }
+ this.reverts = []
+ },
+
+ prepareReplacementString: function(string, portion, match, matchIndex) {
+ var portionMode = this.options.portionMode
+ if (
+ portionMode === PORTION_MODE_FIRST &&
+ portion.indexInMatch > 0
+ ) {
+ return ''
+ }
+ string = string.replace(/\$(\d+|&|`|')/g, function($0, t) {
+ var replacement
+ switch(t) {
+ case '&':
+ replacement = match[0]
+ break
+ case '`':
+ replacement = match.input.substring(0, match.startIndex)
+ break
+ case '\'':
+ replacement = match.input.substring(match.endIndex)
+ break
+ default:
+ replacement = match[+t]
+ }
+ return replacement
+ })
+ if (portionMode === PORTION_MODE_FIRST) {
+ return string
+ }
+
+ if (portion.isEnd) {
+ return string.substring(portion.indexInMatch)
+ }
+
+ return string.substring(portion.indexInMatch, portion.indexInMatch + portion.text.length)
+ },
+
+ getPortionReplacementNode: function(portion, match, matchIndex) {
+
+ var replacement = this.options.replace || '$&'
+ var wrapper = this.options.wrap
+ if (wrapper && wrapper.nodeType) {
+ // Wrapper has been provided as a stencil-node for us to clone:
+ var clone = doc.createElement('div')
+ clone.innerHTML = wrapper.outerHTML || new XMLSerializer().serializeToString(wrapper)
+ wrapper = clone.firstChild
+ }
+
+ if (typeof replacement == 'function') {
+ replacement = replacement(portion, match, matchIndex)
+ if (replacement && replacement.nodeType) {
+ return replacement
+ }
+ return doc.createTextNode(String(replacement))
+ }
+
+ var el = typeof wrapper == 'string' ? doc.createElement(wrapper) : wrapper
+ replacement = doc.createTextNode(
+ this.prepareReplacementString(
+ replacement, portion, match, matchIndex
+ )
+ )
+ if (!replacement.data) {
+ return replacement
+ }
+
+ if (!el) {
+ return replacement
+ }
+
+ el.appendChild(replacement)
+ return el
+ },
+
+ replaceMatch: function(match, startPortion, innerPortions, endPortion) {
+
+ var matchStartNode = startPortion.node
+ var matchEndNode = endPortion.node
+ var preceedingTextNode
+ var followingTextNode
+ if (matchStartNode === matchEndNode) {
+
+ var node = matchStartNode
+ if (startPortion.indexInNode > 0) {
+ // Add `before` text node (before the match)
+ preceedingTextNode = doc.createTextNode(node.data.substring(0, startPortion.indexInNode))
+ node.parentNode.insertBefore(preceedingTextNode, node)
+ }
+
+ // Create the replacement node:
+ var newNode = this.getPortionReplacementNode(
+ endPortion,
+ match
+ )
+ node.parentNode.insertBefore(newNode, node)
+ if (endPortion.endIndexInNode < node.length) { // ?????
+ // Add `after` text node (after the match)
+ followingTextNode = doc.createTextNode(node.data.substring(endPortion.endIndexInNode))
+ node.parentNode.insertBefore(followingTextNode, node)
+ }
+
+ node.parentNode.removeChild(node)
+ this.reverts.push(function() {
+ if (preceedingTextNode === newNode.previousSibling) {
+ preceedingTextNode.parentNode.removeChild(preceedingTextNode)
+ }
+ if (followingTextNode === newNode.nextSibling) {
+ followingTextNode.parentNode.removeChild(followingTextNode)
+ }
+ newNode.parentNode.replaceChild(node, newNode)
+ })
+ return newNode
+ } else {
+ // Replace matchStartNode -> [innerMatchNodes...] -> matchEndNode (in that order)
+
+ preceedingTextNode = doc.createTextNode(
+ matchStartNode.data.substring(0, startPortion.indexInNode)
+ )
+ followingTextNode = doc.createTextNode(
+ matchEndNode.data.substring(endPortion.endIndexInNode)
+ )
+ var firstNode = this.getPortionReplacementNode(
+ startPortion,
+ match
+ )
+ var innerNodes = []
+ for (var i = 0, l = innerPortions.length; i < l; ++i) {
+ var portion = innerPortions[i]
+ var innerNode = this.getPortionReplacementNode(
+ portion,
+ match
+ )
+ portion.node.parentNode.replaceChild(innerNode, portion.node)
+ this.reverts.push((function(portion, innerNode) {
+ return function() {
+ innerNode.parentNode.replaceChild(portion.node, innerNode)
+ }
+ }(portion, innerNode)))
+ innerNodes.push(innerNode)
+ }
+
+ var lastNode = this.getPortionReplacementNode(
+ endPortion,
+ match
+ )
+ matchStartNode.parentNode.insertBefore(preceedingTextNode, matchStartNode)
+ matchStartNode.parentNode.insertBefore(firstNode, matchStartNode)
+ matchStartNode.parentNode.removeChild(matchStartNode)
+ matchEndNode.parentNode.insertBefore(lastNode, matchEndNode)
+ matchEndNode.parentNode.insertBefore(followingTextNode, matchEndNode)
+ matchEndNode.parentNode.removeChild(matchEndNode)
+ this.reverts.push(function() {
+ preceedingTextNode.parentNode.removeChild(preceedingTextNode)
+ firstNode.parentNode.replaceChild(matchStartNode, firstNode)
+ followingTextNode.parentNode.removeChild(followingTextNode)
+ lastNode.parentNode.replaceChild(matchEndNode, lastNode)
+ })
+ return lastNode
+ }
+ }
+
+ }
+ return exposed
+}())
+
+);
+
+var isNodeNormalizeNormal = (function() {
+ //// Disabled `Node.normalize()` for temp due to
+ //// issue below in IE11.
+ //// See: http://stackoverflow.com/questions/22337498/why-does-ie11-handle-node-normalize-incorrectly-for-the-minus-symbol
+ var div = $.create( 'div' )
+
+ div.appendChild($.create( '', '0-' ))
+ div.appendChild($.create( '', '2' ))
+ div.normalize()
+
+ return div.firstChild.length !== 2
+})()
+
+function getFuncOrElmt( obj ) {
+ return (
+ typeof obj === 'function' ||
+ obj instanceof Element
+ )
+ ? obj
+ : undefined
+}
+
+function createBDGroup( portion ) {
+ var clazz = portion.index === 0 && portion.isEnd
+ ? 'biaodian cjk'
+ : 'biaodian cjk portion ' + (
+ portion.index === 0
+ ? 'is-first'
+ : portion.isEnd
+ ? 'is-end'
+ : 'is-inner'
+ )
+
+ var $elmt = $.create( 'h-char-group', clazz )
+ $elmt.innerHTML = portion.text
+ return $elmt
+}
+
+function createBDChar( char ) {
+ var div = $.create( 'div' )
+ var unicode = char.charCodeAt( 0 ).toString( 16 )
+
+ div.innerHTML = (
+ '' + char + ' '
+ )
+ return div.firstChild
+}
+
+function getBDType( char ) {
+ return char.match( TYPESET.char.biaodian.open )
+ ? 'bd-open'
+ : char.match( TYPESET.char.biaodian.close )
+ ? 'bd-close bd-end'
+ : char.match( TYPESET.char.biaodian.end )
+ ? (
+ /(?:\u3001|\u3002|\uff0c)/i.test( char )
+ ? 'bd-end bd-cop'
+ : 'bd-end'
+ )
+ : char.match(new RegExp( UNICODE.biaodian.liga ))
+ ? 'bd-liga'
+ : char.match(new RegExp( UNICODE.biaodian.middle ))
+ ? 'bd-middle'
+ : ''
+}
+
+$.extend( Fibre.fn, {
+ normalize: function() {
+ if ( isNodeNormalizeNormal ) {
+ this.context.normalize()
+ }
+ return this
+ },
+
+ // Force punctuation & biaodian typesetting rules to be applied.
+ jinzify: function( selector ) {
+ return (
+ this
+ .filter( selector || null )
+ .avoid( 'h-jinze' )
+ .replace(
+ TYPESET.jinze.touwei,
+ function( portion, match ) {
+ var elem = $.create( 'h-jinze', 'touwei' )
+ elem.innerHTML = match[0]
+ return (( portion.index === 0 && portion.isEnd ) || portion.index === 1 ) ? elem : ''
+ }
+ )
+ .replace(
+ TYPESET.jinze.wei,
+ function( portion, match ) {
+ var elem = $.create( 'h-jinze', 'wei' )
+ elem.innerHTML = match[0]
+ return portion.index === 0 ? elem : ''
+ }
+ )
+ .replace(
+ TYPESET.jinze.tou,
+ function( portion, match ) {
+ var elem = $.create( 'h-jinze', 'tou' )
+ elem.innerHTML = match[0]
+ return (( portion.index === 0 && portion.isEnd ) || portion.index === 1 )
+ ? elem : ''
+ }
+ )
+ .replace(
+ TYPESET.jinze.middle,
+ function( portion, match ) {
+ var elem = $.create( 'h-jinze', 'middle' )
+ elem.innerHTML = match[0]
+ return (( portion.index === 0 && portion.isEnd ) || portion.index === 1 )
+ ? elem : ''
+ }
+ )
+ .endAvoid()
+ .endFilter()
+ )
+ },
+
+ groupify: function( option ) {
+ var option = $.extend({
+ biaodian: false,
+ //punct: false,
+ hanzi: false, // Includes Kana
+ kana: false,
+ eonmun: false,
+ western: false // Includes Latin, Greek and Cyrillic
+ }, option || {})
+
+ this.avoid( 'h-word, h-char-group' )
+
+ if ( option.biaodian ) {
+ this.replace(
+ TYPESET.group.biaodian[0], createBDGroup
+ ).replace(
+ TYPESET.group.biaodian[1], createBDGroup
+ )
+ }
+
+ if ( option.hanzi || option.cjk ) {
+ this.wrap(
+ TYPESET.group.hanzi, $.clone($.create( 'h-char-group', 'hanzi cjk' ))
+ )
+ }
+ if ( option.western ) {
+ this.wrap(
+ TYPESET.group.western, $.clone($.create( 'h-word', 'western' ))
+ )
+ }
+ if ( option.kana ) {
+ this.wrap(
+ TYPESET.group.kana, $.clone($.create( 'h-char-group', 'kana' ))
+ )
+ }
+ if ( option.eonmun || option.hangul ) {
+ this.wrap(
+ TYPESET.group.eonmun, $.clone($.create( 'h-word', 'eonmun hangul' ))
+ )
+ }
+
+ this.endAvoid()
+ return this
+ },
+
+ charify: function( option ) {
+ var option = $.extend({
+ avoid: true,
+ biaodian: false,
+ punct: false,
+ hanzi: false, // Includes Kana
+ latin: false,
+ ellinika: false,
+ kirillica: false,
+ kana: false,
+ eonmun: false
+ }, option || {})
+
+ if ( option.avoid ) {
+ this.avoid( 'h-char' )
+ }
+
+ if ( option.biaodian ) {
+ this.replace(
+ TYPESET.char.biaodian.all,
+ getFuncOrElmt( option.biaodian )
+ ||
+ function( portion ) { return createBDChar( portion.text ) }
+ ).replace(
+ TYPESET.char.biaodian.liga,
+ getFuncOrElmt( option.biaodian )
+ ||
+ function( portion ) { return createBDChar( portion.text ) }
+ )
+ }
+ if ( option.hanzi || option.cjk ) {
+ this.wrap(
+ TYPESET.char.hanzi,
+ getFuncOrElmt( option.hanzi || option.cjk )
+ ||
+ $.clone($.create( 'h-char', 'hanzi cjk' ))
+ )
+ }
+ if ( option.punct ) {
+ this.wrap(
+ TYPESET.char.punct.all,
+ getFuncOrElmt( option.punct )
+ ||
+ $.clone($.create( 'h-char', 'punct' ))
+ )
+ }
+ if ( option.latin ) {
+ this.wrap(
+ TYPESET.char.latin,
+ getFuncOrElmt( option.latin )
+ ||
+ $.clone($.create( 'h-char', 'alphabet latin' ))
+ )
+ }
+ if ( option.ellinika || option.greek ) {
+ this.wrap(
+ TYPESET.char.ellinika,
+ getFuncOrElmt( option.ellinika || option.greek )
+ ||
+ $.clone($.create( 'h-char', 'alphabet ellinika greek' ))
+ )
+ }
+ if ( option.kirillica || option.cyrillic ) {
+ this.wrap(
+ TYPESET.char.kirillica,
+ getFuncOrElmt( option.kirillica || option.cyrillic )
+ ||
+ $.clone($.create( 'h-char', 'alphabet kirillica cyrillic' ))
+ )
+ }
+ if ( option.kana ) {
+ this.wrap(
+ TYPESET.char.kana,
+ getFuncOrElmt( option.kana )
+ ||
+ $.clone($.create( 'h-char', 'kana' ))
+ )
+ }
+ if ( option.eonmun || option.hangul ) {
+ this.wrap(
+ TYPESET.char.eonmun,
+ getFuncOrElmt( option.eonmun || option.hangul )
+ ||
+ $.clone($.create( 'h-char', 'eonmun hangul' ))
+ )
+ }
+
+ this.endAvoid()
+ return this
+ }
+})
+
+$.extend( Han, {
+ isNodeNormalizeNormal: isNodeNormalizeNormal,
+ find: Fibre,
+ createBDGroup: createBDGroup,
+ createBDChar: createBDChar
+})
+
+$.matches = Han.find.matches
+
+void [
+ 'setMode',
+ 'wrap', 'replace', 'revert',
+ 'addBoundary', 'removeBoundary',
+ 'avoid', 'endAvoid',
+ 'filter', 'endFilter',
+ 'jinzify', 'groupify', 'charify'
+].forEach(function( method ) {
+ Han.fn[ method ] = function() {
+ if ( !this.finder ) {
+ // Share the same selector
+ this.finder = Han.find( this.context )
+ }
+
+ this.finder[ method ]( arguments[ 0 ], arguments[ 1 ] )
+ return this
+ }
+})
+
+var Locale = {}
+
+function writeOnCanvas( text, font ) {
+ var canvas = $.create( 'canvas' )
+ var context
+
+ canvas.width = '50'
+ canvas.height = '20'
+ canvas.style.display = 'none'
+
+ body.appendChild( canvas )
+
+ context = canvas.getContext( '2d' )
+ context.textBaseline = 'top'
+ context.font = '15px ' + font + ', sans-serif'
+ context.fillStyle = 'black'
+ context.strokeStyle = 'black'
+ context.fillText( text, 0, 0 )
+
+ return {
+ node: canvas,
+ context: context,
+ remove: function() {
+ $.remove( canvas, body )
+ }
+ }
+}
+
+function compareCanvases( treat, control ) {
+ var ret
+ var a = treat.context
+ var b = control.context
+
+ try {
+ for ( var j = 1; j <= 20; j++ ) {
+ for ( var i = 1; i <= 50; i++ ) {
+ if (
+ typeof ret === 'undefined' &&
+ a.getImageData(i, j, 1, 1).data[3] !== b.getImageData(i, j, 1, 1).data[3]
+ ) {
+ ret = false
+ break
+ } else if ( typeof ret === 'boolean' ) {
+ break
+ }
+
+ if ( i === 50 && j === 20 && typeof ret === 'undefined' ) {
+ ret = true
+ }
+ }
+ }
+
+ // Remove and clean from memory
+ treat.remove()
+ control.remove()
+ treat = null
+ control = null
+
+ return ret
+ } catch (e) {}
+ return false
+}
+
+function detectFont( treat, control, text ) {
+ var treat = treat
+ var control = control || 'sans-serif'
+ var text = text || '辭Q'
+ var ret
+
+ control = writeOnCanvas( text, control )
+ treat = writeOnCanvas( text, treat )
+
+ return !compareCanvases( treat, control )
+}
+
+Locale.writeOnCanvas = writeOnCanvas
+Locale.compareCanvases = compareCanvases
+Locale.detectFont = detectFont
+
+Locale.support = (function() {
+
+ var PREFIX = 'Webkit Moz ms'.split(' ')
+
+ // Create an element for feature detecting
+ // (in `testCSSProp`)
+ var elem = $.create( 'h-test' )
+
+ function testCSSProp( prop ) {
+ var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1)
+ var allProp = ( prop + ' ' + PREFIX.join( ucProp + ' ' ) + ucProp ).split(' ')
+ var ret
+
+ allProp.forEach(function( prop ) {
+ if ( typeof elem.style[ prop ] === 'string' ) {
+ ret = true
+ }
+ })
+ return ret || false
+ }
+
+ function injectElementWithStyle( rule, callback ) {
+ var fakeBody = body || $.create( 'body' )
+ var div = $.create( 'div' )
+ var container = body ? div : fakeBody
+ var callback = typeof callback === 'function' ? callback : function() {}
+ var style, ret, docOverflow
+
+ style = [ '' ].join('')
+
+ container.innerHTML += style
+ fakeBody.appendChild( div )
+
+ if ( !body ) {
+ fakeBody.style.background = ''
+ fakeBody.style.overflow = 'hidden'
+ docOverflow = root.style.overflow
+
+ root.style.overflow = 'hidden'
+ root.appendChild( fakeBody )
+ }
+
+ // Callback
+ ret = callback( container, rule )
+
+ // Remove the injected scope
+ $.remove( container )
+ if ( !body ) {
+ root.style.overflow = docOverflow
+ }
+ return !!ret
+ }
+
+ function getStyle( elem, prop ) {
+ var ret
+
+ if ( window.getComputedStyle ) {
+ ret = document.defaultView.getComputedStyle( elem, null ).getPropertyValue( prop )
+ } else if ( elem.currentStyle ) {
+ // for IE
+ ret = elem.currentStyle[ prop ]
+ }
+ return ret
+ }
+
+ return {
+ columnwidth: testCSSProp( 'columnWidth' ),
+
+ fontface: (function() {
+ var ret
+
+ injectElementWithStyle(
+ '@font-face { font-family: font; src: url("//"); }',
+ function( node, rule ) {
+ var style = $.qsa( 'style', node )[0]
+ var sheet = style.sheet || style.styleSheet
+ var cssText = sheet ?
+ ( sheet.cssRules && sheet.cssRules[0] ?
+ sheet.cssRules[0].cssText : sheet.cssText || ''
+ ) : ''
+
+ ret = /src/i.test( cssText ) &&
+ cssText.indexOf( rule.split(' ')[0] ) === 0
+ }
+ )
+
+ return ret
+ })(),
+
+ ruby: (function() {
+ var ruby = $.create( 'ruby' )
+ var rt = $.create( 'rt' )
+ var rp = $.create( 'rp' )
+ var ret
+
+ ruby.appendChild( rp )
+ ruby.appendChild( rt )
+ root.appendChild( ruby )
+
+ // Browsers that support ruby hide the `