[
  {
    "path": ".gitattributes",
    "content": "# Auto detect text files and perform LF normalization\n* text=auto\n\n# Custom for Visual Studio\n*.cs     diff=csharp\n\n# Standard to msysgit\n*.doc\t diff=astextplain\n*.DOC\t diff=astextplain\n*.docx diff=astextplain\n*.DOCX diff=astextplain\n*.dot  diff=astextplain\n*.DOT  diff=astextplain\n*.pdf  diff=astextplain\n*.PDF\t diff=astextplain\n*.rtf\t diff=astextplain\n*.RTF\t diff=astextplain\n"
  },
  {
    "path": ".gitignore",
    "content": "# Windows image file caches\nThumbs.db\nehthumbs.db\n\n# Folder config file\nDesktop.ini\n\n# Recycle Bin used on file shares\n$RECYCLE.BIN/\n\n# Windows Installer files\n*.cab\n*.msi\n*.msm\n*.msp\n\n# Windows shortcuts\n*.lnk\n\n# =========================\n# Operating System Files\n# =========================\n\n# OSX\n# =========================\n\n.DS_Store\n.AppleDouble\n.LSOverride\n\n# Thumbnails\n._*\n\n# Files that might appear in the root of a volume\n.DocumentRevisions-V100\n.fseventsd\n.Spotlight-V100\n.TemporaryItems\n.Trashes\n.VolumeIcon.icns\n\n# Directories potentially created on remote AFP share\n.AppleDB\n.AppleDesktop\nNetwork Trash Folder\nTemporary Items\n.apdisk\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Sean Sun\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "README.md",
    "content": "![hexo-theme-bubuzou](https://bubuzou.oss-cn-shenzhen.aliyuncs.com/blog/202010/theme-bubuzou.png)\n\n## 更新日志\n\n### 2024-01-23\n\n- 变更站点和文章访问统计脚本为[不蒜子](https://ibruce.info/2015/04/04/busuanzi/)\n\n### 2021-4-4\n\n- 主题更变-暗色系\n- 文章页目录支持 3 级\n\n### 2020-11-06\n\n- 加载优化\n- 文章页目录插件重写\n\n### 2020-08-13\n\n- 文章页目录栏 bug 修复\n\n### 2019-03-29\n\n- 文章页的右侧去掉“分类归档”、“标签云”和“最新文章”，右侧整块为文章目录\n- 文章评论系统和访问统计改成基于 `leancloud` 的 `valine`\n- 手机端头部菜单精简\n- 手机端去掉右侧导航栏\n\n### 2017-07-21\n\n- bubuzou.css 规范化了`css`文件\n\n### 2017-07-12\n\n- 评论系统由网易云跟帖改成了畅言\n\n### 2017-06-25\n\n- 增加了文章访问次数的统计功能\n\n### 2017-06-07\n\n- 文章目录优化，能够自适应定位\n\n## 说明\n\nhexo-theme-bubuzou 主题是根据 hexo 里 Apollo 主题改编而来的，[主题效果](http://bubuzou.com/)\n\n## 安装\n\n想要把 hexo 的主题应用到自己的博客上，需要在本地先构建好 hexo 所依赖的环境。[hexo 使用文档](https://hexo.io/zh-cn/docs/index.html)\n大致的步骤是这样的：\n\n- 安装 git\n- 安装 node.js\n- 安装 hexo\n\n```\n$ npm install -g hexo-cli\n```\n\n- 构建站点\n\n```\n    $ hexo init d://Blog\n    $ cd d://Blog\n    $ npm install\n```\n\n- clone 主题\n  这个时候已经构建好了站点，但是使用的主题是 hexo 默认的`landscape`。所以如果需要变更为`bubuzou`主题，就需要从 github 上 clone 到本地，修改文件名为`bubuzou`，并且放到`d://Blog/theme`下\n  [hexo-theme-bubuzou 主题](https://github.com/Bulandent/hexo-theme-bubuzou)\n- 修改主题\n  然后把 blog 目录下的`_config.yml`配置文件里的`theme: landscape`改成`bubuzou`即可\n- 安装依赖包\n  hexo 里每个不同的主题所依赖的包都不尽相同。安装的默认主题已经包含了一些依赖包，但是对于`bubuzou`这个主题来说是不够的，所以还需要安装以下几个:\n\n```\n    npm install --save hexo-renderer-jade hexo-generator-feed hexo-generator-sitemap hexo-browsersync hexo-generator-archive\n    npm install --save hexo-deployer-git hexo-generator-json-content hexo-generator-search\n```\n\n## 主题说明文档\n\n- [中文文档](https://github.com/bulandent/hexo-theme-bubuzou/blob/master/doc/doc-zh.md)\n\n## 协议\n\n[![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://opensource.org/licenses/mit-license.php)\n"
  },
  {
    "path": "_config.yml",
    "content": "menu:\n  博文: /\n  归档: /archives/\n  生活: /categories/live/\n  读书: /categories/read/\n  关于: /about/\n\nwidgets:\n  - category\n  - tag\n  - tagcloud\n  - archive\n\n# count\nshow_count: true\nfavicon: https://bubuzou.oss-cn-shenzhen.aliyuncs.com/blog/202010/favicon.ico\nlogo: https://bubuzou.oss-cn-shenzhen.aliyuncs.com/blog/202010/logo.png\nstyle: https://bubuzou.oss-cn-shenzhen.aliyuncs.com/blog/202010/bubuzou.css\n\n# Comment\n#changyan: bubuzou\nleancloud:\n  appid: aD8jJBpu4oew3ovNY73z6Rdq-gzGzoHsz # 填写您的appid\n  appkey: FdzS5SOPHdhYQoEUngQ8K2QW # 填写您的appkey\n  comment: true # 是否开启评论系统\n  timer: false # 是否开启文章统计\n\n# Analytics\n# google-analytics:\nga: UA-65933410-1\n\n# Copyright Infomation\nstartyear: 2016\n"
  },
  {
    "path": "doc/doc-zh.md",
    "content": "## 文章变量\n\n文章变量可以定义在md文件的开头。可以定义文章的标题，时间，归档的标签，归档的分类，文章关键字，文章描述，文章出处以及文章的示例等。\n\n```md\ntitle: background属性\ndate: 2017-3-10 11:19:04\ntags: css\ndesc: css的复合属性background，以及background-repeat,background-position,background-origin等子属性的介绍。\nkeywords: css background、background-repeat、background-position、background-origin\ncategories:\n  - css\nfrom: https://bitsofco.de/the-background-properties/\ndemo: ../../../demos/201703/background.html\n```\n\n## 标题\n\n实际上，Hexo-theme-bubuzou 只支持两种标题：`h2` 一级标题，`h3` 二级标题，也就是分别使用 `##` 和 `###` 来表示。之所以这么处理，是因为就个人感觉而言，我们不应该为文章设置过多的层级消耗读者的阅读精力。配置了这样的标题的页面会自动生成页面目录。\n\n![页面目录](https://raw.githubusercontent.com/Bulandent/hexo-theme-bubuzou/master/source/images/cate.png)\n\n## 文章摘要\n\n如果你想创建文章摘要用于向读者展示文章的核心内容，那么需要在文章摘要之后其他内容之前添加 HTML 注释标签 `<!--more-->`，使用方法如下图所示：\n\n![文章摘要](https://raw.githubusercontent.com/Bulandent/hexo-theme-bubuzou/master/source/images/abstract.png)\n\n## 评论插件\n\nHexo-theme-bubuzou 评论插件由最开始的多说改成网易云跟帖，后面由于8月1号云跟帖暂停服务，所以现在又换成了畅言。请在 `theme/_config.yml` 文件中做如下配置:\n\n```yaml\nchangyan: bubuzou\n```\n\n## 警告块\n\n使用警告块需要 `div` 标签和 `tip` 类名：\n\n```html\n<div class=\"tip\">\n    在ECMAScript 5的strict模式下，这种情况的`this`已经被规定不会指向全局对象了，而是`undefined`\n</div>\n```\n\n![alert](https://raw.githubusercontent.com/Bulandent/hexo-theme-bubuzou/master/source/images/alert.png)\n\n## 搜索\n\n使用搜索功能需要在站点的配置文件_config.yml里配置如下：\n```\n# search\nsearch:\n  path: search.xml\n  field: post\n```\n\n## 归档页面显示所有文章\n需要安装`hexo-generator-archive`插件支持，然后在全局的`_config.yml`里配置：\n```\narchive_generator:\n    per_page: 0\n    yearly: false\n    monthly: false\n    daily: false\n```\n\n## 访问次数统计\n引入js脚本：\n```\n<script src=\"https://cdn1.lncld.net/static/js/av-mini-0.6.10.js\"></script>\n<script src=\"http://jerry-cdn.b0.upaiyun.com/hit-kounter/hit-kounter-lc-0.2.0.js\"></script>\n```\n显示当前页面的访问量：\n```\n<span data-hk-page=\"current\"> - </span>\n```\n显示指定页面的访问量：\n<span data-hk-page=\"http://bubuzou.com/2016/11/closure/\"> - </span>\n注意这里的链接必须是带协议的完整链接，而且不能带中文的。\n更多用法可以参考[这里](http://jerryzou.com/posts/introduction-to-hit-kounter-lc/)\n\n"
  },
  {
    "path": "gulpfile.js",
    "content": "var gulp = require('gulp');\nvar sass = require('gulp-sass');\nvar autoprefixer = require('gulp-autoprefixer');\n\n// 一次性编译 Sass \ngulp.task('sass', function() {\n    return gulp.src('./source/scss/*.scss')\n        .pipe(sass({outputStyle: 'compressed'}))\n        .pipe(autoprefixer())\n        .pipe(gulp.dest('./source/css'));\n});\n\n// 实时编译\ngulp.task('default', ['sass'], function() {\n    gulp.watch('./source/scss/_partial/*.scss', ['sass']);\n    gulp.watch('./source/scss/*.scss', ['sass']);\n});"
  },
  {
    "path": "languages/en.yml",
    "content": "prev: PREV\nnext: NEXT\nprev_post: PREV\nnext_post: NEXT\nmore: ...more"
  },
  {
    "path": "languages/zh-cn.yml",
    "content": "prev: 上一页\nnext: 下一页\nprev_post: 上一篇\nnext_post: 下一篇\nmore: ...阅读全文\n"
  },
  {
    "path": "layout/about.jade",
    "content": "extends partial/layout\n\n.blog 微博\n.github github\n\nblock copyright\n    include partial/copyright\n"
  },
  {
    "path": "layout/archive.jade",
    "content": "extends partial/layout\n\nblock container\n    include mixins/post\n    +postList()\n    \nblock pagination\n    include mixins/paginator\n    +home()\n\nblock copyright\n    include partial/copyright"
  },
  {
    "path": "layout/categories.jade",
    "content": "extends partial/layout\n\nblock container\n    include mixins/post\n    +postCate()\n\nblock pagination\n    include mixins/paginator\n    +home()\n\nblock copyright\n    include partial/copyright"
  },
  {
    "path": "layout/index.jade",
    "content": "extends partial/layout\n\nblock container\n    include mixins/post\n    +posts()\n\nblock pagination\n    include mixins/paginator\n    +home()\n\nblock copyright\n    include partial/copyright\n"
  },
  {
    "path": "layout/mixins/paginator.jade",
    "content": "mixin home()\n    - var prev = page.prev_link\n    - var next = page.next_link\n    .paginator\n        if page.prev\n            a.prev(href=url_for(prev), title=page.prev.title)!= __('prev') \n        if page.next\n            a.next(href=url_for(next), title=page.next.title)!= __('next')\n\nmixin post()\n    - var prev = page.prev ? page.prev.path : false;\n    - var next = page.next ? page.next.path : false; \n    .paginator\n        if prev\n            a.prev(href=url_for(prev), title=page.prev.title)!= __('prev_post')\n        if next\n            a.next(href=url_for(next), title=page.next.title)!= __('next_post')"
  },
  {
    "path": "layout/mixins/post.jade",
    "content": "mixin postInfo(item)\n    .post-info\n        != date(item.date, 'YYYY-MM-DD')\n        p.visit(id=\"busuanzi_container_page_pv\")\n            span(id=\"busuanzi_value_page_pv\") \n            span 次访问\n        if item.from && (is_home() || is_post())\n            a.post-from(href=item.from target=\"_blank\" title=item.from) 原文地址\n        if item.demo && ( is_home() || is_post() )\n            a.post-demo(href=item.demo target=\"_blank\" title=\"\") 去看示例\n// for archive page\nmixin postInfoAr(item)\n    .post-info\n        != date(item.date, 'MM-DD')\n        if item.from && (is_home() || is_post())\n            a.post-from(href=item.from target=\"_blank\" title=item.from) 原文地址\n        if item.demo && ( is_home() || is_post() )\n            a.post-demo(href=item.demo target=\"_blank\" title=\"\") 去看示例\n//- Index Page\nmixin posts()\n    ul.home.post-list\n        - page.posts.each(function (item) {\n            li.post-list-item\n                article.post-block\n                    h2.post-title\n                        a.post-title-link(href= url_for(item.path))\n                            != item.title\n                    +postInfo(item)\n                    .post-content\n                        != item.excerpt\n                    a.read-more(href= url_for(item.path))!= __('more')\n        - })\n\n//- Archive Page\nmixin postList()\n    .archive\n        - var year = 0;\n        - var change = false;\n        - page.posts.each(function (item) {\n            - var itemYear = date(item.date, 'YYYY') - 0;\n            - change = year !== itemYear;\n            - year = change ? itemYear : year;\n            if change \n                h2.archive-year!= year\n            .post-item\n                +postInfoAr(item)\n                a.post-title-link(href= url_for(item.path))\n                    != item.title\n        - })\n\n//- Post Page\nmixin post(item)\n    #postAr.post\n        article.post-block\n            h1.post-title\n                != item.title\n            +postInfo(item)\n            .post-content\n                != item.content\n\n//- post category\nmixin postCate()\n    .archive\n        - var year = 0;\n        - var change = false;\n        - page.posts.each(function (item) {\n            - var itemYear = date(item.date, 'YYYY') - 0;\n            - change = year !== itemYear;\n            - year = change ? itemYear : year;\n            if change \n                h2.archive-year!= year\n            .post-item\n                +postInfo(item)\n                a.post-title-link(href= url_for(item.path))\n                    != item.title\n        - })\n\n//- post live\nmixin postLive()\n    .archive\n        - var year = 0;\n        - var change = false;\n        - page.posts.each(function (item) {\n            if item.live\n                - var itemYear = date(item.date, 'YYYY') - 0;\n                - change = year !== itemYear;\n                - year = change ? itemYear : year;\n                if change \n                    h2.archive-year!= year\n                .post-item\n                    +postInfo(item)\n                    a.post-title-link(href= url_for(item.path))\n                        != item.title\n        - })"
  },
  {
    "path": "layout/partial/comment.jade",
    "content": "if theme.leancloud.comment\n    a(href=\"#comment\", class=\"comment-anchor\")\n    div(id=\"vcomments\")\n    script.\n        new Valine({\n            el: \"#vcomments\",\n            appId: \"!{ theme.leancloud.appid }\",\n            appKey: \"!{ theme.leancloud.appkey }\",\n            notify: false,\n            verify: false,\n            avatar: \"robohash\",\n            visitor: true,\n            placeholder: \"随便说点什么～.～\",\n        });"
  },
  {
    "path": "layout/partial/copyright.jade",
    "content": "﻿.copyright\n    - var hexoURL = \"https://hexo.io/\";\n    - var bubuzouURL = \"https://github.com/Bulandent/hexo-theme-bubuzou\";\n    - var currentDate = new Date();\n    - var year = currentDate.getFullYear();\n    - year = year == theme.startyear ? year : theme.startyear + ' - ' + year;\n    p © #{year} #[a(href=config.weibo, target=\"_blank\")!= config.author], powered by #[a(href=hexoURL, target=\"_blank\") Hexo] <br> and #[a(href=bubuzouURL, target=\"_blank\") hexo-theme-bubuzou]\n    p\n        span(id=\"busuanzi_container_site_pv\") 本站总访问数：\n            span(id=\"busuanzi_value_site_pv\")\n        span(id=\"busuanzi_container_site_uv\", style=\"padding-left: 6px;\") 访客数：\n            span(id=\"busuanzi_value_site_uv\")\n    p \n        span(style=\"padding-right: 6px;\") 闽ICP备16007301号-2"
  },
  {
    "path": "layout/partial/head.jade",
    "content": "meta(charset=\"utf-8\")\nmeta(name=\"X-UA-Compatible\", content=\"IE=edge\")\nmeta(name=\"baidu-site-verification\", content=\"1EB8XoOl0C\")\nmeta(name=\"google-site-verification\", content=\"K7thEgdLm0UfRWJ5MGdF7sCcjClSzAlxFLPv2Oz5CGM\")\n\ntitle \n    block site_title\n        = config.title\nmeta(name=\"viewport\", content=\"width=device-width, initial-scale=1\")\nblock description\n    meta(name=\"description\", content= page.desc ? page.desc : config.description)\nmeta(name=\"keywords\", content= page.keywords ? page.keywords : config.keywords)\nmeta(name=\"author\", content= config.author)\nlink(rel=\"short icon\", href=url_for(theme.favicon))\nlink(rel=\"stylesheet\", href=url_for(theme.style))\n\n- var xml = config.url + '/atom.xml'\n    link(rel=\"search\", type=\"application/opensearchdescription+xml\", href=xml, title=config.title)\n\n<script async src=\"//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js\">\n</script>\n<script src='//unpkg.com/valine/dist/Valine.min.js'></script>\n    \n"
  },
  {
    "path": "layout/partial/layout.jade",
    "content": "doctype\nhtml(lang=config.language)\n    head\n        include head\n    body\n        header\n           .header.row \n                a.logo-link(href=url_for())\n                    img(src=theme.logo)\n                include nav\n                .search\n                    a#search_btn(href='#search')\n                .nav-btn#nav_btn\n                    span\n                    span\n                    span\n        .row.scroll-con\n            section.container\n                block container\n                .right-container\n                    if (is_post())\n                        include ../widget/catalog\n                    else \n                        include ../widget/category\n                        include ../widget/tagcloud\n                        include ../widget/recent\n        .right-menu\n        .modal.search-modal\n            .input-field\n                input(type='text', id='search_input')\n                label(for='search-input') 搜索\n            #search_result.search-result\n        .blog-overlay\n\n        footer.row\n            .footer-con\n                block pagination\n                block copyright\n                .totop\n                    i\n            \n        include scripts\n        if theme.leancloud.timer\n            include timer\n"
  },
  {
    "path": "layout/partial/nav.jade",
    "content": "ul.nav.nav-list#nav_list\n    each value, key in theme.menu\n        li.nav-list-item\n            - var re = /^(http|https):\\/\\/*/gi;\n            - var tar = re.test(value) ? \"_blank\" : \"_self\"\n            a.nav-list-link( href=value target=tar data-hover= key.toUpperCase())\n                != key.toUpperCase()"
  },
  {
    "path": "layout/partial/scripts.jade",
    "content": "//- LaTex\nscript(async src=\"//cdn.bootcss.com/mathjax/2.6.1/MathJax.js?config=TeX-MML-AM_CHTML\")\nscript(src=url_for(\"https://bubuzou.oss-cn-shenzhen.aliyuncs.com/blog/202010/jquery-1.8.2.min.js\"))\nscript(src=url_for(\"https://bubuzou.oss-cn-shenzhen.aliyuncs.com/blog/202010/articleCatalog.js\"))\nscript(src=url_for(\"https://bubuzou.oss-cn-shenzhen.aliyuncs.com/blog/202010/main.js\"))\n\n//- Analytics tracking\n- var ga = theme.ga\nif ga\n    script\n        | (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;e=o.createElement(i);r=o.getElementsByTagName(i)[0];e.src='//www.google-analytics.com/analytics.js';r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));ga('create',\n        != '\"' + ga + '\"'\n        | ,'auto');ga('send','pageview');"
  },
  {
    "path": "layout/partial/timer.jade",
    "content": "script.\n    const valineAPI = (() => {\n    try {\n        AV.init(\"!{ theme.leancloud.appid }\", \"!{ theme.leancloud.appkey }\");\n    } catch(error) {}\n    const isExist = (identity) => {\n        identity = identity || getRealPath();\n        let query = new AV.Query('Timer');\n        return new Promise((resolve, reject) => {\n        query.equalTo(\"identity\", identity);\n        query.find().then(results => {\n            resolve(results.length > 0);\n        }, error => reject(error));\n        })\n    }\n\n    const _get = (identity) => {\n        let query = null;\n        if(identity && identity instanceof Array){\n        let querys = [];\n        for(let i = 0; i < identity.length; ++i) {\n            querys[i] = new AV.Query('Timer');\n            querys[i].equalTo('identity', identity[i]);\n        }\n        query = AV.Query.or.apply(null ,querys);\n        } else {\n        identity = identity || getRealPath();\n        query = new AV.Query(\"Timer\");\n        query.equalTo(\"identity\", identity);\n        }\n\n        return new Promise((resolve, reject) => {\n        query.find()\n        .then(results => resolve(results))\n        .catch(error => reject(error))\n        })\n    }\n\n    const create = (identity) => {\n        identity = identity || getRealPath();\n        return new Promise((resolve, reject) => {\n        let Todo = AV.Object.extend('Timer');\n        let todo = new Todo();\n        todo.set(\"times\", 1);\n        todo.set(\"identity\", identity);\n        todo.save().then(res => resolve(true), error => reject(error));\n        })\n    }\n\n    const update = (identity) => {\n        identity = identity || getRealPath();\n        return new Promise((resolve, reject) => {\n        let query = new AV.Query('Timer');\n        query.equalTo(\"identity\", identity);\n        query.find().then(todos => {\n            todos.forEach(todo => {\n            todo.set(\"times\", todo.attributes.times + 1);\n            });\n            return AV.Object.saveAll(todos);\n        }).then(todos => resolve(true), error => reject(error));\n        })\n    }\n\n    return {\n        isExist,\n        _get,\n        update,\n        create\n    }\n    })()\n\n    const calcAndWriteTimes = () => {\n    let isPost = !{ is_post() };\n\n    let timerAllDOM = document.querySelectorAll(\".article-timer\");\n\n    if(isPost) {\n        let identity = timerAllDOM[0].getAttribute(\"data-identity\");\n        valineAPI.isExist(identity)\n        .then(exist => {\n        if(exist) {\n            return valineAPI.update(identity);\n        }\n        return new Promise(resolve => resolve(true));\n        })\n        .then( succuess => valineAPI._get(identity))\n        .then( result => timerAllDOM[0].innerText = result[0].attributes.times)\n        .catch(error => console.log(error.message))\n        return ;\n    }\n\n    let timerDOMCache = {};\n\n    for(let timerDOM of timerAllDOM) {\n        let identity = timerDOM.getAttribute(\"data-identity\");\n        if(timerDOMCache.hasOwnProperty(identity)){\n        timerDOMCache[identity].dom.push(timerDOM);\n        }else{\n        timerDOMCache[identity] = {\n            dom: [timerDOM],\n            times: undefined\n        };\n        }\n    }\n\n    let identities = Object.keys(timerDOMCache);\n    valineAPI._get(identities).then(results => {\n        for(let result of results) {\n        let {identity, times} = result.attributes;\n        timerDOMCache[identity].times = times;\n        timerDOMCache[identity].dom.map(item => item.innerText = times);\n        }\n        for(let identity of identities) {\n        if(timerDOMCache[identity].times){\n            continue;\n        }\n        timerDOMCache[identity].dom.map(item => item.innerText = 1);\n        valineAPI.create(identity);\n        }\n    }).catch(error => console.log(error.message))\n    }\n\n    if(!{ theme.leancloud.timer }){\n    calcAndWriteTimes();\n    }"
  },
  {
    "path": "layout/post.jade",
    "content": "extends partial/layout\n\nblock site_title\n    != page.title + \" · \" + config.title\n\nblock description\n    - var desc = page.desc || page.title + ' - ' + config.author;\n    meta(name=\"description\", content=desc)\n\nblock container\n    include mixins/post\n    +post(page)\n\nblock pagination\n    include mixins/paginator\n    +post()\n    include partial/comment\n\nblock copyright\n    include partial/copyright\n\n"
  },
  {
    "path": "layout/widget/catalog.jade",
    "content": ".widget\n\t#arAnchorBar"
  },
  {
    "path": "layout/widget/category.jade",
    "content": "﻿.widget\n    .category\n        h4 分类归档\n        != list_categories()\n"
  },
  {
    "path": "layout/widget/recent.jade",
    "content": ".widget\n\t.recent\n\t\th4 最近文章\n\t\t!= list_posts({amount: 5})"
  },
  {
    "path": "layout/widget/tagcloud.jade",
    "content": ".widget\n    .tagcloud\n        h4 标签云\n        != tagcloud()"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"hexo-theme-bubuzou\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A hexo theme remoulded by hexo-theme-apollo\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"sass\": \"gulp sass\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/bulandent/hexo-theme-bubuzou\"\n  },\n  \"keywords\": [\n    \"hexo\",\n    \"theme\",\n    \"apollo\"\n  ],\n  \"author\": \"brandon Sun\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/pinggod/hexo-theme-apollo/issues\"\n  },\n  \"homepage\": \"https://github.com/pinggod/hexo-theme-apollo#readme\",\n  \"devDependencies\": {\n    \"gulp\": \"^3.9.0\",\n    \"gulp-autoprefixer\": \"^3.0.2\",\n    \"gulp-sass\": \"^2.0.4\",\n    \"gulp-sourcemaps\": \"^1.6.0\"\n  }\n}\n"
  },
  {
    "path": "source/css/bubuzou.css",
    "content": "@charset \"utf-8\";\n\n/**\n  * @name: bubuzou.css\n  * @description: hexo-theme-bubuzou的主题样式2\n  * @author: typeR(zgrlbq@126.com)\n  * @update: 2017-7-21 16:21:02\n  */\n\n@font-face {\n    font-family: sourcesanspro;\n\tsrc: url(https://bubuzou.oss-cn-shenzhen.aliyuncs.com/blog/202010/sourcesanspro.woff2) format(\"woff2\"), \n\t\t url(https://bubuzou.oss-cn-shenzhen.aliyuncs.com/blog/202010/sourcesanspro.woff) format(\"woff\");\n    font-weight: 400;\n    font-style: normal;\n}\n:root {\n\t--theme-bg-color: #24292e;\n\t--theme-text-color: #FD7013;\n}\nhtml {\n    font-family: sans-serif;\n    -ms-text-size-adjust: 100%;\n    -webkit-text-size-adjust: 100%\n}\n\nbody { margin: 0; }\n\n.row {\n    position: relative;\n    width: 100%;\n    max-width: 1080px;\n    margin: 0 auto;\n}\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary { display: block; }\n\naudio,\ncanvas,\nprogress,\nvideo {\n    display: inline-block;\n    vertical-align: baseline\n}\n\naudio:not([controls]) {\n    display: none;\n    height: 0;\n}\n\n[hidden],\ntemplate {\n    display: none;\n}\n\na { background-color: transparent; }\n\na:active,\na:hover {\n    outline: 0;\n}\n\nabbr[title] { border-bottom: 1px dotted; }\n\nb,\nstrong { font-weight: bold; }\n\ndfn { font-style: italic; }\n\nh1 {\n    margin: 0.67em 0;\n    font-size: 2em;\n}\n\nmark {\n    background: #ff0;\n    color: #000;\n}\n\nsmall { font-size: 80%; }\n\nsub,\nsup {\n    position: relative;\n    font-size: 75%;\n    line-height: 0;\n    vertical-align: baseline;\n}\n\nsup { top: -0.5em; }\n\nsub { bottom: -0.25em; }\n\nimg { border: 0; }\n\nsvg:not(:root) { overflow: hidden; }\n\nfigure { margin: 1em 40px; }\n\nhr {\n    box-sizing: content-box;\n    height: 0;\n}\n\npre { overflow: auto; }\n\ncode,\nkbd,\npre,\nsamp {\n    font-family: monospace, monospace;\n    font-size: 1em;\n}\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n    margin: 0;\n    font: inherit;\n    color: inherit;\n}\n\nbutton { overflow: visible; }\n\nbutton,\nselect {\n    text-transform: none;\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n    -webkit-appearance: button;\n    cursor: pointer;\n}\n\nbutton[disabled],\nhtml input[disabled] {\n    cursor: default;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n    border: 0;\n    padding: 0;\n}\n\ninput { line-height: normal; }\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n    box-sizing: border-box;\n    padding: 0;\n}\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n    height: auto;\n}\n\ninput[type=\"search\"] {\n    -webkit-appearance: textfield;\n    box-sizing: content-box;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n    -webkit-appearance: none;\n}\n\nfieldset {\n    border: 1px solid #c0c0c0;\n    margin: 0 2px;\n    padding: 0.35em 0.625em 0.75em;\n}\n\nlegend {\n    border: 0;\n    padding: 0;\n}\n\ntextarea { overflow: auto; }\n\noptgroup { font-weight: bold; }\n\ntable {\n    border-collapse: collapse;\n    border-spacing: 0;\n}\n\ntd,\nth { padding: 0; }\n\n::-moz-selection {\n    color: #FFFFFF;\n    background-color: var(--theme-text-color);\n}\n\n::selection {\n    color: #FFFFFF;\n    background-color: var(--theme-text-color);\n}\n\nhtml,\nbody {\n    width: 100%;\n    height: 100%;\n}\n\nbody {\n    margin: 0;\n    font-family: sourcesanspro, \"Helvetica Neue\", Arial, sans-serif;\n    font-size: 16px;\n    line-height: 1.7;\n    background-color: #fff;\n    color: #333;\n}\n\nul.nav,ul.post-list {\n    margin: 0;\n    padding: 0;\n    list-style-type: none;\n}\n\nul {  margin: 1rem 0; }\n\nul li + li { margin-top: 4px; }\n\n.post-content ul { padding-left: 20px; }\n\n.post-content ol { padding-left: 15px; }\n\na,\na:active {\n    color: #2c3e50;\n    text-decoration: none;\n}\n\nhr { border: 0; }\n\ncode {\n    margin: 0 2px;\n    padding: 0px 5px;\n    color: #e96900;\n    border-radius: 2px;\n    white-space: inherit;\n    display: inline-block;\n}\n\niframe,\nvideo {\n    display: block;\n    max-width: 100%;\n    margin: 1rem auto;\n}\n\ntable {\n    width: 100%;\n    margin: 1em auto;\n}\n\ntable thead { background-color: #f6f8fa; }\n\ntable thead th {\n    min-width: 80px;\n    padding: 5px;\n}\n\ntable tbody tr:nth-child(2n) { background-color: #f6f8fa; }\n\ntable tbody td {\n    padding: 5px;\n    vertical-align: text-top;\n}\n\nheader {\n    background: #24292e;\n    position: fixed;\n    width: 100%;\n    top: 0;\n    z-index: 10;\n}\n.header {\n    height: 60px;\n    margin: 0 auto;\n}\nheader .logo-link { \n\tfloat: left;\n\tmargin-top: 9px;\n\ttransform: rotate(0deg);\n\ttransition: 0.6s ease-in-out;\n}\nheader .logo-link:hover {\n\ttransform: rotate(360deg);\n}\n\nheader .nav {\n    float: right;\n    left: 80px;\n    height: 25px;\n    padding-top: 12px;\n    padding-right: 50px;\n}\n\nheader .nav-btn {\n    display: none;\n}\n\nheader .logo-link img { \n\twidth: 42px;\n\tdisplay: block;\n}\n\nheader .nav-list-item {\n    display: inline-block;\n    padding: 0 15px;\n    overflow: hidden;\n    position: relative;\n}\n\nheader .nav-list-item a {\n    font-size: 16px;\n    font-weight: bold;\n    color: #fff;\n    display: block;\n    font-family: \"微软雅黑\";\n}\n\nheader .nav-list-item .active { opacity: 0.7; }\n\n.home.post-list { margin: 2em 0; }\n\n.post-list h2, \n.post-list h3, \n.post-list h4 { display: none; }\n\n.home.post-list .post-list-item {\n    padding: 1em 0 2em;\n    border-bottom: 1px solid #ddd;\n}\n\n.nav-list-item a {\n    position: relative;\n    display: inline-block;\n    -webkit-transition: -webkit-transform 0.3s;\n    -moz-transition: -moz-transform 0.3s;\n    transition: transform 0.3s;\n}\n\n.nav-list-item a::before {\n    content: attr(data-hover);\n    position: absolute;\n    top: 100%;\n    font-weight: 700;\n    -webkit-transform: translate3d(0, 0, 0);\n    -moz-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n}\n\n.nav-list-item a:hover {\n    webkit-transform: translateY(-100%);\n    -moz-transform: translateY(-100%);\n    transform: translateY(-100%);\n}\n\n.home.post-list .post-list-item:last-child { border-bottom: 0; }\n\n.home.post-list .post-content h2:before,\n.home.post-list .post-content h3:before,\n.home.post-list .post-content h4:before,\n.home.post-list .post-content h5:before,\n.home.post-list .post-content h6:before { content: \"\"; }\n\n.home.post-list .post-content > ul { list-style: initial; }\n\n.home.post-list .read-more { color: var(--theme-text-color); }\n\n.archive .archive-year { \n\tfont-family: Georgia, serif; \n\tcolor: #aaa;\n}\n\n.archive .post-item { padding: 2px 0 0 50px; }\n\n.archive .post-time,\n.archive .post-title-link { font-size: 1rem; }\n\n.archive .post-title-link {\n    display: block;\n    word-break: break-all;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    color: #333;\n}\n\n.archive .post-title-link:hover { color: var(--theme-text-color); }\n\n.archive .post-info {\n    float: left;\n    width: 75px;\n    font-family: Georgia, serif;\n    font-size: 16px;\n    color: #aaa;\n}\n\n.post { padding-top: 1em; }\n\n.post-block .post-title {\n    display: block;\n    margin: 0.65em 0;\n    font-size: 22px;\n}\n\n.post .post-block .post-title {\n    font-size: 22px;\n    color: var(--theme-text-color);\n}\n\n.post-block .post-title a { \n\tcolor: #333; \n\tposition: relative;\n}\n\n.post-block .post-title a:hover { \n\tcolor: var(--theme-text-color); \n\tanimation: slideBorder 0.3s ease-in;\n}\n.post-block .post-title a::after {\n\tcontent: '';\n    width: 0;\n    height: 0;\n    border-bottom: 2px solid #FD7013;\n    position: absolute;\n    left: 0;\n\tbottom: -2px;\n\ttransition: 0.3s ease-in-out;\n}\n.post-block .post-title a:hover::after {\n\twidth: 100%;\n}\n\n.post-block .post-info {\n    margin: 1.2em 0;\n    font-family: Georgia, serif;\n    font-size: 16px;\n    color: #999;\n}\n\n.post-block .post-info span { margin-left: 0.5rem; }\n\n.post-block .post-info a {\n    margin-right: 0.5rem;\n    padding: 3px 6px;\n    border-radius: 5px;\n    font-size: 12px;\n    color: #fff;\n}\n\n.post-block .post-info .visit {\n    display: inline-block;\n    margin: 0;\n    padding: 0 10px;\n}\n\n.post-block .post-info .visit i { font-style: normal; }\n\n.post-block .post-info .visit span {\n    margin: 0;\n    padding-left: 2px;\n    font-size: 12px;\n}\n\n.post-block .post-info .post-from { background-color: #E36B6B; }\n\n.post-block .post-info .post-demo { background-color: var(--theme-text-color); }\n\n.post-content h2,\n.post-content h3,\n.post-content h4,\n.post-content h5,\n.post-content h6 {\n    position: relative;\n    margin: 1em 0;\n    color: #4e4a4a;\n}\n\n.post-content h2 { font-size: 20px; }\n\n.post-content h3 { font-size: 18px; }\n\n.post-content h4 { font-size: 16px; }\n\n.post-content a {\n    word-break: break-all;\n    color: var(--theme-text-color);\n}\n\n.post-content .tip {\n    position: relative;\n    margin: 2em 0;\n    padding: 12px 24px 12px 30px;\n    border-left: 4px solid #f66;\n    border-top-right-radius: 2px;\n    border-bottom-right-radius: 2px;\n    background-color: #f6f8fa;\n}\n\n.post-content .tip:before {\n    content: \"!\";\n    position: absolute;\n    top: 14px;\n    left: -12px;\n    width: 20px;\n    height: 20px;\n    border-radius: 100%;\n    font-family: Dosis, \"Source Sans Pro\", \"Helvetica Neue\", Arial, sans-serif;\n    font-size: 14px;\n    line-height: 20px;\n    font-weight: bold;\n    text-align: center;\n    background-color: #f66;\n    color: #fff;\n}\n\n.post-content blockquote {\n    margin: 0;\n    padding: 8px 10px 8px 15px;\n    border-left: 6px solid var(--theme-text-color);\n    background-color: #f6f8fa;\n}\n\n.post-content blockquote p { margin: 0; }\n\n.post-content img { max-width: 100%; }\n\n.post-content .tip br { display: none; }\n\n#mask {\n    position: fixed;\n    z-index: 10;\n    width: 100%;\n    height: 100%;\n    padding: 1em 0;\n    overflow: scroll;\n    background-color: rgba(0, 0, 0, 0.5);\n}\n\n#mask #mask-image { max-width: 95%; }\n\ncode,\npre {\n\t/* font-family: \"Source Code Pro\", Monaco, Menlo, Consolas, monospace; */\n\tfont-family: Menlo, Monaco, Consolas, Courier New, monospace;\n    font-size: 0.9333em;\n    background-color: #f6f8fa;\n}\n\n.highlight {\n    position: relative;\n    margin: 1em 0;\n    overflow-x: auto;\n    border-radius: 2px;\n    line-height: 1.1em;\n    background-color: #f6f8fa;\n}\n\n.highlight table,\n.highlight tr,\n.highlight td {\n    width: 100%;\n    margin: 0;\n    padding: 0;\n    border-collapse: collapse;\n}\n\n.highlight .gutter { display: none; }\n\n.highlight .code pre {\n    margin: 0;\n    padding: 1.2em 1.4em;\n\t/* font-family: \"Source Code Pro\", Monaco, Menlo, Consolas, monospace; */\n\tfont-family: Menlo, Monaco, Consolas, Courier New, monospace;\n    font-size: 14px;\n    line-height: 1.5em;\n}\n\n.highlight.html .code:after,\n.highlight.js .code:after,\n.highlight.bash .code:after,\n.highlight.css .code:after,\n.highlight.scss .code:after,\n.highlight.diff .code:after,\n.highlight.java .code:after,\n.highlight.xml .code:after,\n.highlight.python .code:after,\n.highlight.json .code:after,\n.highlight.swift .code:after,\n.highlight.ruby .code:after,\n.highlight.perl .code:after,\n.highlight.php .code:after,\n.highlight.c .code:after,\n.highlight.cpp .code:after,\n.highlight.ts .code:after {\n    position: absolute;\n    top: 0;\n    right: 0;\n    height: 15px;\n    padding: 5px 10px 0;\n    font-size: 0.75em;\n    font-weight: 600;\n    line-height: 15px;\n    text-align: right;\n    color: #ccc;\n}\n\n.highlight.html .code:after { content: \"HTML\"; }\n\n.highlight.js .code:after { content: \"JS\"; }\n\n.highlight.bash .code:after { content: \"BASH\"; }\n\n.highlight.css .code:after { content: \"CSS\"; }\n\n.highlight.scss .code:after { content: \"SCSS\"; }\n\n.highlight.diff .code:after { content: \"DIFF\"; }\n\n.highlight.java .code:after { content: \"JAVA\"; }\n\n.highlight.xml .code:after { content: \"XML\"; }\n\n.highlight.python .code:after { content: \"PYTHON\"; }\n\n.highlight.json .code:after { content: \"JSON\"; }\n\n.highlight.swift .code:after { content: \"SWIFT\"; }\n\n.highlight.ruby .code:after { content: \"RUBY\"; }\n\n.highlight.perl .code:after { content: \"PERL\"; }\n\n.highlight.php .code:after { content: \"PHP\"; }\n\n.highlight.c .code:after { content: \"C\"; }\n\n.highlight.java .code:after { content: \"JAVA\"; }\n\n.highlight.cpp .code:after { content: \"CPP\"; }\n\n.highlight.ts .code:after { content: \"TS\"; }\n\n.highlight.cpp .code:after { content: 'C++'; }\n\npre { color: #777; }\n\npre .function .keyword,\npre .constant { color: #0092db; }\n\npre .keyword,\npre .attribute { color: #e96900; }\n\npre .number,\npre .literal { color: #ae81ff; }\n\npre .tag,\npre .tag .title,\npre .change,\npre .winutils,\npre .flow,\npre .lisp .title,\npre .clojure .built_in,\npre .nginx .title,\npre .tex .special { color: #2973b7; }\n\npre .symbol,\npre .symbol .string,\npre .value,pre .regexp { color: var(--theme-text-color); }\n\npre .title { color: #83B917; }\n\npre .tag .value,\npre .string,\npre .subst,\npre .haskell .type,\npre .preprocessor,\npre .ruby .class .parent,\npre .built_in,\npre .sql .aggregate,\npre .django .template_tag,\npre .django .variable,\npre .smalltalk .class,\npre .javadoc,\npre .django .filter .argument,\npre .smalltalk .localvars,\npre .smalltalk .array,\npre .attr_selector,\npre .pseudo,\npre .addition,\npre .stream,\npre .envvar,\npre .apache .tag,\npre .apache .cbracket,\npre .tex .command,\npre .prompt { color: var(--theme-text-color); }\n\npre .comment,\npre .java .annotation,\npre .python .decorator,\npre .template_comment,\npre .pi,\npre .doctype,\npre .shebang,\npre .apache .sqbracket,\npre .tex .formula { color: #b3b3b3; }\n\npre .deletion { color: #BA4545; }\n\npre .coffeescript .javascript,\npre .javascript .xml,\npre .tex .formula,\npre .xml .javascript,\npre .xml .vbscript,\npre .xml .css,\npre .xml .cdata { opacity: 0.5; }\n\n.paginator {\n    margin: 4em 0;\n    text-align: center;\n}\n\n.paginator .prev,\n.paginator .next {\n    display: inline-block;\n    margin: 0 4px;\n    padding: 4px 12px;\n    border-radius: 4px;\n    font-size: 13px;\n    color: #fff;\n    background-color: var(--theme-text-color);\n}\n\n.ds-thread,\n#disqus_thread { margin-bottom: 2em; }\n\nsection.container {\n    max-width: 780px;\n    padding-top: 70px;\n}\n\nfooter { padding-bottom: 1px; }\n\nfooter .copyright {\n    margin: 30px 0;\n    padding-top: 10px;\n    border-top: 1px solid #ddd;\n    text-align: center;\n    font-family: sourcesanspro, \"Helvetica Neue\", Arial, sans-serif;\n}\n\nfooter .copyright p {\n    margin: 0;\n    font-size: 14px;\n    font-weight: 100;\n    color: #aaa;\n}\n\nfooter .copyright a { color: #aaa; }\n\nfooter .copyright a:hover { color: #666; }\n\n.footer-con { width: 700px; }\n\n.totop {\n    position: fixed;\n    z-index: 999;\n    bottom: 145px;\n    display: none;\n    margin-left: 800px;\n\tcursor: pointer;\n\twidth: 18px;\n\theight: 18px;\n\tpadding: 5px;\n    border-radius: 4px;\n\ttransition: all 0.1s;\n}\n\n.totop i {\n\tdisplay: block;\n    border-left: 9px solid transparent;\n    border-right: 9px solid transparent;\n    border-width: 9px;\n    border-bottom: 9px solid var(--theme-text-color);\n    position: absolute;\n    top: 8px;\n\tleft: 5px;\n\ttransition: all 0.1s;\n}\n.totop::before {\n    content: \"\";\n    width: 18px;\n    height: 2px;\n    background-color: var(--theme-text-color);\n    display: block;\n    transition: all 0.1s;\n    position: absolute;\n    top: 5px;\n    left: 5px;\n}\n.totop::after {\n    content: \"\";\n    display: block;\n    width: 6px;\n    height: 6px;\n    background-color: var(--theme-text-color);\n    position: absolute;\n    left: 11px;\n\ttop: 17px;\n\ttransition: all 0.1s;\n}\n\n.totop:hover {\n\tbackground-color: var(--theme-text-color);\n}\n.totop:hover::before {\n\tbackground-color: #fff;\n}\n.totop:hover i {\n\tborder-bottom-color: #fff;\n}\n.totop:hover::after {\n\tbackground-color: #fff;\n}\n\n.tags {\n    position: fixed;\n    width: 230px;\n    top: 200px;\n}\n\n.tags a {\n    display: inline-block;\n    height: 28px;\n    margin: 0 5px 8px 0;\n    padding: 0 12px;\n    font-family: \"Source Code Pro\", Monaco, Menlo, Consolas, monospace;\n    line-height: 28px;\n    border-radius: 20px;\n    background: #f6f8fa;\n    transition: color  0.1s, background-color 0.1s;\n}\n\n.tags a:hover {\n    background: var(--theme-text-color);\n    color: #fff;\n}\n\n.search {\n    position: absolute;\n    right: 0;\n    top: 15px;\n}\n\n.search a {\n    display: block;\n    width: 30px;\n    height: 30px;\n    background: url(https://bubuzou.oss-cn-shenzhen.aliyuncs.com/blog/202010/search_white.png) no-repeat center center;\n    background-size: 20px;\n}\n\n/* model */\n\n.modal {\n    box-shadow: 0 16px 28px 0 rgba(0, 0, 0, 0.22), \n                0 25px 55px 0 rgba(0, 0, 0, 0.21);\n}\n\n.modal {\n    position: fixed;\n    left: 0;\n    right: 0;\n    width: 55%;\n    margin: auto;\n    padding: 0;\n    max-height: 70%;\n    overflow: hidden;\n    border-radius: 2px;\n    background-color: #fafafa;\n    will-change: top, opacity;\n}\n\n.search-modal {\n    z-index: 1003;\n    top: 10%;\n    visibility: hidden;\n    max-height: 80%;\n    max-width: 800px;\n    padding: 30px 20px;\n    opacity: 0;\n    -webkit-backface-visibility: hidden;\n    -moz-backface-visibility: hidden;\n    backface-visibility: hidden;\n    -moz-transform: scale(0.7)\n    -ms-transform: scale(0.7);\n    -webkit-transform: scale(0.7);\n    transform: scale(0.7);\n    -moz-transition: all 0.3s;\n    -ms-transition: all 0.3s;\n    -webkit-transition: all 0.3s;\n    transition: all 0.3s;\n}\n\n.search-on .search-modal {\n    visibility: visible;\n    opacity: 1;\n    -moz-transform: scale(1)\n    -ms-transform: scale(1);\n    -webkit-transform: scale(1);\n    transform: scale(1);\n}\n\n.search-modal .search-result li {\n    list-style-type: none;\n    word-break: break-word;\n}\n\n.blog-overlay {\n    position: fixed;\n    z-index: 999;\n    top: -100px;\n    left: 0;\n    bottom: 0;\n    right: 0;\n    display: none;\n    width: 100%;\n    height: 125%;\n    background: #000;\n    will-change: opacity;\n    opacity: 0.5;\n}\n.search-on .blog-overlay { display: block; }\n\n.search-modal .search-result {\n    max-height: 600px;\n    margin-right: 10px;\n    padding: 10px 15px 10px 25px;\n    overflow-y: auto;\n}\n\n.search-result-list {\n    margin: 0;\n    padding: 0;\n}\n\n.search-result-list a {\n    position: relative;\n    color: var(--theme-text-color);\n}\n\n.search-result li a:before {\n    content: \" \";\n    position: absolute;\n    left: -12px;\n    top: 6px;\n    display: block;\n    width: 6px;\n    height: 6px;\n    border-radius: 6px;\n    background: var(--theme-text-color);\n}\n\n.search-result-list .search-keyword { background-color: var(--theme-text-color); }\n\n.search-modal .input-field {\n    position: relative;\n    margin-top: 1rem;\n    padding: 0 12px;\n}\n\n.input-field input {\n    width: 100%;\n    height: 3rem;\n    margin: 0 0 15px 0;\n    padding: 0;\n    border: none;\n    border-bottom: 1px solid #9e9e9e;\n    border-radius: 0;\n    font-size: 15px;\n    background-color: transparent;\n    outline: none;\n    color: #666;\n    box-shadow: none;\n    box-sizing: content-box;\n    transition: all 0.3s;\n}\n\n.input-field label {\n    position: absolute;\n    top: 0.8rem;\n    left: 0.75rem;\n    font-size: 1rem;\n    color: #9e9e9e;\n    cursor: text;\n    transition: .2s ease-out;\n}\n\n.input-field.active label {\n    font-size: 0.8rem;\n    -webkit-transform: translateY(-140%);\n    transform: translateY(-140%);\n}\n\n.widget { margin-bottom: 30px; }\n\n.widget h4 {\n    color: var(--theme-text-color);\n    margin: 10px 0;\n    font-family: '微软雅黑';\n}\n\n.widget a { color: #333; }\n\n.widget a:hover { color: var(--theme-text-color); } \n\n.widget .category-list-count {\n    padding-left: 3px;\n    font-family: Georgia, serif;\n    font-size: 14px;\n    color: #999;   \n}\n\n.widget .category-list-count:before { content: \"(\"; }\n\n.widget .category-list-count:after { content: \")\"; }\n\n.tagcloud a {\n    padding-right: 4px;\n    white-space: nowrap;\n}\n\n.recent .post-list li {\n    height: 28px;\n    line-height: 28px;\n    overflow: hidden;\n}\n\n.category-list {\n    margin: 0;\n    padding: 0;\n}\n\n.category-list-item { list-style-type: none; }\n\n.right-menu { display: none; }\n\n.copyright br { display: none; }\n\n/* 文章目录 */\n\n.right-container {\n    position: fixed;\n    z-index: 10;\n    width: 230px;\n    top: 90px;\n    left: 50%;\n    margin-left: 310px;\n}\n\n.arCatalog {\n    position: relative;\n    margin: 20px 0 0 0;\n}\n\n.arCatalog .arCatalog-line {\n    position: absolute;\n    left: 7px;\n    top: -5px;\n    width: 0;\n    border: 1px solid #eaeaea;\n    border-top: 0;\n    border-bottom: 0;\n    background-color: #eaeaea;\n}\n\n.arCatalog .arCatalog-line:before {\n    content: \"\";\n    position: absolute;\n    top: -10px;\n    left: -5px;\n    display: block;\n    width: 8px;\n    height: 8px;\n    border: 1px solid #d2d2d2;\n    border-radius: 10px;\n}\n\n.arCatalog .arCatalog-line:after {\n    content: \"\";\n    position: absolute;\n    bottom: -10px;\n    left: -5px;\n    display: block;\n    width: 8px;\n    height: 8px;\n    border: 1px solid #d2d2d2;\n    border-radius: 10px;\n}\n\n.arCatalog .arCatalog-body {\n    margin-left: -2px;\n    padding-left: 27px;\n    overflow: hidden;\n}\n\n.arCatalog .arCatalog-body dl { \n\tmargin: 0; \n\ttransition: 0.3s all;\n}\n\n.arCatalog-body::-webkit-scrollbar { display: none; }\n\n.arCatalog .arCatalog-body dd {\n    position: relative;\n    margin: 0;\n    font-size: 15px;\n    line-height: 28px;\n}\n\n.arCatalog-body .arCatalog-tack1 a {\n    display: block;\n    max-width: 170px;\n    padding-left: 28px;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n}\n\n.arCatalog-body dd.on a { color: var(--theme-text-color); }\n\n.arCatalog-body .arCatalog-tack1 .arCatalog-index {\n    position: absolute;\n    left: 2px;\n    top: 0;\n    color: #bbb;\n}\n\n.arCatalog-body .arCatalog-tack1 .arCatalog-dot {\n\tposition: absolute;\n    left: -22px;\n    top: 11px;\n    width: 8px;\n    height: 8px;\n    background-color: #eaeaea;\n    border: 1px solid #fff;\n    border-radius: 2em;\n}\n\n.arCatalog-body dd.on .arCatalog-dot {\n\tposition: absolute;\n    left: -23px;\n    top: 8px;\n    width: 12px;\n    height: 12px;\n    background-color: #fd7013;\n    box-shadow: 0px 0px 2px 2px rgba(253, 112, 19, 0.5);\n    border-radius: 2em;\n    border-width: 0;\n}\n\n.arCatalog-body .arCatalog-tack2 { padding-left: 17px; }\n\n.arCatalog-body .arCatalog-tack2 a {\n    display: block;\n    padding-left: 48px;\n    max-width: 150px;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n}\n\n.arCatalog-body .arCatalog-tack2 .arCatalog-index {\n    position: absolute;\n    left: 27px;\n    top: 0;\n    color: #bbb;\n}\n\n.arCatalog-body .arCatalog-tack3 { padding-left: 66px; }\n\n.article-box .tag {\n    margin: 15px 0 10px;\n    font-size: 12px;\n    color: #999;\n}\n\n.article-box .tag span {\n    margin: 0px 8px 0 2px;\n    padding: 3px 8px;\n    border-radius: 3px;\n    color: #666;\n    background-color: #e7e7e7;\n}\n\n/* pad端 */\n\n@media screen and (max-width: 768px) {\n\n    header .logo-link {\n        padding-left: 20px;\n    }\n\n    .nav-list-item a:hover {\n        webkit-transform: translateY(0);\n        -moz-transform: translateY(0);\n        transform: translateY(0);\n    }\n\n    .search { right: 20px; }\n\n    section.container {\n        max-width: 510px;\n        margin: 70px 0 0;\n        padding: 0 20px;\n    }\n\n    .right-container {\n        left: 50%;\n        width: 180px;\n        margin-left: 180px;\n    }\n\n    .footer-con {\n        width: 510px;\n        margin-left: 20px;\n    }\n\n    .home.post-list .post-list-item {\n        padding: 20px 0;\n        border-bottom: 1px solid #ddd;\n    }\n\n    .post-block .post-title { margin: 0; }\n\n    .post-block .post-info { margin: 10px 0; }\n\n    .totop { margin-left: 530px; }\n}\n\n/* phone端 */\n\n@media screen and (max-width: 640px) {\n    .header { \n        padding: 0;\n        height: 50px;\n    }\n\n    header .logo-link { \n        margin-left: 10px;\n\t\tpadding: 0;\n    }\n\n    header .logo-link img {\n        width: 32px;\n    }\n\n    header .nav-btn {\n        display: block;\n        position: absolute;\n        right: 10px;\n        top: 16px;\n    }\n\n    header .nav-btn span {\n        display: block;\n        width: 22px;\n        height: 3px;\n        background-color: #fff;\n    }\n\n    header .nav-btn span + span {\n        margin-top: 5px;\n    }\n\n    .home.post-list { margin: 0; }\n\n    .search { \n        right: 45px;\n        top: 10px;\n    }\n\n    .search a {\n        background-size: 24px;\n    }\n\n    header .nav {\n        display: none;\n        position: absolute;\n        top: 50px;\n        left: 0;\n        width: 100%;\n        height: auto;\n        padding: 10px 0;    \n        border-bottom: 1px solid #ddd;\n        background-color: #fff;\n    }\n\n    header .nav-list-item {\n        padding: 0;\n        text-align: left;\n        display: block;\n    }\n\n    header .nav-list-item a { \n        color: var(--theme-text-color);\n        padding: 3px 20px;\n    }\n\n    .footer-con {\n        width: 100%;\n        margin: 0;\n    }\n\n    .search-modal {\n        padding: 0;\n        width: 90%;\n    }\n\n    .search-modal .input-field {\n        position: relative;\n        margin-top: 1rem;\n        padding: 0 10px;\n    }\n\n    .input-field.active label {\n        font-size: 0.8rem;\n        -webkit-transform: translateY(-100%);\n        transform: translateY(-100%);\n    }\n\n    .search-modal .search-result {\n        max-height: 500px;\n        padding: 0 10px;\n        overflow-y: auto;\n    }\n\n    .search-result-list { margin: 0; }\n\n    .search-modal .search-result li { padding-left: 12px; }\n\n    .input-field input { padding-top: 5px; }\n\n    .scroll-con { padding-top: 50px; }\n\n    .scroll-con .container {\n        margin: 0;\n        padding: 0 12px;\n    }\n\n    .totop {\n        right: 10px;\n        bottom: 62px;\n        margin-left: 0;\n    }\n\n    .right-container {\n        top: 60px;\n        left: auto;\n        right: 0;\n        z-index: 1003;\n        width: 70%;\n        margin: 0;\n        padding: 0 10px 10px 10px;\n        border: 1px solid #ddd;\n        background-color: #fff;\n        box-shadow: 0 16px 28px 0 rgba(0, 0, 0, 0.22), 0 25px 55px 0 rgba(0, 0, 0, 0.21);\n        transition: 0.25s transform;\n        -moz-transition: 0.25s -moz-transform;\n        -webkit-transition: 0.25s -webkit-transform;\n        -o-transition: 0.25s -o-transform;\n        transform: translateX(110%);\n        -moz-transform: translateX(110%);\n        -webkit-transform: translateX(110%);\n        -o-transform: translateX(110%);\n    }\n\n    .home.post-list .post-list-item { padding: 10px 0; }\n\n    .right-on .right-container {\n        transform: translateX(0);\n        -moz-transform: translateX(0);\n        -webkit-transform: translateX(0);\n        -o-transform: translateX(0);\n    }\n\n    .right-on .blog-overlay { display: block; }\n\n    .widget { margin: 0; }\n\n    .right-menu {\n        display: none;\n        position: fixed;\n        top: 50%;\n        right: 8px;\n        z-index: 999;\n        width: 15px;\n        height: 32px;\n        margin-top: 37px;\n        background: url(https://bubuzou.oss-cn-shenzhen.aliyuncs.com/blog/202010/right-menu.png) no-repeat center center;\n    }\n\n    .archive { padding: 1px 0 20px; }\n\n    .archive .post-item { padding: 0; }\n\n    .archive .archive-year {\n        font-size: 16px;\n        margin: 10px 0;\n    }\n\n    .archive .post-info {\n        width: 54px;\n        overflow: hidden;\n        height: 24px;\n    }\n\n    .paginator { margin: 0; }\n\n    .paginator .prev, .paginator .next { margin: 15px 4px; }\n\n    .highlight .code pre { padding: 0.6em 0.7em; }\n\n    footer div.copyright {\n        margin: 0;\n        padding: 10px 0;\n    }\n\n    .copyright br { display: block; }\n\n    footer .copyright p { margin: 0; }\n\n    .post-content ul { padding-left: 20px; }\n\n    .post-content ol { padding-left: 15px; }\n}\n\n@media screen and (max-width: 400px) {\n    .search-modal .search-result { max-height: 450px; }\n}\n\n@media screen and (max-width: 350px) {\n    .search-modal .search-result { max-height: 370px; }\n}"
  },
  {
    "path": "source/scripts/articleCatalog.js",
    "content": "/*\n * articleCatalog v2.0\n * Copyright(c) 2016 by bulandent\n * Date: 2017-5-27 16:10:41\n * Updated: 2020-10-10 17:40:04\n**/\n;\nlet articleCatalog = (function() {\n    if ( !document.getElementById('postAr') || document.querySelectorAll('.headerlink').length === 0 || window.innerWidth < 900 ) {\n        return function(){};\n\t}\n\tlet DEFAULT = {\n\t\tlineHeight: 28,           // 每个菜单的行高是 28\n\t\tmoreHeight: 10,           // 菜单左侧的线比菜单多出的高度\n\t\tsurplusHeight: 180,       // 除了菜单高度+留白高度\n\t\tdelay: 200,               // 防抖的延迟时间\n\t\tduration: 200,            // 滚动的动画持续时间\n\t\ttoTopDistance: 80,        // 距离视口顶部多少高度之内时候触发高亮\n\t\tselector: '.headerlink',  // 文章内容中标题标签的 selector\n\t}\n    return function(args) {\n\t\tDEFAULT = Object.assign(DEFAULT, args)\n\n\t\tlet arContentAnchor = document.querySelectorAll(DEFAULT.selector),\n\t\t\tcatalogLength = arContentAnchor.length,\n\t\t\tmaxCatalogCount = 0,          // 视口内能容纳的最大目录个数\n\t\t\tviewPortHeight = 0,           // 当前视口的高度\n\t\t\tmarginTop = 0,                // 菜单的初始滚动距离\n\t\t\tdefaultDirec = 'bottom',      // 默认滚动方向\n\t\t\tlastSH = 0,                   // 获取页面初始滚动距离\n\t\t\tlastOnIndex = 0,              // 上次高亮的目录索引\n\t\t\tcatalogBody = [],             // .arCatalog-body\n\t\t\tcatalogDl = null,             // .arCatalog-body dl\n\t\t\tcatalogDd = [],\t\t\t      // .arCatalog-body dd\n\t\t\tinitBodyTop = 0,              // 目录可视区域的 top\n\t\t\tinitDlBottom = 0,             // 目录 dl 的 bottom\n\t\t\tfirstDdTop = 0,               // 第一个 dd 的 top\n\t\t\tbodyMidBottom = 0,            // 目录可视区域的中间位置的 dd 的 bottom\n\t\t\tbodyBCR = null,\t              // 目录可视区域的边界值\n\t\t\thasStopSetHighlight = false;  // 在点击目录子项的时候直接高亮当前目录，而不通过 scroll 事件触发 setHighlight 函数\n\n\t\tinitCatalog()\n\n        window.addEventListener('scroll', function() {\n\t\t\tdebounce(setHighlight, DEFAULT.delay)()\n\t\t\tdebounce(resetStatus, DEFAULT.delay)()\n\t\t}, false)\n\n\t\tif (catalogLength > maxCatalogCount) {\n\t\t\twindow.addEventListener('scroll', function() {\n\t\t\t\tdebounce(scrollCatalog, DEFAULT.delay)()\n\t\t\t}, false)\n\t\t}\n\t\t\n\t\twindow.addEventListener('resize', function(e) {\n\t\t\tdebounce(initCatalog, DEFAULT.delay)()\n\t\t}, false)\n\n\t\t// 初始化\n\t\tfunction initCatalog() {\n\t\t\tlet tempHeight = window.innerHeight\n\t\t\t\n\t\t\tif (viewPortHeight !== tempHeight) {\n\t\t\t\tviewPortHeight = tempHeight\n\t\t\t\tmaxCatalogCount = Math.floor((viewPortHeight - DEFAULT.surplusHeight) / DEFAULT.lineHeight)\n\n\t\t\t\tgenerateCatalog()\n\n\t\t\t\tcatalogLength = arContentAnchor.length\n\t\t\t\tlastSH = window.pageYOffset\n\t\t\t\tcatalogBody = document.querySelector('.arCatalog-body')\n\t\t\t\tcatalogDl = document.querySelector('.arCatalog dl')\n\t\t\t\tcatalogDd = document.querySelectorAll('.arCatalog dd')\n\t\t\t\tbodyBCR = catalogBody.getBoundingClientRect()\n\t\t\t\tinitBodyTop = bodyBCR.top\n\t\t\t\tinitDlBottom = initDlBottom || catalogDl.getBoundingClientRect().bottom\n\t\t\t\tfirstDdTop = firstDdTop || catalogDd[0].getBoundingClientRect().top,\n\t\t\t\tbodyMidBottom = initBodyTop + Math.ceil((maxCatalogCount / 2 )) * DEFAULT.lineHeight\n\t\t\t\t\n\t\t\t\t// 给目录子项绑定事件\n\t\t\t\tcatalogDd.forEach((curr, index) => {\n\t\t\t\t\tcurr.addEventListener('click', function(e) {\n\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\thasStopSetHighlight = true\n\t\t\t\t\t\tdocument.querySelector('.arCatalog .on').classList.remove('on')\n\t\t\t\t\t\tcatalogDd[index].classList.add('on')\n\t\t\t\t\t\tlastOnIndex = index\n\t\t\t\t\t\tlet currTop = arContentAnchor[index].getBoundingClientRect().top\n\t\t\t\t\t\tscrollToDest(currTop + window.pageYOffset - DEFAULT.toTopDistance)\n\t\t\t\t\t}, false)\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// 防抖：触发高频事件 n 秒后只会执行一次，如果 n 秒内事件再次触发，则会重新计时。\n\t\tfunction debounce(fn, delay = 200) {\n\t\t\treturn function(args) {\n\t\t\t\tconst _this = this\n\t\t\t\tclearTimeout(fn.id)\n\t\t\t\tfn.id = setTimeout(function() {\n\t\t\t\t\tfn.apply(_this, args)\n\t\t\t\t}, delay)\n\t\t\t}\n\t\t}\n\n\t\t// 生成目录\n\t\tfunction generateCatalog(){\n\t\t\tlet catalogHeight = arContentAnchor.length > maxCatalogCount ? maxCatalogCount * DEFAULT.lineHeight : arContentAnchor.length * DEFAULT.lineHeight;\n\t\t\tlet retStr = `\n\t\t\t\t\t\t<div class=\"arCatalog\">\n\t\t\t\t\t\t\t<div class=\"arCatalog-line\" style=\"height: ${catalogHeight + DEFAULT.moreHeight}px\"></div>\n\t\t\t\t\t\t\t<div class=\"arCatalog-body\" style=\"max-height: ${catalogHeight}px; height: ${catalogHeight}px\">\n\t\t\t\t\t\t\t\t<dl style=\"margin-top: ${marginTop}px\">`\n\t\t\tlet h2Index = 0,\n\t\t\t\th3Index = 1,\n\t\t\t\tacIndex = '',\n\t\t\t\ttagName = '',\n\t\t\t\tindex = 0;\n\t\t\t\n\t\t\tfor (let currNode of arContentAnchor) {\n\t\t\t\ttagName = currNode.parentElement.tagName\n\t\t\t\tif ( tagName === 'H2') {\n\t\t\t\t\tacIndex = ++h2Index\n\t\t\t\t\th3Index = 1\n\t\t\t\t\tclassName = 'arCatalog-tack1'\n\t\t\t\t} else if (tagName === 'H3') {\n\t\t\t\t\tacIndex = `${h2Index}.${h3Index++}`\n\t\t\t\t\tclassName = 'arCatalog-tack2'\n\t\t\t\t} else {\n\t\t\t\t\tacIndex = ''\n\t\t\t\t\tclassName = 'arCatalog-tack3'\n\t\t\t\t}\n\t\t\t\tretStr += `\n\t\t\t\t\t\t<dd class=\"${className} ${index++ === lastOnIndex ? 'on' : ''}\">\n\t\t\t\t\t\t\t<span class=\"arCatalog-index\">${acIndex}</span>\n\t\t\t\t\t\t\t<a href=\"#\">${currNode.title}</a>\n\t\t\t\t\t\t\t<span class=\"arCatalog-dot\"></span>\n\t\t\t\t\t\t</dd>`\n\t\t\t};\n\t\t\tretStr += `</dl></div></div>`\n\n\t\t\tdocument.getElementById('arAnchorBar').innerHTML = retStr\n\t\t}\n\n        // 自动滚动目录树，使得当前高亮目录在可视范围内\n        function scrollCatalog() {\n            let currentCatalog = document.querySelector('.arCatalog .on');\n\n\t\t\tlet curr = currentCatalog.getBoundingClientRect(),\n\t\t\t\tlist = catalogDl.getBoundingClientRect();\n\n\t\t\tif (defaultDirec === 'bottom') {  // 向下滚动\n\t\t\t\tif (curr.bottom + (maxCatalogCount / 2) * DEFAULT.lineHeight <= bodyBCR.bottom) {  // 上半部分\n\t\t\t\t\t// 不滚动\n\t\t\t\t} else if (curr.bottom - bodyMidBottom < list.bottom - bodyBCR.bottom) {  // 中位以下\n\t\t\t\t\tmarginTop += -Math.floor((curr.bottom - bodyMidBottom ) / DEFAULT.lineHeight) * DEFAULT.lineHeight\n\t\t\t\t} else if (bodyBCR.bottom <= list.bottom) {  // 当剩余滚动距离\n\t\t\t\t\tmarginTop = bodyBCR.bottom - initDlBottom\n\t\t\t\t}\n\t\t\t} else {  // 向上滚动\n\t\t\t\tif (bodyBCR.top + (maxCatalogCount / 2) * DEFAULT.lineHeight <= curr.top) {\n\t\t\t\t\t// 不滚动\n\t\t\t\t} else if (bodyMidBottom - curr.top < bodyBCR.top - list.top) {\n\t\t\t\t\tmarginTop += Math.floor((bodyMidBottom - curr.top) / DEFAULT.lineHeight) * DEFAULT.lineHeight\n\t\t\t\t} else if (list.top <= bodyBCR.top) {\n\t\t\t\t\tmarginTop = 0\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatalogDl.style.marginTop = marginTop + 'px'\n        }\n        \n\t\t// 动画实现滚动到目标位置\n\t\tfunction scrollToDest(destScrollTop) {\n\t\t\tlet startTime;   \n\t\t\tlet currScrollTop = window.pageYOffset;\n\t\t\tfunction step(timestamp) {\n\t\t\t\tif (!startTime) {\n\t\t\t\t\tstartTime = timestamp\n\t\t\t\t}\n\t\t\t\tconst elapsed = Math.round(timestamp - startTime)\n\t\t\t\tconst distance = elapsed * ((Math.floor(destScrollTop) - currScrollTop) / DEFAULT.duration) + currScrollTop\n\n\t\t\t\tdocument.documentElement.scrollTop = document.body.scrollTop = distance\n\t\t\t  \n\t\t\t\tif (elapsed < DEFAULT.duration) {\n\t\t\t\t  \twindow.requestAnimationFrame(step)\n\t\t\t\t}\n\t\t\t}\n\t\t\twindow.requestAnimationFrame(step)\n\t\t}\n\n        // 高亮当前目录s\n        function setHighlight(){\n\t\t\tdefaultDirec = getScrollDirection()\n\n\t\t\tif (hasStopSetHighlight) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tlet {\n\t\t\t\tscrollTop,\n\t\t\t} = document.scrollingElement;\n\t\t\t\n\t\t\tlet curr = document.querySelector('.arCatalog .on')\n\n\t\t\tlet onIndex = [].indexOf.call(catalogDd, curr),  // 当前高亮索引\n\t\t\t\tnextOnIndex = onIndex;  // 滚动后高亮索引\n\t\t\tcurr.classList.remove('on')\n\n\t\t\tlet scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight\n\t\t\tif (arContentAnchor[catalogLength - 1].getBoundingClientRect().top <= DEFAULT.toTopDistance || \n\t\t\t\twindow.innerHeight + window.pageYOffset === scrollHeight) {  // 尾部\n\t\t\t\tlastOnIndex = catalogLength - 1\n\t\t\t\tcatalogDd[lastOnIndex].classList.add('on')\n\t\t\t} else if (scrollTop <= firstDdTop) {  // 顶部\n\t\t\t\tcatalogDd[0].classList.add('on')\n\t\t\t\tlastOnIndex = 0\n\t\t\t} else {  // 中间：使用缓存，直接从上一次索引（onIndex）位置开始查找\n\t\t\t\tif (defaultDirec === 'bottom') {\n\t\t\t\t\twhile (nextOnIndex < catalogLength) {\n\t\t\t\t\t\tlet currTop = arContentAnchor[nextOnIndex].getBoundingClientRect().top\n\t\t\t\t\t\tif ( currTop > DEFAULT.toTopDistance && nextOnIndex > 0){\n\t\t\t\t\t\t\tnextOnIndex--\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnextOnIndex++\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\twhile (nextOnIndex >= 0) {\n\t\t\t\t\t\tlet currTop = arContentAnchor[nextOnIndex].getBoundingClientRect().top\n\t\t\t\t\t\tif ( currTop <= DEFAULT.toTopDistance){\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnextOnIndex--\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnextOnIndex = nextOnIndex === catalogLength ? nextOnIndex - 1 : nextOnIndex < 0 ? 0 : nextOnIndex \n\t\t\t\tlastOnIndex = nextOnIndex\n\t\t\t\tcatalogDd[nextOnIndex].classList.add('on')\n\t\t\t}\n        }\n\n\t\t// 获取最近一次页面的滚动方向\n\t\tfunction getScrollDirection() {\n\t\t\tlet sh = window.pageYOffset, ret = 'bottom'\n\t\t\tif (sh < lastSH) {\n\t\t\t\tret = 'top'\n\t\t\t}\n\t\t\tlastSH = sh\n\t\t\treturn ret\n\t\t}\n\n\t\tfunction resetStatus() {\n\t\t\tif (hasStopSetHighlight) {\n\t\t\t\thasStopSetHighlight = false\n\t\t\t}\n\t\t}\n    }\n}());"
  },
  {
    "path": "source/scripts/main.js",
    "content": "/*\n * main\n * Copyright(c) 2016 by brandon\n * Date: 2016-07-21\n */\n \n(function($) {\n\t// 回到顶部按钮\n    $('.scroll-con, window').scroll(function () {\n        var sH = $('.scroll-con').scrollTop() + $('window').scrollTop();;\n        if( sH >= 300 ) {\n            $('.totop').fadeIn(\"slow\");\n        } else {\n           $('.totop').fadeOut(\"slow\");\n        }\n    });\n\t$(window).scroll(function () {\n        var sH = $(window).scrollTop() + $('.scroll-con').scrollTop();\n\t\tif( sH >= 300 ) {\n\t\t\t$('.totop').fadeIn(\"slow\");\n\t\t} else {\n\t\t   $('.totop').fadeOut(\"slow\");\n\t\t}\n\t});\n\t// 回到顶部\n\t$('.totop').on('click', function() {\n\t\t$('html,body').animate({ scrollTop : 0 }, 200 );\n        $('.scroll-con').animate({ scrollTop : 0 }, 200 );\n\t});\n\n    // 文章目录\n    articleCatalog();\n\n    // phone端，右侧导航\n    // $('.right-menu').on('click', function() {\n    //     $('body').addClass('right-on');\n    // });\n\n    // phone端，右侧导航\n    $('#nav_btn').on('click', function(e) {\n        e.preventDefault();\n        $('#nav_list').slideToggle(300);\n    });\n\n\t$('#search_btn').on('click', function(e) {\n\t\te.preventDefault();\n\t\t$('body').addClass('search-on');\n        $('.input-field').addClass('active');\n        $('#search_input').focus();\n\t});\n\t$('#search_input').blur(function() {\n\t\tif ( $('#search_input').val() === '' ) {\n\t\t\t$('.input-field').removeClass('active');\n\t\t}\n\t});\n\t$('.blog-overlay').on('click', function() {\n\t\t$('#search_input').val('');\n\t\t$('body').removeClass('search-on').removeClass('right-on');\n\t});\n\tvar searchXml = \"search.xml\";\n    if (searchXml.length == 0) {\n     \tsearchXml = \"search.xml\";\n    }\n    var searchPath = \"/\" + searchXml;\n    initSearch(searchPath, 'search_input', 'search_result');\n\n    // 初始化搜索与匹配函数\n    function initSearch(path, search_id, content_id) {\n        'use strict';\n        $.ajax({\n            url: path,\n            dataType: \"xml\",\n            success: function(xmlResponse) {\n                // get the contents from search data\n                var datas = $(\"entry\", xmlResponse).map(function() {\n                    return {\n                        title: $(\"title\", this).text(),\n                        content: $(\"content\", this).text(),\n                        url: $(\"url\", this).text()\n                    };\n                }).get();\n                var $input = document.getElementById(search_id);\n                var $resultContent = document.getElementById(content_id);\n                $input.addEventListener('input', function() {\n                    var str = '<ul class=\\\"search-result-list\\\">';\n                    var keywords = this.value.trim().toLowerCase().split(/[\\s\\-]+/);\n                    $resultContent.innerHTML = \"\";\n                    if (this.value.trim().length <= 0) {\n                        return;\n                    }\n                    // perform local searching\n                    datas.forEach(function(data) {\n                        var isMatch = true;\n                        var content_index = [];\n                        var data_title = data.title.trim().toLowerCase();\n                        var data_content = data.content.trim().replace(/<[^>]+>/g, \"\").toLowerCase();\n                        var data_url = data.url;\n                        var index_title = -1;\n                        var index_content = -1;\n                        var first_occur = -1;\n                        // only match artiles with not empty titles and contents\n                        if (data_title != '' && data_content != '') {\n                            keywords.forEach(function(keyword, i) {\n                                index_title = data_title.indexOf(keyword);\n                                index_content = data_content.indexOf(keyword);\n                                if (index_title < 0 && index_content < 0) {\n                                    isMatch = false;\n                                } else {\n                                    if (index_content < 0) {\n                                        index_content = 0;\n                                    }\n                                    if (i == 0) {\n                                        first_occur = index_content;\n                                    }\n                                }\n                            });\n                        }\n                        // show search results\n                        if (isMatch) {\n                            keywords.forEach(function(keyword) {\n                                var regS = new RegExp(keyword, \"gi\");\n                                data_title = data_title.replace(regS, \"<span class=\\\"search-keyword green lighten-2\\\">\" + keyword + \"</span>\");\n                            });\n\n                            str += \"<li><a href='\" + data_url + \"' class='search-result-title'>\" + data_title + \"</a>\";\n                            var content = data.content.trim().replace(/<[^>]+>/g, \"\");\n                            if (first_occur >= 0) {\n                                // cut out 100 characters\n                                var start = first_occur - 20;\n                                var end = first_occur + 80;\n                                if (start < 0) {\n                                    start = 0;\n                                }\n                                if (start == 0) {\n                                    end = 100;\n                                }\n                                if (end > content.length) {\n                                    end = content.length;\n                                }\n                                var match_content = content.substring(start, end);\n                                // highlight all keywords\n                                keywords.forEach(function(keyword) {\n                                    var regS = new RegExp(keyword, \"gi\");\n                                    match_content = match_content.replace(regS, \"<span class=\\\"search-keyword green lighten-2\\\">\" + keyword + \"</span>\");\n                                });\n\n                                str += \"<p>...\" + match_content + \"...</p>\"\n                            }\n                            str += \"</li>\";\n                        }\n                    });\n                    str += \"</ul>\";\n                    $resultContent.innerHTML = str;\n                });\n            }\n        });\n\t}\n    \n    // 百度统计\n    var _hmt = _hmt || [];\n    (function() {\n        var hm = document.createElement(\"script\");\n        hm.src = \"https://hm.baidu.com/hm.js?47acec2d282c3986f1b600abdc11c7ab\";\n        var s = document.getElementsByTagName(\"script\")[0]; \n        s.parentNode.insertBefore(hm, s);\n    })();\n})(jQuery);\n\n"
  },
  {
    "path": "source/scss/_partial/archive-post-list.scss",
    "content": ".archive {\n    max-width: 500px;\n    margin: 5em auto;\n    .post-item {\n        padding: 2px 0 0 50px;\n    }\n    .post-time,\n    .post-title-link {\n        font-size: 1rem;\n    }\n    .post-title-link {\n        display: block;\n        margin-left: 125px;\n        color: #42b983;\n        word-break: break-all;\n        &:hover {\n            border-bottom: 0;\n            color: #267B54;\n        }\n    }\n    .post-info {\n        float: left;\n        width: 125px;\n        color: #7f8c8d;\n    }\n}"
  },
  {
    "path": "source/scss/_partial/base.scss",
    "content": "::selection {\n    color: #FFFFFF;\n    background-color: #42b983;\n}\n\nhtml, body {\n    width: 100%;\n    height: 100%;\n}\n\nbody {\n    margin: 0;\n    color: #34495e;\n    font-size: 15px;\n    line-height: 1.6;\n    background-color: #fff;\n    font-family: 'sourcesanspro', 'Helvetica Neue', Arial, sans-serif;\n}\n\nul.nav,\nul.post-list {\n    margin: 0;\n    padding: 0;\n    list-style-type: none;\n}\n\nul {\n    margin: 1rem 0;\n}\n\na, a:active {\n    color: #2c3e50;\n    text-decoration: none;\n}\n\na.nav-list-link.active,\na.nav-list-link:hover,\na.post-title-link:hover {\n    border-bottom: 2px solid #42b983;\n}\n\nhr {\n    border: 0;\n}\n\ncode {\n    margin: 0 2px;\n    padding: 3px 5px;\n    color: #e96900;\n    border-radius: 2px;\n    white-space: inherit;\n}\n\niframe, video {\n    max-width: 100%;\n    margin: 1rem auto;\n    display: block;\n}\n\ntable {\n    width: 100%;\n    margin: 1em auto;\n    thead {\n        background-color: #ddd;\n        th {\n            padding: 5px;\n            min-width: 80px;\n        }\n    }\n    tbody {\n        tr:nth-child(2n) {\n            background-color: #eee;\n        }\n        td {\n            padding: 5px;\n            vertical-align: text-top;\n        }\n    }\n}\n"
  },
  {
    "path": "source/scss/_partial/copyright.scss",
    "content": "footer {\n    padding-bottom: 1px;\n    .copyright {\n        margin: 4em 0;\n        border-top: 1px solid #ddd;\n        text-align: center;\n        p, a {\n            color: #aaa;\n            font-size: 14px;\n            font-weight: 100;\n        }\n        a:hover {\n            color: #888;\n        }\n    }\n}\n"
  },
  {
    "path": "source/scss/_partial/footer.scss",
    "content": ".paginator {\n    margin: 4em 0;\n    text-align: center;\n    .prev, .next {\n        display: inline-block;\n        margin: 0 4px;\n        padding: 4px 12px;\n        border-radius: 4px;\n        border-bottom: 4px solid #3aa373;\n        font-size: 14px;\n        color: #fff;\n        background-color: #4fc08d;\n        &:hover {\n            background-color: #22bd77;\n        }\n    }\n}\n\n.ds-thread,\n#disqus_thread {\n    margin-bottom: 2em;\n}"
  },
  {
    "path": "source/scss/_partial/header.scss",
    "content": "header {\n    min-height: 60px;\n\n    .logo-link {\n        float: left;\n    }\n    \n    .nav {\n        float: right;\n        left: 80px;\n    }\n\n    .logo-link img {\n        height: 60px;\n    }\n\n    .nav-list-item {\n        display: inline-block;\n        padding: 19px  10px ;\n        a {\n            font-size: 16px;\n            line-height: 1.4;\n        }\n    }\n}\n"
  },
  {
    "path": "source/scss/_partial/home-post-list.scss",
    "content": ".home.post-list {\n    margin: 2em 0;\n    .post-list-item {\n        padding: 1em 0 2em;\n        border-bottom: 1px solid #ddd;\n        &:last-child {\n            border-bottom: 0px;\n        }\n    }\n    .post-content{\n        h2, h3, h4, h5, h6 {\n            &:before {\n                content: '';\n            }\n        }\n        & > ul {\n            list-style: initial;\n        }\n    }\n    .read-more {     \n        color: #42b983;\n    }\n}"
  },
  {
    "path": "source/scss/_partial/mq.scss",
    "content": "section.container {\n    margin: 2em 10px;\n}\n\n@media screen and (min-width: 700px) {\n    .wrap {\n        width: 700px;\n        margin: 0 auto;\n    }\n    header {\n        padding: 20px 100px;\n    }\n}\n\n@media screen and (max-width: 700px) {\n    .wrap {\n        width: 100%;\n    }\n    header {\n        padding: 20px 0;\n        a.logo-link,\n        ul.nav.nav-list {\n            float: none;\n            display: block;\n            text-align: center;\n        }\n        li.nav-list-item {\n            padding: 10px 10px;\n        }\n    }\n    section.container,\n    .home.post-list,\n    .archive {\n        margin-top: 0;\n    }\n    .archive .post-item {\n        padding-left: 20px;\n    }\n    .post-content {\n        h2, h3, h4, h5, h6 {\n            max-width: 300px;\n            left: 15px;\n        }\n    }\n    .ds-thread,\n    #disqus_thread {\n        margin: 2em 10px;\n    }\n}"
  },
  {
    "path": "source/scss/_partial/normalize.scss",
    "content": "/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n/**\n * 1. Set default font family to sans-serif.\n * 2. Prevent iOS and IE text size adjust after device orientation change,\n *    without disabling user zoom.\n */\n\nhtml {\n  font-family: sans-serif; /* 1 */\n  -ms-text-size-adjust: 100%; /* 2 */\n  -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/**\n * Remove default margin.\n */\n\nbody {\n  margin: 0;\n}\n\n/* HTML5 display definitions\n   ========================================================================== */\n\n/**\n * Correct `block` display not defined for any HTML5 element in IE 8/9.\n * Correct `block` display not defined for `details` or `summary` in IE 10/11\n * and Firefox.\n * Correct `block` display not defined for `main` in IE 11.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\n/**\n * 1. Correct `inline-block` display not defined in IE 8/9.\n * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n */\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block; /* 1 */\n  vertical-align: baseline; /* 2 */\n}\n\n/**\n * Prevent modern browsers from displaying `audio` without controls.\n * Remove excess height in iOS 5 devices.\n */\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n/**\n * Address `[hidden]` styling not present in IE 8/9/10.\n * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n */\n\n[hidden],\ntemplate {\n  display: none;\n}\n\n/* Links\n   ========================================================================== */\n\n/**\n * Remove the gray background color from active links in IE 10.\n */\n\na {\n  background-color: transparent;\n}\n\n/**\n * Improve readability of focused elements when they are also in an\n * active/hover state.\n */\n\na:active,\na:hover {\n  outline: 0;\n}\n\n/* Text-level semantics\n   ========================================================================== */\n\n/**\n * Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n */\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\n/**\n * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n */\n\nb,\nstrong {\n  font-weight: bold;\n}\n\n/**\n * Address styling not present in Safari and Chrome.\n */\n\ndfn {\n  font-style: italic;\n}\n\n/**\n * Address variable `h1` font-size and margin within `section` and `article`\n * contexts in Firefox 4+, Safari, and Chrome.\n */\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n/**\n * Address styling not present in IE 8/9.\n */\n\nmark {\n  background: #ff0;\n  color: #000;\n}\n\n/**\n * Address inconsistent and variable font size in all browsers.\n */\n\nsmall {\n  font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` affecting `line-height` in all browsers.\n */\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\n/* Embedded content\n   ========================================================================== */\n\n/**\n * Remove border when inside `a` element in IE 8/9/10.\n */\n\nimg {\n  border: 0;\n}\n\n/**\n * Correct overflow not hidden in IE 9/10/11.\n */\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n/* Grouping content\n   ========================================================================== */\n\n/**\n * Address margin not present in IE 8/9 and Safari.\n */\n\nfigure {\n  margin: 1em 40px;\n}\n\n/**\n * Address differences between Firefox and other browsers.\n */\n\nhr {\n  box-sizing: content-box;\n  height: 0;\n}\n\n/**\n * Contain overflow in all browsers.\n */\n\npre {\n  overflow: auto;\n}\n\n/**\n * Address odd `em`-unit font size rendering in all browsers.\n */\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\n/* Forms\n   ========================================================================== */\n\n/**\n * Known limitation: by default, Chrome and Safari on OS X allow very limited\n * styling of `select`, unless a `border` property is set.\n */\n\n/**\n * 1. Correct color not being inherited.\n *    Known issue: affects color of disabled elements.\n * 2. Correct font properties not being inherited.\n * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit; /* 1 */\n  font: inherit; /* 2 */\n  margin: 0; /* 3 */\n}\n\n/**\n * Address `overflow` set to `hidden` in IE 8/9/10/11.\n */\n\nbutton {\n  overflow: visible;\n}\n\n/**\n * Address inconsistent `text-transform` inheritance for `button` and `select`.\n * All other form control elements do not inherit `text-transform` values.\n * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n * Correct `select` style inheritance in Firefox.\n */\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n/**\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n *    and `video` controls.\n * 2. Correct inability to style clickable `input` types in iOS.\n * 3. Improve usability and consistency of cursor style between image-type\n *    `input` and others.\n */\n\nbutton,\nhtml input[type=\"button\"], /* 1 */\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button; /* 2 */\n  cursor: pointer; /* 3 */\n}\n\n/**\n * Re-set default cursor for disabled elements.\n */\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\n/**\n * Remove inner padding and border in Firefox 4+.\n */\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n/**\n * Address Firefox 4+ setting `line-height` on `input` using `!important` in\n * the UA stylesheet.\n */\n\ninput {\n  line-height: normal;\n}\n\n/**\n * It's recommended that you don't attempt to style these elements.\n * Firefox's implementation doesn't respect box-sizing, padding, or width.\n *\n * 1. Address box sizing set to `content-box` in IE 8/9/10.\n * 2. Remove excess padding in IE 8/9/10.\n */\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box; /* 1 */\n  padding: 0; /* 2 */\n}\n\n/**\n * Fix the cursor style for Chrome's increment/decrement buttons. For certain\n * `font-size` values of the `input`, it causes the cursor style of the\n * decrement button to change from `default` to `text`.\n */\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n/**\n * 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n * 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n */\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield; /* 1 */\n  box-sizing: content-box; /* 2 */\n}\n\n/**\n * Remove inner padding and search cancel button in Safari and Chrome on OS X.\n * Safari (but not Chrome) clips the cancel button when the search input has\n * padding (and `textfield` appearance).\n */\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n/**\n * Define consistent border, margin, and padding.\n */\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n/**\n * 1. Correct `color` not being inherited in IE 8/9/10/11.\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\n */\n\nlegend {\n  border: 0; /* 1 */\n  padding: 0; /* 2 */\n}\n\n/**\n * Remove default vertical scrollbar in IE 8/9/10/11.\n */\n\ntextarea {\n  overflow: auto;\n}\n\n/**\n * Don't inherit the `font-weight` (applied by a rule above).\n * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n */\n\noptgroup {\n  font-weight: bold;\n}\n\n/* Tables\n   ========================================================================== */\n\n/**\n * Remove most spacing between table cells.\n */\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\ntd,\nth {\n  padding: 0;\n}"
  },
  {
    "path": "source/scss/_partial/post.scss",
    "content": ".post {\n    padding-top: 1em;\n}\n\n.post-block {\n    .post-title {\n        margin: 0.65em 0;\n        color: #2c3e50;\n        font-size: 1.5em;\n    }\n\n    .post-info {\n        color: #7f8c8d;\n        margin: 1.2em 0;\n        span {\n            margin-left: 0.5rem;\n        }\n        a.post-from {\n            margin-left: 0.5rem;\n            padding: 3px 6px;\n            border-radius: 5px;\n            font-size: 12px;\n            color: white;\n            background-color: #E36B6B;\n        }\n    }\n}\n\n.post-content {\n    h2, h3, h4, h5, h6 {\n        position: relative;\n        margin: 1em 0;\n        &:before {\n            content: \"#\";\n            color: #42b983;\n            position: absolute;\n            left: -0.7em;\n            top: -4px;\n            font-size: 1.2em;\n            font-weight: bold;\n        }\n    }\n    h4, h5, h6 {\n        &:before {\n            content: \"\";\n        }\n    }\n\n    h2, h3 {\n        font-size: 22px;\n    }\n\n    h4, h5, h6 {\n        font-size: 18px;\n    }\n    a {\n        color: #42b983;\n        word-break: break-all;\n    }\n    blockquote {\n        margin: 2em 0;\n        padding-left: 20px;\n        border-left: 4px solid #42b983;\n    }\n    img {\n        display: block;\n        max-width: 100%;\n        margin: 1em auto;\n    }\n    & > table,\n    & > figure.highlight {\n        box-shadow: 0 1px 2px rgba(0,0,0,0.125);\n    }\n    .tip {\n        position: relative;\n        margin: 2em 0;\n        padding: 12px 24px 12px 30px;\n        border-left: 4px solid #f66;\n        border-top-right-radius: 2px;\n        border-bottom-right-radius: 2px;\n        background-color: #f8f8f8;\n        br {\n            display: none;\n        }\n    }\n    .tip:before {\n        position: absolute;\n        top: 14px;\n        left: -12px;\n        content: \"!\";\n        width: 20px;\n        height: 20px;\n        border-radius: 100%;\n        color: #fff;\n        font-size: 14px;\n        line-height: 20px;\n        font-weight: bold;\n        text-align: center;\n        background-color: #f66;\n        font-family: 'Dosis', 'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif;\n    }\n}\n\n#mask {\n    position: fixed;\n    overflow: scroll;\n    width: 100%;\n    height: 100%;\n    padding: 1em 0;\n    background-color: rgba(0, 0, 0, 0.5);\n    z-index: 10;\n    #mask-image {\n        max-width: 95%;\n    }\n}\n\ncode,\npre {\n    font-size: 0.8em;\n    background-color: #f8f8f8;\n    font-family: 'Roboto Mono', Monaco, courier, monospace;\n}\n\n.highlight {\n    position: relative;\n    margin: 1em 0;\n    border-radius: 2px;\n    line-height: 1.1em;\n    background-color: #f8f8f8;\n    overflow-x: auto;\n    table, tr, td {\n        width: 100%;\n        border-collapse: collapse;\n        padding: 0;\n        margin: 0;\n    }\n    .gutter {\n        display: none;\n    }\n    .code pre {\n        padding: 1.2em 1.4em;\n        line-height: 1.5em;\n        margin: 0;\n    }\n}\n\n%code-base {\n    position: absolute;\n    top: 0;\n    right: 0;\n    color: #ccc;\n    text-align: right;\n    font-size: 0.75em;\n    padding: 5px 10px 0;\n    line-height: 15px;\n    height: 15px;\n    font-weight: 600;\n}\n\n@mixin code-signs($keys) {\n    @each $key in $keys {\n        .highlight.#{$key} .code:after {\n            content: to-upper-case($key);\n            @extend %code-base;\n        }\n    }\n}\n\n$signs: (\"html\", \"js\", \"bash\", \"css\", \"scss\",\"diff\", \"java\", \"xml\", \"python\", \"json\", \"swift\", \"ruby\", \"perl\", \"php\", \"c\", \"java\", \"cpp\", \"ts\");\n@include code-signs($signs);\n\n.highlight.cpp .code:after {\n    content: 'C++';\n}\n\npre {\n    color: #525252;\n    .function .keyword,\n    .constant {\n       color: #0092db;\n    }\n    .keyword,\n    .attribute {\n        color: #e96900;\n    }\n    .number,\n    .literal {\n        color: #ae81ff;\n    }\n    .tag,\n    .tag .title,\n    .change,\n    .winutils,\n    .flow,\n    .lisp .title,\n    .clojure .built_in,\n    .nginx .title,\n    .tex .special {\n        color: #2973b7;\n    }\n    .symbol,\n    .symbol .string,\n    .value,\n    .regexp {\n        color: #42b983;\n    }\n    .title {\n        color: #83B917;\n    }\n    .tag .value,\n    .string,\n    .subst,\n    .haskell .type,\n    .preprocessor,\n    .ruby .class .parent,\n    .built_in,\n    .sql .aggregate,\n    .django .template_tag,\n    .django .variable,\n    .smalltalk .class,\n    .javadoc,\n    .django .filter .argument,\n    .smalltalk .localvars,\n    .smalltalk .array,\n    .attr_selector,\n    .pseudo,\n    .addition,\n    .stream,\n    .envvar,\n    .apache .tag,\n    .apache .cbracket,\n    .tex .command,\n    .prompt {\n        color: #42b983;\n    }\n    .comment,\n    .java .annotation,\n    .python .decorator,\n    .template_comment,\n    .pi,\n    .doctype,\n    .shebang,\n    .apache .sqbracket,\n    .tex .formula {\n        color: #b3b3b3;\n    }\n    .deletion {\n        color: #BA4545;\n    }\n    .coffeescript .javascript,\n    .javascript .xml,\n    .tex .formula,\n    .xml .javascript,\n    .xml .vbscript,\n    .xml .css,\n    .xml .cdata {\n        opacity: 0.5;\n    }\n}\n"
  },
  {
    "path": "source/scss/bubuzou.scss",
    "content": "@charset \"utf-8\";\n\n@import \"_partial/normalize\";\n@import \"_partial/base\";\n@import \"_partial/header\";\n@import \"_partial/home-post-list\";\n@import \"_partial/archive-post-list\";\n@import \"_partial/post\";\n@import \"_partial/footer\";\n@import \"_partial/mq\";\n@import \"_partial/copyright\";\n\n@font-face {\n    font-family: 'sourcesanspro';\n    src: url('/font/sourcesanspro.woff2') format('woff2'),\n         url('/font/sourcesanspro.woff') format('woff');\n    font-weight: normal;\n    font-style: normal;\n}\n"
  }
]